From 95c7ccbf34c7385958e6d984ba09d9a57ecf1a01 Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Sat, 21 Oct 2023 13:49:13 +0100 Subject: [PATCH] WIP V3: editing saves --- app/models.py | 21 ++++++++++++++++++++ app/musicmuster.py | 2 +- app/playlistmodel.py | 46 +++++++++++++++++++++++++++++++++++++++----- app/playlists.py | 4 ---- 4 files changed, 63 insertions(+), 10 deletions(-) diff --git a/app/models.py b/app/models.py index 94eb041..dbfe401 100644 --- a/app/models.py +++ b/app/models.py @@ -439,6 +439,27 @@ class PlaylistRows(Base): ) session.flush() + @classmethod + def deep_row( + cls, session: scoped_session, playlist_id: int, row_number: int + ) ->"PlaylistRows": + """ + Return a playlist row that includes full track and lastplayed data for + given playlist_id and row + """ + + stmt = ( + select(PlaylistRows) + .options(joinedload(cls.track)) + .where( + PlaylistRows.playlist_id == playlist_id, + PlaylistRows.plr_rownum == row_number + ) + # .options(joinedload(Tracks.playdates)) + ) + + return session.execute(stmt).unique().scalar_one() + @classmethod def deep_rows( cls, session: scoped_session, playlist_id: int diff --git a/app/musicmuster.py b/app/musicmuster.py index 0170126..6252209 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -67,7 +67,7 @@ import icons_rc # noqa F401 import music from models import Base, Carts, Playdates, PlaylistRows, Playlists, Settings, Tracks from config import Config -from playlists_v3 import PlaylistTab +from playlists import PlaylistTab from ui.dlg_cart_ui import Ui_DialogCartEdit # type: ignore from ui.dlg_search_database_ui import Ui_Dialog # type: ignore from ui.dlg_SelectPlaylist_ui import Ui_dlgSelectPlaylist # type: ignore diff --git a/app/playlistmodel.py b/app/playlistmodel.py index 6016cfc..5914cc2 100644 --- a/app/playlistmodel.py +++ b/app/playlistmodel.py @@ -23,9 +23,7 @@ from helpers import ( file_is_unreadable, ) -from models import ( - PlaylistRows, -) +from models import PlaylistRows, Tracks if TYPE_CHECKING: from musicmuster import MusicMusterSignals @@ -299,6 +297,12 @@ class PlaylistModel(QAbstractTableModel): for p in PlaylistRows.deep_rows(session, self.playlist_id): self.playlist_rows[p.plr_rownum] = PlaylistRowData(p) + def refresh_row(self, session, row_number): + """Populate dict for one row for data calls""" + + p = PlaylistRows.deep_row(session, self.playlist_id, row_number) + self.playlist_rows[p.plr_rownum] = PlaylistRowData(p) + def rowCount(self, index: QModelIndex = QModelIndex()) -> int: """Standard function for view""" @@ -311,5 +315,37 @@ class PlaylistModel(QAbstractTableModel): Update model with edited data """ - print(f"setData({index.row()=}, {index.column()=}, {value=}, {role=})") - return True + if index.isValid() and role == Qt.ItemDataRole.EditRole: + row_number = index.row() + column = index.column() + + with Session() as session: + plr = session.get(PlaylistRows, self.playlist_rows[row_number].plrid) + if not plr: + print( + f"Error saving data: {row_number=}, {column=}, {value=}, {self.playlist_id=}" + ) + return False + + if column == Col.TITLE.value or column == Col.ARTIST.value: + track = session.get(Tracks, plr.track_id) + if not track: + print(f"Error retreiving track: {plr=}") + return False + if column == Col.TITLE.value: + track.title = str(value) + elif column == Col.ARTIST.value: + track.artist = str(value) + else: + print(f"Error updating track: {column=}, {value=}") + return False + elif column == Col.NOTE.value: + plr.note = str(value) + + # Flush changes before refreshing data + session.flush() + self.refresh_row(session, row_number) + self.dataChanged.emit(index, index, [Qt.ItemDataRole.DisplayRole, role]) + return True + + return False diff --git a/app/playlists.py b/app/playlists.py index d887dc5..c790685 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -131,7 +131,6 @@ class EscapeDelegate(QStyledItemDelegate): if event.type() == QEvent.Type.KeyPress: key_event = cast(QKeyEvent, event) - print(key_event.key()) if key_event.key() == Qt.Key.Key_Return: if key_event.modifiers() == (Qt.KeyboardModifier.ControlModifier): self.commitData.emit(editor) @@ -147,17 +146,14 @@ class EscapeDelegate(QStyledItemDelegate): return False def setEditorData(self, editor, index): - print("setEditorData()") value = index.model().data(index, Qt.ItemDataRole.EditRole) editor.setPlainText(value.value()) def setModelData(self, editor, model, index): - print("setModelData") value = editor.toPlainText() model.setData(index, value, Qt.ItemDataRole.EditRole) def updateEditorGeometry(self, editor, option, index): - print("updateEditorGeometry") editor.setGeometry(option.rect)