side-chain button select connects exclusively
[ardour.git] / gtk2_ardour / keyeditor.cc
index f567bbf7512859c09c7860687e93c8fd87328109..56044c1c9a2cab2de3d22d50bfad0b6bd5d69efb 100644 (file)
@@ -114,7 +114,13 @@ void
 KeyEditor::add_tab (string const & name, Bindings& bindings)
 {
        Tab* t = new Tab (*this, name, &bindings);
-       t->populate ();
+
+       if (t->populate () == 0) {
+               /* no bindings */
+               delete t;
+               return;
+       }
+
        t->show_all ();
        notebook.append_page (*t, name);
 }
@@ -135,6 +141,7 @@ KeyEditor::remove_tab (string const &name)
                        }
                }
        }
+       cerr << "Removed " << name << endl;
 }
 
 void
@@ -151,8 +158,12 @@ KeyEditor::page_change (GtkNotebookPage*, guint)
 }
 
 bool
-KeyEditor::Tab::on_key_press_event (GdkEventKey* ev)
+KeyEditor::Tab::key_press_event (GdkEventKey* ev)
 {
+       if (view.get_selection()->count_selected_rows() != 1) {
+               return false;
+       }
+
        if (!ev->is_modifier) {
                last_keyval = ev->keyval;
        }
@@ -166,8 +177,12 @@ KeyEditor::Tab::on_key_press_event (GdkEventKey* ev)
 }
 
 bool
-KeyEditor::Tab::on_key_release_event (GdkEventKey* ev)
+KeyEditor::Tab::key_release_event (GdkEventKey* ev)
 {
+       if (view.get_selection()->count_selected_rows() != 1) {
+               return false;
+       }
+
        if (last_keyval == 0) {
                return false;
        }
@@ -186,7 +201,7 @@ KeyEditor::Tab::Tab (KeyEditor& ke, string const & str, Bindings* b)
 {
        data_model = TreeStore::create(columns);
        populate ();
-       
+
        filter = TreeModelFilter::create(data_model);
        filter->set_visible_func (sigc::mem_fun (*this, &Tab::visible_func));
 
@@ -205,6 +220,8 @@ KeyEditor::Tab::Tab (KeyEditor& ke, string const & str, Bindings* b)
        view.set_name (X_("KeyEditorTree"));
 
        view.signal_cursor_changed().connect (sigc::mem_fun (*this, &Tab::action_selected));
+       view.signal_key_press_event().connect (sigc::mem_fun (*this, &Tab::key_press_event), false);
+       view.signal_key_release_event().connect (sigc::mem_fun (*this, &Tab::key_release_event), false);
 
        view.get_column(0)->set_sort_column (columns.name);
        view.get_column(1)->set_sort_column (columns.binding);
@@ -295,7 +312,7 @@ KeyEditor::Tab::bind (GdkEventKey* release_event, guint pressed_key)
        }
 }
 
-void
+uint32_t
 KeyEditor::Tab::populate ()
 {
        vector<string> paths;
@@ -385,6 +402,8 @@ KeyEditor::Tab::populate ()
                }
                row[columns.action] = *a;
        }
+
+       return data_model->children().size();
 }
 
 void
@@ -477,6 +496,8 @@ void
 KeyEditor::search_string_updated (const std::string& filter)
 {
        filter_string = boost::to_lower_copy(filter);
-       current_tab ()->filter->refilter ();
+       KeyEditor::Tab* tab = current_tab ();
+       if (tab) {
+               tab->filter->refilter ();
+       }
 }
-