summaryrefslogtreecommitdiff
path: root/gtk2_ardour/keyeditor.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2015-08-04 13:59:32 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-02-22 15:31:23 -0500
commite35e26fa9b418e04095eb53e8f172dacb1c2545e (patch)
treeb5e217fd9a6fa91b4c681535cb3c45f5f866ec2a /gtk2_ardour/keyeditor.cc
parent0f748492b3041896607b9d9b53ec927eae111af9 (diff)
redesign key editor to work with tabbed notebook, one tab per set of bindings
Diffstat (limited to 'gtk2_ardour/keyeditor.cc')
-rw-r--r--gtk2_ardour/keyeditor.cc198
1 files changed, 111 insertions, 87 deletions
diff --git a/gtk2_ardour/keyeditor.cc b/gtk2_ardour/keyeditor.cc
index cbbbfafc73..f517217b0d 100644
--- a/gtk2_ardour/keyeditor.cc
+++ b/gtk2_ardour/keyeditor.cc
@@ -29,6 +29,7 @@
#include <gtkmm/accelmap.h>
#include <gtkmm/uimanager.h>
+#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")));
@@ -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 ArdourWindow::on_key_press_event (ev);
}
-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<string> paths;
vector<string> labels;
vector<string> tooltips;
vector<string> keys;
- vector<AccelKey> bindings;
+ vector<Gtkmm2ext::KeyboardKey> binds;
typedef std::map<string,TreeIter> 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<string>::iterator k;
vector<string>::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<Tab*> (notebook.get_nth_page (notebook.get_current_page()));
}