hacked up incomplete use of print-key-bindings-as-html
[ardour.git] / gtk2_ardour / keyeditor.cc
index f300b4751c45fe76d3d62f293493e23c51dd3449..fc69d89e2867d171de432ef11da384e764c909c2 100644 (file)
@@ -22,6 +22,7 @@
 #endif
 
 #include <map>
+#include <fstream>
 
 #include <boost/algorithm/string.hpp>
 
@@ -53,6 +54,8 @@ using namespace PBD;
 using Gtkmm2ext::Keyboard;
 using Gtkmm2ext::Bindings;
 
+sigc::signal<void> KeyEditor::UpdateBindings;
+
 void bindings_collision_dialog (Gtk::Window& parent)
 {
        ArdourDialog dialog (parent, _("Colliding keybindings"), true);
@@ -70,6 +73,7 @@ KeyEditor::KeyEditor ()
        , unbind_box (BUTTONBOX_END)
        , filter_entry (_("Search..."), true)
        , filter_string("")
+       , print_button (_("Print"))
        , sort_column(0)
        , sort_type(Gtk::SORT_ASCENDING)
 {
@@ -98,27 +102,58 @@ KeyEditor::KeyEditor ()
        reset_button.add (reset_label);
        reset_label.set_markup (string_compose ("<span size=\"large\" weight=\"bold\">%1</span>", _("Reset Bindings to Defaults")));
 
+       print_button.signal_clicked().connect (sigc::mem_fun (*this, &KeyEditor::print));
+
        reset_box.pack_start (reset_button, true, false);
+       reset_box.pack_start (print_button, true, false);
        reset_box.show ();
        reset_button.show ();
        reset_label.show ();
+       print_button.show ();
        reset_button.signal_clicked().connect (sigc::mem_fun (*this, &KeyEditor::reset));
        vpacker.pack_start (reset_box, false, false);
 
        add (vpacker);
 
        unbind_button.set_sensitive (false);
+       UpdateBindings.connect (sigc::mem_fun (*this, &KeyEditor::refresh));
 }
 
 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;
+       }
+
+       tabs.push_back (t);
        t->show_all ();
        notebook.append_page (*t, name);
 }
 
+
+void
+KeyEditor::remove_tab (string const &name)
+{
+       guint npages = notebook.get_n_pages ();
+
+       for (guint n = 0; n < npages; ++n) {
+               Widget* w = notebook.get_nth_page (n);
+               Tab* tab = dynamic_cast<Tab*> (w);
+               if (tab) {
+                       if (tab->name == name) {
+                               notebook.remove_page (*w);
+                               return;
+                       }
+               }
+       }
+       cerr << "Removed " << name << endl;
+}
+
 void
 KeyEditor::unbind ()
 {
@@ -133,8 +168,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;
        }
@@ -148,8 +187,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;
        }
@@ -168,7 +211,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));
 
@@ -187,6 +230,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);
@@ -277,7 +322,7 @@ KeyEditor::Tab::bind (GdkEventKey* release_event, guint pressed_key)
        }
 }
 
-void
+uint32_t
 KeyEditor::Tab::populate ()
 {
        vector<string> paths;
@@ -367,6 +412,8 @@ KeyEditor::Tab::populate ()
                }
                row[columns.action] = *a;
        }
+
+       return data_model->children().size();
 }
 
 void
@@ -442,7 +489,12 @@ void
 KeyEditor::reset ()
 {
        Keyboard::the_keyboard().reset_bindings ();
+       refresh ();
+}
 
+void
+KeyEditor::refresh ()
+{
        for (Tabs::iterator t = tabs.begin(); t != tabs.end(); ++t) {
                (*t)->view.get_selection()->unselect_all ();
                (*t)->populate ();
@@ -459,6 +511,25 @@ 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 ();
+       }
 }
 
+void
+KeyEditor::print () const
+{
+       char templ[14];
+
+       snprintf (templ, sizeof (templ), "akprintXXXXXX");
+
+       int fd = mkstemp (templ);
+       ofstream f;
+       //f.open (fd);
+
+       Bindings::save_all_bindings_as_html (cerr);
+
+       f.close ();
+       close (fd);
+}