X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fkeyeditor.cc;h=f517217b0d01acdbe2310d99029843670c4f3247;hb=1b5247ebb9ef89b922c3c0b2a8194d510bdd75e1;hp=f8b5f2da4e945062004d53f2b950dc0187d46221;hpb=4166b05bdacd2e77352c4eb4e960146f338df0c3;p=ardour.git diff --git a/gtk2_ardour/keyeditor.cc b/gtk2_ardour/keyeditor.cc index f8b5f2da4e..f517217b0d 100644 --- a/gtk2_ardour/keyeditor.cc +++ b/gtk2_ardour/keyeditor.cc @@ -29,6 +29,7 @@ #include #include +#include "gtkmm2ext/bindings.h" #include "gtkmm2ext/utils.h" #include "pbd/strsplit.h" @@ -48,6 +49,7 @@ using namespace Gdk; using namespace PBD; using Gtkmm2ext::Keyboard; +using Gtkmm2ext::Bindings; KeyEditor::KeyEditor () : ArdourWindow (_("Key Bindings")) @@ -57,28 +59,10 @@ KeyEditor::KeyEditor () { last_keyval = 0; - model = TreeStore::create(columns); - - view.set_model (model); - view.append_column (_("Action"), columns.action); - view.append_column (_("Shortcut"), columns.binding); - view.set_headers_visible (true); - view.get_selection()->set_mode (SELECTION_SINGLE); - view.set_reorderable (false); - view.set_size_request (500,300); - view.set_enable_search (false); - view.set_rules_hint (true); - view.set_name (X_("KeyEditorTree")); - - view.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &KeyEditor::action_selected)); - - scroller.add (view); - scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); - - vpacker.set_spacing (6); - vpacker.set_border_width (12); - vpacker.pack_start (scroller); - + notebook.signal_switch_page ().connect (sigc::mem_fun (*this, &KeyEditor::page_change)); + + vpacker.pack_start (notebook, true, true); + if (!ARDOUR::Profile->get_sae()) { Label* hint = manage (new Label (_("Select an action, then press the key(s) to (re)set its shortcut"))); @@ -93,10 +77,10 @@ KeyEditor::KeyEditor () unbind_button.show (); } - + reset_button.add (reset_label); reset_label.set_markup (string_compose ("%1", _("Reset Bindings to Defaults"))); - + reset_box.pack_start (reset_button, true, false); reset_box.show (); reset_button.show (); @@ -106,53 +90,83 @@ KeyEditor::KeyEditor () add (vpacker); - view.show (); - scroller.show (); - vpacker.show (); - unbind_button.set_sensitive (false); } +void +KeyEditor::add_tab (string const & name, Bindings& bindings) +{ + Tab* t = new Tab (*this, name, &bindings); + t->populate (); + t->show_all (); + notebook.append_page (*t, name); +} + void KeyEditor::unbind () { - TreeModel::iterator i = view.get_selection()->get_selected(); + current_tab()->unbind (); +} +void +KeyEditor::page_change (GtkNotebookPage*, guint) +{ + current_tab()->view.get_selection()->unselect_all (); unbind_button.set_sensitive (false); +} - if (i != model->children().end()) { - string path = (*i)[columns.path]; - - if (!(*i)[columns.bindable]) { - return; - } - - bool result = AccelMap::change_entry (path, - 0, - (ModifierType) 0, - true); - if (result) { - (*i)[columns.binding] = string (); - } +bool +KeyEditor::on_key_press_event (GdkEventKey* ev) +{ + if (!ev->is_modifier) { + last_keyval = ev->keyval; } + return ArdourWindow::on_key_press_event (ev); } -void -KeyEditor::on_show () +bool +KeyEditor::on_key_release_event (GdkEventKey* ev) { - populate (); - view.get_selection()->unselect_all (); - ArdourWindow::on_show (); + if (ARDOUR::Profile->get_sae() || last_keyval == 0) { + return false; + } + + current_tab()->bind (ev, last_keyval); + + last_keyval = 0; + return true; } -void -KeyEditor::on_unmap () +KeyEditor::Tab::Tab (KeyEditor& ke, string const & str, Bindings* b) + : owner (ke) + , name (str) + , bindings (b) { - ArdourWindow::on_unmap (); + model = TreeStore::create(columns); + + view.set_model (model); + view.append_column (_("Action"), columns.action); + view.append_column (_("Shortcut"), columns.binding); + view.set_headers_visible (true); + view.get_selection()->set_mode (SELECTION_SINGLE); + view.set_reorderable (false); + view.set_size_request (500,300); + view.set_enable_search (false); + view.set_rules_hint (true); + view.set_name (X_("KeyEditorTree")); + + view.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &Tab::action_selected)); + + scroller.add (view); + scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + + set_spacing (6); + set_border_width (12); + pack_start (scroller); } void -KeyEditor::action_selected () +KeyEditor::Tab::action_selected () { if (view.get_selection()->count_selected_rows() == 0) { return; @@ -160,7 +174,7 @@ KeyEditor::action_selected () TreeModel::iterator i = view.get_selection()->get_selected(); - unbind_button.set_sensitive (false); + owner.unbind_button.set_sensitive (false); if (i != model->children().end()) { @@ -173,71 +187,78 @@ KeyEditor::action_selected () string binding = (*i)[columns.binding]; if (!binding.empty()) { - unbind_button.set_sensitive (true); + owner.unbind_button.set_sensitive (true); } } } -bool -KeyEditor::on_key_press_event (GdkEventKey* ev) +void +KeyEditor::Tab::unbind () { - if (!ev->is_modifier) { - last_keyval = ev->keyval; + TreeModel::iterator i = view.get_selection()->get_selected(); + + owner.unbind_button.set_sensitive (false); + + if (i != model->children().end()) { + string path = (*i)[columns.path]; + + if (!(*i)[columns.bindable]) { + return; + } + + bool result = AccelMap::change_entry (path, + 0, + (ModifierType) 0, + true); + if (result) { + (*i)[columns.binding] = string (); + } } - return false; } -bool -KeyEditor::on_key_release_event (GdkEventKey* ev) +void +KeyEditor::Tab::bind (GdkEventKey* release_event, guint pressed_key) { - if (ARDOUR::Profile->get_sae() || last_keyval == 0) { - return false; - } - TreeModel::iterator i = view.get_selection()->get_selected(); if (i != model->children().end()) { string path = (*i)[columns.path]; if (!(*i)[columns.bindable]) { - goto out; + return; } - GdkModifierType mod = (GdkModifierType)(Keyboard::RelevantModifierKeyMask & ev->state); + GdkModifierType mod = (GdkModifierType)(Keyboard::RelevantModifierKeyMask & release_event->state); - Gtkmm2ext::possibly_translate_keyval_to_make_legal_accelerator (ev->keyval); + Gtkmm2ext::possibly_translate_keyval_to_make_legal_accelerator (release_event->keyval); Gtkmm2ext::possibly_translate_mod_to_make_legal_accelerator (mod); bool result = AccelMap::change_entry (path, - last_keyval, + pressed_key, Gdk::ModifierType(mod), true); if (result) { AccelKey key; (*i)[columns.binding] = ActionManager::get_key_representation (path, key); - unbind_button.set_sensitive (true); + owner.unbind_button.set_sensitive (true); } } - - out: - last_keyval = 0; - return true; } void -KeyEditor::populate () +KeyEditor::Tab::populate () { vector paths; vector labels; vector tooltips; vector keys; - vector bindings; + vector binds; typedef std::map NodeMap; NodeMap nodes; NodeMap::iterator r; - ActionManager::get_all_actions (labels, paths, tooltips, keys, bindings); + bindings->get_all_actions (labels, paths, tooltips, keys, binds); vector::iterator k; vector::iterator p; @@ -260,16 +281,11 @@ KeyEditor::populate () } //kinda kludgy way to avoid displaying menu items as mappable - if ( parts[1] == _("Main_menu") ) - continue; - if ( parts[1] == _("redirectmenu") ) - continue; - if ( parts[1] == _("Editor_menus") ) - continue; - if ( parts[1] == _("RegionList") ) - continue; - if ( parts[1] == _("ProcessorMenu") ) + if ((parts[1].find ("Menu") == parts[1].length() - 4) || + (parts[1].find ("menu") == parts[1].length() - 4) || + (parts[1] == _("RegionList"))) { continue; + } if ((r = nodes.find (parts[1])) == nodes.end()) { @@ -313,7 +329,15 @@ void KeyEditor::reset () { Keyboard::the_keyboard().reset_bindings (); - populate (); - view.get_selection()->unselect_all (); - populate (); + + for (Tabs::iterator t = tabs.begin(); t != tabs.end(); ++t) { + (*t)->view.get_selection()->unselect_all (); + (*t)->populate (); + } +} + +KeyEditor::Tab* +KeyEditor::current_tab () +{ + return dynamic_cast (notebook.get_nth_page (notebook.get_current_page())); }