1 #include <msp/strings/format.h>
2 #include "libr2c2/zone.h"
10 Zonebar::Zonebar(Designer &d):
14 pnl_content->add(*(drp_groups = new GLtk::Dropdown));
15 drp_groups->set_tooltip("Select zone group to edit");
16 drp_groups->signal_item_selected.connect(sigc::mem_fun(this, &Zonebar::group_selected));
18 pnl_content->add(*(drp_numbers = new GLtk::Dropdown));
19 drp_groups->set_tooltip("Select zone to edit");
20 drp_numbers->signal_item_selected.connect(sigc::mem_fun(this, &Zonebar::number_selected));
24 pnl_content->add(*(btn = new GLtk::Button("Del")));
25 btn->set_style("red");
26 btn->set_tooltip("Delete selected zone");
27 btn->signal_clicked.connect(sigc::mem_fun(this, &Zonebar::delete_zone_clicked));
29 pnl_content->add(*(btn = new GLtk::Button("Prop")));
30 btn->set_tooltip("Change properties of the selected zone");
31 btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::zone_properties));
33 pnl_content->add(*(btn = new GLtk::Button("AddT")));
34 btn->set_tooltip("Add selected tracks to zone");
35 btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::add_selection_to_zone));
37 Layout &rlayout = designer.get_layout();
38 rlayout.signal_track_chain_added.connect(sigc::mem_fun(this, &Zonebar::track_chain_added));
39 rlayout.signal_track_chain_removed.connect(sigc::hide(sigc::mem_fun(this, &Zonebar::update_groups)));
41 const set<Zone *> &zones = rlayout.get_all<Zone>();
42 for(set<Zone *>::const_iterator i=zones.begin(); i!=zones.end(); ++i)
43 (*i)->signal_name_changed.connect(sigc::mem_fun(this, &Zonebar::zone_renamed));
48 void Zonebar::track_chain_added(TrackChain &chain)
50 if(Zone *zone = dynamic_cast<Zone *>(&chain))
52 zone->signal_name_changed.connect(sigc::mem_fun(this, &Zonebar::zone_renamed));
57 void Zonebar::zone_renamed(const string &, const string &, unsigned)
62 void Zonebar::group_selected(unsigned index, const string &group)
64 if(index==drp_groups->get_n_items()-1)
66 Zone *zone = new Zone(designer.get_layout());
67 zone->set_name("New zone", "track", 1);
68 designer.edit_zone(zone);
73 Zone *cur = designer.get_current_zone();
74 if(cur && group==cur->get_group())
77 designer.edit_zone(0);
78 update_numbers(group);
82 void Zonebar::number_selected(unsigned index, const string &)
84 if(drp_groups->get_selected_index()<0)
87 string group = drp_groups->get_selected();
88 Layout::ZoneArray zones = designer.get_layout().get_zones(group);
89 if(index==drp_numbers->get_n_items()-1)
91 Zone *cur = designer.get_current_zone();
92 string qualifier = (cur ? cur->get_qualifier() : "track");
94 Zone *zone = new Zone(designer.get_layout());
95 zone->set_name(group, qualifier, zones.size()+1);
96 designer.edit_zone(zone);
98 update_numbers(group);
102 else if(index<zones.size())
103 designer.edit_zone(zones[index]);
106 void Zonebar::delete_zone_clicked()
108 Zone *cur = designer.get_current_zone();
109 designer.edit_zone(0);
113 void Zonebar::update_groups()
115 const set<Zone *> &zones = designer.get_layout().get_all<Zone>();
117 for(set<Zone *>::const_iterator i=zones.begin(); i!=zones.end(); ++i)
118 groups.insert((*i)->get_group());
120 Zone *cur = designer.get_current_zone();
125 for(set<string>::iterator i=groups.begin(); i!=groups.end(); ++i, ++n)
127 drp_groups->append(*i);
128 if(cur && *i==cur->get_group())
131 drp_groups->append("(new)");
132 drp_groups->set_selected_index(selected);
135 update_numbers(cur->get_group());
137 drp_numbers->clear();
140 void Zonebar::update_numbers(const string &group)
142 Layout::ZoneArray zones = designer.get_layout().get_zones(group);
143 Zone *cur = designer.get_current_zone();
145 drp_numbers->clear();
148 for(Layout::ZoneArray::iterator i=zones.begin(); i!=zones.end(); ++i, ++n)
150 drp_numbers->append(format("%s %d", (*i)->get_qualifier(), (*i)->get_number()));
154 drp_numbers->append("(new)");
155 drp_numbers->set_selected_index(selected);