WIP V3: editing saves

This commit is contained in:
Keith Edmunds 2023-10-21 13:49:13 +01:00
parent 5d19d1ed9f
commit 95c7ccbf34
4 changed files with 63 additions and 10 deletions

View File

@ -439,6 +439,27 @@ class PlaylistRows(Base):
) )
session.flush() 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 @classmethod
def deep_rows( def deep_rows(
cls, session: scoped_session, playlist_id: int cls, session: scoped_session, playlist_id: int

View File

@ -67,7 +67,7 @@ import icons_rc # noqa F401
import music import music
from models import Base, Carts, Playdates, PlaylistRows, Playlists, Settings, Tracks from models import Base, Carts, Playdates, PlaylistRows, Playlists, Settings, Tracks
from config import Config 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_cart_ui import Ui_DialogCartEdit # type: ignore
from ui.dlg_search_database_ui import Ui_Dialog # type: ignore from ui.dlg_search_database_ui import Ui_Dialog # type: ignore
from ui.dlg_SelectPlaylist_ui import Ui_dlgSelectPlaylist # type: ignore from ui.dlg_SelectPlaylist_ui import Ui_dlgSelectPlaylist # type: ignore

View File

@ -23,9 +23,7 @@ from helpers import (
file_is_unreadable, file_is_unreadable,
) )
from models import ( from models import PlaylistRows, Tracks
PlaylistRows,
)
if TYPE_CHECKING: if TYPE_CHECKING:
from musicmuster import MusicMusterSignals from musicmuster import MusicMusterSignals
@ -299,6 +297,12 @@ class PlaylistModel(QAbstractTableModel):
for p in PlaylistRows.deep_rows(session, self.playlist_id): for p in PlaylistRows.deep_rows(session, self.playlist_id):
self.playlist_rows[p.plr_rownum] = PlaylistRowData(p) 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: def rowCount(self, index: QModelIndex = QModelIndex()) -> int:
"""Standard function for view""" """Standard function for view"""
@ -311,5 +315,37 @@ class PlaylistModel(QAbstractTableModel):
Update model with edited data Update model with edited data
""" """
print(f"setData({index.row()=}, {index.column()=}, {value=}, {role=})") if index.isValid() and role == Qt.ItemDataRole.EditRole:
return True 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

View File

@ -131,7 +131,6 @@ class EscapeDelegate(QStyledItemDelegate):
if event.type() == QEvent.Type.KeyPress: if event.type() == QEvent.Type.KeyPress:
key_event = cast(QKeyEvent, event) key_event = cast(QKeyEvent, event)
print(key_event.key())
if key_event.key() == Qt.Key.Key_Return: if key_event.key() == Qt.Key.Key_Return:
if key_event.modifiers() == (Qt.KeyboardModifier.ControlModifier): if key_event.modifiers() == (Qt.KeyboardModifier.ControlModifier):
self.commitData.emit(editor) self.commitData.emit(editor)
@ -147,17 +146,14 @@ class EscapeDelegate(QStyledItemDelegate):
return False return False
def setEditorData(self, editor, index): def setEditorData(self, editor, index):
print("setEditorData()")
value = index.model().data(index, Qt.ItemDataRole.EditRole) value = index.model().data(index, Qt.ItemDataRole.EditRole)
editor.setPlainText(value.value()) editor.setPlainText(value.value())
def setModelData(self, editor, model, index): def setModelData(self, editor, model, index):
print("setModelData")
value = editor.toPlainText() value = editor.toPlainText()
model.setData(index, value, Qt.ItemDataRole.EditRole) model.setData(index, value, Qt.ItemDataRole.EditRole)
def updateEditorGeometry(self, editor, option, index): def updateEditorGeometry(self, editor, option, index):
print("updateEditorGeometry")
editor.setGeometry(option.rect) editor.setGeometry(option.rect)