extend strict-i/o to include route outputs.
[ardour.git] / gtk2_ardour / ardour_ui_dialogs.cc
index 2e2361a3796a5f1b3f3755e52151afc2470a2271..a134a19b8fa4d9a303c27017d0fa4653c086d80b 100644 (file)
 #include "main_clock.h"
 #include "meterbridge.h"
 #include "meter_patterns.h"
+#include "monitor_section.h"
 #include "midi_tracer.h"
 #include "mixer_ui.h"
 #include "public_editor.h"
+#include "processor_box.h"
 #include "rc_option_editor.h"
 #include "route_params_ui.h"
 #include "shuttle_control.h"
@@ -373,6 +375,88 @@ ARDOUR_UI::toggle_editor_and_mixer ()
        }
 }
 
+void
+ARDOUR_UI::step_up_through_tabs ()
+{
+       std::vector<Tabbable*> candidates;
+
+       /* this list must match the order of visibility buttons */
+
+       if (!editor->window_visible()) {
+               candidates.push_back (editor);
+       }
+
+       if (!mixer->window_visible()) {
+               candidates.push_back (mixer);
+       }
+
+       if (!rc_option_editor->window_visible()) {
+               candidates.push_back (rc_option_editor);
+       }
+
+       if (candidates.size() < 2) {
+               /* nothing to be done with zero or one visible in tabs */
+               return;
+       }
+
+       std::vector<Tabbable*>::iterator prev = candidates.end();
+       std::vector<Tabbable*>::iterator i;
+       Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page ());
+
+       for (i = candidates.begin(); i != candidates.end(); ++i) {
+               if (w == &(*i)->contents()) {
+                       if (prev != candidates.end()) {
+                               _tabs.set_current_page (_tabs.page_num ((*prev)->contents()));
+                       } else {
+                               _tabs.set_current_page (_tabs.page_num (candidates.back()->contents()));
+                       }
+                       return;
+               }
+               prev = i;
+       }
+}
+
+void
+ARDOUR_UI::step_down_through_tabs ()
+{
+       std::vector<Tabbable*> candidates;
+
+       /* this list must match the order of visibility buttons */
+
+       if (!editor->window_visible()) {
+               candidates.push_back (editor);
+       }
+
+       if (!mixer->window_visible()) {
+               candidates.push_back (mixer);
+       }
+
+       if (!rc_option_editor->window_visible()) {
+               candidates.push_back (rc_option_editor);
+       }
+
+       if (candidates.size() < 2) {
+               /* nothing to be done with zero or one visible in tabs */
+               return;
+       }
+
+       std::vector<Tabbable*>::reverse_iterator next = candidates.rend();
+       std::vector<Tabbable*>::reverse_iterator i;
+       Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page ());
+
+       for (i = candidates.rbegin(); i != candidates.rend(); ++i) {
+               if (w == &(*i)->contents()) {
+                       if (next != candidates.rend()) {
+                               _tabs.set_current_page (_tabs.page_num ((*next)->contents()));
+                       } else {
+                               _tabs.set_current_page (_tabs.page_num (candidates.front()->contents()));
+                       }
+                       break;
+               }
+               next = i;
+       }
+}
+
 void
 ARDOUR_UI::key_change_tabbable_visibility (Tabbable* t)
 {
@@ -495,7 +579,7 @@ ARDOUR_UI::tabs_page_removed (Widget*, guint)
 void
 ARDOUR_UI::tabs_switch (GtkNotebookPage*, guint page)
 {
-       if (page == (guint) _tabs.page_num (editor->contents())) {
+       if (editor && (page == (guint) _tabs.page_num (editor->contents()))) {
                editor_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
                if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
                        mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
@@ -503,7 +587,7 @@ ARDOUR_UI::tabs_switch (GtkNotebookPage*, guint page)
                if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
                        prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
                }
-       } else if (page == (guint) _tabs.page_num (mixer->contents())) {
+       } else if (mixer && (page == (guint) _tabs.page_num (mixer->contents()))) {
                if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
                        editor_visibility_button.set_active_state (Gtkmm2ext::Off);
                }
@@ -674,7 +758,6 @@ ARDOUR_UI::toggle_luawindow ()
        assert (editor && luawindow);
 
        bool show = false;
-       bool obscuring = false;
 
        if (luawindow->not_visible ()) {
                show = true;
@@ -720,16 +803,8 @@ ARDOUR_UI::create_key_editor ()
 {
        KeyEditor* kedit = new KeyEditor;
 
-       if (global_bindings) {
-               kedit->add_tab (_("Global"), *global_bindings);
-       }
-
-       if (editor->bindings) {
-               kedit->add_tab (_("Editing"), *editor->bindings);
-       }
-
-       if (mixer->bindings) {
-               kedit->add_tab (_("Mixing"), *mixer->bindings);
+       for (std::list<Bindings*>::iterator b = Bindings::bindings.begin(); b != Bindings::bindings.end(); ++b) {
+               kedit->add_tab ((*b)->name(), **b);
        }
 
        return kedit;