]> git.tdb.fi Git - r2c2.git/blob - source/designer/selection.cpp
Major code refactoring:
[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         set<Track *> new_tracks;
45         for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
46         {
47                 const vector<Track *> &links=(*i)->get_links();
48                 for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
49                         if(*j)
50                                 new_tracks.insert(*j);
51         }
52
53         bool changed=false;
54         for(set<Track *>::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         list<Track *> queue(tracks.begin(), tracks.end());
66         while(!queue.empty())
67         {
68                 Track *track=queue.front();
69                 queue.erase(queue.begin());
70
71                 const vector<Track *> &links=track->get_links();
72                 for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
73                         if(*j && tracks.insert(*j).second)
74                         {
75                                 queue.push_back(*j);
76                                 changed=true;
77                         }
78         }
79         for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
80         {
81                 const vector<Track *> &links=(*i)->get_links();
82                 for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
83                         if(*j && tracks.insert(*j).second)
84                                 changed=true;
85         }
86
87         if(changed)
88                 signal_changed.emit();
89 }