]> git.tdb.fi Git - r2c2.git/blob - source/designer/zonebar.cpp
058b2d1d580111f524a880e794f7b58d08ce6db2
[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 Zonebar::Zonebar(Designer &d):
11         Toolbar("Zone"),
12         designer(d)
13 {
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));
17
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));
21
22         GLtk::Button *btn;
23
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));
28
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));
32
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));
36
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)));
40
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));
44
45         update_groups();
46 }
47
48 void Zonebar::track_chain_added(TrackChain &chain)
49 {
50         if(Zone *zone = dynamic_cast<Zone *>(&chain))
51         {
52                 zone->signal_name_changed.connect(sigc::mem_fun(this, &Zonebar::zone_renamed));
53                 update_groups();
54         }
55 }
56
57 void Zonebar::zone_renamed(const string &, const string &, unsigned)
58 {
59         update_groups();
60 }
61
62 void Zonebar::group_selected(unsigned index, const string &group)
63 {
64         if(index==drp_groups->get_n_items()-1)
65         {
66                 Zone *zone = new Zone(designer.get_layout());
67                 zone->set_name("New zone", "track", 1);
68                 designer.edit_zone(zone);
69                 update_groups();
70         }
71         else
72         {
73                 Zone *cur = designer.get_current_zone();
74                 if(cur && group==cur->get_group())
75                         return;
76
77                 designer.edit_zone(0);
78                 update_numbers(group);
79         }
80 }
81
82 void Zonebar::number_selected(unsigned index, const string &)
83 {
84         if(drp_groups->get_selected_index()<0)
85                 return;
86
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)
90         {
91                 Zone *cur = designer.get_current_zone();
92                 string qualifier = (cur ? cur->get_qualifier() : "track");
93
94                 Zone *zone = new Zone(designer.get_layout());
95                 zone->set_name(group, qualifier, zones.size()+1);
96                 designer.edit_zone(zone);
97                 if(cur)
98                         update_numbers(group);
99                 else
100                         update_groups();
101         }
102         else if(index<zones.size())
103                 designer.edit_zone(zones[index]);
104 }
105
106 void Zonebar::delete_zone_clicked()
107 {
108         Zone *cur = designer.get_current_zone();
109         designer.edit_zone(0);
110         delete cur;
111 }
112
113 void Zonebar::update_groups()
114 {
115         const set<Zone *> &zones = designer.get_layout().get_all<Zone>();
116         set<string> groups;
117         for(set<Zone *>::const_iterator i=zones.begin(); i!=zones.end(); ++i)
118                 groups.insert((*i)->get_group());
119
120         Zone *cur = designer.get_current_zone();
121
122         drp_groups->clear();
123         int selected = -1;
124         unsigned n = 0;
125         for(set<string>::iterator i=groups.begin(); i!=groups.end(); ++i, ++n)
126         {
127                 drp_groups->append(*i);
128                 if(cur && *i==cur->get_group())
129                         selected = n;
130         }
131         drp_groups->append("(new)");
132         drp_groups->set_selected_index(selected);
133
134         if(cur)
135                 update_numbers(cur->get_group());
136         else
137                 drp_numbers->clear();
138 }
139
140 void Zonebar::update_numbers(const string &group)
141 {
142         Layout::ZoneArray zones = designer.get_layout().get_zones(group);
143         Zone *cur = designer.get_current_zone();
144
145         drp_numbers->clear();
146         int selected = -1;
147         unsigned n = 0;
148         for(Layout::ZoneArray::iterator i=zones.begin(); i!=zones.end(); ++i, ++n)
149         {
150                 drp_numbers->append(format("%s %d", (*i)->get_qualifier(), (*i)->get_number()));
151                 if(cur && *i==cur)
152                         selected = n;
153         }
154         drp_numbers->append("(new)");
155         drp_numbers->set_selected_index(selected);
156 }