make that status-bar error change actually compile
[ardour.git] / gtk2_ardour / keyeditor.cc
index e340ac0d69e57d448c682ff4649cc987b8693538..fcb5646ae3182e5487b657407a4cbee6e1af51d8 100644 (file)
@@ -3,6 +3,7 @@
 #include <ardour/profile.h>
 
 #include <gtkmm/stock.h>
+#include <gtkmm/label.h>
 #include <gtkmm/accelkey.h>
 #include <gtkmm/accelmap.h>
 #include <gtkmm/uimanager.h>
 #include <pbd/strsplit.h>
 #include <pbd/replace_all.h>
 
+#include <ardour/profile.h>
+
 #include "actions.h"
 #include "keyboard.h"
 #include "keyeditor.h"
+#include "utils.h"
 
 #include "i18n.h"
 
@@ -22,7 +26,10 @@ using namespace Gdk;
 using namespace PBD;
 
 KeyEditor::KeyEditor ()
-       : ArdourDialog (_("Keybinding Editor"), false)
+       : ArdourDialog (_("Keybindings"), false)
+       , unbind_button (_("Remove shortcut"))
+       , unbind_box (BUTTONBOX_END)
+       
 {
        can_bind = false;
        last_state = 0;
@@ -31,11 +38,11 @@ KeyEditor::KeyEditor ()
 
        view.set_model (model);
        view.append_column (_("Action"), columns.action);
-       view.append_column (_("Binding"), columns.binding);
+       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 (300,200);
+       view.set_size_request (500,300);
        view.set_enable_search (false);
        view.set_rules_hint (true);
        view.set_name (X_("KeyEditorTree"));
@@ -45,11 +52,55 @@ KeyEditor::KeyEditor ()
        scroller.add (view);
        scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
 
+
+       get_vbox()->set_spacing (6);
        get_vbox()->pack_start (scroller);
+
+       if (!ARDOUR::Profile->get_sae()) {
+
+               Label* hint = manage (new Label (_("Select an action, then press the key(s) to (re)set its shortcut")));
+               hint->show ();
+               unbind_box.set_spacing (6);
+               unbind_box.pack_start (*hint, false, true);
+               unbind_box.pack_start (unbind_button, false, false);
+               unbind_button.signal_clicked().connect (mem_fun (*this, &KeyEditor::unbind));
+
+               get_vbox()->pack_start (unbind_box, false, false);
+               unbind_box.show ();
+               unbind_button.show ();
+               
+       }
+
        get_vbox()->set_border_width (12);
 
-       scroller.show ();
        view.show ();
+       scroller.show ();
+
+       unbind_button.set_sensitive (false);
+}
+
+void
+KeyEditor::unbind ()
+{
+       TreeModel::iterator i = view.get_selection()->get_selected();
+       
+       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
@@ -69,6 +120,28 @@ KeyEditor::on_unmap ()
 void
 KeyEditor::action_selected ()
 {
+       if (view.get_selection()->count_selected_rows() == 0) {
+               return;
+       }
+
+       TreeModel::iterator i = view.get_selection()->get_selected();
+       
+       unbind_button.set_sensitive (false);
+
+       if (i != model->children().end()) {
+
+               string path = (*i)[columns.path];
+               
+               if (!(*i)[columns.bindable]) {
+                       return;
+               } 
+
+               string binding = (*i)[columns.binding];
+
+               if (!binding.empty()) {
+                       unbind_button.set_sensitive (true);
+               }
+       }
 }
 
 bool
@@ -95,9 +168,11 @@ KeyEditor::on_key_release_event (GdkEventKey* ev)
                        goto out;
                } 
 
+               possibly_translate_keyval_to_make_legal_accelerator (ev->keyval);
+
                bool result = AccelMap::change_entry (path,
                                                      ev->keyval,
-                                                     (ModifierType) ev->state,
+                                                     ModifierType (Keyboard::RelevantModifierKeyMask & ev->state),
                                                      true);
 
                if (result) {
@@ -112,8 +187,6 @@ KeyEditor::on_key_release_event (GdkEventKey* ev)
                                (*i)[columns.binding] = string();
                        }
                }
-
-               
        }
 
   out:
@@ -185,9 +258,16 @@ KeyEditor::populate ()
 
 #ifdef GTKOSX
                        string label = (*k);
-                       replace_all (label, "<Control>", _("Command-"));
+
+                       /* Gtk/Quartz maps:
+                          NSAlternate/NSOption key to Mod1
+                          NSCommand key to Meta 
+                       */
+
+                       replace_all (label, "<Meta>", _("Command-"));
                        replace_all (label, "<Alt>", _("Option-"));
                        replace_all (label, "<Shift>", _("Shift-"));
+                       replace_all (label, "<Control>", _("Control-"));
                        row[columns.binding] = label;
 #else          
                        row[columns.binding] = (*k);