mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-06 14:54:56 +01:00
consolidate rules for selection-as-group and extend to solo/mute/recanable
This commit is contained in:
parent
e0a491f0ee
commit
c9a58bfae1
2 changed files with 74 additions and 21 deletions
|
|
@ -564,15 +564,22 @@ RouteUI::mute_press (GdkEventButton* ev)
|
||||||
/* plain click applies change to this route */
|
/* plain click applies change to this route */
|
||||||
|
|
||||||
std::shared_ptr<RouteList> rl (new RouteList);
|
std::shared_ptr<RouteList> 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) {
|
if (_mute_release) {
|
||||||
_mute_release->set (rl);
|
_mute_release->set (rl);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<MuteControl> mc = _route->mute_control();
|
_session->set_controls (route_list_to_control_list (rl, &Stripable::mute_control), _route->muted_by_self() ? 0.0 : 1.0, Controllable::InverseGroup);
|
||||||
mc->start_touch (timepos_t (_session->audible_sample ()));
|
|
||||||
mc->set_value (!_route->muted_by_self(), Controllable::UseGroup);
|
// std::shared_ptr<MuteControl> 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<RouteList> rl (new RouteList);
|
std::shared_ptr<RouteList> rl (new RouteList);
|
||||||
|
|
||||||
if (!UIConfiguration::instance().get_allow_selection_as_group() &&
|
if (maybe_use_select_as_group (&RouteGroup::is_solo)) {
|
||||||
route() &&
|
gather_selected_routes (rl);
|
||||||
(!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());
|
|
||||||
} else {
|
} else {
|
||||||
TrackSelection& selected_tracks (ARDOUR_UI::instance()->the_editor().get_selection().tracks);
|
rl->push_back (route());
|
||||||
for (auto & st : selected_tracks) {
|
|
||||||
RouteTimeAxisView* rtv;
|
|
||||||
RouteUI* rui;
|
|
||||||
if ((rtv = dynamic_cast<RouteTimeAxisView*>(st)) != 0) {
|
|
||||||
if ((rui = dynamic_cast<RouteUI*>(rtv)) != 0) {
|
|
||||||
rl->push_back (rui->route());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_solo_release) {
|
if (_solo_release) {
|
||||||
|
|
@ -835,8 +830,22 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
std::shared_ptr<Track> trk = track();
|
if (ev->button == 1) {
|
||||||
trk->rec_enable_control()->set_value (!trk->rec_enable_control()->get_value(), Controllable::UseGroup);
|
|
||||||
|
std::shared_ptr<RouteList> 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<Track> 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<RouteList>& 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<RouteTimeAxisView*>(st)) != 0) {
|
||||||
|
if ((rui = dynamic_cast<RouteUI*>(rtv)) != 0) {
|
||||||
|
rl->push_back (rui->route());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -263,6 +263,9 @@ protected:
|
||||||
ARDOUR::SoloMuteRelease* _solo_release;
|
ARDOUR::SoloMuteRelease* _solo_release;
|
||||||
ARDOUR::SoloMuteRelease* _mute_release;
|
ARDOUR::SoloMuteRelease* _mute_release;
|
||||||
|
|
||||||
|
bool maybe_use_select_as_group (bool (ARDOUR::RouteGroup::*method)() const) const;
|
||||||
|
void gather_selected_routes (std::shared_ptr<ARDOUR::RouteList>& rl) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void invert_menu_toggled (uint32_t);
|
void invert_menu_toggled (uint32_t);
|
||||||
bool invert_press (GdkEventButton*);
|
bool invert_press (GdkEventButton*);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue