Hover last played column to show list

Fixes #205
This commit is contained in:
Keith Edmunds 2024-04-28 16:41:16 +01:00
parent 2475f817f9
commit f898e4645b
3 changed files with 41 additions and 3 deletions

View File

@ -59,6 +59,7 @@ class Config(object):
HIDE_AFTER_PLAYING_OFFSET = 5000 HIDE_AFTER_PLAYING_OFFSET = 5000
INFO_TAB_TITLE_LENGTH = 15 INFO_TAB_TITLE_LENGTH = 15
LAST_PLAYED_TODAY_STRING = "Today" LAST_PLAYED_TODAY_STRING = "Today"
LAST_PLAYED_TOOLTIP_DATE_FORMAT = "%a, %d %b %Y"
LOG_LEVEL_STDERR = logging.INFO LOG_LEVEL_STDERR = logging.INFO
LOG_LEVEL_SYSLOG = logging.INFO LOG_LEVEL_SYSLOG = logging.INFO
LOG_NAME = "musicmuster" LOG_NAME = "musicmuster"

View File

@ -129,6 +129,20 @@ class Playdates(dbtables.PlaydatesTable):
session.add(self) session.add(self)
session.commit() session.commit()
@staticmethod
def last_playdates(session: Session, track_id: int, limit=5) -> Sequence["Playdates"]:
"""
Return a list of the last limit playdates for this track, sorted
earliest to latest.
"""
return session.scalars(
Playdates.select()
.where(Playdates.track_id == track_id)
.order_by(Playdates.lastplayed.asc())
.limit(limit)
).all()
@staticmethod @staticmethod
def last_played(session: Session, track_id: int) -> dt.datetime: def last_played(session: Session, track_id: int) -> dt.datetime:
"""Return datetime track last played or None""" """Return datetime track last played or None"""

View File

@ -349,10 +349,11 @@ class PlaylistModel(QAbstractTableModel):
# Dispatch to role-specific functions # Dispatch to role-specific functions
dispatch_table = { dispatch_table = {
int(Qt.ItemDataRole.BackgroundRole): self.background_role,
int(Qt.ItemDataRole.DisplayRole): self.display_role, int(Qt.ItemDataRole.DisplayRole): self.display_role,
int(Qt.ItemDataRole.EditRole): self.edit_role, int(Qt.ItemDataRole.EditRole): self.edit_role,
int(Qt.ItemDataRole.FontRole): self.font_role, int(Qt.ItemDataRole.FontRole): self.font_role,
int(Qt.ItemDataRole.BackgroundRole): self.background_role, int(Qt.ItemDataRole.ToolTipRole): self.tooltip_role,
} }
if role in dispatch_table: if role in dispatch_table:
@ -361,7 +362,6 @@ class PlaylistModel(QAbstractTableModel):
# Document other roles but don't use them # Document other roles but don't use them
if role in [ if role in [
Qt.ItemDataRole.DecorationRole, Qt.ItemDataRole.DecorationRole,
Qt.ItemDataRole.ToolTipRole,
Qt.ItemDataRole.StatusTipRole, Qt.ItemDataRole.StatusTipRole,
Qt.ItemDataRole.WhatsThisRole, Qt.ItemDataRole.WhatsThisRole,
Qt.ItemDataRole.SizeHintRole, Qt.ItemDataRole.SizeHintRole,
@ -860,7 +860,9 @@ class PlaylistModel(QAbstractTableModel):
# number of rows being move from above the destination row # number of rows being move from above the destination row
# otherwise rows below the destination row will end up above the # otherwise rows below the destination row will end up above the
# moved rows. # moved rows.
adjusted_to_row = to_row_number - len([a for a in from_rows if a <= to_row_number]) adjusted_to_row = to_row_number - len(
[a for a in from_rows if a <= to_row_number]
)
# Put the from_row row numbers into the row_map. Ultimately the # Put the from_row row numbers into the row_map. Ultimately the
# total number of elements in the playlist doesn't change, so # total number of elements in the playlist doesn't change, so
@ -1377,6 +1379,27 @@ class PlaylistModel(QAbstractTableModel):
def supportedDropActions(self) -> Qt.DropAction: def supportedDropActions(self) -> Qt.DropAction:
return Qt.DropAction.MoveAction | Qt.DropAction.CopyAction return Qt.DropAction.MoveAction | Qt.DropAction.CopyAction
def tooltip_role(self, row: int, column: int, prd: PlaylistRowData) -> QVariant:
"""
Return tooltip. Currently only used for last_played column.
"""
if column != Col.LAST_PLAYED.value:
return QVariant()
with db.Session() as session:
track_id = self.playlist_rows[row].track_id
if not track_id:
return QVariant()
playdates = Playdates.last_playdates(session, track_id)
return QVariant(
"<br>".join(
[
a.lastplayed.strftime(Config.LAST_PLAYED_TOOLTIP_DATE_FORMAT)
for a in playdates
]
)
)
def update_track_times(self) -> None: def update_track_times(self) -> None:
""" """
Update track start/end times in self.playlist_rows Update track start/end times in self.playlist_rows