]> git.tdb.fi Git - r2c2.git/blob - source/designer/zonebar.cpp
Provide some telemetry values from ArduControl
[r2c2.git] / source / designer / zonebar.cpp
1 #include <msp/strings/format.h>
2 #include "libr2c2/zone.h"
3 #include "designer.h"
4 #include "zonebar.h"
5
6 using namespace std;
7 using namespace Msp;
8 using namespace R2C2;
9
10 string zone_detail(Zone *const &zone)
11 {
12         return zone ? format("%s %d", zone->get_qualifier(), zone->get_number()) : "(new)";
13 }
14
15 Zonebar::Zonebar(Designer &d):
16         Toolbar("Zone"),
17         designer(d),
18         zones(&zone_detail)
19 {
20         pnl_content->add(*(drp_groups = new GLtk::Dropdown(groups)));
21         drp_groups->set_tooltip("Select zone group to edit");
22         drp_groups->signal_item_selected.connect(sigc::mem_fun(this, &Zonebar::group_selected));
23
24         pnl_content->add(*(drp_numbers = new GLtk::Dropdown(zones)));
25         drp_groups->set_tooltip("Select zone to edit");
26         drp_numbers->signal_item_selected.connect(sigc::mem_fun(this, &Zonebar::number_selected));
27
28         GLtk::Button *btn;
29
30         pnl_content->add(*(btn = new GLtk::Button("Del")));
31         btn->set_style("red");
32         btn->set_tooltip("Delete selected zone");
33         btn->signal_clicked.connect(sigc::mem_fun(this, &Zonebar::delete_zone_clicked));
34
35         pnl_content->add(*(btn = new GLtk::Button("Prop")));
36         btn->set_tooltip("Change properties of the selected zone");
37         btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::zone_properties));
38
39         pnl_content->add(*(btn = new GLtk::Button("AddT")));
40         btn->set_tooltip("Add selected tracks to zone");
41         btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::add_selection_to_zone));
42
43         Layout &rlayout = designer.get_layout();
44         rlayout.signal_track_chain_added.connect(sigc::mem_fun(this, &Zonebar::track_chain_added));
45         rlayout.signal_track_chain_removed.connect(sigc::mem_fun(this, &Zonebar::track_chain_removed));
46
47         const set<Zone *> &lzones = rlayout.get_all<Zone>();
48         set<string> group_names;
49         for(set<Zone *>::const_iterator i=lzones.begin(); i!=lzones.end(); ++i)
50         {
51                 (*i)->signal_name_changed.connect(sigc::bind<0>(sigc::mem_fun(this, &Zonebar::zone_renamed), sigc::ref(**i)));
52                 if(!group_names.count((*i)->get_group()))
53                 {
54                         groups.append((*i)->get_group());
55                         group_names.insert((*i)->get_group());
56                 }
57         }
58         groups.append("(new)");
59 }
60
61 void Zonebar::track_chain_added(TrackChain &chain)
62 {
63         if(Zone *zone = dynamic_cast<Zone *>(&chain))
64                 zone->signal_name_changed.connect(sigc::bind<0>(sigc::mem_fun(this, &Zonebar::zone_renamed), sigc::ref(*zone)));
65 }
66
67 void Zonebar::track_chain_removed(TrackChain &chain)
68 {
69         if(Zone *zone = dynamic_cast<Zone *>(&chain))
70         {
71                 bool keep_group = false;
72                 const set<Zone *> &lzones = designer.get_layout().get_all<Zone>();
73                 for(set<Zone *>::const_iterator j=lzones.begin(); (!keep_group && j!=lzones.end()); ++j)
74                         keep_group = (*j)->get_group()==zone->get_group();
75
76                 if(!keep_group)
77                 {
78                         for(unsigned i=0; i<groups.size(); ++i)
79                                 if(groups.get(i)==zone->get_group())
80                                 {
81                                         groups.remove(i);
82                                         break;
83                                 }
84                 }
85
86                 for(unsigned i=0; i<zones.size(); ++i)
87                         if(zones.get(i)==zone)
88                         {
89                                 zones.remove(i);
90                                 break;
91                         }
92         }
93 }
94
95 void Zonebar::zone_renamed(Zone &zone, const string &)
96 {
97         const string &group = zone.get_group();
98         const set<Zone *> &lzones = designer.get_layout().get_all<Zone>();
99         set<string> group_names;
100         for(set<Zone *>::const_iterator i=lzones.begin(); i!=lzones.end(); ++i)
101                 group_names.insert((*i)->get_group());
102
103         bool new_group = true;
104         for(unsigned i=0; i+1<groups.size(); )
105         {
106                 if(group_names.count(groups.get(i)))
107                 {
108                         if(groups.get(i)==group)
109                                 new_group = false;
110                         ++i;
111                 }
112                 else
113                         groups.remove(i);
114         }
115
116         if(new_group)
117                 groups.insert(groups.size()-1, group);
118
119         int sel = drp_groups->get_selected_index();
120         if(sel>=0 && groups.get(sel)==group)
121         {
122                 int i = zones.find(&zone);
123                 if(i<0)
124                         zones.insert(zones.size()-1, &zone);
125                 else
126                         zones.refresh(i);
127         }
128 }
129
130 void Zonebar::group_selected(unsigned index)
131 {
132         if(index==groups.size()-1)
133         {
134                 Zone *zone = new Zone(designer.get_layout());
135                 zone->set_name("New zone", "track", 1);
136
137                 for(unsigned i=0; i<groups.size(); ++i)
138                         if(groups.get(i)=="New zone")
139                         {
140                                 drp_groups->set_selected_index(i);
141                                 break;
142                         }
143
144                 for(unsigned i=0; i<zones.size(); ++i)
145                         if(zones.get(i)==zone)
146                         {
147                                 drp_numbers->set_selected_index(i);
148                                 break;
149                         }
150
151                 designer.edit_zone(zone);
152         }
153         else
154         {
155                 Zone *cur = designer.get_current_zone();
156                 if(cur && groups.get(index)==cur->get_group())
157                         return;
158
159                 designer.edit_zone(0);
160
161                 zones.clear();
162                 Layout::ZoneArray lzones = designer.get_layout().get_zones(groups.get(index));
163                 for(Layout::ZoneArray::iterator i=lzones.begin(); i!=lzones.end(); ++i)
164                         zones.append(*i);
165                 zones.append(0);
166         }
167 }
168
169 void Zonebar::number_selected(unsigned index)
170 {
171         if(drp_groups->get_selected_index()<0)
172                 return;
173
174         string group = groups.get(drp_groups->get_selected_index());
175         if(index==zones.size()-1)
176         {
177                 Zone *cur = designer.get_current_zone();
178                 string qualifier = (cur ? cur->get_qualifier() : "track");
179
180                 Zone *zone = new Zone(designer.get_layout());
181                 zone->set_name(group, qualifier, index+1);
182                 designer.edit_zone(zone);
183
184                 for(unsigned i=0; i<zones.size(); ++i)
185                         if(zones.get(i)==zone)
186                         {
187                                 drp_numbers->set_selected_index(i);
188                                 break;
189                         }
190         }
191         else
192                 designer.edit_zone(zones.get(index));
193 }
194
195 void Zonebar::delete_zone_clicked()
196 {
197         Zone *cur = designer.get_current_zone();
198         designer.edit_zone(0);
199         delete cur;
200 }