mirror of
https://github.com/SoongNoonien/mpdevil.git
synced 2023-08-10 21:12:44 +03:00
reworked browsing
This commit is contained in:
parent
fab8604fd3
commit
3e4ca4a116
@ -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>
|
||||||
|
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user