WIP V3: show selected time plus drag 'n' drop refinements

This commit is contained in:
Keith Edmunds 2023-11-15 22:37:42 +00:00
parent de710b1dc7
commit 9467ae4ee5
2 changed files with 50 additions and 39 deletions

View File

@ -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,

View File

@ -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"<PlaylistTab(id={self.playlist_id}>"
# ########## 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