mackie: clean up (some) interactions between subview mode and selection

Also, stop Plugin button from doing anything, since it has nothing to do yet
This commit is contained in:
Paul Davis 2016-01-27 19:00:21 -05:00
parent d121e6bf15
commit e63c805fe2
4 changed files with 128 additions and 44 deletions

View file

@ -1624,7 +1624,43 @@ MackieControlProtocol::notify_subview_route_deleted ()
set_view_mode (Mixer); 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) MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Route> r)
{ {
SubViewMode old_mode = _subview_mode; SubViewMode old_mode = _subview_mode;
@ -1637,6 +1673,35 @@ MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Route
_subview_route = r; _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 ((_subview_mode != old_mode) || (_subview_route != old_route)) {
if (r != old_route) { if (r != old_route) {
@ -1699,6 +1764,8 @@ MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Route
} }
} }
} }
return 0;
} }
void void
@ -1753,6 +1820,10 @@ MackieControlProtocol::set_pot_mode (PotMode m)
return; return;
} }
/* switch to a pot mode cancels any subview mode */
set_subview_mode (None, boost::shared_ptr<Route>());
_pot_mode = m; _pot_mode = m;
{ {
@ -1859,8 +1930,12 @@ MackieControlProtocol::_gui_track_selection_changed (ARDOUR::RouteNotificationLi
} }
if (gui_selection_did_change) { 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>());
}
} }
} }

View file

@ -152,6 +152,7 @@ class MackieControlProtocol
FlipMode flip_mode () const { return _flip_mode; } FlipMode flip_mode () const { return _flip_mode; }
ViewMode view_mode () const { return _view_mode; } ViewMode view_mode () const { return _view_mode; }
SubViewMode subview_mode () const { return _subview_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; boost::shared_ptr<ARDOUR::Route> subview_route() const;
PotMode pot_mode () const { return _pot_mode; } PotMode pot_mode () const { return _pot_mode; }
bool zoom_mode () const { return modifier_state() & MODIFIER_ZOOM; } bool zoom_mode () const { return modifier_state() & MODIFIER_ZOOM; }
@ -165,7 +166,7 @@ class MackieControlProtocol
boost::shared_ptr<ARDOUR::Route> first_selected_route () const; boost::shared_ptr<ARDOUR::Route> first_selected_route () const;
void set_view_mode (ViewMode); 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_flip_mode (FlipMode);
void set_pot_mode (PotMode); void set_pot_mode (PotMode);
void pot_mode_globals (); void pot_mode_globals ();

View file

@ -689,20 +689,16 @@ MackieControlProtocol::plugin_press (Button &)
LedState LedState
MackieControlProtocol::plugin_release (Button &) 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 */ return none; /* LED state set by set_view_mode */
} }
LedState LedState
MackieControlProtocol::eq_press (Button &) MackieControlProtocol::eq_press (Button &)
{ {
if (Profile->get_mixbus()) { boost::shared_ptr<Route> r = first_selected_route ();
boost::shared_ptr<Route> r = first_selected_route (); set_subview_mode (EQ, r);
if (r && r->eq_band_cnt() > 0) { return none; /* led state handled by set_subview_mode() */
set_subview_mode (EQ, r);
return none; /* led state handled by set_subview_mode() */
}
}
return none;
} }
LedState LedState
@ -713,16 +709,9 @@ MackieControlProtocol::eq_release (Button &)
LedState LedState
MackieControlProtocol::dyn_press (Button &) MackieControlProtocol::dyn_press (Button &)
{ {
if (Profile->get_mixbus()) { boost::shared_ptr<Route> r = first_selected_route ();
boost::shared_ptr<Route> r = first_selected_route (); set_subview_mode (Dynamics, r);
return none; /* led state handled by set_subview_mode() */
if (r) {
set_subview_mode (Dynamics, r);
return none; /* led state handled by set_subview_mode() */
}
}
return none;
} }
LedState LedState
@ -879,20 +868,8 @@ Mackie::LedState
MackieControlProtocol::send_press (Mackie::Button&) MackieControlProtocol::send_press (Mackie::Button&)
{ {
boost::shared_ptr<Route> r = first_selected_route (); boost::shared_ptr<Route> r = first_selected_route ();
if (r) { set_subview_mode (Sends, r);
#ifndef MIXBUS return none; /* led state handled by set_subview_mode() */
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;
} }
Mackie::LedState Mackie::LedState
MackieControlProtocol::send_release (Mackie::Button&) MackieControlProtocol::send_release (Mackie::Button&)

View file

@ -771,23 +771,52 @@ Strip::vselect_event (Button&, ButtonState bs)
{ {
if (_surface->mcp().subview_mode() != MackieControlProtocol::None) { 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) { if (bs != press) {
return; return;
} }
boost::shared_ptr<AutomationControl> control = _vpot->control (); if (_surface->mcp().subview_mode() != MackieControlProtocol::Sends) {
if (!control) {
return; boost::shared_ptr<AutomationControl> control = _vpot->control ();
} if (!control) {
return;
}
if (control->toggled()) {
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; return;
} }
@ -1477,6 +1506,8 @@ Strip::subview_mode_changed ()
switch (_surface->mcp().subview_mode()) { switch (_surface->mcp().subview_mode()) {
case MackieControlProtocol::None: case MackieControlProtocol::None:
set_vpot_parameter (vpot_parameter); set_vpot_parameter (vpot_parameter);
/* need to show strip name again */
show_route_name ();
notify_metering_state_changed (); notify_metering_state_changed ();
eq_band = -1; eq_band = -1;
break; break;