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)
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):
def __init__(self, parent=None, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
@ -267,6 +278,8 @@ class Window(QMainWindow, Ui_MainWindow):
self.previous_track_position: Optional[float] = None
self.selected_plrs: Optional[List[PlaylistRows]] = None
self.signals = MusicMusterSignals()
# Set colours that will be used by playlist row stripes
palette = QPalette()
palette.setColor(QPalette.Base, QColor(Config.COLOUR_EVEN_PLAYLIST))
@ -614,7 +627,8 @@ class Window(QMainWindow, Ui_MainWindow):
assert playlist.id
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)
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 PyQt5.QtCore import (
pyqtSignal,
QEvent,
QModelIndex,
QObject,
@ -60,7 +59,7 @@ from models import (
)
if TYPE_CHECKING:
from musicmuster import Window
from musicmuster import Window, MusicMusterSignals
start_time_re = re.compile(r"@\d\d:\d\d:\d\d")
HEADER_NOTES_COLUMN = 2
@ -138,10 +137,11 @@ class PlaylistTab(QTableWidget):
def __init__(self, musicmuster: "Window",
session: scoped_session,
playlist_id: int, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
playlist_id: int, signals: "MusicMusterSignals") -> None:
super().__init__()
self.musicmuster: Window = musicmuster
self.playlist_id = playlist_id
self.signals = signals
# Set up widget
self.menu: Optional[QMenu] = None
@ -193,6 +193,7 @@ class PlaylistTab(QTableWidget):
self.selecting_in_progress = False
# Connect signals
self.horizontalHeader().sectionResized.connect(self._column_resize)
self.signals.save_playlist_signal.connect(self._deferred_save)
# Load playlist rows
self.populate_display(session, self.playlist_id)
@ -1292,6 +1293,15 @@ class PlaylistTab(QTableWidget):
cb.clear(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:
"""
Delete mutliple rows
@ -1301,22 +1311,33 @@ class PlaylistTab(QTableWidget):
- Save the playlist
"""
# Delete rows from database
plr_ids = self.get_selected_playlistrow_ids()
if not plr_ids:
return
# Get confirmation
row_count = len(plr_ids)
plural = 's' if row_count > 1 else ''
if not ask_yes_no("Delete rows",
f"Really delete {row_count} row{plural}?"):
return
self.remove_selected_rows()
with Session() as session:
QTimer.singleShot(0, lambda: self.save_playlist(session))
plrs = self.get_selected_playlistrows(session)
row_count = len(plrs)
if not row_count:
return
# Get confirmation
plural = 's' if row_count > 1 else ''
if not ask_yes_no("Delete rows",
f"Really delete {row_count} row{plural}?"):
return
rows_to_delete = [a.row_number for a in plrs]
# Delete rows from database. Would be more efficient to
# 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):
"""