]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/selection.cpp
Match the API change in GLtk
[r2c2.git] / source / designer / selection.cpp
index a693c0a7ccfc4ac9d0dbd66fffb3ded71b44b386..c6b1e390d97cb8f80f2aad3ea3f0cc60171b2ac0 100644 (file)
@@ -1,4 +1,12 @@
+/* $Id$
+
+This file is part of the MSP Märklin suite
+Copyright © 2006-2008 Mikkosoft Productions, Mikko Rasa
+Distributed under the GPL
+*/
+
 #include <algorithm>
+#include "libmarklin/block.h"
 #include "selection.h"
 
 using namespace std;
@@ -41,19 +49,19 @@ void Selection::toggle_track(Track *t)
 
 void Selection::select_more()
 {
-       TrackSet new_tracks;
-       for(TrackSet::iterator i=tracks.begin(); i!=tracks.end(); ++i)
+       set<Track *> new_tracks;
+       for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
        {
-               const Track::EndpointSeq &epl=(*i)->get_endpoints();
-               for(Track::EndpointSeq::const_iterator j=epl.begin(); j!=epl.end(); ++j)
-                       if(j->link)
-                               new_tracks.insert(j->link);
+               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);
        }
 
-       bool changed=false;
-       for(TrackSet::iterator i=new_tracks.begin(); i!=new_tracks.end(); ++i)
+       bool changed = false;
+       for(set<Track *>::iterator i=new_tracks.begin(); i!=new_tracks.end(); ++i)
                if(tracks.insert(*i).second)
-                       changed=true;
+                       changed = true;
 
        if(changed)
                signal_changed.emit();
@@ -61,27 +69,45 @@ void Selection::select_more()
 
 void Selection::select_linked()
 {
-       bool changed=false;
-       TrackSeq queue(tracks.begin(), tracks.end());
+       bool changed = false;
+       list<Track *> queue(tracks.begin(), tracks.end());
        while(!queue.empty())
        {
-               Track *track=queue.front();
+               Track *track = queue.front();
                queue.erase(queue.begin());
 
-               const Track::EndpointSeq &epl=track->get_endpoints();
-               for(Track::EndpointSeq::const_iterator j=epl.begin(); j!=epl.end(); ++j)
-                       if(j->link && tracks.insert(j->link).second)
+               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)
                        {
-                               queue.push_back(j->link);
-                               changed=true;
+                               queue.push_back(*j);
+                               changed = true;
                        }
        }
-       for(TrackSet::iterator i=tracks.begin(); i!=tracks.end(); ++i)
+       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();
+}
+
+void Selection::select_blocks()
+{
+       bool changed = false;
+       for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
        {
-               const Track::EndpointSeq &epl=(*i)->get_endpoints();
-               for(Track::EndpointSeq::const_iterator j=epl.begin(); j!=epl.end(); ++j)
-                       if(j->link && tracks.insert(j->link).second)
-                               changed=true;
+               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;
+                       }
        }
 
        if(changed)