Delete trailing whitespace
[ardour.git] / gtk2_ardour / editor_group_tabs.cc
1 /*
2     Copyright (C) 2009 Paul Davis
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #include "ardour/route_group.h"
21 #include "editor_group_tabs.h"
22 #include "editor.h"
23 #include "route_time_axis.h"
24 #include "utils.h"
25 #include "editor_route_groups.h"
26 #include "editor_routes.h"
27 #include "i18n.h"
28
29 using namespace std;
30 using namespace ARDOUR;
31
32 EditorGroupTabs::EditorGroupTabs (Editor* e)
33         : EditorComponent (e)
34 {
35
36 }
37
38 list<GroupTabs::Tab>
39 EditorGroupTabs::compute_tabs () const
40 {
41         list<Tab> tabs;
42
43         Tab tab;
44         tab.from = 0;
45         tab.group = 0;
46
47         int32_t y = 0;
48         for (TrackViewList::iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
49
50                 if ((*i)->marked_for_display() == false) {
51                         continue;
52                 }
53
54                 RouteGroup* g = (*i)->route_group ();
55
56                 if (g != tab.group) {
57                         if (tab.group) {
58                                 tab.to = y;
59                                 tabs.push_back (tab);
60                         }
61
62                         tab.from = y;
63                         tab.group = g;
64                         tab.colour = (*i)->color ();
65                 }
66
67                 y += (*i)->effective_height ();
68         }
69
70         if (tab.group) {
71                 tab.to = y;
72                 tabs.push_back (tab);
73         }
74
75         return tabs;
76 }
77
78 void
79 EditorGroupTabs::draw_tab (cairo_t* cr, Tab const & tab) const
80 {
81         double const arc_radius = _width;
82
83         if (tab.group && tab.group->is_active()) {
84                 cairo_set_source_rgba (cr, tab.colour.get_red_p (), tab.colour.get_green_p (), tab.colour.get_blue_p (), 1);
85         } else {
86                 cairo_set_source_rgba (cr, 1, 1, 1, 0.2);
87         }
88
89         cairo_move_to (cr, 0, tab.from + arc_radius);
90         cairo_arc (cr, _width, tab.from + arc_radius, arc_radius, M_PI, 3 * M_PI / 2);
91         cairo_line_to (cr, _width, tab.to);
92         cairo_arc (cr, _width, tab.to - arc_radius, arc_radius, M_PI / 2, M_PI);
93         cairo_line_to (cr, 0, tab.from + arc_radius);
94         cairo_fill (cr);
95
96         if (tab.group) {
97                 pair<string, double> const f = fit_to_pixels (cr, tab.group->name(), tab.to - tab.from - arc_radius * 2);
98
99                 cairo_text_extents_t ext;
100                 cairo_text_extents (cr, tab.group->name().c_str(), &ext);
101
102                 cairo_set_source_rgb (cr, 1, 1, 1);
103                 cairo_move_to (cr, _width - ext.height / 2, tab.from + (f.second + tab.to - tab.from) / 2);
104                 cairo_save (cr);
105                 cairo_rotate (cr, - M_PI / 2);
106                 cairo_show_text (cr, f.first.c_str());
107                 cairo_restore (cr);
108         }
109 }
110
111 double
112 EditorGroupTabs::primary_coordinate (double, double y) const
113 {
114         return y;
115 }
116
117 RouteList
118 EditorGroupTabs::routes_for_tab (Tab const * t) const
119 {
120         RouteList routes;
121         int32_t y = 0;
122
123         for (TrackViewList::iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
124
125                 if ((*i)->marked_for_display() == false) {
126                         continue;
127                 }
128
129                 RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
130                 if (rtv) {
131
132                         if (y >= t->to) {
133                                 /* tab finishes before this track starts */
134                                 break;
135                         }
136
137                         double const h = y + (*i)->effective_height() / 2;
138
139                         if (t->from < h && t->to > h) {
140                                 routes.push_back (rtv->route ());
141                         }
142                 }
143
144                 y += (*i)->effective_height ();
145         }
146
147         return routes;
148 }
149
150
151 void
152 EditorGroupTabs::add_menu_items (Gtk::Menu* m, RouteGroup* g)
153 {
154         using namespace Gtk::Menu_Helpers;
155
156         if (g) {
157                 MenuList& items = m->items ();
158                 items.push_back (MenuElem (_("Fit to Window"), sigc::bind (sigc::mem_fun (*_editor, &Editor::fit_route_group), g)));
159         }
160 }
161
162 PBD::PropertyList
163 EditorGroupTabs::default_properties () const
164 {
165         PBD::PropertyList plist;
166
167         plist.add (Properties::active, true);
168         plist.add (Properties::mute, true);
169         plist.add (Properties::solo, true);
170         plist.add (Properties::recenable, true);
171         plist.add (Properties::edit, true);
172
173         return plist;
174 }
175
176 string
177 EditorGroupTabs::order_key () const
178 {
179         return X_("editor");
180 }
181
182 RouteList
183 EditorGroupTabs::selected_routes () const
184 {
185         RouteList rl;
186
187         for (TrackSelection::iterator i = _editor->get_selection().tracks.begin(); i != _editor->get_selection().tracks.end(); ++i) {
188                 RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
189                 if (rtv) {
190                         rl.push_back (rtv->route());
191                 }
192         }
193
194         return rl;
195 }
196
197 void
198 EditorGroupTabs::sync_order_keys ()
199 {
200         _editor->_routes->sync_order_keys ("");
201 }