From e96cca154f0f2e04820ecfd88155f692b0b9ca04 Mon Sep 17 00:00:00 2001 From: Martin Wagner Date: Tue, 29 Sep 2020 12:39:21 +0200 Subject: [PATCH] improved keyboard usability --- bin/mpdevil | 436 +++++++++++++++++++++++++++++-------------------- po/de.po | 299 +++++++++++++++++---------------- po/mpdevil.pot | 334 ++++++++++++++++++++----------------- 3 files changed, 605 insertions(+), 464 deletions(-) diff --git a/bin/mpdevil b/bin/mpdevil index 899f74a..61861e8 100755 --- a/bin/mpdevil +++ b/bin/mpdevil @@ -41,7 +41,7 @@ import dbus.service from dbus.mainloop.glib import DBusGMainLoop DBusGMainLoop(set_as_default=True) -VERSION="0.9.3" # sync with setup.py +VERSION="0.9.3-dev" # sync with setup.py COVER_REGEX=r"^\.?(album|cover|folder|front).*\.(gif|jpeg|jpg|png)$" @@ -551,6 +551,23 @@ class Client(MPDClient): meta_base.update(meta_extra) return meta_base + def toggle_play(self): + status=self.status() + if status["state"] == "play": + self.pause(1) + elif status["state"] == "pause": + self.pause(0) + else: + try: + self.play() + except: + pass + + def toggle_option(self, option): + new_state=(int(self.status()[option])+1)%2 # toggle 0,1 + func=getattr(self, option) + func(new_state) + def _main_loop(self, *args): try: status=self.status() @@ -2206,8 +2223,16 @@ class Browser(Gtk.Paned): for data in icons_data: self._icons[data]=PixelSizedIcon(data, self._icon_size) - self.back_to_current_album_button=Gtk.Button(image=self._icons["go-previous-symbolic"], tooltip_text=_("Back to current album")) - self.search_button=Gtk.ToggleButton(image=self._icons["system-search-symbolic"], tooltip_text=_("Search")) + self.back_to_current_album_button=Gtk.Button( + image=self._icons["go-previous-symbolic"], + tooltip_text=_("Back to current album"), + can_focus=False + ) + self.search_button=Gtk.ToggleButton( + image=self._icons["system-search-symbolic"], + tooltip_text=_("Search"), + can_focus=False + ) self.genre_select=GenreSelect(self._client) self._artist_window=ArtistWindow(self._client, self._settings, self.genre_select) self._search_window=SearchWindow(self._client) @@ -2582,14 +2607,16 @@ class PlaylistWindow(Gtk.Box): self._back_to_current_song_button=Gtk.Button( image=self._icons["go-previous-symbolic"], tooltip_text=_("Scroll to current song"), - relief=Gtk.ReliefStyle.NONE + relief=Gtk.ReliefStyle.NONE, + can_focus=False ) style_context=self._back_to_current_song_button.get_style_context() style_context.add_provider(provider, 800) self._clear_button=Gtk.Button( image=self._icons["edit-clear-symbolic"], tooltip_text=_("Clear playlist"), - relief=Gtk.ReliefStyle.NONE + relief=Gtk.ReliefStyle.NONE, + can_focus=False ) style_context=self._clear_button.get_style_context() style_context.add_class("destructive-action") @@ -2866,7 +2893,8 @@ class CoverPlaylistWindow(Gtk.Paned): # lyrics button self.lyrics_button=Gtk.ToggleButton( image=Gtk.Image.new_from_icon_name("media-view-subtitles-symbolic", Gtk.IconSize.BUTTON), - tooltip_text=_("Show lyrics") + tooltip_text=_("Show lyrics"), + can_focus=False ) self.lyrics_button.set_margin_top(6) self.lyrics_button.set_margin_end(6) @@ -2953,54 +2981,33 @@ class PlaybackControl(Gtk.ButtonBox): for data in icons_data: self._icons[data]=PixelSizedIcon(data, self._icon_size) - self.play_button=Gtk.Button(image=self._icons["media-playback-start-symbolic"]) - self.stop_button=Gtk.Button(image=self._icons["media-playback-stop-symbolic"]) - self.prev_button=Gtk.Button(image=self._icons["media-skip-backward-symbolic"]) - self.next_button=Gtk.Button(image=self._icons["media-skip-forward-symbolic"]) + self._play_button=Gtk.Button(image=self._icons["media-playback-start-symbolic"], can_focus=False) + self._stop_button=Gtk.Button(image=self._icons["media-playback-stop-symbolic"], can_focus=False) + self._prev_button=Gtk.Button(image=self._icons["media-skip-backward-symbolic"], can_focus=False) + self._next_button=Gtk.Button(image=self._icons["media-skip-forward-symbolic"], can_focus=False) # connect - self.play_button.connect("clicked", self._on_play_clicked) - self.stop_button.connect("clicked", self._on_stop_clicked) - self.stop_button.set_property("no-show-all", not(self._settings.get_boolean("show-stop"))) - self.prev_button.connect("clicked", self._on_prev_clicked) - self.next_button.connect("clicked", self._on_next_clicked) + self._play_button.connect("clicked", self._on_play_clicked) + self._stop_button.connect("clicked", self._on_stop_clicked) + self._stop_button.set_property("no-show-all", not(self._settings.get_boolean("show-stop"))) + self._prev_button.connect("clicked", self._on_prev_clicked) + self._next_button.connect("clicked", self._on_next_clicked) self._settings.connect("notify::mini-player", self._on_mini_player) self._settings.connect("changed::show-stop", self._on_show_stop_changed) self._settings.connect("changed::icon-size", self._on_icon_size_changed) self._client.emitter.connect("state", self._on_state) + self._client.emitter.connect("disconnected", self._on_disconnected) + self._client.emitter.connect("reconnected", self._on_reconnected) # packing - self.pack_start(self.prev_button, True, True, 0) - self.pack_start(self.play_button, True, True, 0) - self.pack_start(self.stop_button, True, True, 0) - self.pack_start(self.next_button, True, True, 0) - - def _on_state(self, emitter, state): - if state == "play": - self.play_button.set_image(self._icons["media-playback-pause-symbolic"]) - self.prev_button.set_sensitive(True) - self.next_button.set_sensitive(True) - elif state == "pause": - self.play_button.set_image(self._icons["media-playback-start-symbolic"]) - self.prev_button.set_sensitive(True) - self.next_button.set_sensitive(True) - else: - self.play_button.set_image(self._icons["media-playback-start-symbolic"]) - self.prev_button.set_sensitive(False) - self.next_button.set_sensitive(False) + self.pack_start(self._prev_button, True, True, 0) + self.pack_start(self._play_button, True, True, 0) + self.pack_start(self._stop_button, True, True, 0) + self.pack_start(self._next_button, True, True, 0) def _on_play_clicked(self, widget): if self._client.connected(): - status=self._client.wrapped_call("status") - if status["state"] == "play": - self._client.wrapped_call("pause", 1) - elif status["state"] == "pause": - self._client.wrapped_call("pause", 0) - else: - try: - self._client.wrapped_call("play") - except: - pass + self._client.wrapped_call("toggle_play") def _on_stop_clicked(self, widget): if self._client.connected(): @@ -3014,13 +3021,33 @@ class PlaybackControl(Gtk.ButtonBox): if self._client.connected(): self._client.wrapped_call("next") + def _on_state(self, emitter, state): + if state == "play": + self._play_button.set_image(self._icons["media-playback-pause-symbolic"]) + self._prev_button.set_sensitive(True) + self._next_button.set_sensitive(True) + elif state == "pause": + self._play_button.set_image(self._icons["media-playback-start-symbolic"]) + self._prev_button.set_sensitive(True) + self._next_button.set_sensitive(True) + else: + self._play_button.set_image(self._icons["media-playback-start-symbolic"]) + self._prev_button.set_sensitive(False) + self._next_button.set_sensitive(False) + + def _on_disconnected(self, *args): + self.set_sensitive(False) + + def _on_reconnected(self, *args): + self.set_sensitive(True) + def _on_mini_player(self, obj, typestring): self._on_show_stop_changed() def _on_show_stop_changed(self, *args): visibility=(self._settings.get_boolean("show-stop") and not self._settings.get_property("mini-player")) - self.stop_button.set_property("visible", visibility) - self.stop_button.set_property("no-show-all", not(visibility)) + self._stop_button.set_property("visible", visibility) + self._stop_button.set_property("no-show-all", not(visibility)) def _on_icon_size_changed(self, *args): pixel_size=self._settings.get_int("icon-size") @@ -3045,15 +3072,15 @@ class SeekBar(Gtk.Box): self._rest_event_box=Gtk.EventBox() # progress bar - self.scale=Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL) - self.scale.set_show_fill_level(True) - self.scale.set_restrict_to_fill_level(False) - self.scale.set_draw_value(False) - self.scale.set_increments(10, 60) - self._adjustment=self.scale.get_adjustment() + self._scale=Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, can_focus=False) + self._scale.set_show_fill_level(True) + self._scale.set_restrict_to_fill_level(False) + self._scale.set_draw_value(False) + self._scale.set_increments(10, 60) + self._adjustment=self._scale.get_adjustment() # css (scale) - style_context=self.scale.get_style_context() + style_context=self._scale.get_style_context() provider=Gtk.CssProvider() css=b"""scale fill { background-color: @theme_selected_bg_color; }""" provider.load_from_data(css) @@ -3061,13 +3088,13 @@ class SeekBar(Gtk.Box): # connect self._elapsed_event_box.connect("button-release-event", self._on_elapsed_button_release_event) - self._elapsed_event_box.connect("button-press-event", lambda *args: self.scale.grab_focus()) + self._elapsed_event_box.connect("button-press-event", lambda *args: self._scale.grab_focus()) self._rest_event_box.connect("button-release-event", self._on_rest_button_release_event) - self._rest_event_box.connect("button-press-event", lambda *args: self.scale.grab_focus()) - 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._rest_event_box.connect("button-press-event", lambda *args: self._scale.grab_focus()) + 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._client.emitter.connect("disconnected", self._disable) self._client.emitter.connect("state", self._on_state) self._client.emitter.connect("elapsed_changed", self._refresh) @@ -3076,7 +3103,7 @@ class SeekBar(Gtk.Box): self._elapsed_event_box.add(self._elapsed) self._rest_event_box.add(self._rest) self.pack_start(self._elapsed_event_box, False, False, 0) - self.pack_start(self.scale, True, True, 0) + self.pack_start(self._scale, True, True, 0) self.pack_end(self._rest_event_box, False, False, 0) def _refresh(self, emitter, elapsed, duration): @@ -3085,31 +3112,31 @@ class SeekBar(Gtk.Box): elapsed=duration self._adjustment.set_upper(duration) if self._update: - self.scale.set_value(elapsed) + self._scale.set_value(elapsed) self._elapsed.set_text(str(datetime.timedelta(seconds=int(elapsed))).lstrip("0").lstrip(":")) self._rest.set_text("-"+str(datetime.timedelta(seconds=int(duration-elapsed))).lstrip("0").lstrip(":")) - self.scale.set_fill_level(elapsed) + self._scale.set_fill_level(elapsed) def _disable(self, *args): self.set_sensitive(False) - self.scale.set_fill_level(0) - self.scale.set_range(0, 0) + self._scale.set_fill_level(0) + self._scale.set_range(0, 0) self._elapsed.set_text("--:--") self._rest.set_text("--:--") def _on_scale_button_press_event(self, widget, event): if event.button == 1 and event.type == Gdk.EventType.BUTTON_PRESS: self._update=False - self.scale.set_has_origin(False) + self._scale.set_has_origin(False) if event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS: self._jumped=False def _on_scale_button_release_event(self, widget, event): if event.button == 1: self._update=True - self.scale.set_has_origin(True) + self._scale.set_has_origin(True) if self._jumped: # actual seek - self._client.wrapped_call("seekcur", self.scale.get_value()) + self._client.wrapped_call("seekcur", self._scale.get_value()) self._jumped=False else: # restore state status=self._client.wrapped_call("status") @@ -3160,11 +3187,31 @@ class PlaybackOptions(Gtk.Box): for data in icons_data: self._icons[data]=PixelSizedIcon(data, self._icon_size) - self._random_button=Gtk.ToggleButton(image=self._icons["media-playlist-shuffle-symbolic"], tooltip_text=_("Random mode")) - self._repeat_button=Gtk.ToggleButton(image=self._icons["media-playlist-repeat-symbolic"], tooltip_text=_("Repeat mode")) - self._single_button=Gtk.ToggleButton(image=self._icons["zoom-original-symbolic"], tooltip_text=_("Single mode")) - self._consume_button=Gtk.ToggleButton(image=self._icons["edit-cut-symbolic"], tooltip_text=_("Consume mode")) - self._volume_button=Gtk.VolumeButton(use_symbolic=True, size=self._settings.get_gtk_icon_size("icon-size")) + self._random_button=Gtk.ToggleButton( + image=self._icons["media-playlist-shuffle-symbolic"], + tooltip_text=_("Random mode"), + can_focus=False + ) + self._repeat_button=Gtk.ToggleButton( + image=self._icons["media-playlist-repeat-symbolic"], + tooltip_text=_("Repeat mode"), + can_focus=False + ) + self._single_button=Gtk.ToggleButton( + image=self._icons["zoom-original-symbolic"], + tooltip_text=_("Single mode"), + can_focus=False + ) + self._consume_button=Gtk.ToggleButton( + image=self._icons["edit-cut-symbolic"], + tooltip_text=_("Consume mode"), + can_focus=False + ) + self._volume_button=Gtk.VolumeButton( + use_symbolic=True, + size=self._settings.get_gtk_icon_size("icon-size"), + can_focus=False + ) self._volume_button.set_sensitive(False) # do not allow volume change by user when MPD has not yet reported volume adj=self._volume_button.get_adjustment() adj.set_step_increment(0.05) @@ -3261,6 +3308,74 @@ class PlaybackOptions(Gtk.Box): icon.set_pixel_size(pixel_size) self._volume_button.set_property("size", self._settings.get_gtk_icon_size("icon-size")) +################### +# MPD gio actions # +################### +class MPDActionGroup(Gio.SimpleActionGroup): + def __init__(self, client): + super().__init__() + + # adding vars + self._client=client + + # actions + self._simple_actions_data=( + "toggle-play","stop","next","prev","seek-forward","seek-backward","clear","update", + "repeat","random","single","consume" + ) + for name in self._simple_actions_data: + action=Gio.SimpleAction.new(name, None) + action.connect("activate", getattr(self, ("_on_"+name.replace("-","_")))) + self.add_action(action) + + # connect + self._client.emitter.connect("disconnected", self._on_disconnected) + self._client.emitter.connect("reconnected", self._on_reconnected) + + def _on_toggle_play(self, action, param): + self._client.wrapped_call("toggle_play") + + def _on_stop(self, action, param): + self._client.wrapped_call("stop") + + def _on_next(self, action, param): + self._client.wrapped_call("next") + + def _on_prev(self, action, param): + self._client.wrapped_call("previous") + + def _on_seek_forward(self, action, param): + self._client.wrapped_call("seekcur", "+10") + + def _on_seek_backward(self, action, param): + self._client.wrapped_call("seekcur", "-10") + + def _on_clear(self, action, param): + self._client.wrapped_call("clear") + + def _on_update(self, action, param): + self._client.wrapped_call("update") + + def _on_repeat(self, action, param): + self._client.wrapped_call("toggle_option", "repeat") + + def _on_random(self, action, param): + self._client.wrapped_call("toggle_option", "random") + + def _on_single(self, action, param): + self._client.wrapped_call("toggle_option", "single") + + def _on_consume(self, action, param): + self._client.wrapped_call("toggle_option", "consume") + + def _on_disconnected(self, *args): + for action in self._simple_actions_data: + self.lookup_action(action).set_enabled(False) + + def _on_reconnected(self, *args): + for action in self._simple_actions_data: + self.lookup_action(action).set_enabled(True) + #################### # shortcuts window # #################### @@ -3280,26 +3395,34 @@ class ShortcutsWindow(Gtk.ShortcutsWindow): section.add(items_group) section.add(playlist_group) - shortcut_data=[ + shortcut_data=( + ("F1", _("Open online help"), None, general_group), + ("question", _("Open shortcuts window"), None, general_group), + ("F10", _("Open menu"), None, general_group), + ("F5", _("Update database"), None, general_group), + ("q", _("Quit"), None, general_group), ("m", _("Toggle mini player"), None, window_group), ("l", _("Toggle lyrics"), None, window_group), ("f", _("Toggle search"), None, window_group), ("Escape", _("Back to current album"), None, window_group), - ("F1", _("Open online help"), None, general_group), - ("q", _("Quit"), None, general_group), ("space", _("Play/Pause"), None, playback_group), + ("space", _("Stop"), None, playback_group), ("KP_Add", _("Next title"), None, playback_group), ("KP_Subtract", _("Previous title"), None, playback_group), ("KP_Multiply", _("Seek forward"), None, playback_group), ("KP_Divide", _("Seek backward"), None, playback_group), - ("F5", _("Update database"), None, playback_group), + ("r", _("Toggle repeat mode"), None, playback_group), + ("s", _("Toggle random mode"), None, playback_group), + ("1", _("Toggle single mode"), None, playback_group), + ("o", _("Toggle consume mode"), None, playback_group), ("p", _("Play selected item (next)"), _("Left-click"), items_group), ("a", _("Append selected item"), _("Middle-click"), items_group), ("Return", _("Play selected item immediately"), _("Double-click"), items_group), ("Menu", _("Show additional information"), _("Right-click"), items_group), ("Delete", _("Remove selected song"), _("Middle-click"), playlist_group), + ("Delete", _("Clear playlist"), None, playlist_group), ("Menu", _("Show additional information"), _("Right-click"), playlist_group) - ] + ) for accel, title, subtitle, group in shortcut_data: shortcut=Gtk.ShortcutsShortcut(visible=True, accelerator=accel, title=title, subtitle=subtitle) group.pack_start(shortcut, False, False, 0) @@ -3424,16 +3547,15 @@ class MainWindow(Gtk.ApplicationWindow): dbus_service=MPRISInterface(self, self._client, self._settings) # actions - simple_actions_data=[ - "save","settings","stats","update","help", - "toggle-lyrics","toggle-play","next","prev","back-to-current-album","seek-forward","seek-backward","toggle-search" - ] + simple_actions_data=("save","settings","stats","help","menu","toggle-lyrics","back-to-current-album","toggle-search") for name in simple_actions_data: action=Gio.SimpleAction.new(name, None) action.connect("activate", getattr(self, ("_on_"+name.replace("-","_")))) self.add_action(action) mini_player_action=Gio.PropertyAction.new("mini-player", self._settings, "mini-player") self.add_action(mini_player_action) + self._mpd_action_group=MPDActionGroup(self._client) + self.insert_action_group("mpd", self._mpd_action_group) # widgets self._icons={} @@ -3444,8 +3566,8 @@ class MainWindow(Gtk.ApplicationWindow): self._browser=Browser(self._client, self._settings, self) self._cover_playlist_window=CoverPlaylistWindow(self._client, self._settings, self) self._profile_select=ProfileSelect(self._settings) - self._playback_control=PlaybackControl(self._client, self._settings) - self._seek_bar=SeekBar(self._client) + playback_control=PlaybackControl(self._client, self._settings) + seek_bar=SeekBar(self._client) playback_options=PlaybackOptions(self._client, self._settings) connection_notify=ConnectionNotify(self._client, self._settings) @@ -3458,7 +3580,7 @@ class MainWindow(Gtk.ApplicationWindow): subsection.append(_("Quit"), "app.quit") mpd_subsection=Gio.Menu() - mpd_subsection.append(_("Update database"), "win.update") + mpd_subsection.append(_("Update database"), "mpd.update") mpd_subsection.append(_("Server stats"), "win.stats") menu=Gio.Menu() @@ -3467,14 +3589,14 @@ class MainWindow(Gtk.ApplicationWindow): menu.append_section(None, mpd_subsection) menu.append_section(None, subsection) - menu_button=Gtk.MenuButton(image=self._icons["open-menu-symbolic"], tooltip_text=_("Menu")) - menu_popover=Gtk.Popover.new_from_model(menu_button, menu) - menu_button.set_popover(menu_popover) + self._menu_button=Gtk.MenuButton(image=self._icons["open-menu-symbolic"], tooltip_text=_("Menu"), can_focus=False) + menu_popover=Gtk.Popover.new_from_model(self._menu_button, menu) + self._menu_button.set_popover(menu_popover) # action bar action_bar=Gtk.ActionBar() - action_bar.pack_start(self._playback_control) - action_bar.pack_start(self._seek_bar) + action_bar.pack_start(playback_control) + action_bar.pack_start(seek_bar) action_bar.pack_start(playback_options) # connect @@ -3506,13 +3628,13 @@ class MainWindow(Gtk.ApplicationWindow): self.set_titlebar(self._header_bar) self._header_bar.pack_start(self._browser.back_to_current_album_button) self._header_bar.pack_start(self._browser.genre_select) - self._header_bar.pack_end(menu_button) + self._header_bar.pack_end(self._menu_button) self._header_bar.pack_end(self._profile_select) self._header_bar.pack_end(self._browser.search_button) else: action_bar.pack_start(Gtk.Separator.new(orientation=Gtk.Orientation.VERTICAL)) action_bar.pack_start(self._profile_select) - action_bar.pack_start(menu_button) + action_bar.pack_start(self._menu_button) self.add(overlay) @@ -3521,6 +3643,39 @@ class MainWindow(Gtk.ApplicationWindow): self.maximize() self._client.start() # connect client + def _on_toggle_lyrics(self, action, param): + self._cover_playlist_window.lyrics_button.set_active(not(self._cover_playlist_window.lyrics_button.get_active())) + + def _on_back_to_current_album(self, action, param): + self._browser.back_to_current_album_button.emit("clicked") + + def _on_toggle_search(self, action, param): + self._browser.search_button.set_active(not(self._browser.search_button.get_active())) + + def _on_save(self, action, param): + size=self.get_size() + self._settings.set_int("width", size[0]) + self._settings.set_int("height", size[1]) + self._settings.set_boolean("maximize", self.is_maximized()) + self._browser.save_settings() + self._cover_playlist_window.save_settings() + self._settings.set_int("paned2", self._paned2.get_position()) + + def _on_settings(self, action, param): + settings=SettingsDialog(self, self._client, self._settings) + settings.run() + settings.destroy() + + def _on_stats(self, action, param): + stats=ServerStats(self, self._client, self._settings) + stats.destroy() + + def _on_help(self, action, param): + Gtk.show_uri_on_window(self, "https://github.com/SoongNoonien/mpdevil/wiki/Usage", Gdk.CURRENT_TIME) + + def _on_menu(self, action, param): + self._menu_button.emit("clicked") + def _on_song_changed(self, *args): song=self._client.wrapped_call("currentsong") if song == {}: @@ -3548,95 +3703,29 @@ class MainWindow(Gtk.ApplicationWindow): notify.show() def _on_reconnected(self, *args): - self._playback_control.set_sensitive(True) - self.action_enabled_changed - self.lookup_action("update").set_enabled(True) - self.lookup_action("stats").set_enabled(True) - self.lookup_action("toggle-lyrics").set_enabled(True) + for action in ("save","stats","toggle-lyrics","back-to-current-album","toggle-search"): + self.lookup_action(action).set_enabled(True) def _on_disconnected(self, *args): self.set_title("mpdevil") if self._use_csd: self._header_bar.set_subtitle("") - self._playback_control.set_sensitive(False) - self.lookup_action("update").set_enabled(False) - self.lookup_action("stats").set_enabled(False) - self.lookup_action("toggle-lyrics").set_enabled(False) + for action in ("save","stats","toggle-lyrics","back-to-current-album","toggle-search"): + self.lookup_action(action).set_enabled(False) def _on_search_focus_changed(self, obj, focus): - if focus: - self.lookup_action("toggle-play").set_enabled(False) - else: - self.lookup_action("toggle-play").set_enabled(True) - - def _on_toggle_lyrics(self, action, param): - self._cover_playlist_window.lyrics_button.grab_focus() - self._cover_playlist_window.lyrics_button.set_active(not(self._cover_playlist_window.lyrics_button.get_active())) - - def _on_toggle_play(self, action, param): - self._playback_control.play_button.grab_focus() - self._playback_control.play_button.emit("clicked") - - def _on_next(self, action, param): - self._playback_control.next_button.grab_focus() - self._playback_control.next_button.emit("clicked") - - def _on_prev(self, action, param): - self._playback_control.prev_button.grab_focus() - self._playback_control.prev_button.emit("clicked") - - def _on_back_to_current_album(self, action, param): - self._browser.back_to_current_album_button.grab_focus() - self._browser.back_to_current_album_button.emit("clicked") - - def _on_seek_forward(self, action, param): - self._seek_bar.scale.grab_focus() - self._client.wrapped_call("seekcur", "+10") - - def _on_seek_backward(self, action, param): - self._seek_bar.scale.grab_focus() - self._client.wrapped_call("seekcur", "-10") - - def _on_toggle_search(self, action, param): - self._browser.search_button.grab_focus() - self._browser.search_button.set_active(not(self._browser.search_button.get_active())) - - def _on_save(self, action, param): - size=self.get_size() - self._settings.set_int("width", size[0]) - self._settings.set_int("height", size[1]) - self._settings.set_boolean("maximize", self.is_maximized()) - self._browser.save_settings() - self._cover_playlist_window.save_settings() - self._settings.set_int("paned2", self._paned2.get_position()) - - def _on_settings(self, action, param): - settings=SettingsDialog(self, self._client, self._settings) - settings.run() - settings.destroy() - - def _on_stats(self, action, param): - stats=ServerStats(self, self._client, self._settings) - stats.destroy() - - def _on_update(self, action, param): - self._client.wrapped_call("update") - - def _on_help(self, action, param): - Gtk.show_uri_on_window(self, "https://github.com/SoongNoonien/mpdevil/wiki/Usage", Gdk.CURRENT_TIME) + self._mpd_action_group.lookup_action("toggle-play").set_enabled(not(focus)) def _on_mini_player(self, obj, typestring): if obj.get_property("mini-player"): + self.lookup_action("save").set_enabled(False) self._tmp_saved_size=self.get_size() self._tmp_saved_miximized=self.is_maximized() - self.lookup_action("save").set_enabled(False) - self.lookup_action("back-to-current-album").set_enabled(False) if self._tmp_saved_miximized: self.unmaximize() self.resize(1,1) else: self.lookup_action("save").set_enabled(True) - self.lookup_action("back-to-current-album").set_enabled(True) self.resize(self._tmp_saved_size[0], self._tmp_saved_size[1]) if self._tmp_saved_miximized: self.maximize() @@ -3672,18 +3761,17 @@ class mpdevil(Gtk.Application): self._window=MainWindow(self, self._client, self._settings) self._window.connect("delete-event", self._on_delete_event) # accelerators - self.set_accels_for_action("app.quit", ["q"]) - self.set_accels_for_action("win.mini-player", ["m"]) - self.set_accels_for_action("win.update", ["F5"]) - self.set_accels_for_action("win.help", ["F1"]) - self.set_accels_for_action("win.toggle-lyrics", ["l"]) - self.set_accels_for_action("win.toggle-play", ["space"]) - self.set_accels_for_action("win.next", ["KP_Add"]) - self.set_accels_for_action("win.prev", ["KP_Subtract",]) - self.set_accels_for_action("win.seek-forward", ["KP_Multiply"]) - self.set_accels_for_action("win.seek-backward", ["KP_Divide"]) - self.set_accels_for_action("win.back-to-current-album", ["Escape"]) - self.set_accels_for_action("win.toggle-search", ["f"]) + action_accels=( + ("app.quit", ["q"]),("win.mini-player", ["m"]),("win.help", ["F1"]),("win.menu", ["F10"]), + ("win.show-help-overlay", ["question"]),("win.toggle-lyrics", ["l"]), + ("win.back-to-current-album", ["Escape"]),("win.toggle-search", ["f"]), + ("mpd.update", ["F5"]),("mpd.clear", ["Delete"]),("mpd.toggle-play", ["space"]), + ("mpd.stop", ["space"]),("mpd.next", ["KP_Add"]),("mpd.prev", ["KP_Subtract"]), + ("mpd.repeat", ["r"]),("mpd.random", ["s"]),("mpd.single", ["1"]), + ("mpd.consume", ["o"]),("mpd.seek-forward", ["KP_Multiply"]),("mpd.seek-backward", ["KP_Divide"]) + ) + for action, accels in action_accels: + self.set_accels_for_action(action, accels) self._window.present() def do_startup(self): diff --git a/po/de.po b/po/de.po index 2a750b9..bea2548 100644 --- a/po/de.po +++ b/po/de.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-09-24 21:14+0200\n" -"PO-Revision-Date: 2020-09-24 21:16+0200\n" +"POT-Creation-Date: 2020-09-29 12:34+0200\n" +"PO-Revision-Date: 2020-09-29 12:37+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: de\n" @@ -18,103 +18,103 @@ msgstr "" "X-Generator: Poedit 2.3.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: mpdevil:473 +#: mpdevil:404 msgid "Unknown Title" msgstr "Unbekannter Titel" -#: mpdevil:749 +#: mpdevil:693 msgid "Main cover size:" msgstr "Größe des Haupt-Covers:" -#: mpdevil:750 +#: mpdevil:694 msgid "Album view cover size:" msgstr "Covergröße in Albumliste:" -#: mpdevil:751 +#: mpdevil:695 msgid "Action bar icon size:" msgstr "Symbolgröße Aktionsleiste:" -#: mpdevil:752 +#: mpdevil:696 msgid "Secondary icon size:" msgstr "Sekundäre Symbolgröße:" -#: mpdevil:765 +#: mpdevil:709 msgid "Sort albums by:" msgstr "Sortiere Alben nach:" -#: mpdevil:765 +#: mpdevil:709 msgid "name" msgstr "Name" -#: mpdevil:765 +#: mpdevil:709 msgid "year" msgstr "Jahr" -#: mpdevil:766 +#: mpdevil:710 msgid "Position of playlist:" msgstr "Wiedergabelistenposition:" -#: mpdevil:766 +#: mpdevil:710 msgid "bottom" msgstr "unten" -#: mpdevil:766 +#: mpdevil:710 msgid "right" msgstr "rechts" -#: mpdevil:784 +#: mpdevil:728 msgid "Use Client-side decoration" msgstr "Benutze \"Client-side decoration\"" -#: mpdevil:785 +#: mpdevil:729 msgid "Show stop button" msgstr "Zeige Stopp-Knopf" -#: mpdevil:786 +#: mpdevil:730 msgid "Show lyrics button" msgstr "Zeige Liedtext-Knopf" -#: mpdevil:787 +#: mpdevil:731 msgid "Show initials in artist view" msgstr "Zeige Anfangsbuchstaben in Interpretenliste" -#: mpdevil:788 +#: mpdevil:732 msgid "Show tooltips in album view" msgstr "Zeige Tooltips in Albumliste" -#: mpdevil:789 +#: mpdevil:733 msgid "Use 'Album Artist' tag" msgstr "Benutze \"Album Artist\" Tag" -#: mpdevil:790 +#: mpdevil:734 msgid "Send notification on title change" msgstr "Sende Benachrichtigung bei Titelwechsel" -#: mpdevil:791 +#: mpdevil:735 msgid "Stop playback on quit" msgstr "Wiedergabe beim Beenden stoppen" -#: mpdevil:792 +#: mpdevil:736 msgid "Play selected albums and titles immediately" msgstr "Ausgewählte Alben und Titel sofort abspielen" -#: mpdevil:805 +#: mpdevil:749 msgid "View" msgstr "Ansicht" -#: mpdevil:806 +#: mpdevil:750 msgid "Behavior" msgstr "Verhalten" -#: mpdevil:838 +#: mpdevil:782 msgid "(restart required)" msgstr "(Neustart erforderlich)" -#: mpdevil:900 mpdevil:3460 +#: mpdevil:844 mpdevil:3493 msgid "Connect" msgstr "Verbinden" -#: mpdevil:916 +#: mpdevil:860 msgid "" "The first image in the same directory as the song file matching this regex " "will be displayed. %AlbumArtist% and %Album% will be replaced by the " @@ -124,125 +124,125 @@ msgstr "" "regulären Ausdruck entspricht, wird angezeigt. %AlbumArtist% und %Album% " "werden durch die entsprechenden Tags des Liedes ersetzt." -#: mpdevil:921 +#: mpdevil:865 msgid "Profile:" msgstr "Profil:" -#: mpdevil:922 +#: mpdevil:866 msgid "Name:" msgstr "Name:" -#: mpdevil:923 +#: mpdevil:867 msgid "Host:" msgstr "Host:" -#: mpdevil:924 +#: mpdevil:868 msgid "Password:" msgstr "Passwort:" -#: mpdevil:925 +#: mpdevil:869 msgid "Music lib:" msgstr "Musikverzeichnis:" -#: mpdevil:926 +#: mpdevil:870 msgid "Cover regex:" msgstr "Cover-Regex:" -#: mpdevil:1057 +#: mpdevil:1001 msgid "Choose directory" msgstr "Verzeichnis Wählen" -#: mpdevil:1090 +#: mpdevil:1034 msgid "Choose the order of information to appear in the playlist:" msgstr "" "Lege die Reihenfolge fest, in der Informationen in der Wiedergabeliste " "angezeigt werden sollen:" -#: mpdevil:1114 mpdevil:1632 mpdevil:1970 mpdevil:2688 +#: mpdevil:1058 mpdevil:1576 mpdevil:1914 mpdevil:2642 msgid "No" msgstr "Nr." -#: mpdevil:1114 mpdevil:2689 +#: mpdevil:1058 mpdevil:2643 msgid "Disc" msgstr "CD" -#: mpdevil:1114 mpdevil:1637 mpdevil:1975 mpdevil:2690 +#: mpdevil:1058 mpdevil:1581 mpdevil:1919 mpdevil:2644 msgid "Title" msgstr "Titel" -#: mpdevil:1114 mpdevil:1643 mpdevil:1862 mpdevil:2691 +#: mpdevil:1058 mpdevil:1587 mpdevil:1806 mpdevil:2645 msgid "Artist" msgstr "Interpret" -#: mpdevil:1114 mpdevil:1649 mpdevil:2692 +#: mpdevil:1058 mpdevil:1593 mpdevil:2646 msgid "Album" msgstr "Album" -#: mpdevil:1114 mpdevil:1655 mpdevil:1981 mpdevil:2693 +#: mpdevil:1058 mpdevil:1599 mpdevil:1925 mpdevil:2647 msgid "Length" msgstr "Länge" -#: mpdevil:1114 mpdevil:2694 +#: mpdevil:1058 mpdevil:2648 msgid "Year" msgstr "Jahr" -#: mpdevil:1114 mpdevil:2695 +#: mpdevil:1058 mpdevil:2649 msgid "Genre" msgstr "Genre" -#: mpdevil:1230 mpdevil:1238 mpdevil:3544 +#: mpdevil:1174 mpdevil:1182 mpdevil:3576 msgid "Settings" msgstr "Einstellungen" -#: mpdevil:1249 mpdevil:3361 +#: mpdevil:1193 mpdevil:3386 msgid "General" msgstr "Allgemein" -#: mpdevil:1250 +#: mpdevil:1194 msgid "Profiles" msgstr "Profile" -#: mpdevil:1251 mpdevil:3365 +#: mpdevil:1195 mpdevil:3390 msgid "Playlist" msgstr "Wiedergabeliste" -#: mpdevil:1266 mpdevil:1274 +#: mpdevil:1210 mpdevil:1218 msgid "Stats" msgstr "Statistik" -#: mpdevil:1323 +#: mpdevil:1267 msgid "A simple music browser for MPD" msgstr "Ein einfacher Musikbrowser für MPD" -#: mpdevil:1395 +#: mpdevil:1339 msgid "MPD-Tag" msgstr "MPD-Tag" -#: mpdevil:1399 +#: mpdevil:1343 msgid "Value" msgstr "Wert" -#: mpdevil:1553 +#: mpdevil:1497 msgid "Append" msgstr "Anhängen" -#: mpdevil:1554 +#: mpdevil:1498 msgid "Add all titles to playlist" msgstr "Alle Titel der Wiedergabeliste anhängen" -#: mpdevil:1555 +#: mpdevil:1499 msgid "Play" msgstr "Abspielen" -#: mpdevil:1556 +#: mpdevil:1500 msgid "Directly play all titles" msgstr "Alle Titel sofort abspielen" -#: mpdevil:1557 +#: mpdevil:1501 msgid "Enqueue" msgstr "Einreihen" -#: mpdevil:1558 +#: mpdevil:1502 msgid "" "Append all titles after the currently playing track and clear the playlist " "from all other songs" @@ -250,58 +250,58 @@ msgstr "" "Alle Titel hinter dem aktuellen Stück einreihen und die weitere " "Wiedergabeliste leeren" -#: mpdevil:1714 +#: mpdevil:1658 #, python-brace-format msgid "{num} hits" msgstr "{num} Treffer" -#: mpdevil:1752 +#: mpdevil:1696 msgid "all genres" msgstr "Alle Genres" -#: mpdevil:1860 +#: mpdevil:1804 msgid "Album Artist" msgstr "Albuminterpret" -#: mpdevil:1863 +#: mpdevil:1807 msgid "all artists" msgstr "Alle Interpreten" -#: mpdevil:1987 +#: mpdevil:1931 msgid "Close" msgstr "Schließen" -#: mpdevil:2152 +#: mpdevil:2096 #, python-brace-format msgid "{titles} titles on {discs} discs ({length})" msgstr "{titles} Titel auf {discs} CDs ({length})" -#: mpdevil:2155 mpdevil:2783 +#: mpdevil:2099 mpdevil:2737 #, python-brace-format msgid "{titles} titles ({length})" msgstr "{titles} Titel ({length})" -#: mpdevil:2282 mpdevil:3377 +#: mpdevil:2228 mpdevil:3407 msgid "Back to current album" msgstr "Zurück zu aktuellem Album" -#: mpdevil:2283 +#: mpdevil:2233 msgid "Search" msgstr "Suche" -#: mpdevil:2467 +#: mpdevil:2419 msgid "searching..." msgstr "suche..." -#: mpdevil:2472 +#: mpdevil:2424 msgid "connection error" msgstr "Verbindungsfehler" -#: mpdevil:2474 +#: mpdevil:2426 msgid "lyrics not found" msgstr "Liedtext nicht gefunden" -#: mpdevil:2522 +#: mpdevil:2474 #, python-brace-format msgid "" "{bitrate} kb/s, {frequency} kHz, {resolution} bit, {channels} channels, " @@ -310,160 +310,188 @@ msgstr "" "{bitrate} kb/s, {frequency} kHz, {resolution} bit, {channels} Kanäle, " "{file_type}" -#: mpdevil:2657 +#: mpdevil:2609 msgid "Scroll to current song" msgstr "Gehe zu aktuellem Lied" -#: mpdevil:2664 +#: mpdevil:2617 mpdevil:3423 msgid "Clear playlist" msgstr "Wiedergabeliste leeren" -#: mpdevil:2939 +#: mpdevil:2896 msgid "Show lyrics" msgstr "Zeige Liedtext" -#: mpdevil:3253 +#: mpdevil:3192 msgid "Random mode" msgstr "Zufallsmodus" -#: mpdevil:3254 +#: mpdevil:3197 msgid "Repeat mode" msgstr "Dauerschleife" -#: mpdevil:3255 +#: mpdevil:3202 msgid "Single mode" msgstr "Einzelstückmodus" -#: mpdevil:3256 +#: mpdevil:3207 msgid "Consume mode" msgstr "Wiedergabeliste verbrauchen" -#: mpdevil:3362 +#: mpdevil:3387 msgid "Window" msgstr "Fenster" -#: mpdevil:3363 +#: mpdevil:3388 msgid "Playback" msgstr "Wiedergabe" -#: mpdevil:3364 +#: mpdevil:3389 msgid "Search, Album Dialog and Album List" msgstr "Suche, Albumdialog und Albumliste" -#: mpdevil:3374 -msgid "Toggle mini player" -msgstr "Miniplayer ein-/ausschalten" - -#: mpdevil:3375 -msgid "Toggle lyrics" -msgstr "Liedtext ein-/ausblenden" - -#: mpdevil:3376 -msgid "Toggle search" -msgstr "Suche ein-/ausblenden" - -#: mpdevil:3378 +#: mpdevil:3399 msgid "Open online help" msgstr "Onlinehilfe öffnen" -#: mpdevil:3379 mpdevil:3548 -msgid "Quit" -msgstr "Beenden" +#: mpdevil:3400 +msgid "Open shortcuts window" +msgstr "Tastenkürzelfenster öffnen" -#: mpdevil:3380 -msgid "Play/Pause" -msgstr "Wiedergabe/Pause" +#: mpdevil:3401 +msgid "Open menu" +msgstr "Menü öffnen" -#: mpdevil:3381 -msgid "Next title" -msgstr "Nächster Titel" - -#: mpdevil:3382 -msgid "Previous title" -msgstr "Vorheriger Titel" - -#: mpdevil:3383 -msgid "Seek forward" -msgstr "Vorspulen" - -#: mpdevil:3384 -msgid "Seek backward" -msgstr "Zurückspulen" - -#: mpdevil:3385 mpdevil:3551 +#: mpdevil:3402 mpdevil:3583 msgid "Update database" msgstr "Datenbank aktualisieren" -#: mpdevil:3386 +#: mpdevil:3403 mpdevil:3580 +msgid "Quit" +msgstr "Beenden" + +#: mpdevil:3404 +msgid "Toggle mini player" +msgstr "Miniplayer ein-/ausschalten" + +#: mpdevil:3405 +msgid "Toggle lyrics" +msgstr "Liedtext ein-/ausblenden" + +#: mpdevil:3406 +msgid "Toggle search" +msgstr "Suche ein-/ausblenden" + +#: mpdevil:3408 +msgid "Play/Pause" +msgstr "Wiedergabe/Pause" + +#: mpdevil:3409 +msgid "Stop" +msgstr "Stopp" + +#: mpdevil:3410 +msgid "Next title" +msgstr "Nächster Titel" + +#: mpdevil:3411 +msgid "Previous title" +msgstr "Vorheriger Titel" + +#: mpdevil:3412 +msgid "Seek forward" +msgstr "Vorspulen" + +#: mpdevil:3413 +msgid "Seek backward" +msgstr "Zurückspulen" + +#: mpdevil:3414 +msgid "Toggle repeat mode" +msgstr "Dauerschleife ein-/ausschalten" + +#: mpdevil:3415 +msgid "Toggle random mode" +msgstr "Zufallsmodus ein-/ausschalten" + +#: mpdevil:3416 +msgid "Toggle single mode" +msgstr "Einzelstückmodus ein-/ausschalten" + +#: mpdevil:3417 +msgid "Toggle consume mode" +msgstr "Wiedergabeliste verbrauchen ein-/ausschalten" + +#: mpdevil:3418 msgid "Play selected item (next)" msgstr "Ausgewähltes Element (als Nächstes) abspielen" -#: mpdevil:3386 +#: mpdevil:3418 msgid "Left-click" msgstr "Linksklick" -#: mpdevil:3387 +#: mpdevil:3419 msgid "Append selected item" msgstr "Ausgewähltes Element anhängen" -#: mpdevil:3387 mpdevil:3390 +#: mpdevil:3419 mpdevil:3422 msgid "Middle-click" msgstr "Mittelklick" -#: mpdevil:3388 +#: mpdevil:3420 msgid "Play selected item immediately" msgstr "Ausgewähltes Element sofort abspielen" -#: mpdevil:3388 +#: mpdevil:3420 msgid "Double-click" msgstr "Doppelklick" -#: mpdevil:3389 mpdevil:3391 +#: mpdevil:3421 mpdevil:3424 msgid "Show additional information" msgstr "Zeige weitere Informationen" -#: mpdevil:3389 mpdevil:3391 +#: mpdevil:3421 mpdevil:3424 msgid "Right-click" msgstr "Rechtsklick" -#: mpdevil:3390 +#: mpdevil:3422 msgid "Remove selected song" msgstr "Ausgewählten Titel entfernen" -#: mpdevil:3405 +#: mpdevil:3438 msgid "Select profile" msgstr "Profil auswählen" -#: mpdevil:3478 +#: mpdevil:3511 #, python-brace-format msgid "Connection to '{profile}' ({host}:{port}) failed" msgstr "Verbindung zu \"{profile}\" ({host}:{port}) fehlgeschlagen" -#: mpdevil:3545 +#: mpdevil:3577 msgid "Keyboard shortcuts" msgstr "Tastenkürzel" -#: mpdevil:3546 +#: mpdevil:3578 msgid "Help" msgstr "Hilfe" -#: mpdevil:3547 +#: mpdevil:3579 msgid "About" msgstr "Über" -#: mpdevil:3552 +#: mpdevil:3584 msgid "Server stats" msgstr "Serverstatistik" -#: mpdevil:3555 +#: mpdevil:3587 msgid "Save window layout" msgstr "Fensterlayout speichern" -#: mpdevil:3556 +#: mpdevil:3588 msgid "Mini player" msgstr "Miniplayer" -#: mpdevil:3560 +#: mpdevil:3592 msgid "Menu" msgstr "Menü" @@ -527,9 +555,6 @@ msgstr "Menü" #~ msgid "Return to album of current title" #~ msgstr "Zu Album des aktuellen Titels zurückkehren" -#~ msgid "Main menu" -#~ msgstr "Hauptmenu" - #~ msgid "Not connected to MPD-server. Reconnect?" #~ msgstr "Nicht mit MPD-Server verbunden. Verbindung wiederherstellen?" diff --git a/po/mpdevil.pot b/po/mpdevil.pot index 9c2c93b..f2f58b3 100644 --- a/po/mpdevil.pot +++ b/po/mpdevil.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-09-24 21:14+0200\n" +"POT-Creation-Date: 2020-09-29 12:34+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,442 +17,470 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: mpdevil:473 +#: mpdevil:404 msgid "Unknown Title" msgstr "" -#: mpdevil:749 +#: mpdevil:693 msgid "Main cover size:" msgstr "" -#: mpdevil:750 +#: mpdevil:694 msgid "Album view cover size:" msgstr "" -#: mpdevil:751 +#: mpdevil:695 msgid "Action bar icon size:" msgstr "" -#: mpdevil:752 +#: mpdevil:696 msgid "Secondary icon size:" msgstr "" -#: mpdevil:765 +#: mpdevil:709 msgid "Sort albums by:" msgstr "" -#: mpdevil:765 +#: mpdevil:709 msgid "name" msgstr "" -#: mpdevil:765 +#: mpdevil:709 msgid "year" msgstr "" -#: mpdevil:766 +#: mpdevil:710 msgid "Position of playlist:" msgstr "" -#: mpdevil:766 +#: mpdevil:710 msgid "bottom" msgstr "" -#: mpdevil:766 +#: mpdevil:710 msgid "right" msgstr "" -#: mpdevil:784 +#: mpdevil:728 msgid "Use Client-side decoration" msgstr "" -#: mpdevil:785 +#: mpdevil:729 msgid "Show stop button" msgstr "" -#: mpdevil:786 +#: mpdevil:730 msgid "Show lyrics button" msgstr "" -#: mpdevil:787 +#: mpdevil:731 msgid "Show initials in artist view" msgstr "" -#: mpdevil:788 +#: mpdevil:732 msgid "Show tooltips in album view" msgstr "" -#: mpdevil:789 +#: mpdevil:733 msgid "Use 'Album Artist' tag" msgstr "" -#: mpdevil:790 +#: mpdevil:734 msgid "Send notification on title change" msgstr "" -#: mpdevil:791 +#: mpdevil:735 msgid "Stop playback on quit" msgstr "" -#: mpdevil:792 +#: mpdevil:736 msgid "Play selected albums and titles immediately" msgstr "" -#: mpdevil:805 +#: mpdevil:749 msgid "View" msgstr "" -#: mpdevil:806 +#: mpdevil:750 msgid "Behavior" msgstr "" -#: mpdevil:838 +#: mpdevil:782 msgid "(restart required)" msgstr "" -#: mpdevil:900 mpdevil:3460 +#: mpdevil:844 mpdevil:3493 msgid "Connect" msgstr "" -#: mpdevil:916 +#: mpdevil:860 msgid "" "The first image in the same directory as the song file matching this regex " "will be displayed. %AlbumArtist% and %Album% will be replaced by the " "corresponding tags of the song." msgstr "" -#: mpdevil:921 +#: mpdevil:865 msgid "Profile:" msgstr "" -#: mpdevil:922 +#: mpdevil:866 msgid "Name:" msgstr "" -#: mpdevil:923 +#: mpdevil:867 msgid "Host:" msgstr "" -#: mpdevil:924 +#: mpdevil:868 msgid "Password:" msgstr "" -#: mpdevil:925 +#: mpdevil:869 msgid "Music lib:" msgstr "" -#: mpdevil:926 +#: mpdevil:870 msgid "Cover regex:" msgstr "" -#: mpdevil:1057 +#: mpdevil:1001 msgid "Choose directory" msgstr "" -#: mpdevil:1090 +#: mpdevil:1034 msgid "Choose the order of information to appear in the playlist:" msgstr "" -#: mpdevil:1114 mpdevil:1632 mpdevil:1970 mpdevil:2688 +#: mpdevil:1058 mpdevil:1576 mpdevil:1914 mpdevil:2642 msgid "No" msgstr "" -#: mpdevil:1114 mpdevil:2689 +#: mpdevil:1058 mpdevil:2643 msgid "Disc" msgstr "" -#: mpdevil:1114 mpdevil:1637 mpdevil:1975 mpdevil:2690 +#: mpdevil:1058 mpdevil:1581 mpdevil:1919 mpdevil:2644 msgid "Title" msgstr "" -#: mpdevil:1114 mpdevil:1643 mpdevil:1862 mpdevil:2691 +#: mpdevil:1058 mpdevil:1587 mpdevil:1806 mpdevil:2645 msgid "Artist" msgstr "" -#: mpdevil:1114 mpdevil:1649 mpdevil:2692 +#: mpdevil:1058 mpdevil:1593 mpdevil:2646 msgid "Album" msgstr "" -#: mpdevil:1114 mpdevil:1655 mpdevil:1981 mpdevil:2693 +#: mpdevil:1058 mpdevil:1599 mpdevil:1925 mpdevil:2647 msgid "Length" msgstr "" -#: mpdevil:1114 mpdevil:2694 +#: mpdevil:1058 mpdevil:2648 msgid "Year" msgstr "" -#: mpdevil:1114 mpdevil:2695 +#: mpdevil:1058 mpdevil:2649 msgid "Genre" msgstr "" -#: mpdevil:1230 mpdevil:1238 mpdevil:3544 +#: mpdevil:1174 mpdevil:1182 mpdevil:3576 msgid "Settings" msgstr "" -#: mpdevil:1249 mpdevil:3361 +#: mpdevil:1193 mpdevil:3386 msgid "General" msgstr "" -#: mpdevil:1250 +#: mpdevil:1194 msgid "Profiles" msgstr "" -#: mpdevil:1251 mpdevil:3365 +#: mpdevil:1195 mpdevil:3390 msgid "Playlist" msgstr "" -#: mpdevil:1266 mpdevil:1274 +#: mpdevil:1210 mpdevil:1218 msgid "Stats" msgstr "" -#: mpdevil:1323 +#: mpdevil:1267 msgid "A simple music browser for MPD" msgstr "" -#: mpdevil:1395 +#: mpdevil:1339 msgid "MPD-Tag" msgstr "" -#: mpdevil:1399 +#: mpdevil:1343 msgid "Value" msgstr "" -#: mpdevil:1553 +#: mpdevil:1497 msgid "Append" msgstr "" -#: mpdevil:1554 +#: mpdevil:1498 msgid "Add all titles to playlist" msgstr "" -#: mpdevil:1555 +#: mpdevil:1499 msgid "Play" msgstr "" -#: mpdevil:1556 +#: mpdevil:1500 msgid "Directly play all titles" msgstr "" -#: mpdevil:1557 +#: mpdevil:1501 msgid "Enqueue" msgstr "" -#: mpdevil:1558 +#: mpdevil:1502 msgid "" "Append all titles after the currently playing track and clear the playlist " "from all other songs" msgstr "" -#: mpdevil:1714 +#: mpdevil:1658 #, python-brace-format msgid "{num} hits" msgstr "" -#: mpdevil:1752 +#: mpdevil:1696 msgid "all genres" msgstr "" -#: mpdevil:1860 +#: mpdevil:1804 msgid "Album Artist" msgstr "" -#: mpdevil:1863 +#: mpdevil:1807 msgid "all artists" msgstr "" -#: mpdevil:1987 +#: mpdevil:1931 msgid "Close" msgstr "" -#: mpdevil:2152 +#: mpdevil:2096 #, python-brace-format msgid "{titles} titles on {discs} discs ({length})" msgstr "" -#: mpdevil:2155 mpdevil:2783 +#: mpdevil:2099 mpdevil:2737 #, python-brace-format msgid "{titles} titles ({length})" msgstr "" -#: mpdevil:2282 mpdevil:3377 +#: mpdevil:2228 mpdevil:3407 msgid "Back to current album" msgstr "" -#: mpdevil:2283 +#: mpdevil:2233 msgid "Search" msgstr "" -#: mpdevil:2467 +#: mpdevil:2419 msgid "searching..." msgstr "" -#: mpdevil:2472 +#: mpdevil:2424 msgid "connection error" msgstr "" -#: mpdevil:2474 +#: mpdevil:2426 msgid "lyrics not found" msgstr "" -#: mpdevil:2522 +#: mpdevil:2474 #, python-brace-format msgid "" "{bitrate} kb/s, {frequency} kHz, {resolution} bit, {channels} channels, " "{file_type}" msgstr "" -#: mpdevil:2657 +#: mpdevil:2609 msgid "Scroll to current song" msgstr "" -#: mpdevil:2664 +#: mpdevil:2617 mpdevil:3423 msgid "Clear playlist" msgstr "" -#: mpdevil:2939 +#: mpdevil:2896 msgid "Show lyrics" msgstr "" -#: mpdevil:3253 +#: mpdevil:3192 msgid "Random mode" msgstr "" -#: mpdevil:3254 +#: mpdevil:3197 msgid "Repeat mode" msgstr "" -#: mpdevil:3255 +#: mpdevil:3202 msgid "Single mode" msgstr "" -#: mpdevil:3256 +#: mpdevil:3207 msgid "Consume mode" msgstr "" -#: mpdevil:3362 +#: mpdevil:3387 msgid "Window" msgstr "" -#: mpdevil:3363 +#: mpdevil:3388 msgid "Playback" msgstr "" -#: mpdevil:3364 +#: mpdevil:3389 msgid "Search, Album Dialog and Album List" msgstr "" -#: mpdevil:3374 -msgid "Toggle mini player" -msgstr "" - -#: mpdevil:3375 -msgid "Toggle lyrics" -msgstr "" - -#: mpdevil:3376 -msgid "Toggle search" -msgstr "" - -#: mpdevil:3378 +#: mpdevil:3399 msgid "Open online help" msgstr "" -#: mpdevil:3379 mpdevil:3548 -msgid "Quit" +#: mpdevil:3400 +msgid "Open shortcuts window" msgstr "" -#: mpdevil:3380 -msgid "Play/Pause" +#: mpdevil:3401 +msgid "Open menu" msgstr "" -#: mpdevil:3381 -msgid "Next title" -msgstr "" - -#: mpdevil:3382 -msgid "Previous title" -msgstr "" - -#: mpdevil:3383 -msgid "Seek forward" -msgstr "" - -#: mpdevil:3384 -msgid "Seek backward" -msgstr "" - -#: mpdevil:3385 mpdevil:3551 +#: mpdevil:3402 mpdevil:3583 msgid "Update database" msgstr "" -#: mpdevil:3386 -msgid "Play selected item (next)" +#: mpdevil:3403 mpdevil:3580 +msgid "Quit" msgstr "" -#: mpdevil:3386 -msgid "Left-click" -msgstr "" - -#: mpdevil:3387 -msgid "Append selected item" -msgstr "" - -#: mpdevil:3387 mpdevil:3390 -msgid "Middle-click" -msgstr "" - -#: mpdevil:3388 -msgid "Play selected item immediately" -msgstr "" - -#: mpdevil:3388 -msgid "Double-click" -msgstr "" - -#: mpdevil:3389 mpdevil:3391 -msgid "Show additional information" -msgstr "" - -#: mpdevil:3389 mpdevil:3391 -msgid "Right-click" -msgstr "" - -#: mpdevil:3390 -msgid "Remove selected song" +#: mpdevil:3404 +msgid "Toggle mini player" msgstr "" #: mpdevil:3405 +msgid "Toggle lyrics" +msgstr "" + +#: mpdevil:3406 +msgid "Toggle search" +msgstr "" + +#: mpdevil:3408 +msgid "Play/Pause" +msgstr "" + +#: mpdevil:3409 +msgid "Stop" +msgstr "" + +#: mpdevil:3410 +msgid "Next title" +msgstr "" + +#: mpdevil:3411 +msgid "Previous title" +msgstr "" + +#: mpdevil:3412 +msgid "Seek forward" +msgstr "" + +#: mpdevil:3413 +msgid "Seek backward" +msgstr "" + +#: mpdevil:3414 +msgid "Toggle repeat mode" +msgstr "" + +#: mpdevil:3415 +msgid "Toggle random mode" +msgstr "" + +#: mpdevil:3416 +msgid "Toggle single mode" +msgstr "" + +#: mpdevil:3417 +msgid "Toggle consume mode" +msgstr "" + +#: mpdevil:3418 +msgid "Play selected item (next)" +msgstr "" + +#: mpdevil:3418 +msgid "Left-click" +msgstr "" + +#: mpdevil:3419 +msgid "Append selected item" +msgstr "" + +#: mpdevil:3419 mpdevil:3422 +msgid "Middle-click" +msgstr "" + +#: mpdevil:3420 +msgid "Play selected item immediately" +msgstr "" + +#: mpdevil:3420 +msgid "Double-click" +msgstr "" + +#: mpdevil:3421 mpdevil:3424 +msgid "Show additional information" +msgstr "" + +#: mpdevil:3421 mpdevil:3424 +msgid "Right-click" +msgstr "" + +#: mpdevil:3422 +msgid "Remove selected song" +msgstr "" + +#: mpdevil:3438 msgid "Select profile" msgstr "" -#: mpdevil:3478 +#: mpdevil:3511 #, python-brace-format msgid "Connection to '{profile}' ({host}:{port}) failed" msgstr "" -#: mpdevil:3545 +#: mpdevil:3577 msgid "Keyboard shortcuts" msgstr "" -#: mpdevil:3546 +#: mpdevil:3578 msgid "Help" msgstr "" -#: mpdevil:3547 +#: mpdevil:3579 msgid "About" msgstr "" -#: mpdevil:3552 +#: mpdevil:3584 msgid "Server stats" msgstr "" -#: mpdevil:3555 +#: mpdevil:3587 msgid "Save window layout" msgstr "" -#: mpdevil:3556 +#: mpdevil:3588 msgid "Mini player" msgstr "" -#: mpdevil:3560 +#: mpdevil:3592 msgid "Menu" msgstr ""