add previous-tab and next-tab actions and bind to PRIMARY-page-up/down by default
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 25 Feb 2016 20:08:06 +0000 (15:08 -0500)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 25 Feb 2016 20:08:06 +0000 (15:08 -0500)
gtk2_ardour/ardour.keys.in
gtk2_ardour/ardour_ui.h
gtk2_ardour/ardour_ui_dialogs.cc
gtk2_ardour/ardour_ui_ed.cc

index 54f539925e4c86302f76613aa20d13f3f3199768..6d30317b68a21d9beb6d1f2d43025d19a72d10e9 100644 (file)
@@ -260,6 +260,8 @@ This mode provides many different operations on both regions and control points,
 @trans|Transport/Forward|<@TERTIARY@>Right|fast forward
 @markers|Editor/selected-marker-to-next-region-boundary|<@PRIMARY@><@TERTIARY@>Right|move to next region edge
 
+@wvis|Common/next-tab|<@PRIMARY@>Page_Down|next tab
+@wvis|Common/previous-tab|<@PRIMARY@>Page_Up|previous tab
 @vis|Editor/scroll-tracks-down|Page_Down|scroll down (page)
 @vis|Editor/scroll-tracks-up|Page_Up|scroll up (page)
 @trans|Transport/GotoStart|Home|to start marker
index 88006a082076d850322bd59be3176db63718b4e0..08a2bf9a72035608872369172195fcfed916da4a 100644 (file)
@@ -853,6 +853,9 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 
        void load_bindings ();
        bool tabbable_visibility_button_press (GdkEventButton* ev, std::string const& tabbable_name);
+
+       void step_up_through_tabs ();
+       void step_down_through_tabs ();
 };
 
 #endif /* __ardour_gui_h__ */
index 2e2361a3796a5f1b3f3755e52151afc2470a2271..64037e843e45feefca683f56f6ce58996d605a29 100644 (file)
@@ -373,6 +373,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)
 {
index 72da94ef47cbb4875042656c2cbd44c12a8892eb..1d9689e608ccca5361296754a4f3449225a3e567 100644 (file)
@@ -281,6 +281,9 @@ ARDOUR_UI::install_actions ()
        global_actions.register_action (common_actions, X_("key-change-mixer-visibility"), _("Change"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::key_change_tabbable_visibility), mixer));
        global_actions.register_action (common_actions, X_("key-change-preferences-visibility"), _("Change"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::key_change_tabbable_visibility), rc_option_editor));
 
+       global_actions.register_action (common_actions, X_("previous-tab"), _("Previous Tab"), sigc::mem_fun (*this, &ARDOUR_UI::step_up_through_tabs));
+       global_actions.register_action (common_actions, X_("next-tab"), _("Next Tab"), sigc::mem_fun (*this, &ARDOUR_UI::step_down_through_tabs));
+
        global_actions.register_action (common_actions, X_("toggle-editor-and-mixer"), _("Toggle Editor & Mixer"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_editor_and_mixer));
 
        /* windows visibility actions */