improved keyboard usability

This commit is contained in:
Martin Wagner 2020-09-29 12:39:21 +02:00
parent 5415ee08e4
commit e96cca154f
3 changed files with 605 additions and 464 deletions

View File

@ -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),
("<Control>question", _("Open shortcuts window"), None, general_group),
("F10", _("Open menu"), None, general_group),
("F5", _("Update database"), None, general_group),
("<Control>q", _("Quit"), None, general_group),
("<Control>m", _("Toggle mini player"), None, window_group),
("<Control>l", _("Toggle lyrics"), None, window_group),
("<Control>f", _("Toggle search"), None, window_group),
("Escape", _("Back to current album"), None, window_group),
("F1", _("Open online help"), None, general_group),
("<Control>q", _("Quit"), None, general_group),
("space", _("Play/Pause"), None, playback_group),
("<Control>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),
("<Control>r", _("Toggle repeat mode"), None, playback_group),
("<Control>s", _("Toggle random mode"), None, playback_group),
("<Control>1", _("Toggle single mode"), None, playback_group),
("<Control>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),
("<Shift>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", ["<Control>q"])
self.set_accels_for_action("win.mini-player", ["<Control>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", ["<Control>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", ["<control>f"])
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.back-to-current-album", ["Escape"]),("win.toggle-search", ["<control>f"]),
("mpd.update", ["F5"]),("mpd.clear", ["<Shift>Delete"]),("mpd.toggle-play", ["space"]),
("mpd.stop", ["<Control>space"]),("mpd.next", ["KP_Add"]),("mpd.prev", ["KP_Subtract"]),
("mpd.repeat", ["<Control>r"]),("mpd.random", ["<Control>s"]),("mpd.single", ["<Control>1"]),
("mpd.consume", ["<Control>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):

299
po/de.po
View File

@ -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 "<b>View</b>"
msgstr "<b>Ansicht</b>"
#: mpdevil:806
#: mpdevil:750
msgid "<b>Behavior</b>"
msgstr "<b>Verhalten</b>"
#: 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?"

View File

@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 "<b>View</b>"
msgstr ""
#: mpdevil:806
#: mpdevil:750
msgid "<b>Behavior</b>"
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 ""