1 #include <msp/strings/format.h>
2 #include "libr2c2/zone.h"
10 string zone_detail(Zone *const &zone)
12 return zone ? format("%s %d", zone->get_qualifier(), zone->get_number()) : "(new)";
15 Zonebar::Zonebar(Designer &d):
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));
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));
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));
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));
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));
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));
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)
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()))
54 groups.append((*i)->get_group());
55 group_names.insert((*i)->get_group());
58 groups.append("(new)");
61 void Zonebar::track_chain_added(TrackChain &chain)
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)));
67 void Zonebar::track_chain_removed(TrackChain &chain)
69 if(Zone *zone = dynamic_cast<Zone *>(&chain))
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();
78 for(unsigned i=0; i<groups.size(); ++i)
79 if(groups.get(i)==zone->get_group())
86 for(unsigned i=0; i<zones.size(); ++i)
87 if(zones.get(i)==zone)
95 void Zonebar::zone_renamed(Zone &zone, const string &group, const string &, unsigned)
97 const set<Zone *> &lzones = designer.get_layout().get_all<Zone>();
98 set<string> group_names;
99 for(set<Zone *>::const_iterator i=lzones.begin(); i!=lzones.end(); ++i)
100 group_names.insert((*i)->get_group());
102 bool new_group = true;
103 for(unsigned i=0; i+1<groups.size(); )
105 if(group_names.count(groups.get(i)))
107 if(groups.get(i)==group)
116 groups.insert(groups.size()-1, group);
118 int sel = drp_groups->get_selected_index();
119 if(sel>=0 && groups.get(sel)==group)
121 int i = zones.find(&zone);
123 zones.insert(zones.size()-1, &zone);
129 void Zonebar::group_selected(unsigned index)
131 if(index==groups.size()-1)
133 Zone *zone = new Zone(designer.get_layout());
134 zone->set_name("New zone", "track", 1);
136 for(unsigned i=0; i<groups.size(); ++i)
137 if(groups.get(i)=="New zone")
139 drp_groups->set_selected_index(i);
143 for(unsigned i=0; i<zones.size(); ++i)
144 if(zones.get(i)==zone)
146 drp_numbers->set_selected_index(i);
150 designer.edit_zone(zone);
154 Zone *cur = designer.get_current_zone();
155 if(cur && groups.get(index)==cur->get_group())
158 designer.edit_zone(0);
161 Layout::ZoneArray lzones = designer.get_layout().get_zones(groups.get(index));
162 for(Layout::ZoneArray::iterator i=lzones.begin(); i!=lzones.end(); ++i)
168 void Zonebar::number_selected(unsigned index)
170 if(drp_groups->get_selected_index()<0)
173 string group = groups.get(drp_groups->get_selected_index());
174 if(index==zones.size()-1)
176 Zone *cur = designer.get_current_zone();
177 string qualifier = (cur ? cur->get_qualifier() : "track");
179 Zone *zone = new Zone(designer.get_layout());
180 zone->set_name(group, qualifier, index+1);
181 designer.edit_zone(zone);
183 for(unsigned i=0; i<zones.size(); ++i)
184 if(zones.get(i)==zone)
186 drp_numbers->set_selected_index(i);
191 designer.edit_zone(zones.get(index));
194 void Zonebar::delete_zone_clicked()
196 Zone *cur = designer.get_current_zone();
197 designer.edit_zone(0);