From 89804aaccb642c3aaf4e687cdd0a758af7eb734a Mon Sep 17 00:00:00 2001 From: billypom on debian Date: Fri, 18 Apr 2025 20:41:54 -0400 Subject: [PATCH] fix table selection things with proxymodel --- LICENSE | 29 ++++++++++++----------------- components/MusicTable.py | 27 ++++++++++++++++++--------- main.py | 2 +- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/LICENSE b/LICENSE index 8ebd132..7f4c0f5 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,16 @@ -MIT License +MusicPom - Qt music library manager and audio player for Linux -Copyright (c) 2024 billypom +Copyright (C) 2025 billypom -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/components/MusicTable.py b/components/MusicTable.py index 919bab5..caf2458 100644 --- a/components/MusicTable.py +++ b/components/MusicTable.py @@ -482,6 +482,10 @@ class MusicTable(QTableView): def delete_songs(self): """Asks to delete the currently selected songs from the db and music table (not the filesystem)""" + # FIXME: determine if we are in a playlist or not + # then delete songs from only the playlist + # or provide extra questionbox option + # | Delete from playlist & lib | Delete from playlist only | Cancel | selected_filepaths = self.get_selected_songs_filepaths() formatted_selected_filepaths = "\n".join(selected_filepaths) question_dialog = QuestionBoxDetails( @@ -708,12 +712,12 @@ class MusicTable(QTableView): else: std_item = QStandardItem(str(item) if item else "") items.append(std_item) - - self.model2.appendRow(items) # store database id in the row object using setData # - useful for fast db fetching and other model operations for item in items: item.setData(id, Qt.ItemDataRole.UserRole) + self.model2.appendRow(items) + self.model2.layoutChanged.emit() # emits a signal that the view should be updated self.playlistStatsSignal.emit(f"Songs: {row_count} | Total time: {total_time}") self.connect_data_changed() @@ -808,7 +812,7 @@ class MusicTable(QTableView): filepaths = [] for row in selected_rows: idx = self.proxymodel.index( - row, list(self.headers.gui.values()).index("path") + row, self.headers.user_headers.index("filepath") ) filepaths.append(idx.data()) return filepaths @@ -824,7 +828,7 @@ class MusicTable(QTableView): return [] selected_rows = set(index.row() for index in indexes) id_list = [ - self.model2.data(self.model2.index(row, 0), Qt.ItemDataRole.UserRole) + self.proxymodel.data(self.proxymodel.index(row, 0), Qt.ItemDataRole.UserRole) for row in selected_rows ] return id_list @@ -847,11 +851,16 @@ class MusicTable(QTableView): def set_selected_song_filepath(self) -> None: """Sets the filepath of the currently selected song""" - self.selected_song_filepath = ( - self.currentIndex() - .siblingAtColumn(list(self.headers.gui.values()).index("path")) - .data() - ) + try: + table_index = self.headers.user_headers.index("filepath") + filepath = self.currentIndex().siblingAtColumn(table_index).data() + except ValueError: + # if the user doesnt have filepath selected as a header, retrieve the file from db + row = self.currentIndex().row() + id = self.proxymodel.data(self.proxymodel.index(row, 0), Qt.ItemDataRole.UserRole) + with DBA.DBAccess() as db: + filepath = db.query('SELECT filepath FROM song WHERE id = ?', (id,))[0][0] + self.selected_song_filepath = filepath def set_current_song_filepath(self) -> None: """ diff --git a/main.py b/main.py index 5e0dd93..c4d3c8d 100644 --- a/main.py +++ b/main.py @@ -424,7 +424,7 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow): Start playback of `tableView.current_song_filepath` & moves playback slider """ if not filepath: - filepath = self.tableView.get_current_song_filepath() + filepath = self.tableView.get_selected_song_filepath() # get metadata metadata = get_tags(filepath)[0] # read the file