reworked browsing

This commit is contained in:
Martin Wagner 2022-11-23 18:18:56 +01:00
parent fab8604fd3
commit 3e4ca4a116
2 changed files with 19 additions and 47 deletions

View File

@ -110,10 +110,6 @@
<default>false</default> <default>false</default>
<summary>Stop playback on quit</summary> <summary>Stop playback on quit</summary>
</key> </key>
<key type="b" name="force-mode">
<default>false</default>
<summary>Play selected albums directly</summary>
</key>
<key type="b" name="mpris"> <key type="b" name="mpris">
<default>true</default> <default>true</default>
<summary>Provide MPRIS</summary> <summary>Provide MPRIS</summary>

View File

@ -763,12 +763,7 @@ class Client(MPDClient):
except: except:
return False return False
def _to_playlist(self, append, mode="default"): # modes: default, play, append, enqueue def _to_playlist(self, append, mode): # modes: play, append, enqueue
if mode == "default":
if self._settings.get_boolean("force-mode"):
mode="play"
else:
mode="enqueue"
if mode == "append": if mode == "append":
append() append()
elif mode == "play": elif mode == "play":
@ -793,13 +788,13 @@ class Client(MPDClient):
self.move(0, duplicates[1]["pos"]) self.move(0, duplicates[1]["pos"])
self.delete(int(duplicates[1]["pos"])-1) self.delete(int(duplicates[1]["pos"])-1)
def files_to_playlist(self, files, mode="default"): def files_to_playlist(self, files, mode):
def append(): def append():
for f in files: for f in files:
self.add(f) self.add(f)
self._to_playlist(append, mode) self._to_playlist(append, mode)
def filter_to_playlist(self, tag_filter, mode="default"): def filter_to_playlist(self, tag_filter, mode):
def append(): def append():
if tag_filter: if tag_filter:
self.findadd(*tag_filter) self.findadd(*tag_filter)
@ -807,7 +802,7 @@ class Client(MPDClient):
self.searchadd("any", "") self.searchadd("any", "")
self._to_playlist(append, mode) self._to_playlist(append, mode)
def album_to_playlist(self, albumartist, album, date, mode="default"): def album_to_playlist(self, albumartist, album, date, mode):
self.filter_to_playlist(("albumartist", albumartist, "album", album, "date", date), mode) self.filter_to_playlist(("albumartist", albumartist, "album", album, "date", date), mode)
def comp_list(self, *args): # simulates listing behavior of python-mpd2 1.0 def comp_list(self, *args): # simulates listing behavior of python-mpd2 1.0
@ -1069,7 +1064,6 @@ class BehaviorSettings(SettingsList):
(_("Support “MPRIS”"), "mpris", True), (_("Support “MPRIS”"), "mpris", True),
(_("Sort albums by year"), "sort-albums-by-year", False), (_("Sort albums by year"), "sort-albums-by-year", False),
(_("Send notification on title change"), "send-notify", False), (_("Send notification on title change"), "send-notify", False),
(_("Play selected albums and titles immediately"), "force-mode", False),
(_("Rewind via previous button"), "rewind-mode", False), (_("Rewind via previous button"), "rewind-mode", False),
(_("Stop playback on quit"), "stop-on-quit", False), (_("Stop playback on quit"), "stop-on-quit", False),
) )
@ -1420,7 +1414,7 @@ class SongsList(TreeView):
self._store.insert_with_valuesv(-1, range(5), [track, title, duration, file, search_string]) self._store.insert_with_valuesv(-1, range(5), [track, title, duration, file, search_string])
def _on_row_activated(self, widget, path, view_column): def _on_row_activated(self, widget, path, view_column):
self._client.files_to_playlist([self._store[path][3]]) self._client.files_to_playlist([self._store[path][3]], "play")
def _on_button_press_event(self, widget, event): def _on_button_press_event(self, widget, event):
if (path_re:=widget.get_path_at_pos(int(event.x), int(event.y))) is not None: if (path_re:=widget.get_path_at_pos(int(event.x), int(event.y))) is not None:
@ -1934,7 +1928,7 @@ class AlbumLoadingThread(threading.Thread):
idle_add(callback) idle_add(callback)
class AlbumList(Gtk.IconView): class AlbumList(Gtk.IconView):
__gsignals__={"show_info": (GObject.SignalFlags.RUN_FIRST, None, (str,str,str,))} __gsignals__={"album-selected": (GObject.SignalFlags.RUN_FIRST, None, (str,str,str,))}
def __init__(self, client, settings, artist_list): def __init__(self, client, settings, artist_list):
super().__init__(item_width=0,pixbuf_column=0,markup_column=1,activate_on_single_click=True,selection_mode=Gtk.SelectionMode.BROWSE) super().__init__(item_width=0,pixbuf_column=0,markup_column=1,activate_on_single_click=True,selection_mode=Gtk.SelectionMode.BROWSE)
self._settings=settings self._settings=settings
@ -1955,7 +1949,6 @@ class AlbumList(Gtk.IconView):
# connect # connect
self.connect("item-activated", self._on_item_activated) self.connect("item-activated", self._on_item_activated)
self.connect("button-press-event", self._on_button_press_event)
self._client.emitter.connect("disconnected", self._on_disconnected) self._client.emitter.connect("disconnected", self._on_disconnected)
self._client.emitter.connect("connected", self._on_connected) self._client.emitter.connect("connected", self._on_connected)
self._settings.connect("changed::sort-albums-by-year", self._sort_settings) self._settings.connect("changed::sort-albums-by-year", self._sort_settings)
@ -2021,27 +2014,13 @@ class AlbumList(Gtk.IconView):
else: else:
callback() callback()
def _path_to_playlist(self, path, mode="default"): def _path_to_playlist(self, path, mode):
tags=self._store[path][3:6] tags=self._store[path][3:6]
self._client.album_to_playlist(*tags, mode) self._client.album_to_playlist(*tags, mode)
def _on_button_press_event(self, widget, event):
path=widget.get_path_at_pos(int(event.x), int(event.y))
if event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
if path is not None:
self._path_to_playlist(path, "play")
elif event.button == 2 and event.type == Gdk.EventType.BUTTON_PRESS:
if path is not None:
self._path_to_playlist(path, "append")
elif event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS:
v=self.get_vadjustment().get_value()
h=self.get_hadjustment().get_value()
if path is not None:
tags=self._store[path][3:6]
self.emit("show-info", *tags)
def _on_item_activated(self, widget, path): def _on_item_activated(self, widget, path):
self._path_to_playlist(path) tags=self._store[path][3:6]
self.emit("album-selected", *tags)
def _on_disconnected(self, *args): def _on_disconnected(self, *args):
self.set_sensitive(False) self.set_sensitive(False)
@ -2049,15 +2028,6 @@ class AlbumList(Gtk.IconView):
def _on_connected(self, *args): def _on_connected(self, *args):
self.set_sensitive(True) self.set_sensitive(True)
def show_info(self):
if (path:=self.get_cursor()[1]) is not None:
tags=self._store[path][3:6]
self.emit("show-info", *tags)
def add_to_playlist(self, mode):
if (path:=self.get_cursor()[1]) is not None:
self._path_to_playlist(path, mode)
def _on_cover_size_changed(self, *args): def _on_cover_size_changed(self, *args):
if self._client.connected(): if self._client.connected():
self._refresh() self._refresh()
@ -2180,7 +2150,7 @@ class Browser(Gtk.Paned):
self._settings.connect("changed::genre-filter", self._on_genre_filter_changed) self._settings.connect("changed::genre-filter", self._on_genre_filter_changed)
# connect # connect
self._album_list.connect("show-info", self._on_album_list_show_info) self._album_list.connect("album-selected", self._on_album_list_show_info)
self._album_view.connect("close", lambda *args: self._album_stack.set_visible_child_name("album_list")) self._album_view.connect("close", lambda *args: self._album_stack.set_visible_child_name("album_list"))
self._artist_list.connect("item-selected", lambda *args: self._album_stack.set_visible_child_name("album_list")) self._artist_list.connect("item-selected", lambda *args: self._album_stack.set_visible_child_name("album_list"))
self._artist_list.connect("item-reselected", lambda *args: self._album_stack.set_visible_child_name("album_list")) self._artist_list.connect("item-reselected", lambda *args: self._album_stack.set_visible_child_name("album_list"))
@ -2299,6 +2269,12 @@ class PlaylistView(TreeView):
except IndexError: # invalid path except IndexError: # invalid path
pass pass
def _delete(self, path):
if path == self.get_property("selected-path"):
self._client.files_to_playlist([self._store[path][3]], "enqueue")
else:
self._store.remove(self._store.get_iter(path))
def _scroll_to_path(self, path): def _scroll_to_path(self, path):
self.save_scroll_to_cell(path, None, True, 0.25) self.save_scroll_to_cell(path, None, True, 0.25)
@ -2319,7 +2295,7 @@ class PlaylistView(TreeView):
if (path_re:=widget.get_path_at_pos(int(event.x), int(event.y))) is not None: if (path_re:=widget.get_path_at_pos(int(event.x), int(event.y))) is not None:
path=path_re[0] path=path_re[0]
if event.button == 2 and event.type == Gdk.EventType.BUTTON_PRESS: if event.button == 2 and event.type == Gdk.EventType.BUTTON_PRESS:
self._store.remove(self._store.get_iter(path)) self._delete(path)
elif event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS: elif event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS:
point=self.convert_bin_window_to_widget_coords(event.x,event.y) point=self.convert_bin_window_to_widget_coords(event.x,event.y)
self._song_popover.open(self._store[path][3], widget, *point) self._song_popover.open(self._store[path][3], widget, *point)
@ -2328,7 +2304,7 @@ class PlaylistView(TreeView):
if event.keyval == Gdk.keyval_from_name("Delete"): if event.keyval == Gdk.keyval_from_name("Delete"):
if (path:=self.get_cursor()[0]) is not None: if (path:=self.get_cursor()[0]) is not None:
try: try:
self._store.remove(self._store.get_iter(path)) self._delete(path)
except: except:
pass pass
@ -2586,7 +2562,7 @@ class CoverEventBox(Gtk.EventBox):
if (song:=self._client.currentsong()): if (song:=self._client.currentsong()):
tags=(song["albumartist"][0], song["album"][0], song["date"][0]) tags=(song["albumartist"][0], song["album"][0], song["date"][0])
if event.button == 1: if event.button == 1:
self._client.album_to_playlist(*tags) self._client.album_to_playlist(*tags, "enqueue")
self._click_pos=() self._click_pos=()
def _on_motion_notify_event(self, widget, event): def _on_motion_notify_event(self, widget, event):