Extend app menu including shortcuts (close #23)
Add several global actions to the application menu and assign shortcuts (accels) to them.
This commit is contained in:
parent
e34a253645
commit
e7474c744e
3 changed files with 91 additions and 3 deletions
45
data/menu.ui
45
data/menu.ui
|
|
@ -1,6 +1,51 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<menu id="app-menu">
|
||||
<section>
|
||||
<item>
|
||||
<attribute name="action">win.connect</attribute>
|
||||
<attribute name="label" translatable="yes">Connect</attribute>
|
||||
<attribute name="accel"><Primary>c</attribute>
|
||||
</item>
|
||||
</section>
|
||||
<section>
|
||||
<item>
|
||||
<attribute name="action">win.play</attribute>
|
||||
<attribute name="label" translatable="yes">_Play</attribute>
|
||||
<attribute name="accel"><Primary>p</attribute>
|
||||
</item>
|
||||
<item>
|
||||
<attribute name="action">win.clear-playlist</attribute>
|
||||
<attribute name="label" translatable="yes">Clear Playlist</attribute>
|
||||
<attribute name="accel"><Primary>r</attribute>
|
||||
</item>
|
||||
</section>
|
||||
<section>
|
||||
<item>
|
||||
<attribute name="action">win.panel</attribute>
|
||||
<attribute name="label" translatable="yes">Connection</attribute>
|
||||
<attribute name="target">0</attribute>
|
||||
<attribute name="accel"><alt>KP_1</attribute>
|
||||
</item>
|
||||
<item>
|
||||
<attribute name="action">win.panel</attribute>
|
||||
<attribute name="label" translatable="yes">Cover</attribute>
|
||||
<attribute name="target">1</attribute>
|
||||
<attribute name="accel"><alt>KP_2</attribute>
|
||||
</item>
|
||||
<item>
|
||||
<attribute name="action">win.panel</attribute>
|
||||
<attribute name="label" translatable="yes">Playlist</attribute>
|
||||
<attribute name="target">2</attribute>
|
||||
<attribute name="accel"><alt>KP_3</attribute>
|
||||
</item>
|
||||
<item>
|
||||
<attribute name="action">win.panel</attribute>
|
||||
<attribute name="label" translatable="yes">Library</attribute>
|
||||
<attribute name="target">3</attribute>
|
||||
<attribute name="accel"><alt>KP_4</attribute>
|
||||
</item>
|
||||
</section>
|
||||
<section>
|
||||
<item>
|
||||
<attribute name="action">app.quit</attribute>
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ class Application(Gtk.Application):
|
|||
self._window.present()
|
||||
|
||||
|
||||
def on_quit(self, action, param):
|
||||
def on_menu_quit(self, action, value):
|
||||
self.quit()
|
||||
|
||||
|
||||
|
|
@ -113,7 +113,7 @@ class Application(Gtk.Application):
|
|||
|
||||
def _setup_actions(self):
|
||||
action = Gio.SimpleAction.new("quit", None)
|
||||
action.connect('activate', self.on_quit)
|
||||
action.connect('activate', self.on_menu_quit)
|
||||
self.add_action(action)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ import math
|
|||
import sys
|
||||
import threading
|
||||
|
||||
from gi.repository import Gtk, Gdk, GObject, GdkPixbuf, GLib
|
||||
from gi.repository import Gtk, Gdk, GObject, GdkPixbuf, GLib, Gio
|
||||
|
||||
from mcg import client
|
||||
from mcg.utils import SortOrder
|
||||
|
|
@ -132,6 +132,21 @@ class Window():
|
|||
if self._settings.get_boolean(Window.SETTING_CONNECTED):
|
||||
self._connect()
|
||||
|
||||
# Menu actions
|
||||
self._connect_action = Gio.SimpleAction.new_stateful("connect", None, GLib.Variant.new_boolean(False))
|
||||
self._connect_action.connect('change-state', self.on_menu_connect)
|
||||
self._appwindow.add_action(self._connect_action)
|
||||
self._play_action = Gio.SimpleAction.new_stateful("play", None, GLib.Variant.new_boolean(False))
|
||||
self._play_action.connect('change-state', self.on_menu_play)
|
||||
self._appwindow.add_action(self._play_action)
|
||||
self._clear_playlist_action = Gio.SimpleAction.new("clear-playlist", None)
|
||||
self._clear_playlist_action.connect('activate', self.on_menu_clear_playlist)
|
||||
self._appwindow.add_action(self._clear_playlist_action)
|
||||
panel_variant = GLib.Variant.new_string("0")
|
||||
self._panel_action = Gio.SimpleAction.new_stateful("panel", panel_variant.get_type(), panel_variant)
|
||||
self._panel_action.connect('change-state', self.on_menu_panel)
|
||||
self._appwindow.add_action(self._panel_action)
|
||||
|
||||
|
||||
def present(self):
|
||||
self._appwindow.present()
|
||||
|
|
@ -153,11 +168,29 @@ class Window():
|
|||
self._settings.set_value(Window.SETTING_WINDOW_SIZE, GLib.Variant('ai', list(self._size)))
|
||||
|
||||
|
||||
def on_menu_connect(self, action, value):
|
||||
self._connect()
|
||||
|
||||
|
||||
def on_menu_play(self, action, value):
|
||||
self._mcg.playpause()
|
||||
|
||||
|
||||
def on_menu_clear_playlist(self, action, value):
|
||||
self._mcg.clear_playlist()
|
||||
|
||||
|
||||
def on_menu_panel(self, action, value):
|
||||
action.set_state(value)
|
||||
self._stack.set_visible_child(self._panels[int(value.get_string())].get())
|
||||
|
||||
|
||||
# HeaderBar callbacks
|
||||
|
||||
def on_header_bar_stack_switched(self, widget):
|
||||
self._set_visible_toolbar()
|
||||
self._save_visible_panel()
|
||||
self._set_menu_visible_panel()
|
||||
|
||||
|
||||
def on_header_bar_connect(self, widget):
|
||||
|
|
@ -243,8 +276,10 @@ class Window():
|
|||
self._mcg.load_playlist()
|
||||
self._mcg.load_albums()
|
||||
self._mcg.get_status()
|
||||
self._connect_action.set_state(GLib.Variant.new_boolean(True))
|
||||
else:
|
||||
GObject.idle_add(self._connect_disconnected)
|
||||
self._connect_action.set_state(GLib.Variant.new_boolean(False))
|
||||
|
||||
|
||||
def on_mcg_status(self, state, album, pos, time, volume, error):
|
||||
|
|
@ -255,9 +290,11 @@ class Window():
|
|||
if state == 'play':
|
||||
GObject.idle_add(self._header_bar.set_play)
|
||||
GObject.idle_add(self._panels[Window._PANEL_INDEX_COVER].set_play, pos, time)
|
||||
self._play_action.set_state(GLib.Variant.new_boolean(True))
|
||||
elif state == 'pause' or state == 'stop':
|
||||
GObject.idle_add(self._header_bar.set_pause)
|
||||
GObject.idle_add(self._panels[Window._PANEL_INDEX_COVER].set_pause)
|
||||
self._play_action.set_state(GLib.Variant.new_boolean(False))
|
||||
# Volume
|
||||
GObject.idle_add(self._header_bar.set_volume, volume)
|
||||
# Error
|
||||
|
|
@ -359,6 +396,12 @@ class Window():
|
|||
self._settings.set_int(Window.SETTING_PANEL, panel_index_selected)
|
||||
|
||||
|
||||
def _set_menu_visible_panel(self):
|
||||
panels = [panel.get() for panel in self._panels]
|
||||
panel_index_selected = panels.index(self._stack.get_visible_child())
|
||||
self._panel_action.set_state(GLib.Variant.new_string(str(panel_index_selected)))
|
||||
|
||||
|
||||
def _set_visible_toolbar(self):
|
||||
panels = [panel.get() for panel in self._panels]
|
||||
panel_index_selected = panels.index(self._stack.get_visible_child())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue