2 Copyright (C) 2000 Paul Davis
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.
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.
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.
23 #include <gtkmm2ext/stop_signal.h>
24 #include <gtkmm2ext/gtk_ui.h>
25 #include <ardour/route_group.h>
30 #include "time_axis_view.h"
32 #include "gui_thread.h"
34 #include <ardour/route.h>
39 using namespace ARDOUR
;
44 Editor::build_edit_group_list_menu ()
46 using namespace Gtk::Menu_Helpers
;
48 edit_group_list_menu
= new Menu
;
49 edit_group_list_menu
->set_name ("ArdourContextMenu");
50 MenuList
& items
= edit_group_list_menu
->items();
52 items
.push_back (MenuElem (_("Activate All"), mem_fun(*this, &Editor::activate_all_edit_groups
)));
53 items
.push_back (MenuElem (_("Disable All"), mem_fun(*this, &Editor::disable_all_edit_groups
)));
54 items
.push_back (SeparatorElem());
55 items
.push_back (MenuElem (_("Show All"), mem_fun(*this, &Editor::show_all_edit_groups
)));
56 items
.push_back (MenuElem (_("Hide All"), mem_fun(*this, &Editor::hide_all_edit_groups
)));
57 items
.push_back (SeparatorElem());
58 items
.push_back (MenuElem (_("Add group"), mem_fun(*this, &Editor::new_edit_group
)));
63 Editor::activate_all_edit_groups ()
65 Gtk::TreeModel::Children children
= group_model
->children();
66 for(Gtk::TreeModel::Children::iterator iter
= children
.begin(); iter
!= children
.end(); ++iter
) {
67 (*iter
)[group_columns
.is_active
] = true;
72 Editor::disable_all_edit_groups ()
74 Gtk::TreeModel::Children children
= group_model
->children();
75 for(Gtk::TreeModel::Children::iterator iter
= children
.begin(); iter
!= children
.end(); ++iter
) {
76 (*iter
)[group_columns
.is_active
] = false;
81 Editor::show_all_edit_groups ()
83 Gtk::TreeModel::Children children
= group_model
->children();
84 for(Gtk::TreeModel::Children::iterator iter
= children
.begin(); iter
!= children
.end(); ++iter
) {
85 (*iter
)[group_columns
.is_visible
] = true;
90 Editor::hide_all_edit_groups ()
92 Gtk::TreeModel::Children children
= group_model
->children();
93 for(Gtk::TreeModel::Children::iterator iter
= children
.begin(); iter
!= children
.end(); ++iter
) {
94 (*iter
)[group_columns
.is_visible
] = false;
99 Editor::new_edit_group ()
101 session
->add_edit_group ("");
105 Editor::remove_selected_edit_group ()
107 Glib::RefPtr
<TreeSelection
> selection
= edit_group_display
.get_selection();
108 TreeView::Selection::ListHandle_Path rows
= selection
->get_selected_rows ();
114 TreeView::Selection::ListHandle_Path::iterator i
= rows
.begin();
117 /* selection mode is single, so rows.begin() is it */
119 if ((iter
= group_model
->get_iter (*i
))) {
121 RouteGroup
* rg
= (*iter
)[group_columns
.routegroup
];
124 session
->remove_edit_group (*rg
);
130 Editor::edit_group_list_button_clicked ()
136 Editor::edit_group_list_button_press_event (GdkEventButton
* ev
)
138 if (Keyboard::is_context_menu_event (ev
)) {
139 if (edit_group_list_menu
== 0) {
140 build_edit_group_list_menu ();
142 edit_group_list_menu
->popup (1, ev
->time
);
149 TreeModel::Path path
;
150 TreeViewColumn
* column
;
154 if (!edit_group_display
.get_path_at_pos ((int)ev
->x
, (int)ev
->y
, path
, column
, cellx
, celly
)) {
158 switch (GPOINTER_TO_UINT (column
->get_data (X_("colnum")))) {
160 if (Keyboard::is_edit_event (ev
)) {
161 if ((iter
= group_model
->get_iter (path
))) {
162 if ((group
= (*iter
)[group_columns
.routegroup
]) != 0) {
163 // edit_route_group (group);
165 edit_group_display
.queue_draw();
175 if ((iter
= group_model
->get_iter (path
))) {
176 bool active
= (*iter
)[group_columns
.is_active
];
177 (*iter
)[group_columns
.is_active
] = !active
;
179 edit_group_display
.queue_draw();
186 if ((iter
= group_model
->get_iter (path
))) {
187 bool visible
= (*iter
)[group_columns
.is_visible
];
188 (*iter
)[group_columns
.is_visible
] = !visible
;
190 edit_group_display
.queue_draw();
204 Editor::edit_group_row_change (const Gtk::TreeModel::Path
& path
,const Gtk::TreeModel::iterator
& iter
)
208 if (in_edit_group_row_change
) {
212 if ((group
= (*iter
)[group_columns
.routegroup
]) == 0) {
216 if ((*iter
)[group_columns
.is_visible
]) {
217 for (TrackViewList::iterator j
= track_views
.begin(); j
!= track_views
.end(); ++j
) {
218 if ((*j
)->edit_group() == group
) {
219 show_track_in_display (**j
);
223 for (TrackViewList::iterator j
= track_views
.begin(); j
!= track_views
.end(); ++j
) {
224 if ((*j
)->edit_group() == group
) {
225 hide_track_in_display (**j
);
230 bool active
= (*iter
)[group_columns
.is_active
];
231 group
->set_active (active
, this);
233 bool visible
= (*iter
)[group_columns
.is_visible
];
234 group
->set_hidden (!visible
, this);
236 string name
= (*iter
)[group_columns
.text
];
238 if (name
!= group
->name()) {
239 group
->set_name (name
);
244 Editor::add_edit_group (RouteGroup
* group
)
246 ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::add_edit_group
), group
));
249 TreeModel::Row row
= *(group_model
->append());
250 row
[group_columns
.is_active
] = group
->is_active();
251 row
[group_columns
.is_visible
] = !group
->is_hidden();
253 in_edit_group_row_change
= true;
255 row
[group_columns
.routegroup
] = group
;
257 if (!group
->name().empty()) {
258 row
[group_columns
.text
] = group
->name();
260 row
[group_columns
.text
] = _("unnamed");
264 group
->FlagsChanged
.connect (bind (mem_fun(*this, &Editor::group_flags_changed
), group
));
267 TreeViewColumn
* col
= edit_group_display
.get_column (0);
268 CellRendererText
* name_cell
= dynamic_cast<CellRendererText
*>(edit_group_display
.get_column_cell_renderer (0));
269 edit_group_display
.set_cursor (group_model
->get_path (row
), *col
, *name_cell
, true);
272 in_edit_group_row_change
= false;
276 Editor::edit_groups_changed ()
278 ENSURE_GUI_THREAD (mem_fun (*this, &Editor::edit_groups_changed
));
280 /* just rebuild the while thing */
282 group_model
->clear ();
284 session
->foreach_edit_group (mem_fun (*this, &Editor::add_edit_group
));
288 Editor::group_flags_changed (void* src
, RouteGroup
* group
)
290 ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::group_flags_changed
), src
, group
));
292 in_edit_group_row_change
= true;
294 Gtk::TreeModel::Children children
= group_model
->children();
295 for(Gtk::TreeModel::Children::iterator iter
= children
.begin(); iter
!= children
.end(); ++iter
) {
296 if (group
== (*iter
)[group_columns
.routegroup
]) {
297 (*iter
)[group_columns
.is_active
] = group
->is_active();
298 (*iter
)[group_columns
.is_visible
] = !group
->is_hidden();
299 (*iter
)[group_columns
.text
] = group
->name();
303 in_edit_group_row_change
= false;
307 Editor::edit_group_name_edit (const Glib::ustring
& path
, const Glib::ustring
& new_text
)
312 if ((iter
= group_model
->get_iter (path
))) {
314 if ((group
= (*iter
)[group_columns
.routegroup
]) == 0) {
318 if (new_text
!= group
->name()) {
319 group
->set_name (new_text
);