Files missing from last commit.
[ardour.git] / gtk2_ardour / editor_group_tabs.cc
1 #include "ardour/route_group.h"
2 #include "editor_group_tabs.h"
3 #include "editor.h"
4 #include "time_axis_view.h"
5 #include "utils.h"
6
7 using namespace std;
8 using namespace ARDOUR;
9
10 EditorGroupTabs::EditorGroupTabs (Editor* e)
11         : _editor (e)
12 {
13         
14 }
15
16 void
17 EditorGroupTabs::set_session (Session* s)
18 {
19         s->RouteEditGroupChanged.connect (mem_fun (*this, &EditorGroupTabs::set_dirty));
20 }
21
22
23 /** Handle a size request.
24  *  @param req GTK requisition
25  */
26 void
27 EditorGroupTabs::on_size_request (Gtk::Requisition *req)
28 {
29         /* Use a dummy, small height and the actual width that we want */
30         req->width = 16;
31         req->height = 16;
32 }
33
34
35 void
36 EditorGroupTabs::render (cairo_t* cr)
37 {
38         /* background */
39         
40         cairo_set_source_rgb (cr, 0, 0, 0);
41         cairo_rectangle (cr, 0, 0, _width, _height);
42         cairo_fill (cr);
43
44         int32_t curr_start = 0;
45         RouteGroup* curr_group = 0;
46         Gdk::Color curr_colour;
47
48         int32_t y = 0;
49         for (Editor::TrackViewList::iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
50                 RouteGroup* g = (*i)->edit_group ();
51
52                 if (g != curr_group) {
53                         if (curr_group) {
54                                 draw_group (cr, curr_start, y, curr_group, curr_colour);
55                         }
56
57                         curr_start = y;
58                         curr_group = g;
59                         curr_colour = (*i)->color ();
60                 }
61
62                 y += (*i)->effective_height ();
63         }
64
65         if (curr_group) {
66                 draw_group (cr, curr_start, y, curr_group, curr_colour);
67         }
68 }
69
70 void
71 EditorGroupTabs::draw_group (cairo_t* cr, int32_t y1, int32_t y2, RouteGroup* g, Gdk::Color const & colour)
72 {
73         double const arc_radius = _width;
74
75         if (g->is_active()) {
76                 cairo_set_source_rgba (cr, colour.get_red_p (), colour.get_green_p (), colour.get_blue_p (), 1);
77         } else {
78                 cairo_set_source_rgba (cr, 1, 1, 1, 0.2);
79         }
80         
81         cairo_move_to (cr, 0, y1 + arc_radius);
82         cairo_arc (cr, _width, y1 + arc_radius, arc_radius, M_PI, 3 * M_PI / 2);
83         cairo_line_to (cr, _width, y2);
84         cairo_arc (cr, _width, y2 - arc_radius, arc_radius, M_PI / 2, M_PI);
85         cairo_line_to (cr, 0, y1 + arc_radius);
86         cairo_fill (cr);
87
88         pair<string, double> const f = fit_to_pixels (cr, g->name(), y2 - y1 - arc_radius * 2);
89
90         cairo_text_extents_t ext;
91         cairo_text_extents (cr, g->name().c_str(), &ext);
92
93         cairo_set_source_rgb (cr, 1, 1, 1);
94         cairo_move_to (cr, _width - ext.height / 2, y1 + (f.second + y2 - y1) / 2);
95         cairo_save (cr);
96         cairo_rotate (cr, - M_PI / 2);
97         cairo_show_text (cr, f.first.c_str());
98         cairo_restore (cr);
99 }
100
101 bool
102 EditorGroupTabs::on_button_press_event (GdkEventButton* ev)
103 {
104         int32_t y = 0;
105         cout << y << "\n";
106         Editor::TrackViewList::iterator i = _editor->track_views.begin();
107         while (y < ev->y && i != _editor->track_views.end()) {
108                 y += (*i)->effective_height ();
109                 if (y < ev->y) {
110                         cout << "skip past " << (*i)->name() << "\n";
111                         ++i;
112                 }
113         }
114
115         if (i == _editor->track_views.end()) {
116                 return false;
117         }
118         
119         RouteGroup* g = (*i)->edit_group ();
120         if (g) {
121                 g->set_active (!g->is_active (), this);
122         }
123
124         return true;
125 }