#endif
#include <map>
+#include <fstream>
#include <boost/algorithm/string.hpp>
using Gtkmm2ext::Keyboard;
using Gtkmm2ext::Bindings;
+sigc::signal<void> KeyEditor::UpdateBindings;
+
void bindings_collision_dialog (Gtk::Window& parent)
{
ArdourDialog dialog (parent, _("Colliding keybindings"), true);
, unbind_box (BUTTONBOX_END)
, filter_entry (_("Search..."), true)
, filter_string("")
+ , print_button (_("Print"))
, sort_column(0)
, sort_type(Gtk::SORT_ASCENDING)
{
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 ()
{
}
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;
}
}
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;
}
{
data_model = TreeStore::create(columns);
populate ();
-
+
filter = TreeModelFilter::create(data_model);
filter->set_visible_func (sigc::mem_fun (*this, &Tab::visible_func));
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);
}
}
-void
+uint32_t
KeyEditor::Tab::populate ()
{
vector<string> paths;
}
row[columns.action] = *a;
}
+
+ return data_model->children().size();
}
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 ();
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);
+}