]> git.tdb.fi Git - r2c2.git/blob - source/designer/routebar.cpp
Limit timestep to 10 milliseconds
[r2c2.git] / source / designer / routebar.cpp
1 #include <msp/strings/format.h>
2 #include "libr2c2/route.h"
3 #include "designer.h"
4 #include "routebar.h"
5
6 using namespace std;
7 using namespace Msp;
8 using namespace R2C2;
9
10 string route_name(Route *const &route)
11 {
12         return route ? route->get_name() : "(new route)";
13 }
14
15 Routebar::Routebar(Designer &d):
16         Toolbar("Route"),
17         designer(d),
18         routes(&route_name)
19 {
20         pnl_content->add(*(drp_routes = new GLtk::Dropdown(routes)));
21         drp_routes->set_tooltip("Select route to edit");
22         drp_routes->signal_item_selected.connect(sigc::mem_fun(this, &Routebar::route_selected));
23
24         GLtk::Button *btn;
25
26         pnl_content->add(*(btn = new GLtk::Button("Del")));
27         btn->set_style("red");
28         btn->set_tooltip("Delete the current route");
29         btn->signal_clicked.connect(sigc::mem_fun(this, &Routebar::delete_route_clicked));
30
31         pnl_content->add(*(btn = new GLtk::Button("Name")));
32         btn->set_tooltip("Rename the current route");
33         btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::rename_route));
34
35         pnl_content->add(*(btn = new GLtk::Button("Add")));
36         btn->set_tooltip("Add selected tracks to current route (A)");
37         btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::add_selection_to_route));
38
39         designer.get_layout().signal_track_chain_added.connect(sigc::mem_fun(this, &Routebar::track_chain_added));
40         designer.get_layout().signal_track_chain_removed.connect(sigc::mem_fun(this, &Routebar::track_chain_removed));
41
42         const set<Route *> &lroutes = designer.get_layout().get_all<Route>();
43         for(set<Route *>::const_iterator i=lroutes.begin(); i!=lroutes.end(); ++i)
44         {
45                 routes.append(*i);
46                 (*i)->signal_name_changed.connect(sigc::bind(sigc::mem_fun(this, &Routebar::route_name_changed), *i));
47         }
48
49         routes.append(0);
50 }
51
52 void Routebar::route_selected(unsigned index)
53 {
54         if(index==routes.size()-1)
55         {
56                 Layout &rlayout = designer.get_layout();
57                 Route *route = new Route(rlayout);
58                 route->set_name(format("Route %d", index+1));
59                 designer.edit_route(route);
60
61                 for(unsigned i=0; i<routes.size(); ++i)
62                         if(routes.get(i)==route)
63                                 drp_routes->set_selected_index(i);
64         }
65         else
66                 designer.edit_route(routes.get(index));
67 }
68
69 void Routebar::delete_route_clicked()
70 {
71         Route *route = designer.get_current_route();
72         designer.edit_route(0);
73         delete route;
74 }
75
76 void Routebar::track_chain_added(TrackChain &tc)
77 {
78         if(Route *r = dynamic_cast<Route *>(&tc))
79         {
80                 r->signal_name_changed.connect(sigc::bind(sigc::mem_fun(this, &Routebar::route_name_changed), r));
81                 routes.insert(routes.size()-1, r);
82         }
83 }
84
85 void Routebar::track_chain_removed(TrackChain &tc)
86 {
87         if(Route *r = dynamic_cast<Route *>(&tc))
88         {
89                 for(unsigned i=0; i<routes.size(); ++i)
90                         if(routes.get(i)==r)
91                         {
92                                 routes.remove(i);
93                                 break;
94                         }
95         }
96 }
97
98 void Routebar::route_name_changed(const string &, Route *route)
99 {
100         routes.refresh(route);
101 }