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:
coderkun 2017-04-24 13:12:21 +02:00
commit e7474c744e
3 changed files with 91 additions and 3 deletions

View file

@ -1,6 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<menu id="app-menu"> <menu id="app-menu">
<section>
<item>
<attribute name="action">win.connect</attribute>
<attribute name="label" translatable="yes">Connect</attribute>
<attribute name="accel">&lt;Primary&gt;c</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.play</attribute>
<attribute name="label" translatable="yes">_Play</attribute>
<attribute name="accel">&lt;Primary&gt;p</attribute>
</item>
<item>
<attribute name="action">win.clear-playlist</attribute>
<attribute name="label" translatable="yes">Clear Playlist</attribute>
<attribute name="accel">&lt;Primary&gt;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">&lt;alt&gt;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">&lt;alt&gt;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">&lt;alt&gt;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">&lt;alt&gt;KP_4</attribute>
</item>
</section>
<section> <section>
<item> <item>
<attribute name="action">app.quit</attribute> <attribute name="action">app.quit</attribute>

View file

@ -67,7 +67,7 @@ class Application(Gtk.Application):
self._window.present() self._window.present()
def on_quit(self, action, param): def on_menu_quit(self, action, value):
self.quit() self.quit()
@ -113,7 +113,7 @@ class Application(Gtk.Application):
def _setup_actions(self): def _setup_actions(self):
action = Gio.SimpleAction.new("quit", None) action = Gio.SimpleAction.new("quit", None)
action.connect('activate', self.on_quit) action.connect('activate', self.on_menu_quit)
self.add_action(action) self.add_action(action)

View file

@ -13,7 +13,7 @@ import math
import sys import sys
import threading 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 import client
from mcg.utils import SortOrder from mcg.utils import SortOrder
@ -132,6 +132,21 @@ class Window():
if self._settings.get_boolean(Window.SETTING_CONNECTED): if self._settings.get_boolean(Window.SETTING_CONNECTED):
self._connect() 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): def present(self):
self._appwindow.present() self._appwindow.present()
@ -153,11 +168,29 @@ class Window():
self._settings.set_value(Window.SETTING_WINDOW_SIZE, GLib.Variant('ai', list(self._size))) 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 # HeaderBar callbacks
def on_header_bar_stack_switched(self, widget): def on_header_bar_stack_switched(self, widget):
self._set_visible_toolbar() self._set_visible_toolbar()
self._save_visible_panel() self._save_visible_panel()
self._set_menu_visible_panel()
def on_header_bar_connect(self, widget): def on_header_bar_connect(self, widget):
@ -243,8 +276,10 @@ class Window():
self._mcg.load_playlist() self._mcg.load_playlist()
self._mcg.load_albums() self._mcg.load_albums()
self._mcg.get_status() self._mcg.get_status()
self._connect_action.set_state(GLib.Variant.new_boolean(True))
else: else:
GObject.idle_add(self._connect_disconnected) 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): def on_mcg_status(self, state, album, pos, time, volume, error):
@ -255,9 +290,11 @@ class Window():
if state == 'play': if state == 'play':
GObject.idle_add(self._header_bar.set_play) GObject.idle_add(self._header_bar.set_play)
GObject.idle_add(self._panels[Window._PANEL_INDEX_COVER].set_play, pos, time) 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': elif state == 'pause' or state == 'stop':
GObject.idle_add(self._header_bar.set_pause) GObject.idle_add(self._header_bar.set_pause)
GObject.idle_add(self._panels[Window._PANEL_INDEX_COVER].set_pause) GObject.idle_add(self._panels[Window._PANEL_INDEX_COVER].set_pause)
self._play_action.set_state(GLib.Variant.new_boolean(False))
# Volume # Volume
GObject.idle_add(self._header_bar.set_volume, volume) GObject.idle_add(self._header_bar.set_volume, volume)
# Error # Error
@ -359,6 +396,12 @@ class Window():
self._settings.set_int(Window.SETTING_PANEL, panel_index_selected) 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): def _set_visible_toolbar(self):
panels = [panel.get() for panel in self._panels] panels = [panel.get() for panel in self._panels]
panel_index_selected = panels.index(self._stack.get_visible_child()) panel_index_selected = panels.index(self._stack.get_visible_child())