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