]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/selection.cpp
Make designer work on generic objects
[r2c2.git] / source / designer / selection.cpp
index ed71547b0f6a9a46c51279cc3f343cd298bc88a7..c93dd3628e5840394e9c190aaa53d2419e06282f 100644 (file)
@@ -1,40 +1,41 @@
 #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();
 }
@@ -42,18 +43,19 @@ 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;
+       bool changed = false;
        for(set<Track *>::iterator i=new_tracks.begin(); i!=new_tracks.end(); ++i)
-               if(tracks.insert(*i).second)
-                       changed=true;
+               if(objects.insert(*i).second)
+                       changed = true;
 
        if(changed)
                signal_changed.emit();
@@ -61,28 +63,41 @@ void Selection::select_more()
 
 void Selection::select_linked()
 {
-       bool changed=false;
-       list<Track *> queue(tracks.begin(), tracks.end());
+       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);
+
        while(!queue.empty())
        {
-               Track *track=queue.front();
+               Track *track = queue.front();
                queue.erase(queue.begin());
 
-               const vector<Track *> &links=track->get_links();
+               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;
+                               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();
+}
+
+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();