]> git.tdb.fi Git - r2c2.git/blob - source/designer/selection.cpp
a693c0a7ccfc4ac9d0dbd66fffb3ded71b44b386
[r2c2.git] / source / designer / selection.cpp
1 #include <algorithm>
2 #include "selection.h"
3
4 using namespace std;
5 using namespace Marklin;
6 using namespace Msp;
7
8 Track *Selection::get_track() const
9 {
10         if(tracks.empty())
11                 return 0;
12         else
13                 return *tracks.begin();
14 }
15
16 void Selection::clear()
17 {
18         tracks.clear();
19         signal_changed.emit();
20 }
21
22 void Selection::add_track(Track *t)
23 {
24         if(tracks.insert(t).second)
25                 signal_changed.emit();
26 }
27
28 void Selection::remove_track(Track *t)
29 {
30         if(tracks.erase(t))
31                 signal_changed.emit();
32 }
33
34 void Selection::toggle_track(Track *t)
35 {
36         if(!tracks.erase(t))
37                 tracks.insert(t);
38
39         signal_changed.emit();
40 }
41
42 void Selection::select_more()
43 {
44         TrackSet new_tracks;
45         for(TrackSet::iterator i=tracks.begin(); i!=tracks.end(); ++i)
46         {
47                 const Track::EndpointSeq &epl=(*i)->get_endpoints();
48                 for(Track::EndpointSeq::const_iterator j=epl.begin(); j!=epl.end(); ++j)
49                         if(j->link)
50                                 new_tracks.insert(j->link);
51         }
52
53         bool changed=false;
54         for(TrackSet::iterator i=new_tracks.begin(); i!=new_tracks.end(); ++i)
55                 if(tracks.insert(*i).second)
56                         changed=true;
57
58         if(changed)
59                 signal_changed.emit();
60 }
61
62 void Selection::select_linked()
63 {
64         bool changed=false;
65         TrackSeq queue(tracks.begin(), tracks.end());
66         while(!queue.empty())
67         {
68                 Track *track=queue.front();
69                 queue.erase(queue.begin());
70
71                 const Track::EndpointSeq &epl=track->get_endpoints();
72                 for(Track::EndpointSeq::const_iterator j=epl.begin(); j!=epl.end(); ++j)
73                         if(j->link && tracks.insert(j->link).second)
74                         {
75                                 queue.push_back(j->link);
76                                 changed=true;
77                         }
78         }
79         for(TrackSet::iterator i=tracks.begin(); i!=tracks.end(); ++i)
80         {
81                 const Track::EndpointSeq &epl=(*i)->get_endpoints();
82                 for(Track::EndpointSeq::const_iterator j=epl.begin(); j!=epl.end(); ++j)
83                         if(j->link && tracks.insert(j->link).second)
84                                 changed=true;
85         }
86
87         if(changed)
88                 signal_changed.emit();
89 }