]> git.tdb.fi Git - r2c2.git/blob - source/designer/selection.cpp
c93dd3628e5840394e9c190aaa53d2419e06282f
[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 Object *Selection::get_object() const
10 {
11         if(objects.empty())
12                 return 0;
13         else
14                 return *objects.begin();
15 }
16
17 void Selection::clear()
18 {
19         objects.clear();
20         signal_changed.emit();
21 }
22
23 void Selection::add_object(Object *o)
24 {
25         if(objects.insert(o).second)
26                 signal_changed.emit();
27 }
28
29 void Selection::remove_object(Object *o)
30 {
31         if(objects.erase(o))
32                 signal_changed.emit();
33 }
34
35 void Selection::toggle_object(Object *o)
36 {
37         if(!objects.erase(o))
38                 objects.insert(o);
39
40         signal_changed.emit();
41 }
42
43 void Selection::select_more()
44 {
45         set<Track *> new_tracks;
46         for(set<Object *>::iterator i=objects.begin(); i!=objects.end(); ++i)
47                 if(Track *track = dynamic_cast<Track *>(*i))
48                 {
49                         const vector<Track *> &links = track->get_links();
50                         for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
51                                 if(*j)
52                                         new_tracks.insert(*j);
53                 }
54
55         bool changed = false;
56         for(set<Track *>::iterator i=new_tracks.begin(); i!=new_tracks.end(); ++i)
57                 if(objects.insert(*i).second)
58                         changed = true;
59
60         if(changed)
61                 signal_changed.emit();
62 }
63
64 void Selection::select_linked()
65 {
66         bool changed = false;
67         list<Track *> queue;
68         for(set<Object *>::iterator i=objects.begin(); i!=objects.end(); ++i)
69                 if(Track *track = dynamic_cast<Track *>(*i))
70                         queue.push_back(track);
71
72         while(!queue.empty())
73         {
74                 Track *track = queue.front();
75                 queue.erase(queue.begin());
76
77                 const vector<Track *> &links = track->get_links();
78                 for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
79                         if(*j && objects.insert(*j).second)
80                         {
81                                 queue.push_back(*j);
82                                 changed = true;
83                         }
84         }
85
86         if(changed)
87                 signal_changed.emit();
88 }
89
90 void Selection::select_blocks()
91 {
92         bool changed = false;
93         for(set<Object *>::iterator i=objects.begin(); i!=objects.end(); ++i)
94                 if(Track *track = dynamic_cast<Track *>(*i))
95                 {
96                         const set<Track *> &btracks = track->get_block().get_tracks();
97                         for(set<Track *>::iterator j=btracks.begin(); j!=btracks.end(); ++j)
98                                 if(objects.insert(*j).second)
99                                         changed = true;
100                 }
101
102         if(changed)
103                 signal_changed.emit();
104 }