]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/selection.cpp
Avoid nested block reservations completely
[r2c2.git] / source / designer / selection.cpp
index 48f5b497d1410ddcd96a9d4d8cdf178e30f959e6..b351b452953d24c75574c0998cc187247ed19614 100644 (file)
@@ -1,66 +1,60 @@
-/* $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 "libr2c2/block.h"
 #include "selection.h"
 
 using namespace std;
-using namespace Marklin;
+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();
 }
 
 void Selection::select_more()
 {
-       set<Track *> new_tracks;
-       for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
+       set<Object *> new_objects;
+       for(set<Object *>::iterator i=objects.begin(); i!=objects.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);
+               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)
-               if(tracks.insert(*i).second)
-                       changed=true;
+       bool changed = false;
+       for(set<Object *>::iterator i=new_objects.begin(); i!=new_objects.end(); ++i)
+               if(objects.insert(*i).second)
+                       changed = true;
 
        if(changed)
                signal_changed.emit();
@@ -68,29 +62,40 @@ void Selection::select_more()
 
 void Selection::select_linked()
 {
-       bool changed=false;
-       list<Track *> queue(tracks.begin(), tracks.end());
+       bool changed = false;
+       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 && tracks.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;
+               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)
                signal_changed.emit();
 }
+
+void Selection::select_blocks()
+{
+       bool changed = false;
+       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();
+}