]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/selection.cpp
Add a generic link interface as well
[r2c2.git] / source / designer / selection.cpp
index c93dd3628e5840394e9c190aaa53d2419e06282f..b351b452953d24c75574c0998cc187247ed19614 100644 (file)
@@ -42,18 +42,17 @@ void Selection::toggle_object(Object *o)
 
 void Selection::select_more()
 {
-       set<Track *> new_tracks;
+       set<Object *> new_objects;
        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);
-               }
+       {
+               unsigned nls = (*i)->get_n_link_slots();
+               for(unsigned j=0; j<nls; ++j)
+                       if(Object *obj = (*i)->get_link(j))
+                               new_objects.insert(obj);
+       }
 
        bool changed = false;
-       for(set<Track *>::iterator i=new_tracks.begin(); i!=new_tracks.end(); ++i)
+       for(set<Object *>::iterator i=new_objects.begin(); i!=new_objects.end(); ++i)
                if(objects.insert(*i).second)
                        changed = true;
 
@@ -64,23 +63,21 @@ void Selection::select_more()
 void Selection::select_linked()
 {
        bool changed = false;
-       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);
+       list<Object *> queue(objects.begin(), objects.end());
 
        while(!queue.empty())
        {
-               Track *track = queue.front();
-               queue.erase(queue.begin());
-
-               const vector<Track *> &links = track->get_links();
-               for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
-                       if(*j && objects.insert(*j).second)
-                       {
-                               queue.push_back(*j);
-                               changed = true;
-                       }
+               Object *obj = queue.front();
+               queue.pop_front();
+
+               unsigned nls = obj->get_n_link_slots();
+               for(unsigned j=0; j<nls; ++j)
+                       if(Object *linked = obj->get_link(j))
+                               if(objects.insert(linked).second)
+                               {
+                                       queue.push_back(linked);
+                                       changed = true;
+                               }
        }
 
        if(changed)