13
0

GUI changes to support new selection/group logic

This commit is contained in:
Paul Davis 2023-07-31 13:36:25 -06:00
parent 03105aa760
commit fa38a14120
4 changed files with 37 additions and 113 deletions

View File

@ -761,7 +761,7 @@ GainMeterBase::amp_start_touch (int state)
if (ARDOUR_UI::instance()->maybe_use_select_as_group (*_route)) {
_touch_control_group.reset (new GainControlGroup ());
_touch_control_group->set_mode (ControlGroup::Relative);
_touch_control_group->fill_from_selection (_control->session().selection(), _control->parameter());
_touch_control_group->fill_from_selection_or_group (_route, _control->session().selection(), _control->parameter(), &RouteGroup::is_gain);
}
_control->start_touch (timepos_t (_control->session().transport_sample()));

View File

@ -512,7 +512,7 @@ MixerStrip::trim_start_touch (int)
if (ARDOUR_UI::instance()->maybe_use_select_as_group (*_route)) {
_touch_control_group.reset (new GainControlGroup (TrimAutomation));
_touch_control_group->set_mode (ControlGroup::Relative);
_touch_control_group->fill_from_selection (control->session().selection(), control->parameter());
_touch_control_group->fill_from_selection_or_group (_route, control->session().selection(), control->parameter(), &RouteGroup::is_gain);
}
control->start_touch (timepos_t (_session->transport_sample()));

View File

@ -53,6 +53,7 @@
#include "ardour/phase_control.h"
#include "ardour/send.h"
#include "ardour/route.h"
#include "ardour/selection.h"
#include "ardour/session.h"
#include "ardour/session_playlists.h"
#include "ardour/solo_mute_release.h"
@ -510,11 +511,11 @@ RouteUI::mute_press (GdkEventButton* ev)
* on a copy.
*/
std::shared_ptr<RouteList> copy (new RouteList);
std::shared_ptr<StripableList> copy (new StripableList);
*copy = *_session->get_routes ();
*copy = _session->get_stripables ();
for (RouteList::iterator i = copy->begin(); i != copy->end(); ) {
for (StripableList::iterator i = copy->begin(); i != copy->end(); ) {
if ((*i)->is_master() || (*i)->is_monitor()) {
i = copy->erase (i);
} else {
@ -526,7 +527,7 @@ RouteUI::mute_press (GdkEventButton* ev)
_mute_release->set (copy);
}
_session->set_controls (route_list_to_control_list (copy, &Stripable::mute_control), _route->muted_by_self() ? 0.0 : 1.0, Controllable::UseGroup);
_session->set_controls (stripable_list_to_control_list (copy, &Stripable::mute_control), _route->muted_by_self() ? 0.0 : 1.0, Controllable::NoGroup);
} else if (Keyboard::is_group_override_event (ev)) {
@ -543,46 +544,32 @@ RouteUI::mute_press (GdkEventButton* ev)
NOTE: Primary-button2 is MIDI learn.
*/
std::shared_ptr<RouteList> rl;
if (ev->button == 1) {
rl.reset (new RouteList);
rl->push_back (_route);
std::shared_ptr<StripableList> sl (new StripableList);
sl->push_back (_route);
if (_mute_release) {
_mute_release->set (rl);
_mute_release->set (sl);
}
std::shared_ptr<MuteControl> mc = _route->mute_control();
mc->start_touch (timepos_t (_session->audible_sample ()));
_session->set_controls (route_list_to_control_list (rl, &Stripable::mute_control), _route->muted_by_self() ? 0.0 : 1.0, Controllable::InverseGroup);
_session->set_controls (stripable_list_to_control_list (sl, &Stripable::mute_control), _route->muted_by_self() ? 0.0 : 1.0, Controllable::InverseGroup);
}
} else {
/* plain click applies change to this route */
Controllable::GroupControlDisposition gcd;
std::shared_ptr<RouteList> rl (new RouteList);
if (ARDOUR_UI::instance()->maybe_use_select_as_group (*_route)) {
gather_selected_routes (rl);
gcd = Controllable::NoGroup;
} else {
rl->push_back (route());
gcd = Controllable::UseGroup;
}
std::shared_ptr<StripableList> sl (new StripableList);
_session->selection().get_stripables_for_op (sl, _route, &RouteGroup::is_mute);
if (_mute_release) {
_mute_release->set (rl);
_mute_release->set (sl);
}
_session->set_controls (route_list_to_control_list (rl, &Stripable::mute_control), _route->muted_by_self() ? 0.0 : 1.0, gcd);
// 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);
_session->set_controls (stripable_list_to_control_list (sl, &Stripable::mute_control), _route->muted_by_self() ? 0.0 : 1.0, Controllable::NoGroup);
}
}
}
@ -682,11 +669,15 @@ RouteUI::solo_press(GdkEventButton* ev)
/* Primary-Tertiary-click applies change to all routes */
std::shared_ptr<StripableList> sl (new StripableList);
_session->get_stripables (*sl, PresentationInfo::Route);
if (_solo_release) {
_solo_release->set (_session->get_routes ());
_solo_release->set (sl);
}
_session->set_controls (route_list_to_control_list (_session->get_routes(), &Stripable::solo_control), !_route->solo_control()->get_value(), Controllable::UseGroup);
_session->set_controls (stripable_list_to_control_list (sl, &Stripable::solo_control), !_route->solo_control()->get_value(), Controllable::NoGroup);
} else if (Keyboard::modifier_state_contains (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::SecondaryModifier)) || (!_route->self_soloed() && Config->get_exclusive_solo ())) {
@ -742,22 +733,15 @@ RouteUI::solo_press(GdkEventButton* ev)
/* click: solo this route */
std::shared_ptr<RouteList> rl (new RouteList);
Controllable::GroupControlDisposition gcd;
std::shared_ptr<StripableList> sl (new StripableList);
if (ARDOUR_UI::instance()->maybe_use_select_as_group (*_route)) {
gather_selected_routes (rl);
gcd = Controllable::NoGroup;
} else {
rl->push_back (route());
gcd = Controllable::UseGroup;
}
_session->selection().get_stripables_for_op (sl, _route, &RouteGroup::is_solo);
if (_solo_release) {
_solo_release->set (rl);
_solo_release->set (sl);
}
_session->set_controls (route_list_to_control_list (rl, &Stripable::solo_control), !_route->self_soloed(), gcd);
_session->set_controls (stripable_list_to_control_list (sl, &Stripable::solo_control), !_route->self_soloed(), Controllable::NoGroup);
}
}
}
@ -837,24 +821,10 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
} else {
if (ev->button == 1) {
std::shared_ptr<RouteList> rl;
Controllable::GroupControlDisposition gcd;
rl.reset (new RouteList);
if (ARDOUR_UI::instance()->maybe_use_select_as_group (*_route)) {
gather_selected_routes (rl);
gcd = Controllable::NoGroup;
} else {
rl->push_back (route());
gcd = Controllable::UseGroup;
}
_session->set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), !track()->rec_enable_control()->get_value(), gcd);
StripableList sl;
_session->selection().get_stripables_for_op (sl, _route, &RouteGroup::is_recenable);
_session->set_controls (stripable_list_to_control_list (sl, &Stripable::rec_enable_control), !track()->rec_enable_control()->get_value(), Controllable::NoGroup);
}
// std::shared_ptr<Track> trk = track();
// trk->rec_enable_control()->set_value (!trk->rec_enable_control()->get_value(), Controllable::UseGroup);
}
}
@ -953,18 +923,10 @@ RouteUI::monitor_release (GdkEventButton* ev, MonitorChoice monitor_choice)
_session->set_controls (route_list_to_control_list (rl, &Stripable::monitoring_control), (double) mc, GROUP_ACTION);
} else {
std::shared_ptr<RouteList> rl (new RouteList);
Controllable::GroupControlDisposition gcd;
StripableList sl;
_session->selection().get_stripables_for_op (sl, _route, &RouteGroup::is_monitoring);
_session->set_controls (stripable_list_to_control_list (sl, &Stripable::monitoring_control), (double) mc, Controllable::NoGroup);
if (ARDOUR_UI::instance()->maybe_use_select_as_group (*_route)) {
gather_selected_routes (rl);
gcd = Controllable::NoGroup;
} else {
rl->push_back (route());
gcd = Controllable::UseGroup;
}
_session->set_controls (route_list_to_control_list (rl, &Stripable::monitoring_control), (double) mc, gcd);
}
return false;
@ -1591,19 +1553,9 @@ RouteUI::solo_isolate_button_release (GdkEventButton* ev)
} else {
if (model == view) {
std::shared_ptr<RouteList> rl (new RouteList);
Controllable::GroupControlDisposition gcd;
if (ARDOUR_UI::instance()->maybe_use_select_as_group (*_route)) {
gather_selected_routes (rl);
gcd = Controllable::NoGroup;
} else {
rl->push_back (route());
gcd = Controllable::UseGroup;
}
_session->set_controls (route_list_to_control_list (rl, &Stripable::solo_isolate_control), view ? 0.0 : 1.0, gcd);
StripableList sl;
_session->selection().get_stripables_for_op (sl, _route, &RouteGroup::is_solo);
_session->set_controls (stripable_list_to_control_list (sl, &Stripable::solo_isolate_control), view ? 0.0 : 1.0, Controllable::NoGroup);
}
}
}
@ -1632,19 +1584,9 @@ RouteUI::solo_safe_button_release (GdkEventButton* ev)
} else {
if (model == view) {
std::shared_ptr<RouteList> rl (new RouteList);
Controllable::GroupControlDisposition gcd;
if (ARDOUR_UI::instance()->maybe_use_select_as_group (*_route)) {
gather_selected_routes (rl);
gcd = Controllable::NoGroup;
} else {
rl->push_back (route());
gcd = Controllable::UseGroup;
}
_session->set_controls (route_list_to_control_list (rl, &Stripable::solo_safe_control), view ? 0.0 : 1.0, gcd);
StripableList sl;
_session->selection().get_stripables_for_op (sl, _route, &RouteGroup::is_solo);
_session->set_controls (stripable_list_to_control_list (sl, &Stripable::solo_safe_control), view ? 0.0 : 1.0, Controllable::NoGroup);
}
}
}
@ -2902,19 +2844,3 @@ RouteUI::rename_current_playlist ()
}
}
}
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());
}
}
}
}

View File

@ -263,8 +263,6 @@ protected:
ARDOUR::SoloMuteRelease* _solo_release;
ARDOUR::SoloMuteRelease* _mute_release;
void gather_selected_routes (std::shared_ptr<ARDOUR::RouteList>& rl) const;
private:
void invert_menu_toggled (uint32_t);
bool invert_press (GdkEventButton*);