13
0

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);
}
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>());
}
}
}

View 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 ();

View 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&)

View 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;