Start using signals to call for saving playlist

This commit is contained in:
Keith Edmunds 2023-02-25 19:44:02 +00:00
parent 77716005c7
commit cc2f3733b2
2 changed files with 55 additions and 20 deletions

View File

@ -249,6 +249,17 @@ class ImportTrack(QObject):
self.finished.emit(self.playlist) self.finished.emit(self.playlist)
class MusicMusterSignals(QObject):
"""
Class for all MusicMuster signals. See:
- https://zetcode.com/gui/pyqt5/eventssignals/
- https://stackoverflow.com/questions/62654525/
emit-a-signal-from-another-class-to-main-class
"""
save_playlist_signal = pyqtSignal()
class Window(QMainWindow, Ui_MainWindow): class Window(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None, *args, **kwargs) -> None: def __init__(self, parent=None, *args, **kwargs) -> None:
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
@ -267,6 +278,8 @@ class Window(QMainWindow, Ui_MainWindow):
self.previous_track_position: Optional[float] = None self.previous_track_position: Optional[float] = None
self.selected_plrs: Optional[List[PlaylistRows]] = None self.selected_plrs: Optional[List[PlaylistRows]] = None
self.signals = MusicMusterSignals()
# Set colours that will be used by playlist row stripes # Set colours that will be used by playlist row stripes
palette = QPalette() palette = QPalette()
palette.setColor(QPalette.Base, QColor(Config.COLOUR_EVEN_PLAYLIST)) palette.setColor(QPalette.Base, QColor(Config.COLOUR_EVEN_PLAYLIST))
@ -614,7 +627,8 @@ class Window(QMainWindow, Ui_MainWindow):
assert playlist.id assert playlist.id
playlist_tab = PlaylistTab( playlist_tab = PlaylistTab(
musicmuster=self, session=session, playlist_id=playlist.id) musicmuster=self, session=session, playlist_id=playlist.id,
signals=self.signals)
idx = self.tabPlaylist.addTab(playlist_tab, playlist.name) idx = self.tabPlaylist.addTab(playlist_tab, playlist.name)
self.tabPlaylist.setCurrentIndex(idx) self.tabPlaylist.setCurrentIndex(idx)

View File

@ -8,7 +8,6 @@ from datetime import datetime, timedelta
from typing import cast, List, Optional, TYPE_CHECKING, Union from typing import cast, List, Optional, TYPE_CHECKING, Union
from PyQt5.QtCore import ( from PyQt5.QtCore import (
pyqtSignal,
QEvent, QEvent,
QModelIndex, QModelIndex,
QObject, QObject,
@ -60,7 +59,7 @@ from models import (
) )
if TYPE_CHECKING: if TYPE_CHECKING:
from musicmuster import Window from musicmuster import Window, MusicMusterSignals
start_time_re = re.compile(r"@\d\d:\d\d:\d\d") start_time_re = re.compile(r"@\d\d:\d\d:\d\d")
HEADER_NOTES_COLUMN = 2 HEADER_NOTES_COLUMN = 2
@ -138,10 +137,11 @@ class PlaylistTab(QTableWidget):
def __init__(self, musicmuster: "Window", def __init__(self, musicmuster: "Window",
session: scoped_session, session: scoped_session,
playlist_id: int, *args, **kwargs) -> None: playlist_id: int, signals: "MusicMusterSignals") -> None:
super().__init__(*args, **kwargs) super().__init__()
self.musicmuster: Window = musicmuster self.musicmuster: Window = musicmuster
self.playlist_id = playlist_id self.playlist_id = playlist_id
self.signals = signals
# Set up widget # Set up widget
self.menu: Optional[QMenu] = None self.menu: Optional[QMenu] = None
@ -193,6 +193,7 @@ class PlaylistTab(QTableWidget):
self.selecting_in_progress = False self.selecting_in_progress = False
# Connect signals # Connect signals
self.horizontalHeader().sectionResized.connect(self._column_resize) self.horizontalHeader().sectionResized.connect(self._column_resize)
self.signals.save_playlist_signal.connect(self._deferred_save)
# Load playlist rows # Load playlist rows
self.populate_display(session, self.playlist_id) self.populate_display(session, self.playlist_id)
@ -1292,6 +1293,15 @@ class PlaylistTab(QTableWidget):
cb.clear(mode=cb.Clipboard) cb.clear(mode=cb.Clipboard)
cb.setText(pathqs, mode=cb.Clipboard) cb.setText(pathqs, mode=cb.Clipboard)
def _deferred_save(self) -> None:
"""
Create session and save playlist
"""
print("_deferred_save() called")
with Session() as session:
self.save_playlist(session)
def _delete_rows(self) -> None: def _delete_rows(self) -> None:
""" """
Delete mutliple rows Delete mutliple rows
@ -1301,22 +1311,33 @@ class PlaylistTab(QTableWidget):
- Save the playlist - Save the playlist
""" """
# Delete rows from database with Session() as session:
plr_ids = self.get_selected_playlistrow_ids() plrs = self.get_selected_playlistrows(session)
if not plr_ids: row_count = len(plrs)
if not row_count:
return return
# Get confirmation # Get confirmation
row_count = len(plr_ids)
plural = 's' if row_count > 1 else '' plural = 's' if row_count > 1 else ''
if not ask_yes_no("Delete rows", if not ask_yes_no("Delete rows",
f"Really delete {row_count} row{plural}?"): f"Really delete {row_count} row{plural}?"):
return return
self.remove_selected_rows() rows_to_delete = [a.row_number for a in plrs]
with Session() as session: # Delete rows from database. Would be more efficient to
QTimer.singleShot(0, lambda: self.save_playlist(session)) # query then have a single delete.
for plr in plrs:
session.delete(plr)
# Remove from display
self.remove_rows(rows_to_delete)
# Reset drag mode
self.setDragEnabled(False)
# QTimer.singleShot(0, lambda: self._deferred_save())
self.signals.save_playlist_signal.emit()
def _drop_on(self, event): def _drop_on(self, event):
""" """