X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Froute_processor_selection.cc;h=34ad5d365c5daf8e3b3bf92c8bb1eb9750e5cdb8;hb=a8d62ce056fe260792d4e72bf8cf2fbff0e8b39b;hp=729032e637fde74e8df417b98261e329c85471c9;hpb=cf52d6e4b40111eb04b244ec054055a4ec15dbe0;p=ardour.git diff --git a/gtk2_ardour/route_processor_selection.cc b/gtk2_ardour/route_processor_selection.cc index 729032e637..34ad5d365c 100644 --- a/gtk2_ardour/route_processor_selection.cc +++ b/gtk2_ardour/route_processor_selection.cc @@ -1,28 +1,36 @@ /* - Copyright (C) 2002 Paul Davis - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ + * Copyright (C) 2007-2012 David Robillard + * Copyright (C) 2007-2017 Paul Davis + * Copyright (C) 2015-2018 Robin Gareus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ #include #include + #include "pbd/error.h" +#include "ardour/selection.h" +#include "ardour/session.h" +#include "ardour/session_handle.h" + +#include "axis_provider.h" #include "gui_thread.h" #include "mixer_strip.h" +#include "mixer_ui.h" #include "route_processor_selection.h" #include "route_ui.h" @@ -32,21 +40,11 @@ using namespace std; using namespace ARDOUR; using namespace PBD; -RouteProcessorSelection::RouteProcessorSelection() - : _no_route_change_signal (false) +RouteProcessorSelection::RouteProcessorSelection (SessionHandlePtr& s, AxisViewProvider& ap) + : shp (s), avp (ap) { } -RouteProcessorSelection& -RouteProcessorSelection::operator= (const RouteProcessorSelection& other) -{ - if (&other != this) { - processors = other.processors; - axes = other.axes; - } - return *this; -} - bool operator== (const RouteProcessorSelection& a, const RouteProcessorSelection& b) { @@ -61,81 +59,122 @@ RouteProcessorSelection::clear () clear_routes (); } -void -RouteProcessorSelection::clear_processors () -{ - processors.clear (); - ProcessorsChanged (); -} - void RouteProcessorSelection::clear_routes () { - for (AxisViewSelection::iterator i = axes.begin(); i != axes.end(); ++i) { - (*i)->set_selected (false); - } - axes.clear (); - drop_connections (); - if (!_no_route_change_signal) { - RoutesChanged (); + if (shp.session()) { + PresentationInfo::ChangeSuspender cs; + shp.session()->selection().clear_stripables (); } } -void -RouteProcessorSelection::add (XMLNode* node) +std::list +RouteProcessorSelection::add_grouped_tracks (AxisView* r) const { - // XXX check for duplicate - processors.add (node); - ProcessorsChanged(); + std::list rv; + + boost::shared_ptr route = boost::dynamic_pointer_cast(r->stripable()); + if (route) { + ARDOUR::RouteGroup* rg = route->route_group (); + if (rg && rg->is_active() && rg->is_select ()) { + + boost::shared_ptr rl = rg->route_list (); + for (RouteList::const_iterator i = rl->begin(); i != rl->end(); ++i) { + AxisView* av = avp.axis_view_by_stripable (*i); + rv.push_back (av); + } + } + } + return rv; } void -RouteProcessorSelection::set (XMLNode* node) +RouteProcessorSelection::presentation_info_changed (PropertyChange const & what_changed) { - clear_processors (); - processors.set (node); - ProcessorsChanged (); -} + Session* s = shp.session(); -void -RouteProcessorSelection::add (AxisView* r) -{ - if (axes.insert (r).second) { + if (!s) { + /* too early ... session handle provider doesn't know about the + session yet. + */ + return; + } + + PropertyChange pc; + pc.add (Properties::selected); + + CoreSelection::StripableAutomationControls sc; + s->selection().get_stripables (sc); - r->set_selected (true); + for (AxisViewSelection::iterator a = axes.begin(); a != axes.end(); ++a) { + (*a)->set_selected (false); + } - MixerStrip* ms = dynamic_cast (r); + axes.clear (); - if (ms) { - ms->CatchDeletion.connect (*this, invalidator (*this), boost::bind (&RouteProcessorSelection::remove, this, _1), gui_context()); + for (CoreSelection::StripableAutomationControls::const_iterator i = sc.begin(); i != sc.end(); ++i) { + AxisView* av = avp.axis_view_by_stripable ((*i).stripable); + if (av) { + axes.insert (av); + av->set_selected (true); } + } +} + +void +RouteProcessorSelection::add (AxisView* r, bool with_groups) +{ + if (!shp.session()) { + return; + } - if (!_no_route_change_signal) { - RoutesChanged(); + std::list avl; + if (with_groups) { + avl= add_grouped_tracks (r); + } + avl.push_back (r); + + PresentationInfo::ChangeSuspender cs; + for (std::list::const_iterator i = avl.begin (); i != avl.end (); ++i) { + if (axes.insert (*i).second) { + shp.session()->selection().add ((*i)->stripable(), boost::shared_ptr()); + MixerStrip* ms = dynamic_cast (*i); + if (ms) { + ms->CatchDeletion.connect (*this, invalidator (*this), boost::bind (&RouteProcessorSelection::remove, this, _1, false), gui_context()); + } } } } void -RouteProcessorSelection::remove (AxisView* r) +RouteProcessorSelection::remove (AxisView* r, bool with_groups) { + if (!shp.session()) { + return; + } ENSURE_GUI_THREAD (*this, &RouteProcessorSelection::remove, r); - AxisViewSelection::iterator i; - if ((i = find (axes.begin(), axes.end(), r)) != axes.end()) { - (*i)->set_selected (false); - axes.erase (i); - if (!_no_route_change_signal) { - RoutesChanged (); - } + std::list avl; + if (with_groups) { + avl= add_grouped_tracks (r); + } + avl.push_back (r); + + PresentationInfo::ChangeSuspender cs; + for (std::list::const_iterator i = avl.begin (); i != avl.end (); ++i) { + shp.session()->selection().remove ((*i)->stripable(), boost::shared_ptr()); } } void RouteProcessorSelection::set (AxisView* r) { - clear_routes (); - add (r); + if (!shp.session()) { + return; + } + PresentationInfo::ChangeSuspender cs; + shp.session()->selection().clear_stripables (); + add (r, true); } bool @@ -149,9 +188,3 @@ RouteProcessorSelection::empty () { return processors.empty () && axes.empty (); } - -void -RouteProcessorSelection::block_routes_changed (bool yn) -{ - _no_route_change_signal = yn; -}