]> git.tdb.fi Git - r2c2.git/blob - source/designer/zonebar.cpp
Make use of the unified storage class for other parts of Layout
[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", 420),
12         designer(d)
13 {
14         pnl_content->add(*(drp_groups = new GLtk::Dropdown));
15         drp_groups->set_geometry(GLtk::Geometry(0, 10, 195, 20));
16         drp_groups->set_tooltip("Select zone group to edit");
17         drp_groups->signal_item_selected.connect(sigc::mem_fun(this, &Zonebar::group_selected));
18
19         pnl_content->add(*(drp_numbers = new GLtk::Dropdown));
20         drp_numbers->set_geometry(GLtk::Geometry(200, 10, 100, 20));
21         drp_groups->set_tooltip("Select zone to edit");
22         drp_numbers->signal_item_selected.connect(sigc::mem_fun(this, &Zonebar::number_selected));
23
24         GLtk::Button *btn;
25
26         pnl_content->add(*(btn = new GLtk::Button("Del")));
27         btn->set_geometry(GLtk::Geometry(300, 10, 40, 24));
28         btn->set_style("red");
29         btn->set_tooltip("Delete selected zone");
30         btn->signal_clicked.connect(sigc::mem_fun(this, &Zonebar::delete_zone_clicked));
31
32         pnl_content->add(*(btn = new GLtk::Button("Prop")));
33         btn->set_geometry(GLtk::Geometry(340, 10, 40, 24));
34         btn->set_tooltip("Change properties of the selected zone");
35         btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::zone_properties));
36
37         pnl_content->add(*(btn = new GLtk::Button("AddT")));
38         btn->set_geometry(GLtk::Geometry(380, 10, 40, 24));
39         btn->set_tooltip("Add selected tracks to zone");
40         btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::add_selection_to_zone));
41
42         Layout &rlayout = designer.get_layout();
43         rlayout.signal_track_chain_added.connect(sigc::mem_fun(this, &Zonebar::track_chain_added));
44         rlayout.signal_track_chain_removed.connect(sigc::hide(sigc::mem_fun(this, &Zonebar::update_groups)));
45
46         const set<Zone *> &zones = rlayout.get_all<Zone>();
47         for(set<Zone *>::const_iterator i=zones.begin(); i!=zones.end(); ++i)
48                 (*i)->signal_name_changed.connect(sigc::mem_fun(this, &Zonebar::zone_renamed));
49
50         update_groups();
51 }
52
53 void Zonebar::track_chain_added(TrackChain &chain)
54 {
55         if(Zone *zone = dynamic_cast<Zone *>(&chain))
56         {
57                 zone->signal_name_changed.connect(sigc::mem_fun(this, &Zonebar::zone_renamed));
58                 update_groups();
59         }
60 }
61
62 void Zonebar::zone_renamed(const string &, const string &, unsigned)
63 {
64         update_groups();
65 }
66
67 void Zonebar::group_selected(unsigned index, const string &group)
68 {
69         if(index==drp_groups->get_n_items()-1)
70         {
71                 Zone *zone = new Zone(designer.get_layout());
72                 zone->set_name("New zone", "track", 1);
73                 designer.edit_zone(zone);
74                 update_groups();
75         }
76         else
77         {
78                 Zone *cur = designer.get_current_zone();
79                 if(cur && group==cur->get_group())
80                         return;
81
82                 designer.edit_zone(0);
83                 update_numbers(group);
84         }
85 }
86
87 void Zonebar::number_selected(unsigned index, const string &)
88 {
89         if(drp_groups->get_selected_index()<0)
90                 return;
91
92         string group = drp_groups->get_selected();
93         Layout::ZoneArray zones = designer.get_layout().get_zones(group);
94         if(index==drp_numbers->get_n_items()-1)
95         {
96                 Zone *cur = designer.get_current_zone();
97                 string qualifier = (cur ? cur->get_qualifier() : "track");
98
99                 Zone *zone = new Zone(designer.get_layout());
100                 zone->set_name(group, qualifier, zones.size()+1);
101                 designer.edit_zone(zone);
102                 if(cur)
103                         update_numbers(group);
104                 else
105                         update_groups();
106         }
107         else if(index<zones.size())
108                 designer.edit_zone(zones[index]);
109 }
110
111 void Zonebar::delete_zone_clicked()
112 {
113         Zone *cur = designer.get_current_zone();
114         designer.edit_zone(0);
115         delete cur;
116 }
117
118 void Zonebar::update_groups()
119 {
120         const set<Zone *> &zones = designer.get_layout().get_all<Zone>();
121         set<string> groups;
122         for(set<Zone *>::const_iterator i=zones.begin(); i!=zones.end(); ++i)
123                 groups.insert((*i)->get_group());
124
125         Zone *cur = designer.get_current_zone();
126
127         drp_groups->clear();
128         int selected = -1;
129         unsigned n = 0;
130         for(set<string>::iterator i=groups.begin(); i!=groups.end(); ++i, ++n)
131         {
132                 drp_groups->append(*i);
133                 if(cur && *i==cur->get_group())
134                         selected = n;
135         }
136         drp_groups->append("(new)");
137         drp_groups->set_selected_index(selected);
138
139         if(cur)
140                 update_numbers(cur->get_group());
141         else
142                 drp_numbers->clear();
143 }
144
145 void Zonebar::update_numbers(const string &group)
146 {
147         Layout::ZoneArray zones = designer.get_layout().get_zones(group);
148         Zone *cur = designer.get_current_zone();
149
150         drp_numbers->clear();
151         int selected = -1;
152         unsigned n = 0;
153         for(Layout::ZoneArray::iterator i=zones.begin(); i!=zones.end(); ++i, ++n)
154         {
155                 drp_numbers->append(format("%s %d", (*i)->get_qualifier(), (*i)->get_number()));
156                 if(cur && *i==cur)
157                         selected = n;
158         }
159         drp_numbers->append("(new)");
160         drp_numbers->set_selected_index(selected);
161 }