X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdesigner%2Fselection.cpp;h=604890b92795c9fb090a6882308d54b96fbe2da4;hb=1ff06c5bc46a677fa389ef86c6b26664368f1653;hp=a693c0a7ccfc4ac9d0dbd66fffb3ded71b44b386;hpb=6c61179fe09af2f5366d50f10aadbf5f83438087;p=r2c2.git diff --git a/source/designer/selection.cpp b/source/designer/selection.cpp index a693c0a..604890b 100644 --- a/source/designer/selection.cpp +++ b/source/designer/selection.cpp @@ -1,8 +1,16 @@ +/* $Id$ + +This file is part of R²C² +Copyright © 2006-2008 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + #include +#include "libr2c2/block.h" #include "selection.h" using namespace std; -using namespace Marklin; +using namespace R2C2; using namespace Msp; Track *Selection::get_track() const @@ -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 new_tracks; + for(set::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 &links = (*i)->get_links(); + for(vector::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::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 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 &links = track->get_links(); + for(vector::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::iterator i=tracks.begin(); i!=tracks.end(); ++i) + { + const vector &links = (*i)->get_links(); + for(vector::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::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 &btracks = (*i)->get_block().get_tracks(); + for(set::iterator j=btracks.begin(); j!=btracks.end(); ++j) + if(!tracks.count(*j)) + { + tracks.insert(*j); + changed = true; + } } if(changed)