+ current_tab()->view.get_selection()->unselect_all ();
+ unbind_button.set_sensitive (false);
+}
+
+bool
+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;
+ }
+
+ /* 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
+KeyEditor::Tab::key_release_event (GdkEventKey* ev)
+{
+ if (view.get_selection()->count_selected_rows() != 1) {
+ return false;
+ }
+
+ if (last_keyval == 0) {
+ return false;
+ }
+
+ owner.current_tab()->bind (ev, last_keyval);
+
+ last_keyval = 0;
+ return true;
+}
+
+KeyEditor::Tab::Tab (KeyEditor& ke, string const & str, Bindings* b)
+ : owner (ke)
+ , name (str)
+ , bindings (b)
+ , last_keyval (0)
+{
+ data_model = TreeStore::create(columns);
+ populate ();
+
+ filter = TreeModelFilter::create(data_model);
+ filter->set_visible_func (sigc::mem_fun (*this, &Tab::visible_func));
+
+ sorted_filter = TreeModelSort::create(filter);
+
+ view.set_model (sorted_filter);
+ view.append_column (_("Action"), columns.name);
+ view.append_column (_("Shortcut"), columns.binding);
+ view.set_headers_visible (true);
+ view.set_headers_clickable (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.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);
+ data_model->set_sort_column (owner.sort_column, owner.sort_type);
+ data_model->signal_sort_column_changed().connect (sigc::mem_fun (*this, &Tab::sort_column_changed));
+
+ signal_map().connect (sigc::mem_fun (*this, &Tab::tab_mapped));
+
+ scroller.add (view);
+ scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
+
+ set_spacing (6);
+ set_border_width (12);
+ pack_start (scroller);