diff --git a/app/playlistmodel.py b/app/playlistmodel.py index 13f23f0..f3705b9 100644 --- a/app/playlistmodel.py +++ b/app/playlistmodel.py @@ -445,6 +445,17 @@ class PlaylistModel(QAbstractTableModel): return QVariant(boldfont) + def get_rows_duration(self, row_numbers: List[int]) -> int: + """ + Return the total duration of the passed rows + """ + + duration = 0 + for row_number in row_numbers: + duration += self.playlist_rows[row_number].duration + + return duration + def headerData( self, section: int, diff --git a/app/playlists.py b/app/playlists.py index 98be176..3921887 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -13,6 +13,7 @@ from PyQt6.QtCore import ( QEvent, QModelIndex, QObject, + QItemSelection, Qt, # QTimer, ) @@ -174,10 +175,9 @@ class PlaylistTab(QTableView): self.setAcceptDrops(True) # Set our custom style - this draws the drop indicator across the whole row self.setStyle(PlaylistStyle()) - - # TODO: change this later to only enable drags when multiple - # rows selected - self.setDragEnabled(True) + # We will enable dragging when rows are selected. Disabling it + # here means we can click and drag to select rows. + self.setDragEnabled(False) # Prepare for context menu self.menu = QMenu() self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) @@ -189,7 +189,6 @@ class PlaylistTab(QTableView): if isinstance(h_header, QHeaderView): h_header.sectionResized.connect(self._column_resize) h_header.setStretchLastSection(True) - # self.itemSelectionChanged.connect(self._select_event) # self.signals.set_next_track_signal.connect(self._reset_next) self.signals = MusicMusterSignals() self.signals.span_cells_signal.connect(self._span_cells) @@ -206,9 +205,6 @@ class PlaylistTab(QTableView): self.setModel(PlaylistModel(playlist_id)) self._set_column_widths() - # kae def __repr__(self) -> str: - # kae return f"" - # ########## Events other than cell editing ########## def dropEvent(self, event): @@ -226,8 +222,13 @@ class PlaylistTab(QTableView): and 0 <= to_row <= self.model().rowCount() ): self.model().move_rows(from_rows, to_row) + + # Reset drag mode to allow row selection by dragging + self.setDragEnabled(False) + # Deselect rows + self.clear_selection() + event.accept() - super().dropEvent(event) # def dropEvent(self, event: Optional[QDropEvent]) -> None: # """ @@ -314,16 +315,17 @@ class PlaylistTab(QTableView): return menu_item - # def mouseReleaseEvent(self, event): - # """ - # Enable dragging if rows are selected - # """ + def mouseReleaseEvent(self, event): + """ + Enable dragging if rows are selected + """ - # if self.selectedIndexes(): - # self.setDragEnabled(True) - # else: - # self.setDragEnabled(False) - # super().mouseReleaseEvent(event) + if self.selectedIndexes(): + self.setDragEnabled(True) + else: + self.setDragEnabled(False) + self.reset() + super().mouseReleaseEvent(event) # ########## Cell editing ########## @@ -518,7 +520,7 @@ class PlaylistTab(QTableView): """Unselect all tracks and reset drag mode""" self.clearSelection() - # self.setDragEnabled(False) + self.setDragEnabled(False) def get_selected_row_number(self) -> Optional[int]: """ @@ -1855,28 +1857,26 @@ class PlaylistTab(QTableView): if match_row is not None: self.selectRow(row_number) - # kae def _select_event(self) -> None: - # kae """ - # kae Called when item selection changes. - # kae If multiple rows are selected, display sum of durations in status bar. - # kae """ + def selectionChanged(self, selected: QItemSelection, deselected: QItemSelection) -> None: + """ + Toggle drag behaviour according to whether rows are selected + """ - # kae selected_rows = self._get_selected_rows() - # kae # If no rows are selected, we have nothing to do - # kae if len(selected_rows) == 0: - # kae self.musicmuster.lblSumPlaytime.setText("") - # kae return + selected_rows = self._get_selected_rows() + # If no rows are selected, we have nothing to do + if len(selected_rows) == 0: + self.musicmuster.lblSumPlaytime.setText("") + else: + model = cast(PlaylistModel, self.model()) + selected_duration = model.get_rows_duration(self._get_selected_rows()) + if selected_duration > 0: + self.musicmuster.lblSumPlaytime.setText( + f"Selected duration: {ms_to_mmss(selected_duration)}" + ) + else: + self.musicmuster.lblSumPlaytime.setText("") - # kae ms = 0 - # kae for row_number in selected_rows: - # kae ms += self._get_row_duration(row_number) - - # kae if ms > 0: - # kae self.musicmuster.lblSumPlaytime.setText( - # kae f"Selected duration: {ms_to_mmss(ms)}" - # kae ) - # kae else: - # kae self.musicmuster.lblSumPlaytime.setText("") + super().selectionChanged(selected, deselected) # def _set_cell_colour( # self, row_number: int, column: int, colour: Optional[str] = None