fix crash when copy'ing latent plugins
[ardour.git] / gtk2_ardour / route_processor_selection.cc
index 1af1e0c968f393aea11b0f9ad6d2ca6617b9ced1..729032e637fde74e8df417b98261e329c85471c9 100644 (file)
 #include <sigc++/bind.h>
 #include "pbd/error.h"
 
-#include "ardour/playlist.h"
-#include "ardour/processor.h"
-#include "ardour/route.h"
-
+#include "gui_thread.h"
+#include "mixer_strip.h"
 #include "route_processor_selection.h"
+#include "route_ui.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 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;
-               routes = other.routes;
+               axes = other.axes;
        }
        return *this;
 }
 
 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;
+       return a.axes == b.axes;
 }
 
 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 ()
 {
-       routes.clear ();
-       RoutesChanged ();
+       for (AxisViewSelection::iterator i = axes.begin(); i != axes.end(); ++i) {
+               (*i)->set_selected (false);
+       }
+       axes.clear ();
+       drop_connections ();
+       if (!_no_route_change_signal) {
+               RoutesChanged ();
+       }
 }
 
 void
-RouteRedirectSelection::add (XMLNode* node)
+RouteProcessorSelection::add (XMLNode* node)
 {
        // XXX check for duplicate
        processors.add (node);
@@ -80,7 +90,7 @@ RouteRedirectSelection::add (XMLNode* node)
 }
 
 void
-RouteRedirectSelection::set (XMLNode* node)
+RouteProcessorSelection::set (XMLNode* node)
 {
        clear_processors ();
        processors.set (node);
@@ -88,45 +98,60 @@ RouteRedirectSelection::set (XMLNode* node)
 }
 
 void
-RouteRedirectSelection::add (boost::shared_ptr<Route> r)
+RouteProcessorSelection::add (AxisView* r)
 {
-       if (find (routes.begin(), routes.end(), r) == routes.end()) {
-               routes.push_back (r);
+       if (axes.insert (r).second) {
 
-               // XXX SHAREDPTR FIXME
-               // void (RouteRedirectSelection::*pmf)(Route*) = &RouteRedirectSelection::remove;
-               // r->GoingAway.connect (sigc::bind (sigc::mem_fun(*this, pmf), r));
+               r->set_selected (true);
 
-               RoutesChanged();
+               MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+
+               if (ms) {
+                       ms->CatchDeletion.connect (*this, invalidator (*this), boost::bind (&RouteProcessorSelection::remove, this, _1), gui_context());
+               }
+
+               if (!_no_route_change_signal) {
+                       RoutesChanged();
+               }
        }
 }
 
 void
-RouteRedirectSelection::remove (boost::shared_ptr<Route> r)
+RouteProcessorSelection::remove (AxisView* r)
 {
-       list<boost::shared_ptr<Route> >::iterator i;
-       if ((i = find (routes.begin(), routes.end(), r)) != routes.end()) {
-               routes.erase (i);
-               RoutesChanged ();
+       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 ();
+               }
        }
 }
 
 void
-RouteRedirectSelection::set (boost::shared_ptr<Route> r)
+RouteProcessorSelection::set (AxisView* r)
 {
        clear_routes ();
        add (r);
 }
 
 bool
-RouteRedirectSelection::selected (boost::shared_ptr<Route> r)
+RouteProcessorSelection::selected (AxisView* r)
 {
-       return find (routes.begin(), routes.end(), r) != routes.end();
+       return find (axes.begin(), axes.end(), r) != axes.end();
 }
 
 bool
-RouteRedirectSelection::empty ()
+RouteProcessorSelection::empty ()
 {
-       return processors.empty () && routes.empty ();
+       return processors.empty () && axes.empty ();
 }
 
+void
+RouteProcessorSelection::block_routes_changed (bool yn)
+{
+       _no_route_change_signal = yn;
+}