Use signals for setting next track
This commit is contained in:
parent
c6be215bd4
commit
edd8c36c53
@ -244,10 +244,6 @@ class MusicMusterSignals(QObject):
|
|||||||
# escape there to abandon an edit.
|
# escape there to abandon an edit.
|
||||||
enable_escape_signal = pyqtSignal(bool)
|
enable_escape_signal = pyqtSignal(bool)
|
||||||
|
|
||||||
# Signals that the next-cued track has changed. Used to update
|
|
||||||
# playlist headers.
|
|
||||||
next_track_changed_signal = pyqtSignal()
|
|
||||||
|
|
||||||
# Signals that the playlist_id passed should resize all rows.
|
# Signals that the playlist_id passed should resize all rows.
|
||||||
resize_rows_signal = pyqtSignal(int)
|
resize_rows_signal = pyqtSignal(int)
|
||||||
|
|
||||||
@ -277,11 +273,14 @@ class MusicMusterSignals(QObject):
|
|||||||
|
|
||||||
# signal_set_next_track takes a PlaylistRow as an argument. We can't
|
# signal_set_next_track takes a PlaylistRow as an argument. We can't
|
||||||
# specify that here as it requires us to import PlaylistRow from
|
# specify that here as it requires us to import PlaylistRow from
|
||||||
# playlistrow.py, which itself imports MusicMusterSignals
|
# playlistrow.py, which itself imports MusicMusterSignals. It tells
|
||||||
|
# musicmuster to set the passed track as the next one.
|
||||||
# TBD
|
|
||||||
signal_set_next_track = pyqtSignal(object)
|
signal_set_next_track = pyqtSignal(object)
|
||||||
|
|
||||||
|
# Signals that the next-cued track has changed. Used to update
|
||||||
|
# playlist headers and track timings.
|
||||||
|
signal_next_track_changed = pyqtSignal()
|
||||||
|
|
||||||
# Emited when a track starts playing
|
# Emited when a track starts playing
|
||||||
signal_track_started = pyqtSignal(TrackAndPlaylist)
|
signal_track_started = pyqtSignal(TrackAndPlaylist)
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import datetime as dt
|
import datetime as dt
|
||||||
|
import threading
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
|
||||||
|
|
||||||
@ -21,6 +22,7 @@ from config import Config
|
|||||||
import helpers
|
import helpers
|
||||||
from log import log
|
from log import log
|
||||||
|
|
||||||
|
|
||||||
class _FadeTrack(QThread):
|
class _FadeTrack(QThread):
|
||||||
finished = pyqtSignal()
|
finished = pyqtSignal()
|
||||||
|
|
||||||
|
|||||||
@ -101,9 +101,6 @@ class SignalMonitor:
|
|||||||
self.signals.enable_escape_signal.connect(
|
self.signals.enable_escape_signal.connect(
|
||||||
partial(self.show_signal, "enable_escape_signal ")
|
partial(self.show_signal, "enable_escape_signal ")
|
||||||
)
|
)
|
||||||
self.signals.next_track_changed_signal.connect(
|
|
||||||
partial(self.show_signal, "next_track_changed_signal ")
|
|
||||||
)
|
|
||||||
self.signals.resize_rows_signal.connect(
|
self.signals.resize_rows_signal.connect(
|
||||||
partial(self.show_signal, "resize_rows_signal ")
|
partial(self.show_signal, "resize_rows_signal ")
|
||||||
)
|
)
|
||||||
@ -140,6 +137,7 @@ class SignalMonitor:
|
|||||||
self.signals.signal_track_started.connect(
|
self.signals.signal_track_started.connect(
|
||||||
partial(self.show_signal, "signal_track_started ")
|
partial(self.show_signal, "signal_track_started ")
|
||||||
)
|
)
|
||||||
|
# span_cells_signal is very noisy
|
||||||
# self.signals.span_cells_signal.connect(
|
# self.signals.span_cells_signal.connect(
|
||||||
# partial(self.show_signal, "span_cells_signal ")
|
# partial(self.show_signal, "span_cells_signal ")
|
||||||
# )
|
# )
|
||||||
@ -1659,7 +1657,7 @@ class Window(QMainWindow):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
self.track_sequence.set_next(None)
|
self.track_sequence.set_next(None)
|
||||||
self.signals.next_track_changed_signal.emit()
|
self.signals.signal_set_next_track.emit(None)
|
||||||
|
|
||||||
def clear_selection(self, checked: bool = False) -> None:
|
def clear_selection(self, checked: bool = False) -> None:
|
||||||
"""Clear row selection"""
|
"""Clear row selection"""
|
||||||
@ -1741,9 +1739,12 @@ class Window(QMainWindow):
|
|||||||
self.txtSearch.textChanged.connect(self.search_playlist_text_changed)
|
self.txtSearch.textChanged.connect(self.search_playlist_text_changed)
|
||||||
|
|
||||||
self.signals.enable_escape_signal.connect(self.enable_escape)
|
self.signals.enable_escape_signal.connect(self.enable_escape)
|
||||||
self.signals.next_track_changed_signal.connect(self.update_headers)
|
self.signals.search_songfacts_signal.connect(self.open_songfacts_browser)
|
||||||
self.signals.status_message_signal.connect(self.show_status_message)
|
self.signals.search_wikipedia_signal.connect(self.open_wikipedia_browser)
|
||||||
self.signals.show_warning_signal.connect(self.show_warning)
|
self.signals.show_warning_signal.connect(self.show_warning)
|
||||||
|
self.signals.signal_next_track_changed.connect(self.signal_next_track_changed_handler)
|
||||||
|
self.signals.signal_set_next_track.connect(self.signal_set_next_track_handler)
|
||||||
|
self.signals.status_message_signal.connect(self.show_status_message)
|
||||||
self.signals.track_ended_signal.connect(self.end_of_track_actions)
|
self.signals.track_ended_signal.connect(self.end_of_track_actions)
|
||||||
|
|
||||||
self.timer10.timeout.connect(self.tick_10ms)
|
self.timer10.timeout.connect(self.tick_10ms)
|
||||||
@ -1751,9 +1752,6 @@ class Window(QMainWindow):
|
|||||||
self.timer100.timeout.connect(self.tick_100ms)
|
self.timer100.timeout.connect(self.tick_100ms)
|
||||||
self.timer1000.timeout.connect(self.tick_1000ms)
|
self.timer1000.timeout.connect(self.tick_1000ms)
|
||||||
|
|
||||||
self.signals.search_songfacts_signal.connect(self.open_songfacts_browser)
|
|
||||||
self.signals.search_wikipedia_signal.connect(self.open_wikipedia_browser)
|
|
||||||
|
|
||||||
# @log_call
|
# @log_call
|
||||||
def current_row_or_end(self) -> int:
|
def current_row_or_end(self) -> int:
|
||||||
"""
|
"""
|
||||||
@ -2523,6 +2521,21 @@ class Window(QMainWindow):
|
|||||||
|
|
||||||
self._active_tab().scroll_to_top(playlist_track.row_number)
|
self._active_tab().scroll_to_top(playlist_track.row_number)
|
||||||
|
|
||||||
|
def signal_set_next_track_handler(self, plr: PlaylistRow) -> None:
|
||||||
|
"""
|
||||||
|
Handle signal_set_next_track
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.track_sequence.set_next(plr)
|
||||||
|
self.signals.signal_next_track_changed.emit()
|
||||||
|
|
||||||
|
def signal_next_track_changed_handler(self) -> None:
|
||||||
|
"""
|
||||||
|
Handle next track changed
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.update_headers()
|
||||||
|
|
||||||
# @log_call
|
# @log_call
|
||||||
def stop(self, checked: bool = False) -> None:
|
def stop(self, checked: bool = False) -> None:
|
||||||
"""Stop playing immediately"""
|
"""Stop playing immediately"""
|
||||||
|
|||||||
@ -101,6 +101,7 @@ class PlaylistModel(QAbstractTableModel):
|
|||||||
self.signals.signal_set_next_row.connect(self.set_next_row)
|
self.signals.signal_set_next_row.connect(self.set_next_row)
|
||||||
self.signals.signal_track_started.connect(self.track_started)
|
self.signals.signal_track_started.connect(self.track_started)
|
||||||
self.signals.track_ended_signal.connect(self.previous_track_ended)
|
self.signals.track_ended_signal.connect(self.previous_track_ended)
|
||||||
|
self.signals.signal_next_track_changed.connect(self.signal_next_track_changed_handler)
|
||||||
|
|
||||||
# Populate self.playlist_rows
|
# Populate self.playlist_rows
|
||||||
for dto in ds.playlistrows_by_playlist(self.playlist_id):
|
for dto in ds.playlistrows_by_playlist(self.playlist_id):
|
||||||
@ -1303,8 +1304,6 @@ class PlaylistModel(QAbstractTableModel):
|
|||||||
if self.track_sequence.next:
|
if self.track_sequence.next:
|
||||||
old_next_row = self.track_sequence.next.row_number
|
old_next_row = self.track_sequence.next.row_number
|
||||||
|
|
||||||
self.track_sequence.set_next(plr)
|
|
||||||
|
|
||||||
roles = [
|
roles = [
|
||||||
Qt.ItemDataRole.BackgroundRole,
|
Qt.ItemDataRole.BackgroundRole,
|
||||||
]
|
]
|
||||||
@ -1314,8 +1313,19 @@ class PlaylistModel(QAbstractTableModel):
|
|||||||
# only invalidate required roles
|
# only invalidate required roles
|
||||||
self.invalidate_row(plr.row_number, roles)
|
self.invalidate_row(plr.row_number, roles)
|
||||||
|
|
||||||
self.signals.next_track_changed_signal.emit()
|
self.signals.signal_set_next_track.emit(plr)
|
||||||
|
|
||||||
|
def signal_next_track_changed_handler(self) -> None:
|
||||||
|
"""
|
||||||
|
Handle next track changed
|
||||||
|
"""
|
||||||
|
|
||||||
self.update_track_times()
|
self.update_track_times()
|
||||||
|
# Refresh display to show new next track
|
||||||
|
if self.track_sequence.next:
|
||||||
|
next_row_number = self.track_sequence.next.row_number
|
||||||
|
if next_row_number is not None:
|
||||||
|
self.invalidate_row(next_row_number, [Qt.ItemDataRole.BackgroundRole])
|
||||||
|
|
||||||
# @log_call
|
# @log_call
|
||||||
def setData(
|
def setData(
|
||||||
|
|||||||
@ -172,7 +172,9 @@ class PlaylistRow:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if self.track_id > 0:
|
if self.track_id > 0:
|
||||||
raise ApplicationError("Attempting to add track to row with existing track ({self=}")
|
raise ApplicationError(
|
||||||
|
"Attempting to add track to row with existing track ({self=}"
|
||||||
|
)
|
||||||
|
|
||||||
ds.track_add_to_header(playlistrow_id=self.playlistrow_id, track_id=track_id)
|
ds.track_add_to_header(playlistrow_id=self.playlistrow_id, track_id=track_id)
|
||||||
|
|
||||||
@ -221,28 +223,6 @@ class PlaylistRow:
|
|||||||
# the change to the database.
|
# the change to the database.
|
||||||
self.dto.row_number = value
|
self.dto.row_number = value
|
||||||
|
|
||||||
def check_for_end_of_track(self) -> None:
|
|
||||||
"""
|
|
||||||
Check whether track has ended. If so, emit track_ended_signal
|
|
||||||
"""
|
|
||||||
|
|
||||||
if self.start_time is None:
|
|
||||||
return
|
|
||||||
|
|
||||||
if self.end_of_track_signalled:
|
|
||||||
return
|
|
||||||
|
|
||||||
if self.music.is_playing():
|
|
||||||
return
|
|
||||||
|
|
||||||
self.start_time = None
|
|
||||||
if self.fade_graph:
|
|
||||||
self.fade_graph.clear()
|
|
||||||
# Ensure that player is released
|
|
||||||
self.music.fade(0)
|
|
||||||
self.signals.track_ended_signal.emit(self.playlist_id)
|
|
||||||
self.end_of_track_signalled = True
|
|
||||||
|
|
||||||
def drop3db(self, enable: bool) -> None:
|
def drop3db(self, enable: bool) -> None:
|
||||||
"""
|
"""
|
||||||
If enable is true, drop output by 3db else restore to full volume
|
If enable is true, drop output by 3db else restore to full volume
|
||||||
@ -278,7 +258,12 @@ class PlaylistRow:
|
|||||||
self.start_time = now
|
self.start_time = now
|
||||||
|
|
||||||
# Initialise player
|
# Initialise player
|
||||||
self.music.play(self.path, start_time=now, position=position)
|
self.music.play(
|
||||||
|
path=self.path,
|
||||||
|
start_time=now,
|
||||||
|
playlist_id=self.playlist_id,
|
||||||
|
position=position,
|
||||||
|
)
|
||||||
|
|
||||||
self.end_time = now + dt.timedelta(milliseconds=self.duration)
|
self.end_time = now + dt.timedelta(milliseconds=self.duration)
|
||||||
|
|
||||||
|
|||||||
@ -1142,4 +1142,4 @@ class PlaylistTab(QTableView):
|
|||||||
|
|
||||||
self.track_sequence.set_next(None)
|
self.track_sequence.set_next(None)
|
||||||
self.clear_selection()
|
self.clear_selection()
|
||||||
self.signals.next_track_changed_signal.emit()
|
self.signals.signal_set_next_track.emit(None)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user