diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index 20fab7a172..24c714587d 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -564,15 +564,22 @@ RouteUI::mute_press (GdkEventButton* ev) /* plain click applies change to this route */ std::shared_ptr rl (new RouteList); - rl->push_back (_route); + + if (maybe_use_select_as_group (&RouteGroup::is_mute)) { + gather_selected_routes (rl); + } else { + rl->push_back (route()); + } if (_mute_release) { _mute_release->set (rl); } - std::shared_ptr mc = _route->mute_control(); - mc->start_touch (timepos_t (_session->audible_sample ())); - mc->set_value (!_route->muted_by_self(), Controllable::UseGroup); + _session->set_controls (route_list_to_control_list (rl, &Stripable::mute_control), _route->muted_by_self() ? 0.0 : 1.0, Controllable::InverseGroup); + + // std::shared_ptr mc = _route->mute_control(); + // mc->start_touch (timepos_t (_session->audible_sample ())); + // mc->set_value (!_route->muted_by_self(), Controllable::UseGroup); } } } @@ -734,22 +741,10 @@ RouteUI::solo_press(GdkEventButton* ev) std::shared_ptr rl (new RouteList); - if (!UIConfiguration::instance().get_allow_selection_as_group() && - route() && - (!route()->is_selected() || (route()->route_group() && route()->route_group()->is_solo()))) { - /* Not selected or part of a group that share solo, just start with this route */ - rl->push_back (route()); + if (maybe_use_select_as_group (&RouteGroup::is_solo)) { + gather_selected_routes (rl); } else { - TrackSelection& selected_tracks (ARDOUR_UI::instance()->the_editor().get_selection().tracks); - for (auto & st : selected_tracks) { - RouteTimeAxisView* rtv; - RouteUI* rui; - if ((rtv = dynamic_cast(st)) != 0) { - if ((rui = dynamic_cast(rtv)) != 0) { - rl->push_back (rui->route()); - } - } - } + rl->push_back (route()); } if (_solo_release) { @@ -835,8 +830,22 @@ RouteUI::rec_enable_press(GdkEventButton* ev) } else { - std::shared_ptr trk = track(); - trk->rec_enable_control()->set_value (!trk->rec_enable_control()->get_value(), Controllable::UseGroup); + if (ev->button == 1) { + + std::shared_ptr rl; + rl.reset (new RouteList); + + if (maybe_use_select_as_group (&RouteGroup::is_recenable)) { + gather_selected_routes (rl); + } else { + rl->push_back (route()); + } + + _session->set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), !track()->rec_enable_control()->get_value(), GROUP_ACTION); + } + + // std::shared_ptr trk = track(); + // trk->rec_enable_control()->set_value (!trk->rec_enable_control()->get_value(), Controllable::UseGroup); } } @@ -2864,3 +2873,44 @@ RouteUI::rename_current_playlist () } } } + +bool +RouteUI::maybe_use_select_as_group (bool (RouteGroup::*method)() const) const +{ + if (!UIConfiguration::instance().get_allow_selection_as_group()) { + return false; + } + + if (!route()) { + /* Shouldn't happen but protects conditionals below */ + return false; + } + + if (!route()->is_selected()) { + /* Not selected, can't possibly use selection */ + return false; + } + + if (route()->route_group() && route()->route_group()->is_active() && (route()->route_group()->*method)()) { + /* active route group sharing the appropriate property */ + return false; + } + + return true; +} + +void +RouteUI::gather_selected_routes (std::shared_ptr& rl) const +{ + TrackSelection& selected_tracks (ARDOUR_UI::instance()->the_editor().get_selection().tracks); + + for (auto & st : selected_tracks) { + RouteTimeAxisView* rtv; + RouteUI* rui; + if ((rtv = dynamic_cast(st)) != 0) { + if ((rui = dynamic_cast(rtv)) != 0) { + rl->push_back (rui->route()); + } + } + } +} diff --git a/gtk2_ardour/route_ui.h b/gtk2_ardour/route_ui.h index 23d5a81ab1..c16a21f37f 100644 --- a/gtk2_ardour/route_ui.h +++ b/gtk2_ardour/route_ui.h @@ -263,6 +263,9 @@ protected: ARDOUR::SoloMuteRelease* _solo_release; ARDOUR::SoloMuteRelease* _mute_release; + bool maybe_use_select_as_group (bool (ARDOUR::RouteGroup::*method)() const) const; + void gather_selected_routes (std::shared_ptr& rl) const; + private: void invert_menu_toggled (uint32_t); bool invert_press (GdkEventButton*);