#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()
{
- TrackSet new_tracks;
- for(TrackSet::iterator i=tracks.begin(); i!=tracks.end(); ++i)
+ set<Object *> new_objects;
+ for(set<Object *>::iterator i=objects.begin(); i!=objects.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);
+ 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(TrackSet::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();
void Selection::select_linked()
{
- bool changed=false;
- TrackSeq 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 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)
- {
- queue.push_back(j->link);
- changed=true;
- }
- }
- for(TrackSet::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;
+ 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();
+}