OSC: Changed gainVCA to gainfader as VCA is already used.
[ardour.git] / gtk2_ardour / route_processor_selection.cc
index b3a6620f6bf1bca3f56fea40f7c90d7857ae642b..30943e22d04475765a1d4b1b07d7b815e9797b82 100644 (file)
 #include <sigc++/bind.h>
 #include "pbd/error.h"
 
-#include "ardour/playlist.h"
-#include "ardour/processor.h"
-#include "ardour/route.h"
-
-#include "route_processor_selection.h"
 #include "gui_thread.h"
+#include "mixer_strip.h"
+#include "route_processor_selection.h"
+#include "route_ui.h"
 
 #include "i18n.h"
 
@@ -34,8 +32,13 @@ using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 
-RouteRedirectSelection&
-RouteRedirectSelection::operator= (const RouteRedirectSelection& other)
+RouteProcessorSelection::RouteProcessorSelection()
+       : _no_route_change_signal (false)
+{
+}
+
+RouteProcessorSelection&
+RouteProcessorSelection::operator= (const RouteProcessorSelection& other)
 {
        if (&other != this) {
                processors = other.processors;
@@ -45,36 +48,41 @@ RouteRedirectSelection::operator= (const RouteRedirectSelection& other)
 }
 
 bool
-operator== (const RouteRedirectSelection& a, const RouteRedirectSelection& b)
+operator== (const RouteProcessorSelection& a, const RouteProcessorSelection& b)
 {
        // XXX MUST TEST PROCESSORS SOMEHOW
        return a.routes == b.routes;
 }
 
 void
-RouteRedirectSelection::clear ()
+RouteProcessorSelection::clear ()
 {
        clear_processors ();
        clear_routes ();
 }
 
 void
-RouteRedirectSelection::clear_processors ()
+RouteProcessorSelection::clear_processors ()
 {
        processors.clear ();
        ProcessorsChanged ();
 }
 
 void
-RouteRedirectSelection::clear_routes ()
+RouteProcessorSelection::clear_routes ()
 {
+       for (RouteUISelection::iterator i = routes.begin(); i != routes.end(); ++i) {
+               (*i)->set_selected (false);
+       }
        routes.clear ();
        drop_connections ();
-       RoutesChanged ();
+       if (!_no_route_change_signal) {
+               RoutesChanged ();
+       }
 }
 
 void
-RouteRedirectSelection::add (XMLNode* node)
+RouteProcessorSelection::add (XMLNode* node)
 {
        // XXX check for duplicate
        processors.add (node);
@@ -82,7 +90,7 @@ RouteRedirectSelection::add (XMLNode* node)
 }
 
 void
-RouteRedirectSelection::set (XMLNode* node)
+RouteProcessorSelection::set (XMLNode* node)
 {
        clear_processors ();
        processors.set (node);
@@ -90,55 +98,61 @@ RouteRedirectSelection::set (XMLNode* node)
 }
 
 void
-RouteRedirectSelection::add (boost::shared_ptr<Route> r)
+RouteProcessorSelection::add (RouteUI* r)
 {
        if (find (routes.begin(), routes.end(), r) == routes.end()) {
-               routes.push_back (r);
-               r->DropReferences.connect (*this, MISSING_INVALIDATOR, boost::bind (&RouteRedirectSelection::removed, this, boost::weak_ptr<Route>(r)), gui_context());
-               RoutesChanged();
-       }
-}
+               if (routes.insert (r).second) {
+                       r->set_selected (true);
 
-void
-RouteRedirectSelection::removed (boost::weak_ptr<Route> wr)
-{
-       boost::shared_ptr<Route> r (wr.lock());
+                       MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
 
-       if (!r) {
-               return;
-       }
+                       if (ms) {
+                               ms->CatchDeletion.connect (*this, invalidator (*this), boost::bind (&RouteProcessorSelection::remove, this, _1), gui_context());
+                       }
 
-       remove (r);
+                       if (!_no_route_change_signal) {
+                               RoutesChanged();
+                       }
+               }
+       }
 }
 
 void
-RouteRedirectSelection::remove (boost::shared_ptr<Route> r)
+RouteProcessorSelection::remove (RouteUI* r)
 {
-       ENSURE_GUI_THREAD (*this, &RouteRedirectSelection::remove, r);
+       ENSURE_GUI_THREAD (*this, &RouteProcessorSelection::remove, r);
 
-       list<boost::shared_ptr<Route> >::iterator i;
+       RouteUISelection::iterator i;
        if ((i = find (routes.begin(), routes.end(), r)) != routes.end()) {
+               (*i)->set_selected (false);
                routes.erase (i);
-               RoutesChanged ();
+               if (!_no_route_change_signal) {
+                       RoutesChanged ();
+               }
        }
 }
 
 void
-RouteRedirectSelection::set (boost::shared_ptr<Route> r)
+RouteProcessorSelection::set (RouteUI* r)
 {
        clear_routes ();
        add (r);
 }
 
 bool
-RouteRedirectSelection::selected (boost::shared_ptr<Route> r)
+RouteProcessorSelection::selected (RouteUI* r)
 {
        return find (routes.begin(), routes.end(), r) != routes.end();
 }
 
 bool
-RouteRedirectSelection::empty ()
+RouteProcessorSelection::empty ()
 {
        return processors.empty () && routes.empty ();
 }
 
+void
+RouteProcessorSelection::block_routes_changed (bool yn)
+{
+       _no_route_change_signal = yn;
+}