mackie: clean up (some) interactions between subview mode and selection
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 28 Jan 2016 00:00:21 +0000 (19:00 -0500)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 28 Jan 2016 00:00:27 +0000 (19:00 -0500)
Also, stop Plugin button from doing anything, since it has nothing to do yet

libs/surfaces/mackie/mackie_control_protocol.cc
libs/surfaces/mackie/mackie_control_protocol.h
libs/surfaces/mackie/mcp_buttons.cc
libs/surfaces/mackie/strip.cc

index 8ac54e64460dc1fa02ce9860cd9e1418085a7727..a6ac44b2ba542234cc571f70b9542671262c59b1 100644 (file)
@@ -1624,7 +1624,43 @@ MackieControlProtocol::notify_subview_route_deleted ()
        set_view_mode (Mixer);
 }
 
-void
+bool
+MackieControlProtocol::subview_mode_would_be_ok (SubViewMode mode, boost::shared_ptr<Route> r)
+{
+
+       if (!r) {
+               /* no selected track? no subview mode */
+               return false;
+       }
+
+       switch (mode) {
+       case None:
+               return true;
+               break;
+
+       case Sends:
+               if (r->send_level_controllable (0)) {
+                       return true;
+               }
+               break;
+
+       case EQ:
+               if (r->eq_band_cnt() > 0) {
+                       return true;
+               }
+               break;
+
+       case Dynamics:
+               if (r->comp_enable_controllable()) {
+                       return true;
+               }
+               break;
+       }
+
+       return false;
+}
+
+int
 MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Route> r)
 {
        SubViewMode old_mode = _subview_mode;
@@ -1637,6 +1673,35 @@ MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Route
                _subview_route = r;
        }
 
+       if (!subview_mode_would_be_ok (sm, r)) {
+
+               Glib::Threads::Mutex::Lock lm (surfaces_lock);
+
+               if (!surfaces.empty()) {
+
+                       string msg;
+
+                       switch (sm) {
+                       case Sends:
+                               msg = _("no sends for selected track/bus");
+                               break;
+                       case EQ:
+                               msg = _("no EQ in the track/bus");
+                               break;
+                       case Dynamics:
+                               msg = _("no dynamics in selected track/bus");
+                               break;
+                       default:
+                               break;
+                       }
+                       if (!msg.empty()) {
+                               surfaces.front()->display_message_for (msg, 1000);
+                       }
+               }
+
+               return -1;
+       }
+
        if ((_subview_mode != old_mode) || (_subview_route != old_route)) {
 
                if (r != old_route) {
@@ -1699,6 +1764,8 @@ MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Route
                        }
                }
        }
+
+       return 0;
 }
 
 void
@@ -1753,6 +1820,10 @@ MackieControlProtocol::set_pot_mode (PotMode m)
                return;
        }
 
+       /* switch to a pot mode cancels any subview mode */
+
+       set_subview_mode (None, boost::shared_ptr<Route>());
+
        _pot_mode = m;
 
        {
@@ -1859,8 +1930,12 @@ MackieControlProtocol::_gui_track_selection_changed (ARDOUR::RouteNotificationLi
        }
 
        if (gui_selection_did_change) {
-               /* actual GUI selection changed */
-               set_subview_mode (_subview_mode, first_selected_route());
+
+               /* actual GUI selection changed, which may affect subview state */
+
+               if (set_subview_mode (_subview_mode, first_selected_route())) {
+                       set_subview_mode (None, boost::shared_ptr<Route>());
+               }
        }
 }
 
index d418871d6a3cc25c639958c31774c49186907d9b..680d3c2819c5a14d0d33921f72b6563f14c40ffd 100644 (file)
@@ -152,6 +152,7 @@ class MackieControlProtocol
        FlipMode flip_mode () const { return _flip_mode; }
        ViewMode view_mode () const { return _view_mode; }
        SubViewMode subview_mode () const { return _subview_mode; }
+       static bool subview_mode_would_be_ok (SubViewMode, boost::shared_ptr<ARDOUR::Route>);
        boost::shared_ptr<ARDOUR::Route> subview_route() const;
        PotMode pot_mode () const { return _pot_mode; }
        bool zoom_mode () const { return modifier_state() & MODIFIER_ZOOM; }
@@ -165,7 +166,7 @@ class MackieControlProtocol
        boost::shared_ptr<ARDOUR::Route> first_selected_route () const;
 
        void set_view_mode (ViewMode);
-       void set_subview_mode (SubViewMode, boost::shared_ptr<ARDOUR::Route>);
+       int set_subview_mode (SubViewMode, boost::shared_ptr<ARDOUR::Route>);
        void set_flip_mode (FlipMode);
        void set_pot_mode (PotMode);
        void pot_mode_globals ();
index c239004e5954c6b8fce4974827be8b207a259978..60de07480e3cd130a133e782d892339d11a44f9e 100644 (file)
@@ -689,20 +689,16 @@ MackieControlProtocol::plugin_press (Button &)
 LedState
 MackieControlProtocol::plugin_release (Button &)
 {
-       set_view_mode (Plugins);
+       // Do not do this yet, since it does nothing
+       // set_view_mode (Plugins);
        return none; /* LED state set by set_view_mode */
 }
 LedState
 MackieControlProtocol::eq_press (Button &)
 {
-       if (Profile->get_mixbus()) {
-               boost::shared_ptr<Route> r = first_selected_route ();
-               if (r && r->eq_band_cnt() > 0) {
-                       set_subview_mode (EQ, r);
-                       return none; /* led state handled by set_subview_mode() */
-               }
-       }
-       return none;
+       boost::shared_ptr<Route> r = first_selected_route ();
+       set_subview_mode (EQ, r);
+       return none; /* led state handled by set_subview_mode() */
 
 }
 LedState
@@ -713,16 +709,9 @@ MackieControlProtocol::eq_release (Button &)
 LedState
 MackieControlProtocol::dyn_press (Button &)
 {
-       if (Profile->get_mixbus()) {
-               boost::shared_ptr<Route> r = first_selected_route ();
-
-               if (r) {
-                       set_subview_mode (Dynamics, r);
-                       return none; /* led state handled by set_subview_mode() */
-               }
-       }
-
-       return none;
+       boost::shared_ptr<Route> r = first_selected_route ();
+       set_subview_mode (Dynamics, r);
+       return none; /* led state handled by set_subview_mode() */
 }
 
 LedState
@@ -879,20 +868,8 @@ Mackie::LedState
 MackieControlProtocol::send_press (Mackie::Button&)
 {
        boost::shared_ptr<Route> r = first_selected_route ();
-       if (r) {
-#ifndef MIXBUS
-               if (!r->nth_send (0)) {
-                       /* no sends ... no send subview mode */
-                       if (!surfaces.empty()) {
-                               surfaces.front()->display_message_for (_("No sends for this track/bus"), 1000);
-                       }
-                       return none;
-               }
-#endif
-               set_subview_mode (Sends, r);
-               return none; /* led state handled by set_subview_mode() */
-       }
-       return none;
+       set_subview_mode (Sends, r);
+       return none; /* led state handled by set_subview_mode() */
 }
 Mackie::LedState
 MackieControlProtocol::send_release (Mackie::Button&)
index 24cae949ca752c3743ada49145bc3fbc0a4d6541..6cc733b76f650704ea9808962762b494ed04687e 100644 (file)
@@ -771,23 +771,52 @@ Strip::vselect_event (Button&, ButtonState bs)
 {
        if (_surface->mcp().subview_mode() != MackieControlProtocol::None) {
 
-               /* subview mode: vpot press acts like a button for toggle parameters */
+               /* most subview modes: vpot press acts like a button for toggle parameters */
 
                if (bs != press) {
                        return;
                }
 
-               boost::shared_ptr<AutomationControl> control = _vpot->control ();
-               if (!control) {
-                       return;
-               }
+               if (_surface->mcp().subview_mode() != MackieControlProtocol::Sends) {
+
+                       boost::shared_ptr<AutomationControl> control = _vpot->control ();
+                       if (!control) {
+                               return;
+                       }
 
-               if (control->toggled()) {
                        if (control->toggled()) {
-                               control->set_value (!control->get_value(), Controllable::NoGroup);
+                               if (control->toggled()) {
+                                       control->set_value (!control->get_value(), Controllable::NoGroup);
+                               }
+                       }
+               } else {
+
+                       /* Send mode: press enables/disables the relevant send */
+
+                       if (_route) {
+
+                               const uint32_t global_pos = _surface->mcp().global_index (*this);
+                               boost::shared_ptr<AutomationControl> control = _route->send_enable_controllable (global_pos);
+
+                               if (control) {
+                                       bool currently_enabled = (bool) control->get_value();
+                                       control->set_value (!currently_enabled, Controllable::UseGroup);
+
+                                       if (currently_enabled) {
+                                               /* we just turned it off */
+                                               display (1, "off");
+                                       } else {
+                                               /* we just turned it on, show the level
+                                               */
+                                               control = _route->send_level_controllable (global_pos);
+                                               do_parameter_display (BusSendLevel, control->get_value());
+                                       }
+                               }
                        }
                }
 
+               /* done with this event in subview mode */
+
                return;
        }
 
@@ -1477,6 +1506,8 @@ Strip::subview_mode_changed ()
        switch (_surface->mcp().subview_mode()) {
        case MackieControlProtocol::None:
                set_vpot_parameter (vpot_parameter);
+               /* need to show strip name again */
+               show_route_name ();
                notify_metering_state_changed ();
                eq_band = -1;
                break;