From cd793f96686550c5ff6e177fde07137ae460321d Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Sun, 13 Apr 2025 15:17:01 +0100 Subject: [PATCH] WIP: fix ds names, tidy row moving --- app/musicmuster.py | 129 +++++++++++++++++++++++------------------- app/playlists.py | 2 +- app/querylistmodel.py | 2 +- 3 files changed, 72 insertions(+), 61 deletions(-) diff --git a/app/musicmuster.py b/app/musicmuster.py index 34288f3..5af05c3 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -67,8 +67,8 @@ from classes import ( Filter, MusicMusterSignals, PlaylistDTO, - TrackAndPlaylist, QueryDTO, + TrackAndPlaylist, TrackInfo, ) from config import Config @@ -472,7 +472,7 @@ class ManageQueries(ItemlistManager): # Build a list of queries query_list: list[ItemlistItem] = [] - for query in ds.get_all_queries(): + for query in ds.queries_all(): query_list.append( ItemlistItem( name=query.name, id=query.query_id, favourite=query.favourite @@ -494,7 +494,7 @@ class ManageQueries(ItemlistManager): "Delete query", f"Delete query '{query.name}': " "Are you sure?", ): - ds.delete_query(query_id) + ds.query_delete(query_id) self.refresh_table() @@ -503,8 +503,9 @@ class ManageQueries(ItemlistManager): dlg = FilterDialog(query.name, query.filter) if dlg.exec(): - ds.update_query_filter(query.query_id, dlg.filter) - ds.update_query_name(query.query_id, dlg.name_text.text()) + ds.query_update_filter + (query.query_id, dlg.filter) + ds.query_update_name(query.query_id, dlg.name_text.text()) def edit_item(self, query_id: int) -> None: """Edit query""" @@ -519,7 +520,7 @@ class ManageQueries(ItemlistManager): def toggle_favourite(self, query_id: int, favourite: bool) -> None: """Mark query as (not) favourite""" - ds.update_query_favourite(query_id, favourite) + ds.query_update_favourite(query_id, favourite) def new_item(self) -> None: """Create new query""" @@ -528,7 +529,7 @@ class ManageQueries(ItemlistManager): if not query_name: return - query = ds.create_query(query_name, Filter()) + query = ds.query_create(query_name, Filter()) self._edit_item(query) self.refresh_table() @@ -542,7 +543,7 @@ class ManageQueries(ItemlistManager): if not new_name: return - ds.update_query_name(query_id, new_name) + ds.query_update_name(query_id, new_name) self.change_text(query_id, new_name) @@ -567,7 +568,7 @@ class ManageTemplates(ItemlistManager): # Build a list of templates template_list: list[ItemlistItem] = [] - for template in ds.playlists_templates(): + for template in ds.playlists_templates_all(): template_list.append( ItemlistItem( name=template.name, @@ -602,7 +603,7 @@ class ManageTemplates(ItemlistManager): else: self.musicmuster.playlist_section.tabPlaylist.removeTab(open_idx) - ds.delete_playlist(template.playlist_id) + ds.playlist_delete(template.playlist_id) def edit_item(self, template_id: int) -> None: """Edit template""" @@ -619,7 +620,7 @@ class ManageTemplates(ItemlistManager): def toggle_favourite(self, template_id: int, favourite: bool) -> None: """Mark template as (not) favourite""" - ds.update_template_favourite(template_id, favourite) + ds.playlist_update_template_favourite(template_id, favourite) def new_item( self, @@ -634,12 +635,14 @@ class ManageTemplates(ItemlistManager): return # Get new template name - name = self.musicmuster.get_playlist_name(default="", prompt="New template name:") + name = self.musicmuster.get_playlist_name( + default="", prompt="New template name:" + ) if not name: return # Create playlist for template and mark is as a template - template = ds.create_playlist(name, template_id, as_template=True) + template = ds.playlist_create(name, template_id, as_template=True) # Open it for editing self.musicmuster._open_playlist(template, is_template=True) @@ -780,7 +783,7 @@ class QueryDialog(QDialog): self.query_list: list[tuple[str, int]] = [] self.query_list.append((Config.NO_QUERY_NAME, 0)) - for query in ds.get_all_queries(): + for query in ds.queries_all(): self.query_list.append((query.name, query.query_id)) self.setWindowTitle("Query Selector") @@ -908,9 +911,7 @@ class QueryDialog(QDialog): return for column_number in range(column_count - 1): attr_name = f"querylist_col_{column_number}_width" - ds.setting_set( - attr_name, self.table_view.columnWidth(column_number) - ) + ds.setting_set(attr_name, self.table_view.columnWidth(column_number)) def _column_resize(self, column_number: int, _old: int, _new: int) -> None: """ @@ -1022,6 +1023,12 @@ class SelectPlaylistDialog(QDialog): self.accept() +@dataclass +class MoveSource: + model: PlaylistModel + rows: list[int] + + class TemplateSelectorDialog(QDialog): """ Class to manage user selection of template @@ -1145,8 +1152,7 @@ class Window(QMainWindow): self.footer_section.widgetFadeVolume.setDefaultPadding(0) self.footer_section.widgetFadeVolume.setBackground(Config.FADE_CURVE_BACKGROUND) - self.move_source_rows: list[PlaylistRow] = [] - self.move_source_model: Optional[PlaylistModel] = None + self.move_source: MoveSource | None = None self.disable_selection_timing = False self.clock_counter = 0 @@ -1324,7 +1330,7 @@ class Window(QMainWindow): "separator": True, }, ] - templates = ds.playlists_templates() + templates = ds.playlists_templates_all() for template in templates: submenu_items.append( { @@ -1357,7 +1363,7 @@ class Window(QMainWindow): "separator": True, }, ] - queries = ds.get_all_queries(favourites_only=True) + queries = ds.queries_all(favourites_only=True) for query in queries: submenu_items.append( { @@ -1458,7 +1464,7 @@ class Window(QMainWindow): if not playlist_name: return - _ = ds.create_playlist(playlist_name, template_id) + _ = ds.playlist_create(playlist_name, template_id) # @log_call def delete_playlist(self, checked: bool = False) -> None: @@ -1474,7 +1480,7 @@ class Window(QMainWindow): f"Delete playlist '{playlist.name}': " "Are you sure?", ): if self.close_playlist_tab(): - ds.delete_playlist(self.current.playlist_id) + ds.playlist_delete(self.current.playlist_id) else: log.error("Failed to retrieve playlist") @@ -1491,7 +1497,7 @@ class Window(QMainWindow): def save_as_template(self, checked: bool = False) -> None: """Save current playlist as template""" - template_names = [a.name for a in ds.playlists_templates()] + template_names = [a.name for a in ds.playlists_templates_all()] while True: # Get name for new template @@ -1509,7 +1515,7 @@ class Window(QMainWindow): helpers.show_warning( self, "Duplicate template", "Template name already in use" ) - ds.save_as_template(self.current.playlist_id, template_name) + ds.playlist_save_as_template(self.current.playlist_id, template_name) helpers.show_OK("Template", "Template saved", self) def get_playlist_name( @@ -1520,7 +1526,7 @@ class Window(QMainWindow): dlg = QInputDialog(self) dlg.setInputMode(QInputDialog.InputMode.TextInput) dlg.setLabelText(prompt) - all_playlist_names = [a.name for a in ds.get_all_playlists()] + all_playlist_names = [a.name for a in ds.playlists_all()] while True: if default: @@ -1552,7 +1558,7 @@ class Window(QMainWindow): template_name_id_list: list[tuple[str, int]] = [] template_name_id_list.append((Config.NO_TEMPLATE_NAME, 0)) - for template in ds.playlists_templates(): + for template in ds.playlists_templates_all(): template_name_id_list.append((template.name, template.playlist_id)) dlg = TemplateSelectorDialog(template_name_id_list, template_prompt) @@ -1661,7 +1667,7 @@ class Window(QMainWindow): return False # Record playlist as closed - ds.playlist_mark_status(open=False) + ds.playlist_mark_status(closing_tab_playlist_id, open=False) # Close playlist and remove tab self.playlist_section.tabPlaylist.widget(tab_index).close() @@ -1828,7 +1834,7 @@ class Window(QMainWindow): with open(path, "w") as f: # Required directive on first line f.write("#EXTM3U\n") - for playlistrow in ds.get_playlist_rows(playlist_id): + for playlistrow in ds.playlistrows_by_playlist(playlist_id): if playlistrow.track: f.write( "#EXTINF:" @@ -1948,13 +1954,13 @@ class Window(QMainWindow): # Save the selected PlaylistRows items ready for a later # paste - self.move_source_rows = self.current.base_model.selected_rows - self.move_source_model = self.current.base_model - - log.debug( - f"mark_rows_for_moving(): {self.move_source_rows=} {self.move_source_model=}" + self.move_source = MoveSource( + model=self.current.base_model, + rows=[a.row_number for a in self.current.base_model.selected_rows], ) + log.debug(f"mark_rows_for_moving(): {self.move_source=}") + # @log_call def move_playlist_rows(self, row_numbers: list[int]) -> None: """ @@ -1965,7 +1971,7 @@ class Window(QMainWindow): playlists = [] source_playlist_id = self.current.playlist_id - for playlist in ds.get_all_playlists(): + for playlist in ds.playlists_all(): if playlist.id == source_playlist_id: continue else: @@ -2035,36 +2041,37 @@ class Window(QMainWindow): # @log_call def paste_rows(self, checked: bool = False) -> None: """ - Paste earlier cut rows. + Paste earlier rows identified in self.mark_rows_for_moving() + + 'checked' is a dummy parameter passed to us by the menu """ - if not self.move_source_rows or not self.move_source_model: + if not self.move_source: return to_playlist_model = self.current.base_model - destination_row = self.current_row_or_end() + from_playlist_model = self.move_source.model + to_row = self.current_row_or_end() + from_rows = self.move_source.rows - # If we move a row to immediately under the current track, make - # that moved row the next track - set_next_row: Optional[int] = None - if ( - self.track_sequence.current - and self.track_sequence.current.playlist_id == to_playlist_model.playlist_id - and destination_row == self.track_sequence.current.row_number + 1 - ): - set_next_row = destination_row - - if to_playlist_model.playlist_id == self.move_source_model.playlist_id: - self.move_source_model.move_rows(self.move_source_rows, destination_row) + if from_playlist_model == to_playlist_model: + from_playlist_model.move_rows(from_rows, to_row) else: - self.move_source_model.move_rows_between_playlists( - self.move_source_rows, destination_row, to_playlist_model.playlist_id + from_playlist_model.move_rows_between_playlists( + from_rows, to_row, to_playlist_model.playlist_id ) + self.active_tab().resize_rows() self.active_tab().clear_selection() - if set_next_row: - to_playlist_model.set_next_row(set_next_row) + # If we move a row to immediately under the current track, make + # that moved row the next track + if ( + self.track_sequence.current + and self.track_sequence.current.playlist_id == to_playlist_model.playlist_id + and to_row == self.track_sequence.current.row_number + 1 + ): + to_playlist_model.set_next_row(to_row) # @log_call def play_next( @@ -2141,8 +2148,10 @@ class Window(QMainWindow): # Notify others self.signals.signal_track_started.emit( - TrackAndPlaylist(self.track_sequence.current.playlist_id, - self.track_sequence.current.track_id) + TrackAndPlaylist( + self.track_sequence.current.playlist_id, + self.track_sequence.current.track_id, + ) ) # TODO: ensure signal_track_started does all this: @@ -2192,7 +2201,9 @@ class Window(QMainWindow): f"musicmuster.preview: unable to retreive track {track_info.track_id=}" ) self.preview_manager.set_track_info( - track_id=track.track_id, track_path=track.path, track_intro=track.intro or 0 + track_id=track.track_id, + track_path=track.path, + track_intro=track.intro or 0, ) self.preview_manager.play() self.show_status_message( @@ -2236,7 +2247,7 @@ class Window(QMainWindow): return intro = round(self.preview_manager.get_playtime() / 100) * 100 - ds.set_track_intro(track_id, intro) + ds.track_set_intro(track_id, intro) self.preview_manager.set_intro(intro) self.current.base_model.refresh_row(row_number) roles = [ @@ -2274,7 +2285,7 @@ class Window(QMainWindow): if playlist: new_name = self.get_playlist_name(playlist.name) if new_name: - ds.playlist_rename(playlist.id, new_name) + ds.playlist_rename(playlist.playlist_id, new_name) idx = self.tabBar.currentIndex() self.tabBar.setTabText(idx, new_name) diff --git a/app/playlists.py b/app/playlists.py index 507ce38..077acfd 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -574,7 +574,7 @@ class PlaylistTab(QTableView): "Rescan track", lambda: self._rescan(model_row_number) ) self._add_context_menu("Mark for moving", lambda: self._mark_for_moving()) - if self.musicmuster.move_source_rows: + if self.musicmuster.move_source: self._add_context_menu( "Move selected rows here", lambda: self._move_selected_rows() ) diff --git a/app/querylistmodel.py b/app/querylistmodel.py index 2af079f..354c428 100644 --- a/app/querylistmodel.py +++ b/app/querylistmodel.py @@ -228,7 +228,7 @@ class QuerylistModel(QAbstractTableModel): row = 0 try: - results = ds.get_filtered_tracks(self.filter) + results = ds.tracks_filtered(self.filter) for result in results: queryrow = QueryRow( artist=result.artist,