From 26328c9ef1d010e8cd4672407f0a2b08c5f49e20 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 29 Jun 2009 00:57:27 +0000 Subject: lincoln's patch from mantis 2757 to add route group property checkboxes in the route groups editor list, and to initialise new route groups with some appropriate properties. git-svn-id: svn://localhost/ardour2/branches/3.0@5295 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor.cc | 48 ++++++++++- gtk2_ardour/editor.h | 26 ++++-- gtk2_ardour/editor_edit_groups.cc | 174 ++++++++++++++++++++++++++++++++++++-- gtk2_ardour/mixer_strip.cc | 7 +- gtk2_ardour/mixer_ui.cc | 2 +- gtk2_ardour/route_group_dialog.cc | 9 +- gtk2_ardour/route_group_menu.cc | 26 +++++- gtk2_ardour/route_group_menu.h | 25 +++++- gtk2_ardour/route_time_axis.cc | 6 +- libs/ardour/ardour/route_group.h | 2 +- libs/ardour/route_group.cc | 4 +- 11 files changed, 303 insertions(+), 26 deletions(-) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 93a69de8c3..7e9d17b80e 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -558,6 +558,7 @@ Editor::Editor () route_list_display.set_name ("TrackListDisplay"); route_list_display.get_selection()->set_mode (SELECTION_NONE); route_list_display.set_reorderable (true); + route_list_display.set_rules_hint (true); route_list_display.set_size_request (100,-1); route_list_display.add_object_drag (route_display_columns.route.index(), "routes"); @@ -577,12 +578,36 @@ Editor::Editor () group_model = ListStore::create(group_columns); route_group_display.set_model (group_model); + route_group_display.append_column (_("Name"), group_columns.text); + + route_group_display.append_column (_("G"), group_columns.gain); + route_group_display.append_column (_("R"), group_columns.record); + route_group_display.append_column (_("M"), group_columns.mute); + route_group_display.append_column (_("S"), group_columns.solo); + route_group_display.append_column (_("Sel"), group_columns.select); + route_group_display.append_column (_("E"), group_columns.edits); + route_group_display.append_column (_("Show"), group_columns.is_visible); + route_group_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0)); route_group_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1)); + route_group_display.get_column (2)->set_data (X_("colnum"), GUINT_TO_POINTER(2)); + route_group_display.get_column (3)->set_data (X_("colnum"), GUINT_TO_POINTER(3)); + route_group_display.get_column (4)->set_data (X_("colnum"), GUINT_TO_POINTER(4)); + route_group_display.get_column (5)->set_data (X_("colnum"), GUINT_TO_POINTER(5)); + route_group_display.get_column (6)->set_data (X_("colnum"), GUINT_TO_POINTER(6)); + route_group_display.get_column (7)->set_data (X_("colnum"), GUINT_TO_POINTER(7)); + route_group_display.get_column (0)->set_expand (true); route_group_display.get_column (1)->set_expand (false); + route_group_display.get_column (2)->set_expand (false); + route_group_display.get_column (3)->set_expand (false); + route_group_display.get_column (4)->set_expand (false); + route_group_display.get_column (5)->set_expand (false); + route_group_display.get_column (6)->set_expand (false); + route_group_display.get_column (7)->set_expand (false); + route_group_display.set_headers_visible (true); /* name is directly editable */ @@ -597,12 +622,33 @@ Editor::Editor () active_cell->property_activatable() = true; active_cell->property_radio() = false; - active_cell = dynamic_cast(route_group_display.get_column_cell_renderer (1)); + active_cell = dynamic_cast(route_group_display.get_column_cell_renderer (2)); + active_cell->property_activatable() = true; + active_cell->property_radio() = false; + + active_cell = dynamic_cast(route_group_display.get_column_cell_renderer (3)); + active_cell->property_activatable() = true; + active_cell->property_radio() = false; + + active_cell = dynamic_cast(route_group_display.get_column_cell_renderer (4)); + active_cell->property_activatable() = true; + active_cell->property_radio() = false; + + active_cell = dynamic_cast(route_group_display.get_column_cell_renderer (5)); + active_cell->property_activatable() = true; + active_cell->property_radio() = false; + + active_cell = dynamic_cast(route_group_display.get_column_cell_renderer (6)); + active_cell->property_activatable() = true; + active_cell->property_radio() = false; + + active_cell = dynamic_cast(route_group_display.get_column_cell_renderer (7)); active_cell->property_activatable() = true; active_cell->property_radio() = false; group_model->signal_row_changed().connect (mem_fun (*this, &Editor::route_group_row_change)); + route_group_display.set_name ("EditGroupList"); route_group_display.get_selection()->set_mode (SELECTION_SINGLE); route_group_display.set_headers_visible (true); diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 990f6f2136..a05ff655d3 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1600,7 +1600,8 @@ public: void redisplay_tempo (bool immediate_redraw); void snap_to (nframes64_t& first, int32_t direction = 0, bool for_mark = false); - + void snap_to (nframes64_t& first, nframes64_t& last, int32_t direction = 0, bool for_mark = false); + double snap_length_beats (nframes64_t start); uint32_t bbt_beat_subdivision; @@ -1844,17 +1845,32 @@ public: /* edit group management */ struct GroupListModelColumns : public Gtk::TreeModel::ColumnRecord { + GroupListModelColumns () { - add (is_visible); - add (text); - add (routegroup); + add (is_visible); + add (gain); + add (record); + add (mute); + add (solo); + add (select); + add (edits); + add (text); + add (routegroup); } + Gtk::TreeModelColumn is_visible; + Gtk::TreeModelColumn gain; + Gtk::TreeModelColumn record; + Gtk::TreeModelColumn mute; + Gtk::TreeModelColumn solo; + Gtk::TreeModelColumn select; + Gtk::TreeModelColumn edits; Gtk::TreeModelColumn text; - Gtk::TreeModelColumn routegroup; + Gtk::TreeModelColumn routegroup; }; GroupListModelColumns group_columns; + Glib::RefPtr group_model; Glib::RefPtr group_selection; diff --git a/gtk2_ardour/editor_edit_groups.cc b/gtk2_ardour/editor_edit_groups.cc index 54547b5a0d..6eac473c7e 100644 --- a/gtk2_ardour/editor_edit_groups.cc +++ b/gtk2_ardour/editor_edit_groups.cc @@ -106,7 +106,7 @@ Editor::set_route_group_activation (RouteGroup* g, bool a) void Editor::new_route_group () { - RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active); + RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active, (RouteGroup::Property) (RouteGroup::Mute | RouteGroup::Solo | RouteGroup::Edit)); RouteGroupDialog d (g, Gtk::Stock::NEW); int const r = d.do_run (); @@ -121,7 +121,7 @@ Editor::new_route_group () void Editor::new_route_group_from_selection () { - RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active); + RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active, (RouteGroup::Property) (RouteGroup::Mute | RouteGroup::Solo | RouteGroup::Edit | RouteGroup::Select)); RouteGroupDialog d (g, Gtk::Stock::NEW); int const r = d.do_run (); @@ -144,7 +144,7 @@ Editor::new_route_group_from_selection () void Editor::new_route_group_from_rec_enabled () { - RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active); + RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active, (RouteGroup::Property) (RouteGroup::Mute | RouteGroup::Solo | RouteGroup::Edit | RouteGroup::RecEnable)); RouteGroupDialog d (g, Gtk::Stock::NEW); int const r = d.do_run (); @@ -167,7 +167,7 @@ Editor::new_route_group_from_rec_enabled () void Editor::new_route_group_from_soloed () { - RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active); + RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active, (RouteGroup::Property) (RouteGroup::Mute | RouteGroup::Solo | RouteGroup::Edit)); RouteGroupDialog d (g, Gtk::Stock::NEW); int const r = d.do_run (); @@ -272,6 +272,72 @@ Editor::route_group_list_button_press_event (GdkEventButton* ev) break; case 1: + if ((iter = group_model->get_iter (path))) { + bool gain = (*iter)[group_columns.gain]; + (*iter)[group_columns.gain] = !gain; +#ifdef GTKOSX + route_group_display.queue_draw(); +#endif + return true; + } + break; + + case 2: + if ((iter = group_model->get_iter (path))) { + bool record = (*iter)[group_columns.record]; + (*iter)[group_columns.record] = !record; +#ifdef GTKOSX + route_group_display.queue_draw(); +#endif + return true; + } + break; + + case 3: + if ((iter = group_model->get_iter (path))) { + bool mute = (*iter)[group_columns.mute]; + (*iter)[group_columns.mute] = !mute; +#ifdef GTKOSX + route_group_display.queue_draw(); +#endif + return true; + } + break; + + case 4: + if ((iter = group_model->get_iter (path))) { + bool solo = (*iter)[group_columns.solo]; + (*iter)[group_columns.solo] = !solo; +#ifdef GTKOSX + route_group_display.queue_draw(); +#endif + return true; + } + break; + + case 5: + if ((iter = group_model->get_iter (path))) { + bool select = (*iter)[group_columns.select]; + (*iter)[group_columns.select] = !select; +#ifdef GTKOSX + route_group_display.queue_draw(); +#endif + return true; + } + break; + + case 6: + if ((iter = group_model->get_iter (path))) { + bool edits = (*iter)[group_columns.edits]; + (*iter)[group_columns.edits] = !edits; +#ifdef GTKOSX + route_group_display.queue_draw(); +#endif + return true; + } + break; + + case 7: if ((iter = group_model->get_iter (path))) { bool visible = (*iter)[group_columns.is_visible]; (*iter)[group_columns.is_visible] = !visible; @@ -316,6 +382,90 @@ Editor::route_group_row_change (const Gtk::TreeModel::Path& path,const Gtk::Tree } } + if ((*iter)[group_columns.gain]) { + for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { + if ((*j)->route_group() == group) { + group->set_property (RouteGroup::Gain, true); + } + } + } else { + for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { + if ((*j)->route_group() == group) { + group->set_property (RouteGroup::Gain, false); + } + } + } + + if ((*iter)[group_columns.record]) { + for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { + if ((*j)->route_group() == group) { + group->set_property (RouteGroup::RecEnable, true); + } + } + } else { + for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { + if ((*j)->route_group() == group) { + group->set_property (RouteGroup::RecEnable, false); + } + } + } + + if ((*iter)[group_columns.mute]) { + for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { + if ((*j)->route_group() == group) { + group->set_property (RouteGroup::Mute, true); + } + } + } else { + for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { + if ((*j)->route_group() == group) { + group->set_property (RouteGroup::Mute, false); + } + } + } + + if ((*iter)[group_columns.solo]) { + for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { + if ((*j)->route_group() == group) { + group->set_property (RouteGroup::Solo, true); + } + } + } else { + for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { + if ((*j)->route_group() == group) { + group->set_property (RouteGroup::Solo, false); + } + } + } + + if ((*iter)[group_columns.select]) { + for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { + if ((*j)->route_group() == group) { + group->set_property (RouteGroup::Select, true); + } + } + } else { + for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { + if ((*j)->route_group() == group) { + group->set_property (RouteGroup::Select, false); + } + } + } + + if ((*iter)[group_columns.edits]) { + for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { + if ((*j)->route_group() == group) { + group->set_property (RouteGroup::Edit, true); + } + } + } else { + for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) { + if ((*j)->route_group() == group) { + group->set_property (RouteGroup::Edit, false); + } + } + } + string name = (*iter)[group_columns.text]; if (name != group->name()) { @@ -330,7 +480,14 @@ Editor::add_route_group (RouteGroup* group) bool focus = false; TreeModel::Row row = *(group_model->append()); + row[group_columns.is_visible] = !group->is_hidden(); + row[group_columns.gain] = group->property(RouteGroup::Gain); + row[group_columns.record] = group->property(RouteGroup::RecEnable); + row[group_columns.mute] = group->property(RouteGroup::Mute); + row[group_columns.solo] = group->property(RouteGroup::Solo); + row[group_columns.select] = group->property(RouteGroup::Select); + row[group_columns.edits] = group->property(RouteGroup::Edit); in_route_group_row_change = true; @@ -345,7 +502,7 @@ Editor::add_route_group (RouteGroup* group) group->FlagsChanged.connect (bind (mem_fun(*this, &Editor::group_flags_changed), group)); - if (focus) { + if (focus) { TreeViewColumn* col = route_group_display.get_column (0); CellRendererText* name_cell = dynamic_cast(route_group_display.get_column_cell_renderer (0)); route_group_display.set_cursor (group_model->get_path (row), *col, *name_cell, true); @@ -384,10 +541,17 @@ Editor::group_flags_changed (void* src, RouteGroup* group) in_route_group_row_change = true; Gtk::TreeModel::Children children = group_model->children(); + for(Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) { if (group == (*iter)[group_columns.routegroup]) { (*iter)[group_columns.is_visible] = !group->is_hidden(); (*iter)[group_columns.text] = group->name(); + (*iter)[group_columns.gain] = group->property(RouteGroup::Gain); + (*iter)[group_columns.record] = group->property(RouteGroup::RecEnable); + (*iter)[group_columns.mute] = group->property(RouteGroup::Mute); + (*iter)[group_columns.solo] = group->property(RouteGroup::Solo); + (*iter)[group_columns.select] = group->property(RouteGroup::Select); + (*iter)[group_columns.edits] = group->property(RouteGroup::Edit); } } diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 00c7503efa..33bc024ee8 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -1068,7 +1068,12 @@ MixerStrip::select_route_group (GdkEventButton *ev) if (ev->button == 1) { if (group_menu == 0) { - group_menu = new RouteGroupMenu (_session); + + group_menu = new RouteGroupMenu ( + _session, + (RouteGroup::Property) (RouteGroup::Gain | RouteGroup::Mute | RouteGroup::Solo) + ); + group_menu->GroupSelected.connect (mem_fun (*this, &MixerStrip::set_route_group)); } diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index eb79d8042c..156947a709 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -1112,7 +1112,7 @@ Mixer_UI::route_groups_changed () void Mixer_UI::new_route_group () { - session->add_route_group (new RouteGroup (*session, "")); + session->add_route_group (new RouteGroup (*session, "", RouteGroup::Active, (RouteGroup::Property) (RouteGroup::Gain |RouteGroup::Mute | RouteGroup::Solo))); } void diff --git a/gtk2_ardour/route_group_dialog.cc b/gtk2_ardour/route_group_dialog.cc index 6a87ea3c95..1e5ddaa5dc 100644 --- a/gtk2_ardour/route_group_dialog.cc +++ b/gtk2_ardour/route_group_dialog.cc @@ -2,9 +2,11 @@ #include "ardour/route_group.h" #include "route_group_dialog.h" #include "i18n.h" +#include using namespace Gtk; using namespace ARDOUR; +using namespace std; RouteGroupDialog::RouteGroupDialog (RouteGroup* g, StockID const & s) : Dialog (_("Route group")), @@ -35,9 +37,9 @@ RouteGroupDialog::RouteGroupDialog (RouteGroup* g, StockID const & s) get_vbox()->pack_start (*h); get_vbox()->pack_start (_active); - get_vbox()->pack_start (_gain); h = manage (new HBox); + h->pack_start (_gain); h->pack_start (_relative, PACK_EXPAND_PADDING); get_vbox()->pack_start (*h); @@ -61,15 +63,14 @@ RouteGroupDialog::do_run () int const r = run (); if (r == Gtk::RESPONSE_OK) { - _group->set_name (_name.get_text ()); - _group->set_active (_active.get_active (), this); - _group->set_property (RouteGroup::Gain, _gain.get_active ()); _group->set_property (RouteGroup::Mute, _mute.get_active ()); _group->set_property (RouteGroup::Solo, _solo.get_active ()); _group->set_property (RouteGroup::RecEnable, _rec_enable.get_active ()); _group->set_property (RouteGroup::Select, _select.get_active ()); _group->set_property (RouteGroup::Edit, _edit.get_active ()); + _group->set_name (_name.get_text ()); // This emits changed signal + _group->set_active (_active.get_active (), this); _group->set_relative (_relative.get_active(), this); } diff --git a/gtk2_ardour/route_group_menu.cc b/gtk2_ardour/route_group_menu.cc index e42cdedfac..cdb264aa9c 100644 --- a/gtk2_ardour/route_group_menu.cc +++ b/gtk2_ardour/route_group_menu.cc @@ -1,3 +1,22 @@ +/* + Copyright (C) 2009 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + #include #include #include "ardour/session.h" @@ -9,8 +28,9 @@ using namespace Gtk; using namespace ARDOUR; -RouteGroupMenu::RouteGroupMenu (Session& s) - : _session (s) +RouteGroupMenu::RouteGroupMenu (Session& s, RouteGroup::Property p) + : _session (s), + _default_properties (p) { rebuild (0); } @@ -57,7 +77,7 @@ RouteGroupMenu::set_group (RouteGroup* g) void RouteGroupMenu::new_group () { - RouteGroup* g = new RouteGroup (_session, "", RouteGroup::Active); + RouteGroup* g = new RouteGroup (_session, "", RouteGroup::Active, _default_properties); RouteGroupDialog d (g, Gtk::Stock::NEW); int const r = d.do_run (); diff --git a/gtk2_ardour/route_group_menu.h b/gtk2_ardour/route_group_menu.h index 09a31e60ed..7827179acb 100644 --- a/gtk2_ardour/route_group_menu.h +++ b/gtk2_ardour/route_group_menu.h @@ -1,12 +1,32 @@ +/* + Copyright (C) 2009 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "ardour/route_group.h" + namespace ARDOUR { class Session; - class RouteGroup; } class RouteGroupMenu : public Gtk::Menu { public: - RouteGroupMenu (ARDOUR::Session &); + RouteGroupMenu (ARDOUR::Session &, ARDOUR::RouteGroup::Property); void rebuild (ARDOUR::RouteGroup *); @@ -18,4 +38,5 @@ private: void set_group (ARDOUR::RouteGroup *); ARDOUR::Session& _session; + ARDOUR::RouteGroup::Property _default_properties; }; diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index f0a0857030..7d5ac17735 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -253,7 +253,11 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh _editor.ZoomChanged.connect (mem_fun(*this, &RouteTimeAxisView::reset_samples_per_unit)); ColorsChanged.connect (mem_fun (*this, &RouteTimeAxisView::color_handler)); - route_group_menu = new RouteGroupMenu (_session); + route_group_menu = new RouteGroupMenu ( + _session, + (RouteGroup::Property) (RouteGroup::Mute | RouteGroup::Solo | RouteGroup::Edit) + ); + route_group_menu->GroupSelected.connect (mem_fun (*this, &RouteTimeAxisView::set_route_group_from_menu)); gm.get_gain_slider().signal_scroll_event().connect(mem_fun(*this, &RouteTimeAxisView::controls_ebox_scroll), false); diff --git a/libs/ardour/ardour/route_group.h b/libs/ardour/ardour/route_group.h index 2ea7b95208..7b7166decd 100644 --- a/libs/ardour/ardour/route_group.h +++ b/libs/ardour/ardour/route_group.h @@ -52,7 +52,7 @@ public: Edit = 0x20 }; - RouteGroup (Session& s, const std::string &n, Flag f = Flag(0)); + RouteGroup (Session& s, const std::string &n, Flag f = Flag(0), Property p = Property(0)); const std::string& name() { return _name; } void set_name (std::string str); diff --git a/libs/ardour/route_group.cc b/libs/ardour/route_group.cc index 826341092f..f88df5c86a 100644 --- a/libs/ardour/route_group.cc +++ b/libs/ardour/route_group.cc @@ -38,8 +38,8 @@ using namespace ARDOUR; using namespace sigc; using namespace std; -RouteGroup::RouteGroup (Session& s, const string &n, Flag f) - : _session (s), _name (n), _flags (f), _properties (Property (0)) +RouteGroup::RouteGroup (Session& s, const string &n, Flag f, Property p) + : _session (s), _name (n), _flags (f), _properties (Property (p)) { } -- cgit v1.2.3