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)
+ for(set<Object *>::iterator i=new_objects.begin(); i!=new_objects.end(); ++i)
+ if(objects.insert(*i).second)
changed = true;
if(changed)
void Selection::select_linked()
{
bool changed = false;
- list<Track *> queue(tracks.begin(), tracks.end());
+ 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)
void Selection::select_blocks()
{
bool changed = false;
- for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
- {
- 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;
- }
- }
+ 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();