From: Christopher Arndt Date: Tue, 30 Jun 2020 13:36:23 +0000 (+0200) Subject: Add accelerator shortcuts to menu items (#22) X-Git-Tag: release-13~45 X-Git-Url: https://git.0d.be/?p=jack_mixer.git;a=commitdiff_plain;h=6b3d3e930e370bdd03112e6e180c5d23aa4a5719 Add accelerator shortcuts to menu items (#22) * Add accelerator shortcuts to menu items * Rename "Open" menu item to "Open...". * Rename "SaveAs" menu item to "Save As...". * Change some menu item mnemonics: * "New Output _Channel" (different from "_Open...") * "_Edit Input Channel" * "E_dit Output Channel" * "_Remove Input Channel" * "Re_move Ouput Channel" * "_Clear" (added) * Disable "Edit/Remove Input Channel" sub-menu entries initially and when no input channels are left. * Same for output channels. * Change mnemonics to what is described in previous commit message Signed-off-by: Christopher Arndt --- diff --git a/jack_mixer.py b/jack_mixer.py index e66d95d..7f88e6e 100755 --- a/jack_mixer.py +++ b/jack_mixer.py @@ -102,6 +102,17 @@ class JackMixer(SerializedObject): GLib.timeout_add(200, self.nsm_react) GLib.timeout_add(50, self.midi_events_check) + def new_menu_item(self, title, callback=None, accel=None, enabled=True): + menuitem = Gtk.MenuItem.new_with_mnemonic(title) + menuitem.set_sensitive(enabled) + if callback: + menuitem.connect("activate", callback) + if accel: + key, mod = Gtk.accelerator_parse(accel) + menuitem.add_accelerator("activate", self.menu_accelgroup, key, mod, + Gtk.AccelFlags.VISIBLE) + return menuitem + def create_ui(self, with_nsm): self.channels = [] self.output_channels = [] @@ -112,6 +123,9 @@ class JackMixer(SerializedObject): self.vbox_top = Gtk.VBox() self.window.add(self.vbox_top) + self.menu_accelgroup = Gtk.AccelGroup() + self.window.add_accel_group(self.menu_accelgroup) + self.menubar = Gtk.MenuBar() self.vbox_top.pack_start(self.menubar, False, True, 0) @@ -127,72 +141,59 @@ class JackMixer(SerializedObject): self.mixer_menu = Gtk.Menu() mixer_menu_item.set_submenu(self.mixer_menu) - add_input_channel = Gtk.MenuItem.new_with_mnemonic('New _Input Channel') - self.mixer_menu.append(add_input_channel) - add_input_channel.connect("activate", self.on_add_input_channel) - - add_output_channel = Gtk.MenuItem.new_with_mnemonic('New _Output Channel') - self.mixer_menu.append(add_output_channel) - add_output_channel.connect("activate", self.on_add_output_channel) + self.mixer_menu.append(self.new_menu_item('New _Input Channel', + self.on_add_input_channel, "N")) + self.mixer_menu.append(self.new_menu_item('New Output _Channel', + self.on_add_output_channel, "N")) self.mixer_menu.append(Gtk.SeparatorMenuItem()) if not with_nsm: - open = Gtk.MenuItem.new_with_mnemonic('_Open') - self.mixer_menu.append(open) - open.connect('activate', self.on_open_cb) - save = Gtk.MenuItem.new_with_mnemonic('_Save') - self.mixer_menu.append(save) - save.connect('activate', self.on_save_cb) + self.mixer_menu.append(self.new_menu_item('_Open...', self.on_open_cb, "O")) + + self.mixer_menu.append(self.new_menu_item('_Save', self.on_save_cb, "S")) + if not with_nsm: - save_as = Gtk.MenuItem.new_with_mnemonic('Save_As') - self.mixer_menu.append(save_as) - save_as.connect('activate', self.on_save_as_cb) + self.mixer_menu.append(self.new_menu_item('Save _As...', self.on_save_as_cb, + "S")) self.mixer_menu.append(Gtk.SeparatorMenuItem()) - - quit = Gtk.MenuItem.new_with_mnemonic('_Quit') - self.mixer_menu.append(quit) - quit.connect('activate', self.on_quit_cb) + self.mixer_menu.append(self.new_menu_item('_Quit', self.on_quit_cb, "Q")) edit_menu = Gtk.Menu() edit_menu_item.set_submenu(edit_menu) - self.channel_edit_input_menu_item = Gtk.MenuItem.new_with_mnemonic('_Edit Input Channel') + self.channel_edit_input_menu_item = self.new_menu_item('_Edit Input Channel', + enabled=False) edit_menu.append(self.channel_edit_input_menu_item) self.channel_edit_input_menu = Gtk.Menu() self.channel_edit_input_menu_item.set_submenu(self.channel_edit_input_menu) - self.channel_edit_output_menu_item = Gtk.MenuItem.new_with_mnemonic('Edit _Output Channel') + self.channel_edit_output_menu_item = self.new_menu_item('E_dit Output Channel', + enabled=False) edit_menu.append(self.channel_edit_output_menu_item) self.channel_edit_output_menu = Gtk.Menu() self.channel_edit_output_menu_item.set_submenu(self.channel_edit_output_menu) - self.channel_remove_input_menu_item = Gtk.MenuItem.new_with_mnemonic('Remove _Input Channel') + self.channel_remove_input_menu_item = self.new_menu_item('_Remove Input Channel', + enabled=False) edit_menu.append(self.channel_remove_input_menu_item) self.channel_remove_input_menu = Gtk.Menu() self.channel_remove_input_menu_item.set_submenu(self.channel_remove_input_menu) - self.channel_remove_output_menu_item = Gtk.MenuItem.new_with_mnemonic('_Remove Output Channel') + self.channel_remove_output_menu_item = self.new_menu_item('Re_move Output Channel', + enabled=False) edit_menu.append(self.channel_remove_output_menu_item) self.channel_remove_output_menu = Gtk.Menu() self.channel_remove_output_menu_item.set_submenu(self.channel_remove_output_menu) - channel_remove_all_menu_item = Gtk.MenuItem.new_with_mnemonic('Clear') - edit_menu.append(channel_remove_all_menu_item) - channel_remove_all_menu_item.connect("activate", self.on_channels_clear) - + edit_menu.append(self.new_menu_item('_Clear', self.on_channels_clear, "X")) edit_menu.append(Gtk.SeparatorMenuItem()) - - preferences = Gtk.MenuItem.new_with_mnemonic('_Preferences') - preferences.connect('activate', self.on_preferences_cb) - edit_menu.append(preferences) + edit_menu.append(self.new_menu_item('_Preferences', self.on_preferences_cb, "P")) help_menu = Gtk.Menu() help_menu_item.set_submenu(help_menu) - about = Gtk.MenuItem.new_with_mnemonic('_About') - help_menu.append(about) - about.connect("activate", self.on_about) + help_menu.append(self.new_menu_item('_About', self.on_about, "F1")) self.hbox_top = Gtk.HBox() self.vbox_top.pack_start(self.hbox_top, True, True, 0) @@ -382,7 +383,8 @@ class JackMixer(SerializedObject): del self.channels[i] self.hbox_inputs.remove(channel.get_parent()) break - if len(self.channels) == 0: + if not self.channels: + self.channel_edit_input_menu_item.set_sensitive(False) self.channel_remove_input_menu_item.set_sensitive(False) def on_edit_output_channel(self, widget, channel): @@ -407,7 +409,8 @@ class JackMixer(SerializedObject): del self.output_channels[i] self.hbox_outputs.remove(channel.get_parent()) break - if len(self.output_channels) == 0: + if not self.output_channels: + self.channel_edit_output_menu_item.set_sensitive(False) self.channel_remove_output_menu_item.set_sensitive(False) def rename_channels(self, container, parameters):