]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/selection.cpp
Make designer work on generic objects
[r2c2.git] / source / designer / selection.cpp
index 855b41cc5e91538d0b4ab062c961af94ff4b5677..c93dd3628e5840394e9c190aaa53d2419e06282f 100644 (file)
@@ -6,36 +6,36 @@ using namespace std;
 using namespace R2C2;
 using namespace Msp;
 
-Track *Selection::get_track() const
+Object *Selection::get_object() const
 {
-       if(tracks.empty())
+       if(objects.empty())
                return 0;
        else
-               return *tracks.begin();
+               return *objects.begin();
 }
 
 void Selection::clear()
 {
-       tracks.clear();
+       objects.clear();
        signal_changed.emit();
 }
 
-void Selection::add_track(Track *t)
+void Selection::add_object(Object *o)
 {
-       if(tracks.insert(t).second)
+       if(objects.insert(o).second)
                signal_changed.emit();
 }
 
-void Selection::remove_track(Track *t)
+void Selection::remove_object(Object *o)
 {
-       if(tracks.erase(t))
+       if(objects.erase(o))
                signal_changed.emit();
 }
 
-void Selection::toggle_track(Track *t)
+void Selection::toggle_object(Object *o)
 {
-       if(!tracks.erase(t))
-               tracks.insert(t);
+       if(!objects.erase(o))
+               objects.insert(o);
 
        signal_changed.emit();
 }
@@ -43,17 +43,18 @@ void Selection::toggle_track(Track *t)
 void Selection::select_more()
 {
        set<Track *> new_tracks;
-       for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
-       {
-               const vector<Track *> &links = (*i)->get_links();
-               for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
-                       if(*j)
-                               new_tracks.insert(*j);
-       }
+       for(set<Object *>::iterator i=objects.begin(); i!=objects.end(); ++i)
+               if(Track *track = dynamic_cast<Track *>(*i))
+               {
+                       const vector<Track *> &links = track->get_links();
+                       for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
+                               if(*j)
+                                       new_tracks.insert(*j);
+               }
 
        bool changed = false;
        for(set<Track *>::iterator i=new_tracks.begin(); i!=new_tracks.end(); ++i)
-               if(tracks.insert(*i).second)
+               if(objects.insert(*i).second)
                        changed = true;
 
        if(changed)
@@ -63,7 +64,11 @@ void Selection::select_more()
 void Selection::select_linked()
 {
        bool changed = false;
-       list<Track *> queue(tracks.begin(), tracks.end());
+       list<Track *> queue;
+       for(set<Object *>::iterator i=objects.begin(); i!=objects.end(); ++i)
+               if(Track *track = dynamic_cast<Track *>(*i))
+                       queue.push_back(track);
+
        while(!queue.empty())
        {
                Track *track = queue.front();
@@ -71,19 +76,12 @@ void Selection::select_linked()
 
                const vector<Track *> &links = track->get_links();
                for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
-                       if(*j && tracks.insert(*j).second)
+                       if(*j && objects.insert(*j).second)
                        {
                                queue.push_back(*j);
                                changed = true;
                        }
        }
-       for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
-       {
-               const vector<Track *> &links = (*i)->get_links();
-               for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
-                       if(*j && tracks.insert(*j).second)
-                               changed = true;
-       }
 
        if(changed)
                signal_changed.emit();
@@ -92,16 +90,14 @@ void Selection::select_linked()
 void Selection::select_blocks()
 {
        bool changed = false;
-       for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
-       {
-               const set<Track *> &btracks = (*i)->get_block().get_tracks();
-               for(set<Track *>::iterator j=btracks.begin(); j!=btracks.end(); ++j)
-                       if(!tracks.count(*j))
-                       {
-                               tracks.insert(*j);
-                               changed = true;
-                       }
-       }
+       for(set<Object *>::iterator i=objects.begin(); i!=objects.end(); ++i)
+               if(Track *track = dynamic_cast<Track *>(*i))
+               {
+                       const set<Track *> &btracks = track->get_block().get_tracks();
+                       for(set<Track *>::iterator j=btracks.begin(); j!=btracks.end(); ++j)
+                               if(objects.insert(*j).second)
+                                       changed = true;
+               }
 
        if(changed)
                signal_changed.emit();