WIP V3: select duplicate rows working
This commit is contained in:
parent
77774dc403
commit
f4a374f68c
@ -529,7 +529,9 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
lambda: self.tabPlaylist.currentWidget().lookup_row_in_wikipedia()
|
lambda: self.tabPlaylist.currentWidget().lookup_row_in_wikipedia()
|
||||||
)
|
)
|
||||||
self.actionSearch.triggered.connect(self.search_playlist)
|
self.actionSearch.triggered.connect(self.search_playlist)
|
||||||
self.actionSelect_duplicate_rows.triggered.connect(self.select_duplicate_rows)
|
self.actionSelect_duplicate_rows.triggered.connect(
|
||||||
|
lambda: self.active_tab().select_duplicate_rows()
|
||||||
|
)
|
||||||
self.actionSelect_next_track.triggered.connect(self.select_next_row)
|
self.actionSelect_next_track.triggered.connect(self.select_next_row)
|
||||||
self.actionSelect_previous_track.triggered.connect(self.select_previous_row)
|
self.actionSelect_previous_track.triggered.connect(self.select_previous_row)
|
||||||
self.actionMoveUnplayed.triggered.connect(self.move_unplayed)
|
self.actionMoveUnplayed.triggered.connect(self.move_unplayed)
|
||||||
@ -1296,35 +1298,6 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
self.active_tab().set_search(self.txtSearch.text())
|
self.active_tab().set_search(self.txtSearch.text())
|
||||||
self.enable_play_next_controls()
|
self.enable_play_next_controls()
|
||||||
|
|
||||||
def select_duplicate_rows(self) -> None:
|
|
||||||
"""
|
|
||||||
Select the last of any rows with duplicate tracks in current playlist.
|
|
||||||
This allows the selection to typically come towards the end of the playlist away
|
|
||||||
from any show specific sections.
|
|
||||||
If there a track is selected on three or more rows, only the last one is selected.
|
|
||||||
"""
|
|
||||||
|
|
||||||
visible_playlist_id = self.active_tab().playlist_id
|
|
||||||
# Get row number of duplicate rows
|
|
||||||
sql = text(
|
|
||||||
f"""
|
|
||||||
SELECT max(plr_rownum)
|
|
||||||
FROM playlist_rows
|
|
||||||
WHERE playlist_id = {visible_playlist_id}
|
|
||||||
AND track_id != 0
|
|
||||||
GROUP BY track_id
|
|
||||||
HAVING count(id) > 1
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
|
|
||||||
with Session() as session:
|
|
||||||
row_numbers = [int(a) for a in session.execute(sql).scalars().all()]
|
|
||||||
if row_numbers:
|
|
||||||
self.active_tab().select_rows(row_numbers)
|
|
||||||
self.statusbar.showMessage(
|
|
||||||
f"{len(row_numbers)} duplicate rows selected", 10000
|
|
||||||
)
|
|
||||||
|
|
||||||
def select_next_row(self) -> None:
|
def select_next_row(self) -> None:
|
||||||
"""Select next or first row in playlist"""
|
"""Select next or first row in playlist"""
|
||||||
|
|
||||||
|
|||||||
@ -399,6 +399,26 @@ class PlaylistModel(QAbstractTableModel):
|
|||||||
|
|
||||||
return QVariant()
|
return QVariant()
|
||||||
|
|
||||||
|
def get_duplicate_rows(self) -> List[int]:
|
||||||
|
"""
|
||||||
|
Return a list of duplicate rows. If track appears in rows 2, 3 and 4, return [3, 4]
|
||||||
|
(ie, ignore the first, not-yet-duplicate, track).
|
||||||
|
"""
|
||||||
|
|
||||||
|
found = []
|
||||||
|
result = []
|
||||||
|
|
||||||
|
for i in range(len(self.playlist_rows)):
|
||||||
|
track_id = self.playlist_rows[i].track_id
|
||||||
|
if track_id is None:
|
||||||
|
continue
|
||||||
|
if track_id in found:
|
||||||
|
result.append(i)
|
||||||
|
else:
|
||||||
|
found.append(track_id)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
def edit_role(self, row: int, column: int, prd: PlaylistRowData) -> QVariant:
|
def edit_role(self, row: int, column: int, prd: PlaylistRowData) -> QVariant:
|
||||||
"""
|
"""
|
||||||
Return text for editing
|
Return text for editing
|
||||||
|
|||||||
@ -917,6 +917,26 @@ class PlaylistTab(QTableView):
|
|||||||
# if match_row is not None:
|
# if match_row is not None:
|
||||||
# self.selectRow(row_number)
|
# self.selectRow(row_number)
|
||||||
|
|
||||||
|
def select_duplicate_rows(self) -> None:
|
||||||
|
"""
|
||||||
|
Select the last of any rows with duplicate tracks in current playlist.
|
||||||
|
This allows the selection to typically come towards the end of the playlist away
|
||||||
|
from any show specific sections.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Clear any selected rows to avoid confustion
|
||||||
|
self.clear_selection()
|
||||||
|
# We need to be in MultiSelection mode
|
||||||
|
self.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection)
|
||||||
|
# Get the duplicate rows
|
||||||
|
model = cast(PlaylistModel, self.model())
|
||||||
|
duplicate_rows = model.get_duplicate_rows()
|
||||||
|
# Select the rows
|
||||||
|
for duplicate_row in duplicate_rows:
|
||||||
|
self.selectRow(duplicate_row)
|
||||||
|
# Reset selection mode
|
||||||
|
self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
|
||||||
|
|
||||||
def selectionChanged(
|
def selectionChanged(
|
||||||
self, selected: QItemSelection, deselected: QItemSelection
|
self, selected: QItemSelection, deselected: QItemSelection
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user