diff --git a/app/musicmuster.py b/app/musicmuster.py index f88cfc7..0a30f60 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -245,6 +245,7 @@ class MusicMusterSignals(QObject): """ set_next_track_signal = pyqtSignal(int, int) + span_cells_signal = pyqtSignal(int, int, int, int) class PlaylistTrack: diff --git a/app/playlistmodel.py b/app/playlistmodel.py index e7b71d1..39ec24c 100644 --- a/app/playlistmodel.py +++ b/app/playlistmodel.py @@ -1,6 +1,6 @@ from datetime import datetime from enum import auto, Enum -from typing import Optional +from typing import Optional, TYPE_CHECKING from PyQt6.QtCore import ( QAbstractTableModel, @@ -12,7 +12,6 @@ from PyQt6.QtCore import ( from PyQt6.QtGui import ( QBrush, QColor, - QFont, ) from config import Config @@ -27,6 +26,9 @@ from models import ( PlaylistRows, ) +if TYPE_CHECKING: + from musicmuster import MusicMusterSignals + class Col(Enum): START_GAP = 0 @@ -40,6 +42,9 @@ class Col(Enum): NOTE = auto() +HEADER_NOTES_COLUMN = 1 + + class PlaylistRowData: def __init__(self, plr: PlaylistRows) -> None: """ @@ -77,8 +82,11 @@ class PlaylistRowData: class PlaylistModel(QAbstractTableModel): - def __init__(self, playlist_id: int, *args, **kwargs): + def __init__( + self, playlist_id: int, signals: "MusicMusterSignals", *args, **kwargs + ): self.playlist_id = playlist_id + self.signals = signals super().__init__(*args, **kwargs) self.playlist_rows: dict[int, PlaylistRowData] = {} @@ -146,6 +154,21 @@ class PlaylistModel(QAbstractTableModel): Return text for display """ + # Detect whether this is a header row + if not prd.path: + header = prd.note + else: + header = "" + + if header: + if column == HEADER_NOTES_COLUMN: + self.signals.span_cells_signal.emit( + row, HEADER_NOTES_COLUMN, 1, self.columnCount() - 1 + ) + return QVariant(prd.note) + else: + return QVariant() + if column == Col.START_GAP.value: return QVariant(prd.start_gap) if column == Col.TITLE.value: @@ -168,7 +191,11 @@ class PlaylistModel(QAbstractTableModel): return QVariant() def background_role(self, row: int, column: int, prd: PlaylistRowData) -> QBrush: - """ Return background setting """ + """Return background setting""" + + # Handle entire row colouring + if file_is_unreadable(prd.path): + return QBrush(QColor(Config.COLOUR_UNREADABLE)) if column == Col.START_GAP.value: if prd.start_gap and prd.start_gap >= Config.START_GAP_WARNING_THRESHOLD: @@ -199,7 +226,6 @@ class PlaylistModel(QAbstractTableModel): # cell_colour = Config.COLOUR_BITRATE_OK # return QVariant(QColor(cell_colour)) - # if not rowdata.played: # font = QFont() # font.setBold(True) diff --git a/app/playlists_v3.py b/app/playlists_v3.py index b082c81..00fee67 100644 --- a/app/playlists_v3.py +++ b/app/playlists_v3.py @@ -146,7 +146,7 @@ class PlaylistTab(QTableView): super().__init__() self.musicmuster = musicmuster self.playlist_id = playlist_id - self.setModel(PlaylistModel(playlist_id)) + self.setModel(PlaylistModel(playlist_id, signals)) self.signals = signals # Set up widget @@ -202,6 +202,7 @@ class PlaylistTab(QTableView): self.horizontalHeader().sectionResized.connect(self._column_resize) # self.itemSelectionChanged.connect(self._select_event) # self.signals.set_next_track_signal.connect(self._reset_next) + self.signals.span_cells_signal.connect(self._span_cells) # Load playlist rows # self.populate_display(session, self.playlist_id) @@ -2379,6 +2380,13 @@ class PlaylistTab(QTableView): self.save_playlist(session) self._update_start_end_times(session) + def _span_cells(self, row: int, column: int, rowSpan: int, columnSpan: int) -> None: + """ + Implement spanning of cells, initiated by signal + """ + + self.setSpan(row, column, rowSpan, columnSpan) + def _track_time_between_rows( self, session: scoped_session, from_plr: PlaylistRows, to_plr: PlaylistRows ) -> Tuple[int, int]: