Compare commits

...

4 Commits

Author SHA1 Message Date
Martin Wagner a2e8ac875a updated German translation 2022-12-26 20:44:12 +01:00
Martin Wagner d4ab4f38c9 added A-B loop 2022-12-26 20:42:11 +01:00
Martin Wagner 8f55d37819 readded numpad shortcuts 2022-12-24 10:21:43 +01:00
Martin Wagner ad3938f784 reworked back buttons 2022-12-23 22:53:51 +01:00
4 changed files with 184 additions and 155 deletions

View File

@ -86,13 +86,6 @@
<property name="accelerator">&lt;Control&gt;f</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
<property name="title" translatable="yes">Back to current album</property>
<property name="accelerator">Escape</property>
</object>
</child>
</object>
</child>
<child>
@ -124,28 +117,28 @@
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
<property name="title" translatable="yes">Next title</property>
<property name="accelerator">&lt;Alt&gt;Down</property>
<property name="accelerator">&lt;Alt&gt;Down KP_Add</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
<property name="title" translatable="yes">Previous title</property>
<property name="accelerator">&lt;Alt&gt;Up</property>
<property name="accelerator">&lt;Alt&gt;Up KP_Subtract</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
<property name="title" translatable="yes">Seek forward</property>
<property name="accelerator">&lt;Alt&gt;Right</property>
<property name="accelerator">&lt;Alt&gt;Right KP_Multiply</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="visible">True</property>
<property name="title" translatable="yes">Seek backward</property>
<property name="accelerator">&lt;Alt&gt;Left</property>
<property name="accelerator">&lt;Alt&gt;Left KP_Divide</property>
</object>
</child>
<child>

126
po/de.po
View File

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-12-02 18:10+0100\n"
"PO-Revision-Date: 2022-12-02 18:12+0100\n"
"POT-Creation-Date: 2022-12-26 20:43+0100\n"
"PO-Revision-Date: 2022-12-26 20:44+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
@ -124,12 +124,12 @@ msgid "Cover regex:"
msgstr "Cover-Regex:"
#. connect button
#: src/mpdevil.py:1152 src/mpdevil.py:3117
#: src/mpdevil.py:1152 src/mpdevil.py:3155
msgid "Connect"
msgstr "Verbinden"
#: src/mpdevil.py:1175 src/mpdevil.py:1177 src/mpdevil.py:3118
#: src/mpdevil.py:3207
#: src/mpdevil.py:1175 src/mpdevil.py:1177 src/mpdevil.py:3156
#: src/mpdevil.py:3245
msgid "Preferences"
msgstr "Einstellungen"
@ -181,35 +181,28 @@ msgstr "<b>Gesamtwiedergabezeit:</b>"
msgid "<b>Database Update:</b>"
msgstr "<b>Datenbankaktualisierung:</b>"
#: src/mpdevil.py:1301 src/mpdevil.py:2166
#: src/mpdevil.py:1301 src/mpdevil.py:2175
msgid "No"
msgstr "Nr."
#: src/mpdevil.py:1302 src/mpdevil.py:2167
#: src/mpdevil.py:1302 src/mpdevil.py:2176
msgid "Title"
msgstr "Titel"
#: src/mpdevil.py:1303 src/mpdevil.py:2168
#: src/mpdevil.py:1303 src/mpdevil.py:2177
msgid "Length"
msgstr "Länge"
#: src/mpdevil.py:1317
msgid "Add all titles to playlist"
msgstr "Alle Titel der Wiedergabeliste anhängen"
#: src/mpdevil.py:1318
msgid "Directly play all titles"
msgstr "Alle Titel sofort abspielen"
#: src/mpdevil.py:1339
#: src/mpdevil.py:1317 src/mpdevil.py:1339
msgid "Append"
msgstr "Anhängen"
#: src/mpdevil.py:1340 src/mpdevil.py:2661 src/mpdevil.py:2694
#: src/mpdevil.py:1318 src/mpdevil.py:1340 src/mpdevil.py:2668
#: src/mpdevil.py:2701
msgid "Play"
msgstr "Abspielen"
#: src/mpdevil.py:1341 src/mpdevil.py:2188
#: src/mpdevil.py:1341 src/mpdevil.py:2197
msgid "Show"
msgstr "Anzeigen"
@ -239,133 +232,133 @@ msgid_plural "{number} songs ({duration})"
msgstr[0] "{number} Stück ({duration})"
msgstr[1] "{number} Stücke ({duration})"
#: src/mpdevil.py:2187
#: src/mpdevil.py:2196
msgid "Remove"
msgstr "Entfernen"
#: src/mpdevil.py:2190
#: src/mpdevil.py:2199
msgid "Enqueue Album"
msgstr "Album einreihen"
#: src/mpdevil.py:2191
#: src/mpdevil.py:2200
msgid "Tidy"
msgstr "Aufräumen"
#: src/mpdevil.py:2193
#: src/mpdevil.py:2202
msgid "Clear"
msgstr "Leeren"
#: src/mpdevil.py:2366
#: src/mpdevil.py:2375
msgid "Scroll to current song"
msgstr "Gehe zu aktuellem Lied"
#: src/mpdevil.py:2484
#: src/mpdevil.py:2493
msgid "searching…"
msgstr "suche…"
#: src/mpdevil.py:2489
#: src/mpdevil.py:2498
msgid "connection error"
msgstr "Verbindungsfehler"
#: src/mpdevil.py:2491
#: src/mpdevil.py:2500
msgid "lyrics not found"
msgstr "Liedtext nicht gefunden"
#: src/mpdevil.py:2605
#: src/mpdevil.py:2612
msgid "Lyrics"
msgstr "Liedtext"
#: src/mpdevil.py:2663 data/ShortcutsWindow.ui:112
#: src/mpdevil.py:2670 data/ShortcutsWindow.ui:105
msgid "Stop"
msgstr "Stopp"
#: src/mpdevil.py:2667 data/ShortcutsWindow.ui:133
#: src/mpdevil.py:2674 data/ShortcutsWindow.ui:126
msgid "Previous title"
msgstr "Vorheriger Titel"
#: src/mpdevil.py:2670 data/ShortcutsWindow.ui:126
#: src/mpdevil.py:2677 data/ShortcutsWindow.ui:119
msgid "Next title"
msgstr "Nächster Titel"
#: src/mpdevil.py:2691
#: src/mpdevil.py:2698
msgid "Pause"
msgstr "Pause"
#: src/mpdevil.py:2863
#: src/mpdevil.py:2901
msgid "Repeat mode"
msgstr "Dauerschleife"
#: src/mpdevil.py:2864
#: src/mpdevil.py:2902
msgid "Random mode"
msgstr "Zufallsmodus"
#: src/mpdevil.py:2865
#: src/mpdevil.py:2903
msgid "Single mode"
msgstr "Einzelstückmodus"
#: src/mpdevil.py:2866
#: src/mpdevil.py:2904
msgid "Consume mode"
msgstr "Wiedergabeliste verbrauchen"
#: src/mpdevil.py:3087
#: src/mpdevil.py:3125
msgid "Updating Database…"
msgstr "Datenbank aktualisieren…"
#: src/mpdevil.py:3135
#: src/mpdevil.py:3173
#, python-brace-format
msgid "Connection to “{socket}” failed"
msgstr "Verbindung zu „{socket}“ fehlgeschlagen"
#: src/mpdevil.py:3137
#: src/mpdevil.py:3175
#, python-brace-format
msgid "Connection to “{host}:{port}” failed"
msgstr "Verbindung zu „{host}:{port}“ fehlgeschlagen"
#: src/mpdevil.py:3191
#: src/mpdevil.py:3229
msgid "Search"
msgstr "Suche"
#: src/mpdevil.py:3194 data/ShortcutsWindow.ui:92
msgid "Back to current album"
msgstr "Zurück zu aktuellem Album"
#: src/mpdevil.py:3232
msgid "Back"
msgstr "Zurück"
#: src/mpdevil.py:3208
#: src/mpdevil.py:3246
msgid "Keyboard Shortcuts"
msgstr "Tastenkürzel"
#: src/mpdevil.py:3209
#: src/mpdevil.py:3247
msgid "Help"
msgstr "Hilfe"
#: src/mpdevil.py:3210
#: src/mpdevil.py:3248
msgid "About mpdevil"
msgstr "Info zu mpdevil"
#: src/mpdevil.py:3212
#: src/mpdevil.py:3250
msgid "Update Database"
msgstr "Datenbank aktualisieren"
#: src/mpdevil.py:3213
#: src/mpdevil.py:3251
msgid "Server Stats"
msgstr "Serverstatistik"
#: src/mpdevil.py:3215
#: src/mpdevil.py:3253
msgid "Mini Player"
msgstr "Miniplayer"
#: src/mpdevil.py:3216
#: src/mpdevil.py:3254
msgid "Genre Filter"
msgstr "Genrefilter"
#: src/mpdevil.py:3225
#: src/mpdevil.py:3263
msgid "Menu"
msgstr "Menü"
#: src/mpdevil.py:3399 src/mpdevil.py:3401
#: src/mpdevil.py:3437 src/mpdevil.py:3439
msgid "connecting…"
msgstr "verbinden…"
#: src/mpdevil.py:3439
#: src/mpdevil.py:3477
msgid "Debug mode"
msgstr "Debugmodus"
@ -429,42 +422,51 @@ msgstr "Liedtext ein-/ausblenden"
msgid "Toggle search"
msgstr "Suche ein-/ausblenden"
#: data/ShortcutsWindow.ui:101
#: data/ShortcutsWindow.ui:94
msgid "Playback"
msgstr "Wiedergabe"
#: data/ShortcutsWindow.ui:105
#: data/ShortcutsWindow.ui:98
msgid "Play/Pause"
msgstr "Wiedergabe/Pause"
#: data/ShortcutsWindow.ui:119
#: data/ShortcutsWindow.ui:112
msgid "Stop after current title"
msgstr "Nach aktuellem Titel stoppen"
#: data/ShortcutsWindow.ui:140
#: data/ShortcutsWindow.ui:133
msgid "Seek forward"
msgstr "Vorspulen"
#: data/ShortcutsWindow.ui:147
#: data/ShortcutsWindow.ui:140
msgid "Seek backward"
msgstr "Zurückspulen"
#: data/ShortcutsWindow.ui:154
#: data/ShortcutsWindow.ui:147
msgid "Toggle repeat mode"
msgstr "Dauerschleife ein-/ausschalten"
#: data/ShortcutsWindow.ui:161
#: data/ShortcutsWindow.ui:154
msgid "Toggle random mode"
msgstr "Zufallsmodus ein-/ausschalten"
#: data/ShortcutsWindow.ui:168
#: data/ShortcutsWindow.ui:161
msgid "Toggle single mode"
msgstr "Einzelstückmodus ein-/ausschalten"
#: data/ShortcutsWindow.ui:175
#: data/ShortcutsWindow.ui:168
msgid "Toggle consume mode"
msgstr "Wiedergabeliste verbrauchen ein-/ausschalten"
#~ msgid "Add all titles to playlist"
#~ msgstr "Alle Titel der Wiedergabeliste anhängen"
#~ msgid "Directly play all titles"
#~ msgstr "Alle Titel sofort abspielen"
#~ msgid "Back to current album"
#~ msgstr "Zurück zu aktuellem Album"
#~ msgid "Play selected albums and titles immediately"
#~ msgstr "Ausgewählte Alben und Titel sofort abspielen"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: mpdevil\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-12-02 18:10+0100\n"
"POT-Creation-Date: 2022-12-26 20:43+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -121,12 +121,12 @@ msgid "Cover regex:"
msgstr ""
#. connect button
#: src/mpdevil.py:1152 src/mpdevil.py:3117
#: src/mpdevil.py:1152 src/mpdevil.py:3155
msgid "Connect"
msgstr ""
#: src/mpdevil.py:1175 src/mpdevil.py:1177 src/mpdevil.py:3118
#: src/mpdevil.py:3207
#: src/mpdevil.py:1175 src/mpdevil.py:1177 src/mpdevil.py:3156
#: src/mpdevil.py:3245
msgid "Preferences"
msgstr ""
@ -178,35 +178,28 @@ msgstr ""
msgid "<b>Database Update:</b>"
msgstr ""
#: src/mpdevil.py:1301 src/mpdevil.py:2166
#: src/mpdevil.py:1301 src/mpdevil.py:2175
msgid "No"
msgstr ""
#: src/mpdevil.py:1302 src/mpdevil.py:2167
#: src/mpdevil.py:1302 src/mpdevil.py:2176
msgid "Title"
msgstr ""
#: src/mpdevil.py:1303 src/mpdevil.py:2168
#: src/mpdevil.py:1303 src/mpdevil.py:2177
msgid "Length"
msgstr ""
#: src/mpdevil.py:1317
msgid "Add all titles to playlist"
msgstr ""
#: src/mpdevil.py:1318
msgid "Directly play all titles"
msgstr ""
#: src/mpdevil.py:1339
#: src/mpdevil.py:1317 src/mpdevil.py:1339
msgid "Append"
msgstr ""
#: src/mpdevil.py:1340 src/mpdevil.py:2661 src/mpdevil.py:2694
#: src/mpdevil.py:1318 src/mpdevil.py:1340 src/mpdevil.py:2668
#: src/mpdevil.py:2701
msgid "Play"
msgstr ""
#: src/mpdevil.py:1341 src/mpdevil.py:2188
#: src/mpdevil.py:1341 src/mpdevil.py:2197
msgid "Show"
msgstr ""
@ -236,133 +229,133 @@ msgid_plural "{number} songs ({duration})"
msgstr[0] ""
msgstr[1] ""
#: src/mpdevil.py:2187
#: src/mpdevil.py:2196
msgid "Remove"
msgstr ""
#: src/mpdevil.py:2190
#: src/mpdevil.py:2199
msgid "Enqueue Album"
msgstr ""
#: src/mpdevil.py:2191
#: src/mpdevil.py:2200
msgid "Tidy"
msgstr ""
#: src/mpdevil.py:2193
#: src/mpdevil.py:2202
msgid "Clear"
msgstr ""
#: src/mpdevil.py:2366
#: src/mpdevil.py:2375
msgid "Scroll to current song"
msgstr ""
#: src/mpdevil.py:2484
#: src/mpdevil.py:2493
msgid "searching…"
msgstr ""
#: src/mpdevil.py:2489
#: src/mpdevil.py:2498
msgid "connection error"
msgstr ""
#: src/mpdevil.py:2491
#: src/mpdevil.py:2500
msgid "lyrics not found"
msgstr ""
#: src/mpdevil.py:2605
#: src/mpdevil.py:2612
msgid "Lyrics"
msgstr ""
#: src/mpdevil.py:2663 data/ShortcutsWindow.ui:112
#: src/mpdevil.py:2670 data/ShortcutsWindow.ui:105
msgid "Stop"
msgstr ""
#: src/mpdevil.py:2667 data/ShortcutsWindow.ui:133
#: src/mpdevil.py:2674 data/ShortcutsWindow.ui:126
msgid "Previous title"
msgstr ""
#: src/mpdevil.py:2670 data/ShortcutsWindow.ui:126
#: src/mpdevil.py:2677 data/ShortcutsWindow.ui:119
msgid "Next title"
msgstr ""
#: src/mpdevil.py:2691
#: src/mpdevil.py:2698
msgid "Pause"
msgstr ""
#: src/mpdevil.py:2863
#: src/mpdevil.py:2901
msgid "Repeat mode"
msgstr ""
#: src/mpdevil.py:2864
#: src/mpdevil.py:2902
msgid "Random mode"
msgstr ""
#: src/mpdevil.py:2865
#: src/mpdevil.py:2903
msgid "Single mode"
msgstr ""
#: src/mpdevil.py:2866
#: src/mpdevil.py:2904
msgid "Consume mode"
msgstr ""
#: src/mpdevil.py:3087
#: src/mpdevil.py:3125
msgid "Updating Database…"
msgstr ""
#: src/mpdevil.py:3135
#: src/mpdevil.py:3173
#, python-brace-format
msgid "Connection to “{socket}” failed"
msgstr ""
#: src/mpdevil.py:3137
#: src/mpdevil.py:3175
#, python-brace-format
msgid "Connection to “{host}:{port}” failed"
msgstr ""
#: src/mpdevil.py:3191
#: src/mpdevil.py:3229
msgid "Search"
msgstr ""
#: src/mpdevil.py:3194 data/ShortcutsWindow.ui:92
msgid "Back to current album"
#: src/mpdevil.py:3232
msgid "Back"
msgstr ""
#: src/mpdevil.py:3208
#: src/mpdevil.py:3246
msgid "Keyboard Shortcuts"
msgstr ""
#: src/mpdevil.py:3209
#: src/mpdevil.py:3247
msgid "Help"
msgstr ""
#: src/mpdevil.py:3210
#: src/mpdevil.py:3248
msgid "About mpdevil"
msgstr ""
#: src/mpdevil.py:3212
#: src/mpdevil.py:3250
msgid "Update Database"
msgstr ""
#: src/mpdevil.py:3213
#: src/mpdevil.py:3251
msgid "Server Stats"
msgstr ""
#: src/mpdevil.py:3215
#: src/mpdevil.py:3253
msgid "Mini Player"
msgstr ""
#: src/mpdevil.py:3216
#: src/mpdevil.py:3254
msgid "Genre Filter"
msgstr ""
#: src/mpdevil.py:3225
#: src/mpdevil.py:3263
msgid "Menu"
msgstr ""
#: src/mpdevil.py:3399 src/mpdevil.py:3401
#: src/mpdevil.py:3437 src/mpdevil.py:3439
msgid "connecting…"
msgstr ""
#: src/mpdevil.py:3439
#: src/mpdevil.py:3477
msgid "Debug mode"
msgstr ""
@ -426,38 +419,38 @@ msgstr ""
msgid "Toggle search"
msgstr ""
#: data/ShortcutsWindow.ui:101
#: data/ShortcutsWindow.ui:94
msgid "Playback"
msgstr ""
#: data/ShortcutsWindow.ui:105
#: data/ShortcutsWindow.ui:98
msgid "Play/Pause"
msgstr ""
#: data/ShortcutsWindow.ui:119
#: data/ShortcutsWindow.ui:112
msgid "Stop after current title"
msgstr ""
#: data/ShortcutsWindow.ui:140
#: data/ShortcutsWindow.ui:133
msgid "Seek forward"
msgstr ""
#: data/ShortcutsWindow.ui:147
#: data/ShortcutsWindow.ui:140
msgid "Seek backward"
msgstr ""
#: data/ShortcutsWindow.ui:154
#: data/ShortcutsWindow.ui:147
msgid "Toggle repeat mode"
msgstr ""
#: data/ShortcutsWindow.ui:161
#: data/ShortcutsWindow.ui:154
msgid "Toggle random mode"
msgstr ""
#: data/ShortcutsWindow.ui:168
#: data/ShortcutsWindow.ui:161
msgid "Toggle single mode"
msgstr ""
#: data/ShortcutsWindow.ui:175
#: data/ShortcutsWindow.ui:168
msgid "Toggle consume mode"
msgstr ""

View File

@ -2004,23 +2004,23 @@ class AlbumView(Gtk.Box):
self._title.set_line_wrap(True) # wrap=True is not working
self._duration=Gtk.Label(xalign=1, ellipsize=Pango.EllipsizeMode.END)
# close button
close_button=Gtk.Button(image=Gtk.Image.new_from_icon_name("go-previous-symbolic", Gtk.IconSize.BUTTON), halign=Gtk.Align.START)
# event box
event_box=Gtk.EventBox()
# connect
self.connect("hide", lambda *args: print("test"))
close_button.connect("clicked", lambda *args: self.emit("close"))
event_box.connect("button-press-event", self._on_button_press_event)
# packing
event_box.add(self._cover)
hbox=Gtk.Box(spacing=12)
hbox.pack_end(self.songs_list.buttons, False, False, 0)
hbox.pack_end(self._duration, False, False, 0)
vbox=Gtk.Box(orientation=Gtk.Orientation.VERTICAL, border_width=6)
vbox.pack_start(close_button, False, False, 0)
vbox.set_center_widget(self._title)
vbox.pack_end(hbox, False, False, 0)
header=Gtk.Box()
header.pack_start(self._cover, False, False, 0)
header.pack_start(event_box, False, False, 0)
header.pack_start(Gtk.Separator(), False, False, 0)
header.pack_start(vbox, True, True, 0)
self.pack_start(header, False, False, 0)
@ -2065,6 +2065,10 @@ class AlbumView(Gtk.Box):
size=self._settings.get_int("album-cover")*1.5
self._cover.set_from_pixbuf(cover.get_pixbuf(size))
def _on_button_press_event(self, widget, event):
if event.button == 1 and event.type == Gdk.EventType.BUTTON_PRESS:
self.emit("close")
class Browser(Gtk.Paned):
def __init__(self, client, settings):
super().__init__()
@ -2110,9 +2114,14 @@ class Browser(Gtk.Paned):
self.pack1(genre_window, False, False)
self.pack2(self.paned1, True, False)
def back_to_current_album(self):
self._album_stack.set_visible_child_name("album_list")
song=self._client.currentsong()
def back(self):
if self._album_stack.get_visible_child_name() == "album_view":
self._album_stack.set_visible_child_name("album_list")
else:
if (song:=self._client.currentsong()):
self._to_album(song)
def _to_album(self, song):
artist,genre=self._artist_list.get_artist_selected()
if genre is None or song["genre"][0] == genre:
if artist is None or song["albumartist"][0] == artist:
@ -2696,6 +2705,8 @@ class SeekBar(Gtk.Box):
super().__init__(hexpand=True, margin_start=6, margin_right=6)
self._client=client
self._update=True
self._first_mark=None
self._second_mark=None
# labels
attrs=Pango.AttrList()
@ -2717,13 +2728,16 @@ class SeekBar(Gtk.Box):
elapsed_dict={1: Gtk.ScrollType.STEP_BACKWARD, 3: Gtk.ScrollType.STEP_FORWARD}
rest_dict={1: Gtk.ScrollType.STEP_FORWARD, 3: Gtk.ScrollType.STEP_BACKWARD}
elapsed_event_box.connect("button-release-event", self._on_label_button_release_event, elapsed_dict)
elapsed_event_box.connect("button-press-event", self._on_label_button_press_event)
rest_event_box.connect("button-release-event", self._on_label_button_release_event, rest_dict)
rest_event_box.connect("button-press-event", self._on_label_button_press_event)
self._scale.connect("change-value", self._on_change_value)
self._scale.connect("scroll-event", lambda *args: True) # disable mouse wheel
self._scale.connect("button-press-event", self._on_scale_button_press_event)
self._scale.connect("button-release-event", self._on_scale_button_release_event)
self._adjustment.connect("notify::value", self._update_labels)
self._adjustment.connect("notify::upper", self._update_labels)
self._adjustment.connect("notify::upper", self._clear_marks)
self._client.emitter.connect("disconnected", self._disable)
self._client.emitter.connect("state", self._on_state)
self._client.emitter.connect("elapsed", self._refresh)
@ -2738,6 +2752,10 @@ class SeekBar(Gtk.Box):
if duration > 0:
self._adjustment.set_upper(duration)
if self._update:
if self._second_mark is not None:
if elapsed > self._second_mark:
self._client.seekcur(self._first_mark)
return
self._scale.set_value(elapsed)
self._scale.set_fill_level(elapsed)
else:
@ -2762,6 +2780,12 @@ class SeekBar(Gtk.Box):
self.set_sensitive(False)
self._scale.set_fill_level(0)
self._scale.set_range(0, 0)
self._clear_marks()
def _clear_marks(self, *args):
self._first_mark=None
self._second_mark=None
self._scale.clear_marks()
def _on_scale_button_press_event(self, widget, event):
self._update=False
@ -2777,6 +2801,22 @@ class SeekBar(Gtk.Box):
def _on_label_button_release_event(self, widget, event, scroll_type):
self._scale.emit("move-slider", scroll_type.get(event.button, Gtk.ScrollType.NONE))
def _on_label_button_press_event(self, widget, event):
if event.button == 2 and event.type == Gdk.EventType.BUTTON_PRESS:
value=self._scale.get_value()
if self._first_mark is None:
self._first_mark=value
self._scale.add_mark(value, Gtk.PositionType.BOTTOM, None)
elif self._second_mark is None:
if value < self._first_mark:
self._second_mark=self._first_mark
self._first_mark=value
else:
self._second_mark=value
self._scale.add_mark(value, Gtk.PositionType.BOTTOM, None)
else:
self._clear_marks()
def _on_state(self, emitter, state):
if state == "stop":
self._disable()
@ -3153,7 +3193,7 @@ class MainWindow(Gtk.ApplicationWindow):
self._size=None # needed for window size saving
# actions
simple_actions_data=("settings","connection-settings","stats","help","menu","toggle-lyrics","back-to-current-album","toggle-search")
simple_actions_data=("settings","connection-settings","stats","help","menu","toggle-lyrics","back","toggle-search")
for name in simple_actions_data:
action=Gio.SimpleAction.new(name, None)
action.connect("activate", getattr(self, ("_on_"+name.replace("-","_"))))
@ -3189,8 +3229,8 @@ class MainWindow(Gtk.ApplicationWindow):
image=icon("system-search-symbolic"), tooltip_text=_("Search"), can_focus=False, no_show_all=True)
self._settings.bind("mini-player", self._search_button, "visible", Gio.SettingsBindFlags.INVERT_BOOLEAN|Gio.SettingsBindFlags.GET)
back_button=Gtk.Button(
image=icon("go-previous-symbolic"), tooltip_text=_("Back to current album"),
action_name="win.back-to-current-album", can_focus=False, no_show_all=True)
image=icon("go-previous-symbolic"), tooltip_text=_("Back"),
action_name="win.back", can_focus=False, no_show_all=True)
self._settings.bind("mini-player", back_button, "visible", Gio.SettingsBindFlags.INVERT_BOOLEAN|Gio.SettingsBindFlags.GET)
# stack
@ -3318,9 +3358,11 @@ class MainWindow(Gtk.ApplicationWindow):
def _on_toggle_lyrics(self, action, param):
self._cover_lyrics_window.lyrics_button.emit("clicked")
def _on_back_to_current_album(self, action, param):
self._search_button.set_active(False)
self._browser.back_to_current_album()
def _on_back(self, action, param):
if self._search_button.get_active():
self._search_button.set_active(False)
else:
self._browser.back()
def _on_toggle_search(self, action, param):
self._search_button.emit("clicked")
@ -3354,7 +3396,6 @@ class MainWindow(Gtk.ApplicationWindow):
def _on_song_changed(self, *args):
if (song:=self._client.currentsong()):
self.lookup_action("back-to-current-album").set_enabled(True)
album=song.get_album_with_date()
title="".join(filter(None, (song["title"][0], str(song["artist"]))))
if self._use_csd:
@ -3375,19 +3416,18 @@ class MainWindow(Gtk.ApplicationWindow):
else:
self.get_application().withdraw_notification("title-change")
else:
self.lookup_action("back-to-current-album").set_enabled(False)
self._clear_title()
self.get_application().withdraw_notification("title-change")
def _on_connected(self, *args):
self._clear_title()
for action in ("stats","toggle-lyrics","toggle-search"):
for action in ("stats","toggle-lyrics","back","toggle-search"):
self.lookup_action(action).set_enabled(True)
self._search_button.set_sensitive(True)
def _on_disconnected(self, *args):
self._clear_title()
for action in ("stats","toggle-lyrics","back-to-current-album","toggle-search"):
for action in ("stats","toggle-lyrics","back","toggle-search"):
self.lookup_action(action).set_enabled(False)
self._search_button.set_active(False)
self._search_button.set_sensitive(False)
@ -3458,11 +3498,12 @@ class mpdevil(Gtk.Application):
action_accels=(
("app.quit", ["<Control>q"]),("win.mini-player", ["<Control>m"]),("win.help", ["F1"]),("win.menu", ["F10"]),
("win.show-help-overlay", ["<Control>question"]),("win.toggle-lyrics", ["<Control>l"]),
("win.genre-filter", ["<Control>g"]),("win.back-to-current-album", ["Escape"]),("win.toggle-search", ["<Control>f"]),
("win.genre-filter", ["<Control>g"]),("win.back", ["Escape"]),("win.toggle-search", ["<Control>f"]),
("mpd.update", ["F5"]),("mpd.clear", ["<Shift>Delete"]),("mpd.toggle-play", ["space"]),("mpd.stop", ["<Shift>space"]),
("mpd.next", ["<Alt>Down"]),("mpd.prev", ["<Alt>Up"]),("mpd.repeat", ["<Control>r"]),("mpd.random", ["<Control>n"]),
("mpd.single", ["<Control>s"]),("mpd.consume", ["<Control>o"]),("mpd.single-oneshot", ["<Shift><Control>s"]),
("mpd.seek-forward", ["<Alt>Right"]),("mpd.seek-backward", ["<Alt>Left"])
("mpd.next", ["<Alt>Down", "KP_Add"]),("mpd.prev", ["<Alt>Up", "KP_Subtract"]),("mpd.repeat", ["<Control>r"]),
("mpd.random", ["<Control>n"]),("mpd.single", ["<Control>s"]),("mpd.consume", ["<Control>o"]),
("mpd.single-oneshot", ["<Shift><Control>s"]),
("mpd.seek-forward", ["<Alt>Right", "KP_Multiply"]),("mpd.seek-backward", ["<Alt>Left", "KP_Divide"])
)
for action, accels in action_accels:
self.set_accels_for_action(action, accels)