]> git.tdb.fi Git - r2c2.git/blob - source/designer/selection.cpp
Update #includes that have been renamed, and remove stray ones
[r2c2.git] / source / designer / selection.cpp
1 #include <algorithm>
2 #include "libr2c2/block.h"
3 #include "selection.h"
4
5 using namespace std;
6 using namespace R2C2;
7 using namespace Msp;
8
9 Track *Selection::get_track() const
10 {
11         if(tracks.empty())
12                 return 0;
13         else
14                 return *tracks.begin();
15 }
16
17 void Selection::clear()
18 {
19         tracks.clear();
20         signal_changed.emit();
21 }
22
23 void Selection::add_track(Track *t)
24 {
25         if(tracks.insert(t).second)
26                 signal_changed.emit();
27 }
28
29 void Selection::remove_track(Track *t)
30 {
31         if(tracks.erase(t))
32                 signal_changed.emit();
33 }
34
35 void Selection::toggle_track(Track *t)
36 {
37         if(!tracks.erase(t))
38                 tracks.insert(t);
39
40         signal_changed.emit();
41 }
42
43 void Selection::select_more()
44 {
45         set<Track *> new_tracks;
46         for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
47         {
48                 const vector<Track *> &links = (*i)->get_links();
49                 for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
50                         if(*j)
51                                 new_tracks.insert(*j);
52         }
53
54         bool changed = false;
55         for(set<Track *>::iterator i=new_tracks.begin(); i!=new_tracks.end(); ++i)
56                 if(tracks.insert(*i).second)
57                         changed = true;
58
59         if(changed)
60                 signal_changed.emit();
61 }
62
63 void Selection::select_linked()
64 {
65         bool changed = false;
66         list<Track *> queue(tracks.begin(), tracks.end());
67         while(!queue.empty())
68         {
69                 Track *track = queue.front();
70                 queue.erase(queue.begin());
71
72                 const vector<Track *> &links = track->get_links();
73                 for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
74                         if(*j && tracks.insert(*j).second)
75                         {
76                                 queue.push_back(*j);
77                                 changed = true;
78                         }
79         }
80         for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
81         {
82                 const vector<Track *> &links = (*i)->get_links();
83                 for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
84                         if(*j && tracks.insert(*j).second)
85                                 changed = true;
86         }
87
88         if(changed)
89                 signal_changed.emit();
90 }
91
92 void Selection::select_blocks()
93 {
94         bool changed = false;
95         for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
96         {
97                 const set<Track *> &btracks = (*i)->get_block().get_tracks();
98                 for(set<Track *>::iterator j=btracks.begin(); j!=btracks.end(); ++j)
99                         if(!tracks.count(*j))
100                         {
101                                 tracks.insert(*j);
102                                 changed = true;
103                         }
104         }
105
106         if(changed)
107                 signal_changed.emit();
108 }