diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2007-10-12 01:54:35 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2007-10-12 01:54:35 +0000 |
commit | 29f0d9732eb68fcaa22219cedddddd47bcaa8c17 (patch) | |
tree | aea1b182e2853985301613f5d8a3c31755b40c17 /gtk2_ardour/keyeditor.cc | |
parent | 02196886bbbef0f7f169c6d7f91bb0fea83e0379 (diff) |
add keybinding editor
git-svn-id: svn://localhost/ardour2/trunk@2543 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/keyeditor.cc')
-rw-r--r-- | gtk2_ardour/keyeditor.cc | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/gtk2_ardour/keyeditor.cc b/gtk2_ardour/keyeditor.cc new file mode 100644 index 0000000000..07aad652af --- /dev/null +++ b/gtk2_ardour/keyeditor.cc @@ -0,0 +1,159 @@ +#include <map> + +#include <gtkmm/stock.h> +#include <gtkmm/accelkey.h> +#include <gtkmm/accelmap.h> +#include <gtkmm/uimanager.h> + +#include <pbd/strsplit.h> + +#include "actions.h" +#include "keyboard.h" +#include "keyeditor.h" + +#include "i18n.h" + +using namespace std; +using namespace Gtk; +using namespace Gdk; + +KeyEditor::KeyEditor () + : ArdourDialog (_("Keybinding Editor"), false) +{ + model = TreeStore::create(columns); + + view.set_model (model); + view.append_column (_("Action"), columns.action); + view.append_column (_("Binding"), columns.binding); + view.set_headers_visible (true); + view.get_selection()->set_mode (SELECTION_SINGLE); + view.set_reorderable (false); + view.set_size_request (300,200); + view.set_enable_search (false); + view.set_rules_hint (true); + view.set_name (X_("KeyEditorTree")); + + view.get_selection()->signal_changed().connect (mem_fun (*this, &KeyEditor::action_selected)); + + scroller.add (view); + scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + get_vbox()->pack_start (scroller); + + scroller.show (); + view.show (); +} + +void +KeyEditor::on_show () +{ + populate (); + view.get_selection()->unselect_all (); + ArdourDialog::on_show (); +} + +void +KeyEditor::on_unmap () +{ + ArdourDialog::on_unmap (); +} + +void +KeyEditor::action_selected () +{ +} + +bool +KeyEditor::on_key_release_event (GdkEventKey* ev) +{ + TreeModel::iterator i = view.get_selection()->get_selected(); + + if (i != model->children().end()) { + string path = (*i)[columns.path]; + + bool result = AccelMap::change_entry (path, + ev->keyval, + (ModifierType) ev->state, + true); + + if (result) { + bool known; + AccelKey key; + + known = ActionManager::lookup_entry (path, key); + + if (known) { + (*i)[columns.binding] = ActionManager::ui_manager->get_accel_group()->name (key.get_key(), Gdk::ModifierType (key.get_mod())); + } else { + (*i)[columns.binding] = string(); + } + } + + + } + + return true; +} + +void +KeyEditor::populate () +{ + vector<string> paths; + vector<string> labels; + vector<string> keys; + vector<AccelKey> bindings; + typedef std::map<string,TreeIter> NodeMap; + NodeMap nodes; + NodeMap::iterator r; + + ActionManager::get_all_actions (labels, paths, keys, bindings); + + vector<string>::iterator k; + vector<string>::iterator p; + vector<string>::iterator l; + + model->clear (); + + for (l = labels.begin(), k = keys.begin(), p = paths.begin(); l != labels.end(); ++k, ++p, ++l) { + + TreeModel::Row row; + vector<string> parts; + + parts.clear (); + + split (*p, parts, '/'); + + if (parts.empty()) { + continue; + } + + if ((r = nodes.find (parts[1])) == nodes.end()) { + + /* top level is missing */ + + TreeIter rowp; + TreeModel::Row parent; + rowp = model->append(); + nodes[parts[1]] = rowp; + parent = *(rowp); + parent[columns.action] = parts[1]; + + row = *(model->append (parent.children())); + + } else { + + row = *(model->append ((*r->second)->children())); + + } + + /* add this action */ + + row[columns.action] = (*l); + row[columns.path] = (*p); + + if (*k == ActionManager::unbound_string) { + row[columns.binding] = string(); + } else { + row[columns.binding] = (*k); + } + } +} |