X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=gtk2_ardour%2Fkeyeditor.cc;h=f517217b0d01acdbe2310d99029843670c4f3247;hb=e35e26fa9b418e04095eb53e8f172dacb1c2545e;hp=5ebc4178c82af9ca0fdc47b5a8baa12fbe0471de;hpb=05283a63398fd7a563480a76802e6b2c2ad2e404;p=ardour.git diff --git a/gtk2_ardour/keyeditor.cc b/gtk2_ardour/keyeditor.cc index 5ebc4178c8..f517217b0d 100644 --- a/gtk2_ardour/keyeditor.cc +++ b/gtk2_ardour/keyeditor.cc @@ -23,25 +23,23 @@ #include -#include "ardour/profile.h" - #include #include #include #include #include +#include "gtkmm2ext/bindings.h" #include "gtkmm2ext/utils.h" #include "pbd/strsplit.h" -#include "pbd/replace_all.h" +#include "ardour/filesystem_paths.h" #include "ardour/profile.h" #include "actions.h" #include "keyboard.h" #include "keyeditor.h" -#include "utils.h" #include "i18n.h" @@ -51,6 +49,7 @@ using namespace Gdk; using namespace PBD; using Gtkmm2ext::Keyboard; +using Gtkmm2ext::Bindings; KeyEditor::KeyEditor () : ArdourWindow (_("Key Bindings")) @@ -58,29 +57,12 @@ KeyEditor::KeyEditor () , unbind_box (BUTTONBOX_END) { - can_bind = false; - last_state = 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); - - add (scroller); + last_keyval = 0; + 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"))); @@ -90,60 +72,101 @@ KeyEditor::KeyEditor () unbind_box.pack_start (unbind_button, false, false); unbind_button.signal_clicked().connect (sigc::mem_fun (*this, &KeyEditor::unbind)); - add (unbind_box); + vpacker.pack_start (unbind_box, false, false); unbind_box.show (); unbind_button.show (); } - view.show (); - scroller.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 (); + reset_label.show (); + reset_button.signal_clicked().connect (sigc::mem_fun (*this, &KeyEditor::reset)); + vpacker.pack_start (reset_box, false, false); + + add (vpacker); 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); +} - cerr << "trying to unbind\n"; - - 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; @@ -151,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()) { @@ -164,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 () { - can_bind = true; - last_state = ev->state; - return false; -} + TreeModel::iterator i = view.get_selection()->get_selected(); -bool -KeyEditor::on_key_release_event (GdkEventKey* ev) -{ - if (ARDOUR::Profile->get_sae() || !can_bind || ev->state != last_state) { - return false; + 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 (); + } } +} +void +KeyEditor::Tab::bind (GdkEventKey* release_event, guint pressed_key) +{ 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; } - cerr << "real lkeyval: " << ev->keyval << endl; - Gtkmm2ext::possibly_translate_keyval_to_make_legal_accelerator (ev->keyval); - cerr << "using keyval = " << ev->keyval << endl; + GdkModifierType mod = (GdkModifierType)(Keyboard::RelevantModifierKeyMask & release_event->state); + 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, - ev->keyval, - ModifierType (Keyboard::RelevantModifierKeyMask & ev->state), + pressed_key, + Gdk::ModifierType(mod), true); - cerr << "New binding to " << ev->keyval << " worked: " << result << endl; - if (result) { AccelKey key; (*i)[columns.binding] = ActionManager::get_key_representation (path, key); + owner.unbind_button.set_sensitive (true); } } - - out: - can_bind = false; - 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; @@ -250,6 +280,13 @@ KeyEditor::populate () continue; } + //kinda kludgy way to avoid displaying menu items as mappable + 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()) { /* top level is missing */ @@ -283,23 +320,24 @@ KeyEditor::populate () if (*k == ActionManager::unbound_string) { row[columns.binding] = string(); } else { - -#ifdef GTKOSX - string label = (*k); - - /* Gtk/Quartz maps: - NSAlternate/NSOption key to Mod1 - NSCommand key to Meta - */ - - replace_all (label, "", _("Command-")); - replace_all (label, "", _("Option-")); - replace_all (label, "", _("Shift-")); - replace_all (label, "", _("Control-")); - row[columns.binding] = label; -#else row[columns.binding] = (*k); -#endif } } } + +void +KeyEditor::reset () +{ + Keyboard::the_keyboard().reset_bindings (); + + 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())); +}