13
0

use Bindings API for binding replacement

This commit is contained in:
Paul Davis 2015-08-05 10:57:00 -04:00
parent 36023db8aa
commit 6e55812535
4 changed files with 66 additions and 65 deletions

View File

@ -587,19 +587,21 @@ ARDOUR_UI::post_engine ()
/* this is the first point at which all the keybindings are available */
if (ARDOUR_COMMAND_LINE::show_key_actions) {
vector<string> names;
vector<string> paths;
vector<string> tooltips;
vector<string> keys;
vector<AccelKey> bindings;
ActionManager::get_all_actions (names, paths, tooltips, keys, bindings);
for (map<string,Bindings*>::const_iterator mb = Bindings::bindings_for_state.begin(); mb != Bindings::bindings_for_state.end(); ++mb) {
vector<string>::iterator n;
vector<string>::iterator k;
vector<string>::iterator p;
for (n = names.begin(), k = keys.begin(), p = paths.begin(); n != names.end(); ++n, ++k, ++p) {
cout << "Action: '" << (*n) << "' bound to '" << (*k) << "' Path: '" << (*p) << "'" << endl;
vector<string> names;
vector<string> paths;
vector<string> keys;
mb->second->get_all_actions (names, paths, keys);
vector<string>::iterator n;
vector<string>::iterator k;
vector<string>::iterator p;
for (n = names.begin(), k = keys.begin(), p = paths.begin(); n != names.end(); ++n, ++k, ++p) {
cout << "Action: '" << (*n) << "' bound to '" << (*k) << "' Path: '" << (*p) << "'" << endl;
}
}
halt_connection.disconnect ();

View File

@ -36,18 +36,6 @@ using namespace PBD;
using namespace ARDOUR;
using Gtkmm2ext::Keyboard;
static void
accel_map_changed (GtkAccelMap* /*map*/,
gchar* /*path*/,
guint /*key*/,
GdkModifierType /*mod*/,
gpointer keyboard)
{
ArdourKeyboard* me = (ArdourKeyboard*)keyboard;
Keyboard::keybindings_changed ();
me->ui.setup_tooltips ();
}
#ifdef GTKOSX
guint ArdourKeyboard::constraint_mod = Keyboard::PrimaryModifier;
#else

View File

@ -121,7 +121,13 @@ KeyEditor::on_key_press_event (GdkEventKey* ev)
if (!ev->is_modifier) {
last_keyval = ev->keyval;
}
return ArdourWindow::on_key_press_event (ev);
/* Don't let anything else handle the key press, because navigation
* keys will be used by GTK to change the selection/treeview cursor
* position
*/
return true;
}
bool
@ -145,7 +151,7 @@ KeyEditor::Tab::Tab (KeyEditor& ke, string const & str, Bindings* b)
model = TreeStore::create(columns);
view.set_model (model);
view.append_column (_("Action"), columns.action);
view.append_column (_("Action"), columns.name);
view.append_column (_("Shortcut"), columns.binding);
view.set_headers_visible (true);
view.get_selection()->set_mode (SELECTION_SINGLE);
@ -200,19 +206,14 @@ KeyEditor::Tab::unbind ()
owner.unbind_button.set_sensitive (false);
if (i != model->children().end()) {
string path = (*i)[columns.path];
Glib::RefPtr<Action> action = (*i)[columns.action];
if (!(*i)[columns.bindable]) {
return;
}
bool result = AccelMap::change_entry (path,
0,
(ModifierType) 0,
true);
if (result) {
(*i)[columns.binding] = string ();
}
bindings->remove (action, Gtkmm2ext::Bindings::Press, true);
(*i)[columns.binding] = string ();
}
}
@ -222,25 +223,20 @@ 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];
string action_name = (*i)[columns.path];
if (!(*i)[columns.bindable]) {
return;
}
GdkModifierType mod = (GdkModifierType)(Keyboard::RelevantModifierKeyMask & release_event->state);
Gtkmm2ext::KeyboardKey new_binding (mod, pressed_key);
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,
pressed_key,
Gdk::ModifierType(mod),
true);
bool result = bindings->replace (new_binding, Gtkmm2ext::Bindings::Press, action_name);
if (result) {
AccelKey key;
(*i)[columns.binding] = ActionManager::get_key_representation (path, key);
(*i)[columns.binding] = gtk_accelerator_get_label (new_binding.key(), (GdkModifierType) new_binding.state());
owner.unbind_button.set_sensitive (true);
}
}
@ -248,80 +244,93 @@ KeyEditor::Tab::bind (GdkEventKey* release_event, guint pressed_key)
void
KeyEditor::Tab::populate ()
{
{
vector<string> paths;
vector<string> labels;
vector<string> tooltips;
vector<string> keys;
vector<Gtkmm2ext::KeyboardKey> binds;
vector<Glib::RefPtr<Action> > actions;
typedef std::map<string,TreeIter> NodeMap;
NodeMap nodes;
NodeMap::iterator r;
bindings->get_all_actions (labels, paths, tooltips, keys, binds);
bindings->get_all_actions (paths, labels, tooltips, keys, actions);
vector<string>::iterator k;
vector<string>::iterator p;
vector<string>::iterator t;
vector<string>::iterator l;
vector<Glib::RefPtr<Action> >::iterator a;
model->clear ();
for (l = labels.begin(), k = keys.begin(), p = paths.begin(), t = tooltips.begin(); l != labels.end(); ++k, ++p, ++t, ++l) {
for (a = actions.begin(), l = labels.begin(), k = keys.begin(), p = paths.begin(), t = tooltips.begin(); l != labels.end(); ++k, ++p, ++t, ++l, ++a) {
TreeModel::Row row;
vector<string> parts;
parts.clear ();
split (*p, parts, '/');
if (parts.empty()) {
string category = parts[1];
string action_name = parts[2];
if (action_name.empty()) {
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"))) {
if ((action_name.find ("Menu") == action_name.length() - 4) ||
(action_name.find ("menu") == action_name.length() - 4) ||
(action_name == _("RegionList"))) {
continue;
}
if ((r = nodes.find (parts[1])) == nodes.end()) {
if ((r = nodes.find (category)) == nodes.end()) {
/* top level is missing */
/* category/group is missing, so add it first */
TreeIter rowp;
TreeModel::Row parent;
rowp = model->append();
nodes[parts[1]] = rowp;
nodes[category] = rowp;
parent = *(rowp);
parent[columns.action] = parts[1];
parent[columns.name] = category;
parent[columns.bindable] = false;
parent[columns.action] = *a;
/* now set up the child row that we're about to fill
* out with information
*/
row = *(model->append (parent.children()));
} else {
/* category/group is present, so just add the child row */
row = *(model->append ((*r->second)->children()));
}
/* add this action */
/* use the "visible label" as the action name */
if (l->empty ()) {
row[columns.action] = *t;
/* no label, try using the tooltip instead */
row[columns.name] = *t;
} else {
row[columns.action] = *l;
row[columns.name] = *l;
}
row[columns.path] = (*p);
row[columns.path] = string_compose ("%1/%2", category, action_name);
row[columns.bindable] = true;
if (*k == ActionManager::unbound_string) {
row[columns.binding] = string();
} else {
row[columns.binding] = (*k);
row[columns.binding] = *k;
}
row[columns.action] = *a;
}
}

View File

@ -58,15 +58,17 @@ class KeyEditor : public ArdourWindow
struct KeyEditorColumns : public Gtk::TreeModel::ColumnRecord {
KeyEditorColumns () {
add (action);
add (name);
add (binding);
add (path);
add (bindable);
add (action);
}
Gtk::TreeModelColumn<std::string> action;
Gtk::TreeModelColumn<std::string> name;
Gtk::TreeModelColumn<std::string> binding;
Gtk::TreeModelColumn<std::string> path;
Gtk::TreeModelColumn<bool> bindable;
Gtk::TreeModelColumn<Glib::RefPtr<Gtk::Action> > action;
};
Gtk::VBox vpacker;