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 &)
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());
103 bool new_group = true;
104 for(unsigned i=0; i+1<groups.size(); )
106 if(group_names.count(groups.get(i)))
108 if(groups.get(i)==group)
117 groups.insert(groups.size()-1, group);
119 int sel = drp_groups->get_selected_index();
120 if(sel>=0 && groups.get(sel)==group)
122 int i = zones.find(&zone);
124 zones.insert(zones.size()-1, &zone);
130 void Zonebar::group_selected(unsigned index)
132 if(index==groups.size()-1)
134 Zone *zone = new Zone(designer.get_layout());
135 zone->set_name("New zone", "track", 1);
137 for(unsigned i=0; i<groups.size(); ++i)
138 if(groups.get(i)=="New zone")
140 drp_groups->set_selected_index(i);
144 for(unsigned i=0; i<zones.size(); ++i)
145 if(zones.get(i)==zone)
147 drp_numbers->set_selected_index(i);
151 designer.edit_zone(zone);
155 Zone *cur = designer.get_current_zone();
156 if(cur && groups.get(index)==cur->get_group())
159 designer.edit_zone(0);
162 Layout::ZoneArray lzones = designer.get_layout().get_zones(groups.get(index));
163 for(Layout::ZoneArray::iterator i=lzones.begin(); i!=lzones.end(); ++i)
169 void Zonebar::number_selected(unsigned index)
171 if(drp_groups->get_selected_index()<0)
174 string group = groups.get(drp_groups->get_selected_index());
175 if(index==zones.size()-1)
177 Zone *cur = designer.get_current_zone();
178 string qualifier = (cur ? cur->get_qualifier() : "track");
180 Zone *zone = new Zone(designer.get_layout());
181 zone->set_name(group, qualifier, index+1);
182 designer.edit_zone(zone);
184 for(unsigned i=0; i<zones.size(); ++i)
185 if(zones.get(i)==zone)
187 drp_numbers->set_selected_index(i);
192 designer.edit_zone(zones.get(index));
195 void Zonebar::delete_zone_clicked()
197 Zone *cur = designer.get_current_zone();
198 designer.edit_zone(0);