summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2009-06-21 19:59:56 +0000
committerCarl Hetherington <carl@carlh.net>2009-06-21 19:59:56 +0000
commit955d731fa6933e6769986687a781d16f7889da67 (patch)
tree84a383627ac0a9548f5b789b17740915846e5dcf /gtk2_ardour
parent8cd536ab85b5923fe97d32cb93c913420fbaf5bf (diff)
Merge edit and mix groups to just being route groups. Add properties to route groups to decide what things their member routes will share. Allow edits to happen across a route group without its tracks necessarily being selected.
git-svn-id: svn://localhost/ardour2/branches/3.0@5236 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/add_route_dialog.cc18
-rw-r--r--gtk2_ardour/add_route_dialog.h6
-rw-r--r--gtk2_ardour/ardour_ui.cc18
-rw-r--r--gtk2_ardour/ardour_ui.h12
-rw-r--r--gtk2_ardour/editor.cc171
-rw-r--r--gtk2_ardour/editor.h45
-rw-r--r--gtk2_ardour/editor_edit_groups.cc114
-rw-r--r--gtk2_ardour/editor_group_tabs.cc36
-rw-r--r--gtk2_ardour/editor_group_tabs.h11
-rw-r--r--gtk2_ardour/editor_mixer.cc4
-rw-r--r--gtk2_ardour/editor_selection.cc15
-rw-r--r--gtk2_ardour/gain_meter.cc6
-rw-r--r--gtk2_ardour/group_tabs.cc95
-rw-r--r--gtk2_ardour/group_tabs.h49
-rw-r--r--gtk2_ardour/mixer_group_tabs.cc33
-rw-r--r--gtk2_ardour/mixer_group_tabs.h10
-rw-r--r--gtk2_ardour/mixer_strip.cc46
-rw-r--r--gtk2_ardour/mixer_strip.h12
-rw-r--r--gtk2_ardour/mixer_ui.cc138
-rw-r--r--gtk2_ardour/mixer_ui.h23
-rw-r--r--gtk2_ardour/route_group_dialog.cc35
-rw-r--r--gtk2_ardour/route_group_dialog.h8
-rw-r--r--gtk2_ardour/route_time_axis.cc92
-rw-r--r--gtk2_ardour/route_time_axis.h12
-rw-r--r--gtk2_ardour/route_ui.cc30
-rw-r--r--gtk2_ardour/route_ui.h6
-rw-r--r--gtk2_ardour/selection.cc16
-rw-r--r--gtk2_ardour/time_axis_view.h2
-rwxr-xr-xgtk2_ardour/track_selection.cc19
-rw-r--r--gtk2_ardour/track_selection.h6
-rw-r--r--gtk2_ardour/wscript2
31 files changed, 598 insertions, 492 deletions
diff --git a/gtk2_ardour/add_route_dialog.cc b/gtk2_ardour/add_route_dialog.cc
index c08120dd85..06dc51dc83 100644
--- a/gtk2_ardour/add_route_dialog.cc
+++ b/gtk2_ardour/add_route_dialog.cc
@@ -84,12 +84,12 @@ AddRouteDialog::AddRouteDialog (Session & s)
refill_channel_setups ();
set_popdown_strings (track_mode_combo, track_mode_strings, true);
- edit_group_combo.append_text (_("No group"));
- _session.foreach_edit_group (mem_fun (*this, &AddRouteDialog::add_edit_group));
+ route_group_combo.append_text (_("No group"));
+ _session.foreach_route_group (mem_fun (*this, &AddRouteDialog::add_route_group));
channel_combo.set_active_text (channel_combo_strings.front());
track_mode_combo.set_active_text (track_mode_strings.front());
- edit_group_combo.set_active (0);
+ route_group_combo.set_active (0);
RadioButton::Group g = track_button.get_group();
bus_button.set_group (g);
@@ -134,7 +134,7 @@ AddRouteDialog::AddRouteDialog (Session & s)
l = manage (new Label (_("Add to edit group:")));
l->set_alignment (1, 0.5);
table->attach (*l, 0, 1, 4, 5);
- table->attach (edit_group_combo, 1, 2, 4, 5, FILL | EXPAND);
+ table->attach (route_group_combo, 1, 2, 4, 5, FILL | EXPAND);
get_vbox()->pack_start (*table);
get_vbox()->set_spacing (6);
@@ -325,17 +325,17 @@ AddRouteDialog::refill_channel_setups ()
}
void
-AddRouteDialog::add_edit_group (RouteGroup* g)
+AddRouteDialog::add_route_group (RouteGroup* g)
{
- edit_group_combo.append_text (g->name ());
+ route_group_combo.append_text (g->name ());
}
RouteGroup*
-AddRouteDialog::edit_group ()
+AddRouteDialog::route_group ()
{
- if (edit_group_combo.get_active_row_number () == 0) {
+ if (route_group_combo.get_active_row_number () == 0) {
return 0;
}
- return _session.edit_group_by_name (edit_group_combo.get_active_text());
+ return _session.route_group_by_name (route_group_combo.get_active_text());
}
diff --git a/gtk2_ardour/add_route_dialog.h b/gtk2_ardour/add_route_dialog.h
index 984f98735f..6103cec80c 100644
--- a/gtk2_ardour/add_route_dialog.h
+++ b/gtk2_ardour/add_route_dialog.h
@@ -50,7 +50,7 @@ class AddRouteDialog : public Gtk::Dialog
ARDOUR::DataType type();
ARDOUR::TrackMode mode();
- ARDOUR::RouteGroup* edit_group ();
+ ARDOUR::RouteGroup* route_group ();
private:
ARDOUR::Session& _session;
@@ -61,13 +61,13 @@ class AddRouteDialog : public Gtk::Dialog
Gtk::SpinButton routes_spinner;
Gtk::ComboBoxText channel_combo;
Gtk::ComboBoxText track_mode_combo;
- Gtk::ComboBoxText edit_group_combo;
+ Gtk::ComboBoxText route_group_combo;
std::vector<ARDOUR::TemplateInfo> route_templates;
void track_type_chosen ();
void refill_channel_setups ();
- void add_edit_group (ARDOUR::RouteGroup *);
+ void add_route_group (ARDOUR::RouteGroup *);
void reset_template_option_visibility ();
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index 24e566eecb..ff8d617a0a 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -1242,7 +1242,7 @@ ARDOUR_UI::open_session ()
void
-ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* edit_group, uint32_t how_many)
+ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* route_group, uint32_t how_many)
{
list<boost::shared_ptr<MidiTrack> > tracks;
@@ -1254,7 +1254,7 @@ ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* edit_group, uint32_t h
try {
if (disk) {
- tracks = session->new_midi_track (ARDOUR::Normal, edit_group, how_many);
+ tracks = session->new_midi_track (ARDOUR::Normal, route_group, how_many);
if (tracks.size() != how_many) {
if (how_many == 1) {
@@ -1282,7 +1282,7 @@ restart JACK with more ports."));
void
-ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, RouteGroup* edit_group, uint32_t how_many)
+ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, RouteGroup* route_group, uint32_t how_many)
{
list<boost::shared_ptr<AudioTrack> > tracks;
RouteList routes;
@@ -1294,7 +1294,7 @@ ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t
try {
if (track) {
- tracks = session->new_audio_track (input_channels, output_channels, mode, edit_group, how_many);
+ tracks = session->new_audio_track (input_channels, output_channels, mode, route_group, how_many);
if (tracks.size() != how_many) {
if (how_many == 1) {
@@ -1307,7 +1307,7 @@ ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t
} else {
- routes = session->new_audio_route (input_channels, output_channels, edit_group, how_many);
+ routes = session->new_audio_route (input_channels, output_channels, route_group, how_many);
if (routes.size() != how_many) {
if (how_many == 1) {
@@ -2802,7 +2802,7 @@ ARDOUR_UI::add_route (Gtk::Window* float_window)
uint32_t output_chan;
string name_template = add_route_dialog->name_template ();
bool track = add_route_dialog->track ();
- RouteGroup* edit_group = add_route_dialog->edit_group ();
+ RouteGroup* route_group = add_route_dialog->route_group ();
AutoConnectOption oac = Config->get_output_auto_connect();
@@ -2816,7 +2816,7 @@ ARDOUR_UI::add_route (Gtk::Window* float_window)
if (add_route_dialog->type() == ARDOUR::DataType::MIDI) {
if (track) {
- session_add_midi_track(edit_group, count);
+ session_add_midi_track (route_group, count);
} else {
MessageDialog msg (*editor,
_("Sorry, MIDI Busses are not supported at this time."));
@@ -2825,9 +2825,9 @@ ARDOUR_UI::add_route (Gtk::Window* float_window)
}
} else {
if (track) {
- session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), edit_group, count);
+ session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), route_group, count);
} else {
- session_add_audio_bus (input_chan, output_chan, edit_group, count);
+ session_add_audio_bus (input_chan, output_chan, route_group, count);
}
}
}
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index 343b940781..10c9a870c4 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -198,16 +198,16 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void add_route (Gtk::Window* float_window);
- void session_add_audio_track (int input_channels, int32_t output_channels, ARDOUR::TrackMode mode, ARDOUR::RouteGroup* edit_group, uint32_t how_many) {
- session_add_audio_route (true, input_channels, output_channels, mode, edit_group, how_many);
+ void session_add_audio_track (int input_channels, int32_t output_channels, ARDOUR::TrackMode mode, ARDOUR::RouteGroup* route_group, uint32_t how_many) {
+ session_add_audio_route (true, input_channels, output_channels, mode, route_group, how_many);
}
- void session_add_audio_bus (int input_channels, int32_t output_channels, ARDOUR::RouteGroup* edit_group, uint32_t how_many) {
- session_add_audio_route (false, input_channels, output_channels, ARDOUR::Normal, edit_group, how_many);
+ void session_add_audio_bus (int input_channels, int32_t output_channels, ARDOUR::RouteGroup* route_group, uint32_t how_many) {
+ session_add_audio_route (false, input_channels, output_channels, ARDOUR::Normal, route_group, how_many);
}
- void session_add_midi_track (ARDOUR::RouteGroup* edit_group, uint32_t how_many) {
- session_add_midi_route (true, edit_group, how_many);
+ void session_add_midi_track (ARDOUR::RouteGroup* route_group, uint32_t how_many) {
+ session_add_midi_route (true, route_group, how_many);
}
/*void session_add_midi_bus () {
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index c669d6b261..ef8d704d82 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -312,7 +312,7 @@ Editor::Editor ()
_xfade_visibility = true;
editor_ruler_menu = 0;
no_ruler_shown_update = false;
- edit_group_list_menu = 0;
+ route_group_list_menu = 0;
route_list_menu = 0;
region_list_menu = 0;
marker_menu = 0;
@@ -337,7 +337,7 @@ Editor::Editor ()
clear_entered_track = false;
_new_regionviews_show_envelope = false;
current_timefx = 0;
- in_edit_group_row_change = false;
+ in_route_group_row_change = false;
playhead_cursor = 0;
button_release_can_deselect = true;
_dragging_playhead = false;
@@ -575,73 +575,70 @@ Editor::Editor ()
route_list_scroller.set_policy (POLICY_NEVER, POLICY_AUTOMATIC);
group_model = ListStore::create(group_columns);
- edit_group_display.set_model (group_model);
- edit_group_display.append_column (_("Name"), group_columns.text);
- edit_group_display.append_column (_("Active"), group_columns.is_active);
- edit_group_display.append_column (_("Show"), group_columns.is_visible);
- edit_group_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
- edit_group_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
- edit_group_display.get_column (2)->set_data (X_("colnum"), GUINT_TO_POINTER(2));
- edit_group_display.get_column (0)->set_expand (true);
- edit_group_display.get_column (1)->set_expand (false);
- edit_group_display.get_column (2)->set_expand (false);
- edit_group_display.set_headers_visible (true);
+ route_group_display.set_model (group_model);
+ route_group_display.append_column (_("Name"), group_columns.text);
+ 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 (0)->set_expand (true);
+ route_group_display.get_column (1)->set_expand (false);
+ route_group_display.set_headers_visible (true);
/* name is directly editable */
- CellRendererText* name_cell = dynamic_cast<CellRendererText*>(edit_group_display.get_column_cell_renderer (0));
+ CellRendererText* name_cell = dynamic_cast<CellRendererText*>(route_group_display.get_column_cell_renderer (0));
name_cell->property_editable() = true;
- name_cell->signal_edited().connect (mem_fun (*this, &Editor::edit_group_name_edit));
+ name_cell->signal_edited().connect (mem_fun (*this, &Editor::route_group_name_edit));
/* use checkbox for the active + visible columns */
- CellRendererToggle* active_cell = dynamic_cast<CellRendererToggle*>(edit_group_display.get_column_cell_renderer (1));
+ CellRendererToggle* active_cell = dynamic_cast<CellRendererToggle*>(route_group_display.get_column_cell_renderer (1));
active_cell->property_activatable() = true;
active_cell->property_radio() = false;
- active_cell = dynamic_cast<CellRendererToggle*>(edit_group_display.get_column_cell_renderer (1));
+ active_cell = dynamic_cast<CellRendererToggle*>(route_group_display.get_column_cell_renderer (1));
active_cell->property_activatable() = true;
active_cell->property_radio() = false;
- group_model->signal_row_changed().connect (mem_fun (*this, &Editor::edit_group_row_change));
+ group_model->signal_row_changed().connect (mem_fun (*this, &Editor::route_group_row_change));
- edit_group_display.set_name ("EditGroupList");
- edit_group_display.get_selection()->set_mode (SELECTION_SINGLE);
- edit_group_display.set_headers_visible (true);
- edit_group_display.set_reorderable (false);
- edit_group_display.set_rules_hint (true);
- edit_group_display.set_size_request (75, -1);
+ route_group_display.set_name ("EditGroupList");
+ route_group_display.get_selection()->set_mode (SELECTION_SINGLE);
+ route_group_display.set_headers_visible (true);
+ route_group_display.set_reorderable (false);
+ route_group_display.set_rules_hint (true);
+ route_group_display.set_size_request (75, -1);
- edit_group_display_scroller.add (edit_group_display);
- edit_group_display_scroller.set_policy (POLICY_AUTOMATIC, POLICY_AUTOMATIC);
+ route_group_display_scroller.add (route_group_display);
+ route_group_display_scroller.set_policy (POLICY_AUTOMATIC, POLICY_AUTOMATIC);
- edit_group_display.signal_button_press_event().connect (mem_fun(*this, &Editor::edit_group_list_button_press_event), false);
+ route_group_display.signal_button_press_event().connect (mem_fun(*this, &Editor::route_group_list_button_press_event), false);
- VBox* edit_group_display_packer = manage (new VBox());
- HBox* edit_group_display_button_box = manage (new HBox());
- edit_group_display_button_box->set_homogeneous (true);
+ VBox* route_group_display_packer = manage (new VBox());
+ HBox* route_group_display_button_box = manage (new HBox());
+ route_group_display_button_box->set_homogeneous (true);
- Button* edit_group_add_button = manage (new Button ());
- Button* edit_group_remove_button = manage (new Button ());
+ Button* route_group_add_button = manage (new Button ());
+ Button* route_group_remove_button = manage (new Button ());
Widget* w;
w = manage (new Image (Stock::ADD, ICON_SIZE_BUTTON));
w->show();
- edit_group_add_button->add (*w);
+ route_group_add_button->add (*w);
w = manage (new Image (Stock::REMOVE, ICON_SIZE_BUTTON));
w->show();
- edit_group_remove_button->add (*w);
+ route_group_remove_button->add (*w);
- edit_group_add_button->signal_clicked().connect (mem_fun (*this, &Editor::new_edit_group));
- edit_group_remove_button->signal_clicked().connect (mem_fun (*this, &Editor::remove_selected_edit_group));
+ route_group_add_button->signal_clicked().connect (mem_fun (*this, &Editor::new_route_group));
+ route_group_remove_button->signal_clicked().connect (mem_fun (*this, &Editor::remove_selected_route_group));
- edit_group_display_button_box->pack_start (*edit_group_add_button);
- edit_group_display_button_box->pack_start (*edit_group_remove_button);
+ route_group_display_button_box->pack_start (*route_group_add_button);
+ route_group_display_button_box->pack_start (*route_group_remove_button);
- edit_group_display_packer->pack_start (edit_group_display_scroller, true, true);
- edit_group_display_packer->pack_start (*edit_group_display_button_box, false, false);
+ route_group_display_packer->pack_start (route_group_display_scroller, true, true);
+ route_group_display_packer->pack_start (*route_group_display_button_box, false, false);
region_list_display.set_size_request (100, -1);
region_list_display.set_name ("RegionListDisplay");
@@ -752,9 +749,9 @@ Editor::Editor ()
nlabel = manage (new Label (_("Snapshots")));
nlabel->set_angle (-90);
the_notebook.append_page (snapshot_display_scroller, *nlabel);
- nlabel = manage (new Label (_("Edit Groups")));
+ nlabel = manage (new Label (_("Route Groups")));
nlabel->set_angle (-90);
- the_notebook.append_page (*edit_group_display_packer, *nlabel);
+ the_notebook.append_page (*route_group_display_packer, *nlabel);
if (!Profile->get_sae()) {
nlabel = manage (new Label (_("Chunks")));
@@ -1293,8 +1290,8 @@ Editor::connect_to_session (Session *t)
session_connections.push_back (session->RegionsAdded.connect (mem_fun(*this, &Editor::handle_new_regions)));
session_connections.push_back (session->RegionRemoved.connect (mem_fun(*this, &Editor::handle_region_removed)));
session_connections.push_back (session->DurationChanged.connect (mem_fun(*this, &Editor::handle_new_duration)));
- session_connections.push_back (session->edit_group_added.connect (mem_fun(*this, &Editor::add_edit_group)));
- session_connections.push_back (session->edit_group_removed.connect (mem_fun(*this, &Editor::edit_groups_changed)));
+ session_connections.push_back (session->route_group_added.connect (mem_fun(*this, &Editor::add_route_group)));
+ session_connections.push_back (session->route_group_removed.connect (mem_fun(*this, &Editor::route_groups_changed)));
session_connections.push_back (session->NamedSelectionAdded.connect (mem_fun(*this, &Editor::handle_new_named_selection)));
session_connections.push_back (session->NamedSelectionRemoved.connect (mem_fun(*this, &Editor::handle_new_named_selection)));
session_connections.push_back (session->DirtyChanged.connect (mem_fun(*this, &Editor::update_title)));
@@ -1309,7 +1306,7 @@ Editor::connect_to_session (Session *t)
session_connections.push_back (session->Located.connect (mem_fun (*this, &Editor::located)));
session_connections.push_back (session->config.ParameterChanged.connect (mem_fun (*this, &Editor::parameter_changed)));
- edit_groups_changed ();
+ route_groups_changed ();
edit_point_clock.set_mode(AudioClock::BBT);
edit_point_clock.set_session (session);
@@ -3560,24 +3557,24 @@ Editor::commit_reversible_command ()
}
void
-Editor::set_edit_group_solo (Route& route, bool yn)
+Editor::set_route_group_solo (Route& route, bool yn)
{
- RouteGroup *edit_group;
+ RouteGroup *route_group;
- if ((edit_group = route.edit_group()) != 0) {
- edit_group->apply (&Route::set_solo, yn, this);
+ if ((route_group = route.route_group()) != 0) {
+ route_group->apply (&Route::set_solo, yn, this);
} else {
route.set_solo (yn, this);
}
}
void
-Editor::set_edit_group_mute (Route& route, bool yn)
+Editor::set_route_group_mute (Route& route, bool yn)
{
- RouteGroup *edit_group = 0;
+ RouteGroup *route_group = 0;
- if ((edit_group == route.edit_group()) != 0) {
- edit_group->apply (&Route::set_mute, yn, this);
+ if ((route_group == route.route_group()) != 0) {
+ route_group->apply (&Route::set_mute, yn, this);
} else {
route.set_mute (yn, this);
}
@@ -3966,11 +3963,11 @@ Editor::get_valid_views (TimeAxisView* track, RouteGroup* group)
} else {
- /* views for all tracks in the edit group */
+ /* views for all tracks in the route group */
for (i = track_views.begin(); i != track_views.end (); ++i) {
- if (group == 0 || (*i)->edit_group() == group) {
+ if (group == 0 || (*i)->route_group() == group) {
v->push_back (*i);
}
}
@@ -5070,45 +5067,29 @@ Editor::get_regions_for_action (RegionSelection& rs, bool allow_entered)
{
if (selection->regions.empty()) {
- if (selection->tracks.empty()) {
+ /* no regions selected; get all regions at the edit point across:
+ - tracks in the region's route's edit group, if it has the edit property
+ - selected tracks
+ */
- /* no regions or tracks selected
- */
+ if (entered_regionview) {
- if (entered_regionview && mouse_mode == Editing::MouseObject) {
+ rs.add (entered_regionview);
- /* entered regionview is valid and we're in object mode -
- just use entered regionview
- */
+ TrackSelection tracks = selection->tracks;
- rs.add (entered_regionview);
+ RouteGroup* g = entered_regionview->get_time_axis_view().route_group ();
+ if (g && g->active_property (RouteGroup::Edit)) {
+ tracks.add (axis_views_from_routes (g->route_list()));
}
- return;
-
- } else {
-
- /* no regions selected, so get all regions at the edit point across
- all selected tracks.
- */
-
- nframes64_t where = get_preferred_edit_position();
- get_regions_at (rs, where, selection->tracks);
-
- /* if the entered regionview wasn't selected and neither was its track
- then add it.
- */
-
- if (entered_regionview != 0 &&
- !selection->selected (entered_regionview) &&
- !selection->selected (&entered_regionview->get_time_axis_view())) {
- rs.add (entered_regionview);
- }
+ nframes64_t const where = get_preferred_edit_position ();
+ get_regions_at (rs, where, tracks);
}
-
+
} else {
- /* just use the selected regions */
+ /* use the selected regions */
rs = selection->regions;
@@ -5289,3 +5270,23 @@ Editor::streamview_height_changed ()
{
_summary->set_dirty ();
}
+
+TrackSelection
+Editor::axis_views_from_routes (list<Route*> r) const
+{
+ TrackSelection t;
+
+ for (list<Route*>::const_iterator i = r.begin(); i != r.end(); ++i) {
+ TrackViewList::const_iterator j = track_views.begin ();
+ while (j != track_views.end()) {
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*j);
+ if (rtv && rtv->route().get() == *i) {
+ t.push_back (rtv);
+ }
+ ++j;
+ }
+ }
+
+ return t;
+}
+
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index c4f9eafa6f..a28c742881 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -1060,6 +1060,7 @@ class Editor : public PublicEditor
/* track views */
TrackViewList track_views;
std::pair<TimeAxisView*, ARDOUR::layer_t> trackview_by_y_position (double);
+ TrackSelection axis_views_from_routes (std::list<ARDOUR::Route *>) const;
static Gdk::Cursor* cross_hair_cursor;
static Gdk::Cursor* trimmer_cursor;
@@ -1842,12 +1843,10 @@ public:
struct GroupListModelColumns : public Gtk::TreeModel::ColumnRecord {
GroupListModelColumns () {
- add (is_active);
add (is_visible);
add (text);
add (routegroup);
}
- Gtk::TreeModelColumn<bool> is_active;
Gtk::TreeModelColumn<bool> is_visible;
Gtk::TreeModelColumn<std::string> text;
Gtk::TreeModelColumn<ARDOUR::RouteGroup*> routegroup;
@@ -1857,23 +1856,23 @@ public:
Glib::RefPtr<Gtk::ListStore> group_model;
Glib::RefPtr<Gtk::TreeSelection> group_selection;
- Gtk::TreeView edit_group_display;
- Gtk::ScrolledWindow edit_group_display_scroller;
- Gtk::Menu* edit_group_list_menu;
-
- void build_edit_group_list_menu ();
- void activate_all_edit_groups ();
- void disable_all_edit_groups ();
-
- bool in_edit_group_row_change;
- void edit_group_row_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
- void edit_group_name_edit (const Glib::ustring&, const Glib::ustring&);
- void new_edit_group ();
- void edit_group_list_button_clicked ();
- gint edit_group_list_button_press_event (GdkEventButton* ev);
- void add_edit_group (ARDOUR::RouteGroup* group);
- void remove_selected_edit_group ();
- void edit_groups_changed ();
+ Gtk::TreeView route_group_display;
+ Gtk::ScrolledWindow route_group_display_scroller;
+ Gtk::Menu* route_group_list_menu;
+
+ void build_route_group_list_menu ();
+ void activate_all_route_groups ();
+ void disable_all_route_groups ();
+
+ bool in_route_group_row_change;
+ void route_group_row_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
+ void route_group_name_edit (const Glib::ustring&, const Glib::ustring&);
+ void new_route_group ();
+ void route_group_list_button_clicked ();
+ gint route_group_list_button_press_event (GdkEventButton* ev);
+ void add_route_group (ARDOUR::RouteGroup* group);
+ void remove_selected_route_group ();
+ void route_groups_changed ();
void group_flags_changed (void*, ARDOUR::RouteGroup*);
Gtk::VBox list_vpacker;
@@ -2018,10 +2017,10 @@ public:
void freeze_route ();
void unfreeze_route ();
- /* edit-group solo + mute */
+ /* route-group solo + mute */
- void set_edit_group_solo (ARDOUR::Route&, bool);
- void set_edit_group_mute (ARDOUR::Route&, bool);
+ void set_route_group_solo (ARDOUR::Route&, bool);
+ void set_route_group_mute (ARDOUR::Route&, bool);
/* duplication */
@@ -2244,6 +2243,8 @@ public:
EditorGroupTabs* _group_tabs;
+ void set_route_group_activation (ARDOUR::RouteGroup *, bool);
+
friend class Drag;
friend class RegionDrag;
friend class RegionMoveDrag;
diff --git a/gtk2_ardour/editor_edit_groups.cc b/gtk2_ardour/editor_edit_groups.cc
index d311295706..ac7e1f3d66 100644
--- a/gtk2_ardour/editor_edit_groups.cc
+++ b/gtk2_ardour/editor_edit_groups.cc
@@ -43,49 +43,49 @@ using namespace PBD;
using namespace Gtk;
void
-Editor::build_edit_group_list_menu ()
+Editor::build_route_group_list_menu ()
{
using namespace Gtk::Menu_Helpers;
- edit_group_list_menu = new Menu;
- edit_group_list_menu->set_name ("ArdourContextMenu");
- MenuList& items = edit_group_list_menu->items();
+ route_group_list_menu = new Menu;
+ route_group_list_menu->set_name ("ArdourContextMenu");
+ MenuList& items = route_group_list_menu->items();
- items.push_back (MenuElem (_("Activate All"), mem_fun(*this, &Editor::activate_all_edit_groups)));
- items.push_back (MenuElem (_("Disable All"), mem_fun(*this, &Editor::disable_all_edit_groups)));
+ items.push_back (MenuElem (_("Activate All"), mem_fun(*this, &Editor::activate_all_route_groups)));
+ items.push_back (MenuElem (_("Disable All"), mem_fun(*this, &Editor::disable_all_route_groups)));
items.push_back (SeparatorElem());
- items.push_back (MenuElem (_("Add group"), mem_fun(*this, &Editor::new_edit_group)));
+ items.push_back (MenuElem (_("Add group"), mem_fun(*this, &Editor::new_route_group)));
}
void
-Editor::activate_all_edit_groups ()
+Editor::activate_all_route_groups ()
{
- Gtk::TreeModel::Children children = group_model->children();
- for(Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) {
- (*iter)[group_columns.is_active] = true;
- }
+ session->foreach_route_group (bind (mem_fun (*this, &Editor::set_route_group_activation), true));
}
void
-Editor::disable_all_edit_groups ()
+Editor::disable_all_route_groups ()
{
- Gtk::TreeModel::Children children = group_model->children();
- for(Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) {
- (*iter)[group_columns.is_active] = false;
- }
+ session->foreach_route_group (bind (mem_fun (*this, &Editor::set_route_group_activation), false));
+}
+
+void
+Editor::set_route_group_activation (RouteGroup* g, bool a)
+{
+ g->set_active (a, this);
}
void
-Editor::new_edit_group ()
+Editor::new_route_group ()
{
- session->add_edit_group (new RouteGroup (*session, ""));
+ session->add_route_group (new RouteGroup (*session, ""));
}
void
-Editor::remove_selected_edit_group ()
+Editor::remove_selected_route_group ()
{
- Glib::RefPtr<TreeSelection> selection = edit_group_display.get_selection();
+ Glib::RefPtr<TreeSelection> selection = route_group_display.get_selection();
TreeView::Selection::ListHandle_Path rows = selection->get_selected_rows ();
if (rows.empty()) {
@@ -102,25 +102,25 @@ Editor::remove_selected_edit_group ()
RouteGroup* rg = (*iter)[group_columns.routegroup];
if (rg) {
- session->remove_edit_group (*rg);
+ session->remove_route_group (*rg);
}
}
}
void
-Editor::edit_group_list_button_clicked ()
+Editor::route_group_list_button_clicked ()
{
- new_edit_group ();
+ new_route_group ();
}
gint
-Editor::edit_group_list_button_press_event (GdkEventButton* ev)
+Editor::route_group_list_button_press_event (GdkEventButton* ev)
{
if (Keyboard::is_context_menu_event (ev)) {
- if (edit_group_list_menu == 0) {
- build_edit_group_list_menu ();
+ if (route_group_list_menu == 0) {
+ build_route_group_list_menu ();
}
- edit_group_list_menu->popup (1, ev->time);
+ route_group_list_menu->popup (1, ev->time);
return true;
}
@@ -132,7 +132,7 @@ Editor::edit_group_list_button_press_event (GdkEventButton* ev)
int cellx;
int celly;
- if (!edit_group_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) {
+ if (!route_group_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) {
return false;
}
@@ -143,7 +143,7 @@ Editor::edit_group_list_button_press_event (GdkEventButton* ev)
if ((group = (*iter)[group_columns.routegroup]) != 0) {
// edit_route_group (group);
#ifdef GTKOSX
- edit_group_display.queue_draw();
+ route_group_display.queue_draw();
#endif
return true;
}
@@ -154,21 +154,10 @@ Editor::edit_group_list_button_press_event (GdkEventButton* ev)
case 1:
if ((iter = group_model->get_iter (path))) {
- bool active = (*iter)[group_columns.is_active];
- (*iter)[group_columns.is_active] = !active;
-#ifdef GTKOSX
- edit_group_display.queue_draw();
-#endif
- return true;
- }
- break;
-
- case 2:
- if ((iter = group_model->get_iter (path))) {
bool visible = (*iter)[group_columns.is_visible];
(*iter)[group_columns.is_visible] = !visible;
#ifdef GTKOSX
- edit_group_display.queue_draw();
+ route_group_display.queue_draw();
#endif
return true;
}
@@ -182,11 +171,11 @@ Editor::edit_group_list_button_press_event (GdkEventButton* ev)
}
void
-Editor::edit_group_row_change (const Gtk::TreeModel::Path& path,const Gtk::TreeModel::iterator& iter)
+Editor::route_group_row_change (const Gtk::TreeModel::Path& path,const Gtk::TreeModel::iterator& iter)
{
RouteGroup* group;
- if (in_edit_group_row_change) {
+ if (in_route_group_row_change) {
return;
}
@@ -196,22 +185,18 @@ Editor::edit_group_row_change (const Gtk::TreeModel::Path& path,const Gtk::TreeM
if ((*iter)[group_columns.is_visible]) {
for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) {
- if ((*j)->edit_group() == group) {
+ if ((*j)->route_group() == group) {
show_track_in_display (**j);
}
}
} else {
for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) {
- if ((*j)->edit_group() == group) {
+ if ((*j)->route_group() == group) {
hide_track_in_display (**j);
}
}
}
- bool active = (*iter)[group_columns.is_active];
- group->set_active (active, this);
-
-
string name = (*iter)[group_columns.text];
if (name != group->name()) {
@@ -220,16 +205,15 @@ Editor::edit_group_row_change (const Gtk::TreeModel::Path& path,const Gtk::TreeM
}
void
-Editor::add_edit_group (RouteGroup* group)
+Editor::add_route_group (RouteGroup* group)
{
- ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::add_edit_group), group));
+ ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::add_route_group), group));
bool focus = false;
TreeModel::Row row = *(group_model->append());
- row[group_columns.is_active] = group->is_active();
row[group_columns.is_visible] = !group->is_hidden();
- in_edit_group_row_change = true;
+ in_route_group_row_change = true;
row[group_columns.routegroup] = group;
@@ -243,20 +227,20 @@ Editor::add_edit_group (RouteGroup* group)
group->FlagsChanged.connect (bind (mem_fun(*this, &Editor::group_flags_changed), group));
if (focus) {
- TreeViewColumn* col = edit_group_display.get_column (0);
- CellRendererText* name_cell = dynamic_cast<CellRendererText*>(edit_group_display.get_column_cell_renderer (0));
- edit_group_display.set_cursor (group_model->get_path (row), *col, *name_cell, true);
+ TreeViewColumn* col = route_group_display.get_column (0);
+ CellRendererText* name_cell = dynamic_cast<CellRendererText*>(route_group_display.get_column_cell_renderer (0));
+ route_group_display.set_cursor (group_model->get_path (row), *col, *name_cell, true);
}
- in_edit_group_row_change = false;
+ in_route_group_row_change = false;
_group_tabs->set_dirty ();
}
void
-Editor::edit_groups_changed ()
+Editor::route_groups_changed ()
{
- ENSURE_GUI_THREAD (mem_fun (*this, &Editor::edit_groups_changed));
+ ENSURE_GUI_THREAD (mem_fun (*this, &Editor::route_groups_changed));
/* just rebuild the while thing */
@@ -265,13 +249,12 @@ Editor::edit_groups_changed ()
{
TreeModel::Row row;
row = *(group_model->append());
- row[group_columns.is_active] = false;
row[group_columns.is_visible] = true;
row[group_columns.text] = (_("-all-"));
row[group_columns.routegroup] = 0;
}
- session->foreach_edit_group (mem_fun (*this, &Editor::add_edit_group));
+ session->foreach_route_group (mem_fun (*this, &Editor::add_route_group));
}
void
@@ -279,24 +262,23 @@ Editor::group_flags_changed (void* src, RouteGroup* group)
{
ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::group_flags_changed), src, group));
- in_edit_group_row_change = true;
+ 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_active] = group->is_active();
(*iter)[group_columns.is_visible] = !group->is_hidden();
(*iter)[group_columns.text] = group->name();
}
}
- in_edit_group_row_change = false;
+ in_route_group_row_change = false;
_group_tabs->set_dirty ();
}
void
-Editor::edit_group_name_edit (const Glib::ustring& path, const Glib::ustring& new_text)
+Editor::route_group_name_edit (const Glib::ustring& path, const Glib::ustring& new_text)
{
RouteGroup* group;
TreeIter iter;
diff --git a/gtk2_ardour/editor_group_tabs.cc b/gtk2_ardour/editor_group_tabs.cc
index f6c817c00c..c4032c9b28 100644
--- a/gtk2_ardour/editor_group_tabs.cc
+++ b/gtk2_ardour/editor_group_tabs.cc
@@ -33,25 +33,6 @@ EditorGroupTabs::EditorGroupTabs (Editor* e)
}
void
-EditorGroupTabs::set_session (Session* s)
-{
- s->RouteEditGroupChanged.connect (mem_fun (*this, &EditorGroupTabs::set_dirty));
-}
-
-
-/** Handle a size request.
- * @param req GTK requisition
- */
-void
-EditorGroupTabs::on_size_request (Gtk::Requisition *req)
-{
- /* Use a dummy, small height and the actual width that we want */
- req->width = 16;
- req->height = 16;
-}
-
-
-void
EditorGroupTabs::render (cairo_t* cr)
{
/* background */
@@ -71,7 +52,7 @@ EditorGroupTabs::render (cairo_t* cr)
continue;
}
- RouteGroup* g = (*i)->edit_group ();
+ RouteGroup* g = (*i)->route_group ();
if (g != curr_group) {
if (curr_group) {
@@ -122,8 +103,8 @@ EditorGroupTabs::draw_group (cairo_t* cr, int32_t y1, int32_t y2, RouteGroup* g,
cairo_restore (cr);
}
-bool
-EditorGroupTabs::on_button_press_event (GdkEventButton* ev)
+RouteGroup*
+EditorGroupTabs::click_to_route_group (GdkEventButton* ev)
{
int32_t y = 0;
Editor::TrackViewList::iterator i = _editor->track_views.begin();
@@ -137,15 +118,10 @@ EditorGroupTabs::on_button_press_event (GdkEventButton* ev)
++i;
}
}
-
+
if (i == _editor->track_views.end()) {
- return false;
+ return 0;
}
- RouteGroup* g = (*i)->edit_group ();
- if (g) {
- g->set_active (!g->is_active (), this);
- }
-
- return true;
+ return (*i)->route_group ();
}
diff --git a/gtk2_ardour/editor_group_tabs.h b/gtk2_ardour/editor_group_tabs.h
index 5bf4a71439..140c195fb4 100644
--- a/gtk2_ardour/editor_group_tabs.h
+++ b/gtk2_ardour/editor_group_tabs.h
@@ -17,21 +17,20 @@
*/
-#include "cairo_widget.h"
+#include <gtkmm/menu.h>
+#include "group_tabs.h"
class Editor;
-class EditorGroupTabs : public CairoWidget
+class EditorGroupTabs : public GroupTabs
{
public:
EditorGroupTabs (Editor *);
- void set_session (ARDOUR::Session *);
-
private:
- void on_size_request (Gtk::Requisition *);
- bool on_button_press_event (GdkEventButton *);
+ ARDOUR::RouteGroup* click_to_route_group (GdkEventButton *);
void render (cairo_t *);
+
void draw_group (cairo_t *, int32_t, int32_t, ARDOUR::RouteGroup* , Gdk::Color const &);
Editor* _editor;
diff --git a/gtk2_ardour/editor_mixer.cc b/gtk2_ardour/editor_mixer.cc
index bc58aa3ee5..7fd31c468b 100644
--- a/gtk2_ardour/editor_mixer.cc
+++ b/gtk2_ardour/editor_mixer.cc
@@ -370,7 +370,7 @@ Editor::session_going_away ()
region_list_display.set_model (Glib::RefPtr<Gtk::TreeStore>(0));
route_list_display.set_model (Glib::RefPtr<Gtk::TreeStore>(0));
named_selection_display.set_model (Glib::RefPtr<Gtk::TreeStore>(0));
- edit_group_display.set_model (Glib::RefPtr<Gtk::TreeStore>(0));
+ route_group_display.set_model (Glib::RefPtr<Gtk::TreeStore>(0));
region_list_model->clear ();
route_display_model->clear ();
@@ -380,7 +380,7 @@ Editor::session_going_away ()
region_list_display.set_model (region_list_model);
route_list_display.set_model (route_display_model);
named_selection_display.set_model (named_selection_model);
- edit_group_display.set_model (group_model);
+ route_group_display.set_model (group_model);
edit_point_clock_connection_a.disconnect();
edit_point_clock_connection_b.disconnect();
diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc
index 9bfba273f7..bb9a392c9c 100644
--- a/gtk2_ardour/editor_selection.cc
+++ b/gtk2_ardour/editor_selection.cc
@@ -274,7 +274,7 @@ Editor::get_relevant_tracks (set<RouteTimeAxisView*>& relevant_tracks)
continue;
}
- RouteGroup* group = rtv->route()->edit_group();
+ RouteGroup* group = rtv->route()->route_group();
if (group && group->is_active()) {
@@ -286,7 +286,7 @@ Editor::get_relevant_tracks (set<RouteTimeAxisView*>& relevant_tracks)
if ((trtv = dynamic_cast<RouteTimeAxisView*> (*i)) != 0) {
- if (trtv->route()->edit_group() == group) {
+ if (trtv->route()->route_group() == group) {
relevant_tracks.insert (trtv);
}
}
@@ -299,7 +299,7 @@ Editor::get_relevant_tracks (set<RouteTimeAxisView*>& relevant_tracks)
/**
* Call a slot for a given `basis' track and also for any track that is in the same
- * active edit group.
+ * active route group with the `select' property.
* @param sl Slot to call.
* @param basis Basis track.
*/
@@ -320,13 +320,13 @@ Editor::mapover_tracks (slot<void, RouteTimeAxisView&, uint32_t> sl, TimeAxisVie
/* always call for the basis */
tracks.insert (route_basis);
- RouteGroup* group = route_basis->route()->edit_group();
- if (group && group->is_active()) {
+ RouteGroup* group = route_basis->route()->route_group();
+ if (group && group->active_property (RouteGroup::Select)) {
/* the basis is a member of an active edit group; find other members */
for (TrackViewList::const_iterator i = track_views.begin(); i != track_views.end(); ++i) {
RouteTimeAxisView* v = dynamic_cast<RouteTimeAxisView*> (*i);
- if (v && v->route()->edit_group() == group) {
+ if (v && v->route()->route_group() == group) {
tracks.insert (v);
}
}
@@ -487,7 +487,8 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op,
case Selection::Set:
if (!selection->selected (clicked_regionview)) {
- selection->set (clicked_regionview);
+ get_equivalent_regions (clicked_regionview, all_equivalent_regions);
+ selection->set (all_equivalent_regions);
commit = true;
} else {
/* no commit necessary: clicked on an already selected region */
diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc
index cbcddf45b3..b375a9c0a1 100644
--- a/gtk2_ardour/gain_meter.cc
+++ b/gtk2_ardour/gain_meter.cc
@@ -274,7 +274,7 @@ GainMeterBase::peak_button_release (GdkEventButton* ev)
ResetAllPeakDisplays ();
} else if (ev->button == 1 && Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
if (_route) {
- ResetGroupPeakDisplays (_route->mix_group());
+ ResetGroupPeakDisplays (_route->route_group());
}
} else {
reset_peak_display ();
@@ -296,7 +296,7 @@ GainMeterBase::reset_peak_display ()
void
GainMeterBase::reset_group_peak_display (RouteGroup* group)
{
- if (_route && group == _route->mix_group()) {
+ if (_route && group == _route->route_group()) {
reset_peak_display ();
}
}
@@ -542,7 +542,7 @@ GainMeterBase::set_mix_group_meter_point (Route& route, MeterPoint mp)
{
RouteGroup* mix_group;
- if((mix_group = route.mix_group()) != 0){
+ if((mix_group = route.route_group()) != 0){
mix_group->apply (&Route::set_meter_point, mp, this);
} else {
route.set_meter_point (mp, this);
diff --git a/gtk2_ardour/group_tabs.cc b/gtk2_ardour/group_tabs.cc
new file mode 100644
index 0000000000..ed179e3aef
--- /dev/null
+++ b/gtk2_ardour/group_tabs.cc
@@ -0,0 +1,95 @@
+/*
+ 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 <gtkmm/stock.h>
+#include "ardour/session.h"
+#include "ardour/route_group.h"
+#include "route_group_dialog.h"
+#include "group_tabs.h"
+#include "i18n.h"
+
+using namespace Gtk;
+using namespace ARDOUR;
+
+GroupTabs::GroupTabs ()
+ : _session (0),
+ _menu (0)
+{
+
+}
+
+void
+GroupTabs::set_session (Session* s)
+{
+ _session = s;
+ s->RouteGroupChanged.connect (mem_fun (*this, &GroupTabs::set_dirty));
+}
+
+
+/** Handle a size request.
+ * @param req GTK requisition
+ */
+void
+GroupTabs::on_size_request (Gtk::Requisition *req)
+{
+ /* Use a dummy, small width and the actual height that we want */
+ req->width = 16;
+ req->height = 16;
+}
+
+bool
+GroupTabs::on_button_press_event (GdkEventButton* ev)
+{
+ using namespace Menu_Helpers;
+
+ RouteGroup* g = click_to_route_group (ev);
+
+ if (ev->button == 1 && g) {
+
+ g->set_active (!g->is_active (), this);
+
+ } else if (ev->button == 3 && g) {
+
+ if (!_menu) {
+ _menu = new Menu;
+ MenuList& items = _menu->items ();
+ items.push_back (MenuElem (_("Edit..."), bind (mem_fun (*this, &GroupTabs::edit_group), g)));
+ items.push_back (MenuElem (_("Remove"), bind (mem_fun (*this, &GroupTabs::remove_group), g)));
+ }
+
+ _menu->popup (ev->button, ev->time);
+
+ }
+
+ return true;
+}
+
+
+void
+GroupTabs::edit_group (RouteGroup* g)
+{
+ RouteGroupDialog d (g, Gtk::Stock::APPLY);
+ d.do_run ();
+}
+
+void
+GroupTabs::remove_group (RouteGroup *g)
+{
+ _session->remove_route_group (*g);
+}
diff --git a/gtk2_ardour/group_tabs.h b/gtk2_ardour/group_tabs.h
new file mode 100644
index 0000000000..b83f7f2a06
--- /dev/null
+++ b/gtk2_ardour/group_tabs.h
@@ -0,0 +1,49 @@
+/*
+ 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 <gtkmm/menu.h>
+#include "cairo_widget.h"
+
+namespace ARDOUR {
+ class Session;
+ class RouteGroup;
+}
+
+class Editor;
+
+class GroupTabs : public CairoWidget
+{
+public:
+ GroupTabs ();
+
+ void set_session (ARDOUR::Session *);
+
+private:
+ virtual ARDOUR::RouteGroup* click_to_route_group (GdkEventButton* ev) = 0;
+ virtual void render (cairo_t *) = 0;
+
+ void on_size_request (Gtk::Requisition *);
+ bool on_button_press_event (GdkEventButton *);
+
+ void edit_group (ARDOUR::RouteGroup *);
+ void remove_group (ARDOUR::RouteGroup *);
+
+ ARDOUR::Session* _session;
+ Gtk::Menu* _menu;
+};
diff --git a/gtk2_ardour/mixer_group_tabs.cc b/gtk2_ardour/mixer_group_tabs.cc
index a79aa45b28..5e376396a1 100644
--- a/gtk2_ardour/mixer_group_tabs.cc
+++ b/gtk2_ardour/mixer_group_tabs.cc
@@ -33,24 +33,6 @@ MixerGroupTabs::MixerGroupTabs (Mixer_UI* m)
}
-void
-MixerGroupTabs::set_session (Session* s)
-{
- s->RouteMixGroupChanged.connect (mem_fun (*this, &MixerGroupTabs::set_dirty));
-}
-
-
-/** Handle a size request.
- * @param req GTK requisition
- */
-void
-MixerGroupTabs::on_size_request (Gtk::Requisition *req)
-{
- /* Use a dummy, small width and the actual height that we want */
- req->width = 16;
- req->height = 16;
-}
-
void
MixerGroupTabs::render (cairo_t* cr)
@@ -72,7 +54,7 @@ MixerGroupTabs::render (cairo_t* cr)
continue;
}
- RouteGroup* g = (*i)->mix_group ();
+ RouteGroup* g = (*i)->route_group ();
if (g != curr_group) {
if (curr_group) {
@@ -121,8 +103,8 @@ MixerGroupTabs::draw_group (cairo_t* cr, int32_t x1, int32_t x2, RouteGroup* g,
cairo_restore (cr);
}
-bool
-MixerGroupTabs::on_button_press_event (GdkEventButton* ev)
+RouteGroup*
+MixerGroupTabs::click_to_route_group (GdkEventButton* ev)
{
int32_t x = 0;
list<MixerStrip*>::iterator i = _mixer->strips.begin();
@@ -138,13 +120,8 @@ MixerGroupTabs::on_button_press_event (GdkEventButton* ev)
}
if (i == _mixer->strips.end()) {
- return false;
+ return 0;
}
- RouteGroup* g = (*i)->mix_group ();
- if (g) {
- g->set_active (!g->is_active (), this);
- }
-
- return true;
+ return (*i)->route_group ();
}
diff --git a/gtk2_ardour/mixer_group_tabs.h b/gtk2_ardour/mixer_group_tabs.h
index fc95b4b1f6..75521795f0 100644
--- a/gtk2_ardour/mixer_group_tabs.h
+++ b/gtk2_ardour/mixer_group_tabs.h
@@ -17,21 +17,19 @@
*/
-#include "cairo_widget.h"
+#include "group_tabs.h"
class Mixer_UI;
-class MixerGroupTabs : public CairoWidget
+class MixerGroupTabs : public GroupTabs
{
public:
MixerGroupTabs (Mixer_UI *);
- void set_session (ARDOUR::Session *);
-
private:
- void on_size_request (Gtk::Requisition *);
- bool on_button_press_event (GdkEventButton *);
+ ARDOUR::RouteGroup* click_to_route_group (GdkEventButton *);
void render (cairo_t *);
+
void draw_group (cairo_t *, int32_t, int32_t, ARDOUR::RouteGroup* , Gdk::Color const &);
Mixer_UI* _mixer;
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index 66023042a5..07e17159dc 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -280,7 +280,7 @@ MixerStrip::init ()
show_sends_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::show_sends_release));
name_button.signal_button_press_event().connect (mem_fun(*this, &MixerStrip::name_button_button_press), false);
- group_button.signal_button_press_event().connect (mem_fun(*this, &MixerStrip::select_mix_group), false);
+ group_button.signal_button_press_event().connect (mem_fun(*this, &MixerStrip::select_route_group), false);
_width = (Width) -1;
@@ -411,8 +411,8 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
mem_fun(*this, &MixerStrip::input_changed)));
connections.push_back (_route->output()->changed.connect (
mem_fun(*this, &MixerStrip::output_changed)));
- connections.push_back (_route->mix_group_changed.connect (
- mem_fun(*this, &MixerStrip::mix_group_changed)));
+ connections.push_back (_route->route_group_changed.connect (
+ mem_fun(*this, &MixerStrip::route_group_changed)));
if (_route->panner()) {
connections.push_back (_route->panner()->Changed.connect (
@@ -441,7 +441,7 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
solo_changed (0);
name_changed ();
comment_changed (0);
- mix_group_changed (0);
+ route_group_changed (0);
connect_to_pan ();
@@ -611,7 +611,7 @@ MixerStrip::set_width_enum (Width w, void* owner)
}
update_input_display ();
update_output_display ();
- mix_group_changed (0);
+ route_group_changed (0);
name_changed ();
#ifdef GTKOSX
WidthChanged();
@@ -1065,27 +1065,27 @@ MixerStrip::comment_changed (void *src)
}
void
-MixerStrip::set_mix_group (RouteGroup *rg)
+MixerStrip::set_route_group (RouteGroup *rg)
{
- _route->set_mix_group (rg, this);
+ _route->set_route_group (rg, this);
}
void
-MixerStrip::add_mix_group_to_menu (RouteGroup *rg, RadioMenuItem::Group* group)
+MixerStrip::add_route_group_to_menu (RouteGroup *rg, RadioMenuItem::Group* group)
{
using namespace Menu_Helpers;
MenuList& items = group_menu->items();
- items.push_back (RadioMenuElem (*group, rg->name(), bind (mem_fun(*this, &MixerStrip::set_mix_group), rg)));
+ items.push_back (RadioMenuElem (*group, rg->name(), bind (mem_fun(*this, &MixerStrip::set_route_group), rg)));
- if (_route->mix_group() == rg) {
+ if (_route->route_group() == rg) {
static_cast<RadioMenuItem*>(&items.back())->set_active ();
}
}
bool
-MixerStrip::select_mix_group (GdkEventButton *ev)
+MixerStrip::select_route_group (GdkEventButton *ev)
{
using namespace Menu_Helpers;
@@ -1101,13 +1101,13 @@ MixerStrip::select_mix_group (GdkEventButton *ev)
items.clear ();
- items.push_back (MenuElem (_("New group..."), mem_fun (*this, &MixerStrip::set_mix_group_to_new)));
+ items.push_back (MenuElem (_("New group..."), mem_fun (*this, &MixerStrip::set_route_group_to_new)));
items.push_back (SeparatorElem ());
- items.push_back (RadioMenuElem (group, _("No group"), bind (mem_fun(*this, &MixerStrip::set_mix_group), (RouteGroup *) 0)));
+ items.push_back (RadioMenuElem (group, _("No group"), bind (mem_fun(*this, &MixerStrip::set_route_group), (RouteGroup *) 0)));
- _session.foreach_mix_group (bind (mem_fun (*this, &MixerStrip::add_mix_group_to_menu), &group));
+ _session.foreach_route_group (bind (mem_fun (*this, &MixerStrip::add_route_group_to_menu), &group));
group_menu->popup (1, ev->time);
break;
@@ -1120,11 +1120,11 @@ MixerStrip::select_mix_group (GdkEventButton *ev)
}
void
-MixerStrip::mix_group_changed (void *ignored)
+MixerStrip::route_group_changed (void *ignored)
{
- ENSURE_GUI_THREAD(bind (mem_fun(*this, &MixerStrip::mix_group_changed), ignored));
+ ENSURE_GUI_THREAD(bind (mem_fun(*this, &MixerStrip::route_group_changed), ignored));
- RouteGroup *rg = _route->mix_group();
+ RouteGroup *rg = _route->route_group();
if (rg) {
group_label.set_text (rg->name());
@@ -1377,9 +1377,9 @@ MixerStrip::route_active_changed ()
}
RouteGroup*
-MixerStrip::mix_group() const
+MixerStrip::route_group() const
{
- return _route->mix_group();
+ return _route->route_group();
}
void
@@ -1484,17 +1484,17 @@ MixerStrip::revert_to_default_display ()
}
void
-MixerStrip::set_mix_group_to_new ()
+MixerStrip::set_route_group_to_new ()
{
RouteGroup* g = new RouteGroup (_session, "", RouteGroup::Active);
g->set_active (true, this);
- RouteGroupDialog d (g);
+ RouteGroupDialog d (g, Gtk::Stock::NEW);
int const r = d.do_run ();
if (r == Gtk::RESPONSE_OK) {
- _session.add_mix_group (g);
- _route->set_mix_group (g, this);
+ _session.add_route_group (g);
+ _route->set_route_group (g, this);
} else {
delete g;
}
diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h
index ced789f3ef..ca9f1f844f 100644
--- a/gtk2_ardour/mixer_strip.h
+++ b/gtk2_ardour/mixer_strip.h
@@ -94,7 +94,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
void fast_update ();
void set_embedded (bool);
- ARDOUR::RouteGroup* mix_group() const;
+ ARDOUR::RouteGroup* route_group() const;
void set_route (boost::shared_ptr<ARDOUR::Route>);
#ifdef GTKOSX
@@ -226,10 +226,10 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
void comment_edited ();
bool ignore_comment_edit;
- void set_mix_group (ARDOUR::RouteGroup *);
- void add_mix_group_to_menu (ARDOUR::RouteGroup *, Gtk::RadioMenuItem::Group*);
- bool select_mix_group (GdkEventButton *);
- void mix_group_changed (void *);
+ void set_route_group (ARDOUR::RouteGroup *);
+ void add_route_group_to_menu (ARDOUR::RouteGroup *, Gtk::RadioMenuItem::Group*);
+ bool select_route_group (GdkEventButton *);
+ void route_group_changed (void *);
IOSelectorWindow *input_selector;
IOSelectorWindow *output_selector;
@@ -257,7 +257,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
boost::shared_ptr<ARDOUR::Delivery> _current_delivery;
void revert_to_default_display ();
- void set_mix_group_to_new ();
+ void set_route_group_to_new ();
static int scrollbar_height;
};
diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc
index 6f9750a32b..1c31f400ff 100644
--- a/gtk2_ardour/mixer_ui.cc
+++ b/gtk2_ardour/mixer_ui.cc
@@ -66,7 +66,7 @@ Mixer_UI::Mixer_UI ()
session = 0;
_strip_width = Config->get_default_narrow_ms() ? Narrow : Wide;
track_menu = 0;
- mix_group_context_menu = 0;
+ route_group_context_menu = 0;
no_track_list_redisplay = false;
in_group_row_change = false;
_visible = false;
@@ -120,14 +120,11 @@ Mixer_UI::Mixer_UI ()
group_model = ListStore::create (group_columns);
group_display.set_model (group_model);
group_display.append_column (_("Group"), group_columns.text);
- group_display.append_column (_("Active"), group_columns.active);
group_display.append_column (_("Show"), group_columns.visible);
group_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
group_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
- group_display.get_column (2)->set_data (X_("colnum"), GUINT_TO_POINTER(2));
group_display.get_column (0)->set_expand(true);
group_display.get_column (1)->set_expand(false);
- group_display.get_column (2)->set_expand(false);
group_display.set_name ("MixerGroupList");
group_display.get_selection()->set_mode (Gtk::SELECTION_SINGLE);
group_display.set_reorderable (true);
@@ -138,7 +135,7 @@ Mixer_UI::Mixer_UI ()
CellRendererText* name_cell = dynamic_cast<CellRendererText*>(group_display.get_column_cell_renderer (0));
name_cell->property_editable() = true;
- name_cell->signal_edited().connect (mem_fun (*this, &Mixer_UI::mix_group_name_edit));
+ name_cell->signal_edited().connect (mem_fun (*this, &Mixer_UI::route_group_name_edit));
/* use checkbox for the active column */
@@ -146,44 +143,38 @@ Mixer_UI::Mixer_UI ()
active_cell->property_activatable() = true;
active_cell->property_radio() = false;
- /* use checkbox for the visible column */
-
- active_cell = dynamic_cast<CellRendererToggle*>(group_display.get_column_cell_renderer (2));
- active_cell->property_activatable() = true;
- active_cell->property_radio() = false;
-
- group_model->signal_row_changed().connect (mem_fun (*this, &Mixer_UI::mix_group_row_change));
+ group_model->signal_row_changed().connect (mem_fun (*this, &Mixer_UI::route_group_row_change));
group_display.signal_button_press_event().connect (mem_fun (*this, &Mixer_UI::group_display_button_press), false);
group_display_scroller.add (group_display);
group_display_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
- HBox* mix_group_display_button_box = manage (new HBox());
+ HBox* route_group_display_button_box = manage (new HBox());
- Button* mix_group_add_button = manage (new Button ());
- Button* mix_group_remove_button = manage (new Button ());
+ Button* route_group_add_button = manage (new Button ());
+ Button* route_group_remove_button = manage (new Button ());
Widget* w;
w = manage (new Image (Stock::ADD, ICON_SIZE_BUTTON));
w->show();
- mix_group_add_button->add (*w);
+ route_group_add_button->add (*w);
w = manage (new Image (Stock::REMOVE, ICON_SIZE_BUTTON));
w->show();
- mix_group_remove_button->add (*w);
+ route_group_remove_button->add (*w);
- mix_group_display_button_box->set_homogeneous (true);
+ route_group_display_button_box->set_homogeneous (true);
- mix_group_add_button->signal_clicked().connect (mem_fun (*this, &Mixer_UI::new_mix_group));
- mix_group_remove_button->signal_clicked().connect (mem_fun (*this, &Mixer_UI::remove_selected_mix_group));
+ route_group_add_button->signal_clicked().connect (mem_fun (*this, &Mixer_UI::new_route_group));
+ route_group_remove_button->signal_clicked().connect (mem_fun (*this, &Mixer_UI::remove_selected_route_group));
- mix_group_display_button_box->add (*mix_group_remove_button);
- mix_group_display_button_box->add (*mix_group_add_button);
+ route_group_display_button_box->add (*route_group_remove_button);
+ route_group_display_button_box->add (*route_group_add_button);
group_display_vbox.pack_start (group_display_scroller, true, true);
- group_display_vbox.pack_start (*mix_group_display_button_box, false, false);
+ group_display_vbox.pack_start (*route_group_display_button_box, false, false);
track_display_frame.set_name("BaseFrame");
track_display_frame.set_shadow_type (Gtk::SHADOW_IN);
@@ -235,9 +226,9 @@ Mixer_UI::Mixer_UI ()
_selection.RoutesChanged.connect (mem_fun(*this, &Mixer_UI::follow_strip_selection));
- mix_group_display_button_box->show();
- mix_group_add_button->show();
- mix_group_remove_button->show();
+ route_group_display_button_box->show();
+ route_group_add_button->show();
+ route_group_remove_button->show();
global_hpacker.show();
global_vpacker.show();
@@ -485,11 +476,11 @@ Mixer_UI::connect_to_session (Session* sess)
session->GoingAway.connect (mem_fun(*this, &Mixer_UI::disconnect_from_session));
session->RouteAdded.connect (mem_fun(*this, &Mixer_UI::add_strip));
- session->mix_group_added.connect (mem_fun(*this, &Mixer_UI::add_mix_group));
- session->mix_group_removed.connect (mem_fun(*this, &Mixer_UI::mix_groups_changed));
+ session->route_group_added.connect (mem_fun(*this, &Mixer_UI::add_route_group));
+ session->route_group_removed.connect (mem_fun(*this, &Mixer_UI::route_groups_changed));
session->config.ParameterChanged.connect (mem_fun (*this, &Mixer_UI::parameter_changed));
- mix_groups_changed ();
+ route_groups_changed ();
_plugin_selector->set_session (session);
@@ -1013,18 +1004,18 @@ Mixer_UI::strip_name_changed (MixerStrip* mx)
void
-Mixer_UI::build_mix_group_context_menu ()
+Mixer_UI::build_route_group_context_menu ()
{
using namespace Gtk::Menu_Helpers;
- mix_group_context_menu = new Menu;
- mix_group_context_menu->set_name ("ArdourContextMenu");
- MenuList& items = mix_group_context_menu->items();
+ route_group_context_menu = new Menu;
+ route_group_context_menu->set_name ("ArdourContextMenu");
+ MenuList& items = route_group_context_menu->items();
- items.push_back (MenuElem (_("Activate All"), mem_fun(*this, &Mixer_UI::activate_all_mix_groups)));
- items.push_back (MenuElem (_("Disable All"), mem_fun(*this, &Mixer_UI::disable_all_mix_groups)));
+ items.push_back (MenuElem (_("Activate All"), mem_fun(*this, &Mixer_UI::activate_all_route_groups)));
+ items.push_back (MenuElem (_("Disable All"), mem_fun(*this, &Mixer_UI::disable_all_route_groups)));
items.push_back (SeparatorElem());
- items.push_back (MenuElem (_("Add group"), mem_fun(*this, &Mixer_UI::new_mix_group)));
+ items.push_back (MenuElem (_("Add group"), mem_fun(*this, &Mixer_UI::new_route_group)));
}
@@ -1032,10 +1023,10 @@ bool
Mixer_UI::group_display_button_press (GdkEventButton* ev)
{
if (Keyboard::is_context_menu_event (ev)) {
- if (mix_group_context_menu == 0) {
- build_mix_group_context_menu ();
+ if (route_group_context_menu == 0) {
+ build_route_group_context_menu ();
}
- mix_group_context_menu->popup (1, ev->time);
+ route_group_context_menu->popup (1, ev->time);
return true;
}
@@ -1056,7 +1047,7 @@ Mixer_UI::group_display_button_press (GdkEventButton* ev)
if (Keyboard::is_edit_event (ev)) {
if ((iter = group_model->get_iter (path))) {
if ((group = (*iter)[group_columns.group]) != 0) {
- // edit_mix_group (group);
+ // edit_route_group (group);
#ifdef GTKOSX
group_display.queue_draw();
#endif
@@ -1069,17 +1060,6 @@ Mixer_UI::group_display_button_press (GdkEventButton* ev)
case 1:
if ((iter = group_model->get_iter (path))) {
- bool active = (*iter)[group_columns.active];
- (*iter)[group_columns.active] = !active;
-#ifdef GTKOSX
- group_display.queue_draw();
-#endif
- return true;
- }
- break;
-
- case 2:
- if ((iter = group_model->get_iter (path))) {
bool visible = (*iter)[group_columns.visible];
(*iter)[group_columns.visible] = !visible;
#ifdef GTKOSX
@@ -1097,27 +1077,21 @@ Mixer_UI::group_display_button_press (GdkEventButton* ev)
}
void
-Mixer_UI::activate_all_mix_groups ()
+Mixer_UI::activate_all_route_groups ()
{
- Gtk::TreeModel::Children children = group_model->children();
- for(Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) {
- (*iter)[group_columns.active] = true;
- }
+ session->foreach_route_group (bind (mem_fun (*this, &Mixer_UI::set_route_group_activation), true));
}
void
-Mixer_UI::disable_all_mix_groups ()
+Mixer_UI::disable_all_route_groups ()
{
- Gtk::TreeModel::Children children = group_model->children();
- for(Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) {
- (*iter)[group_columns.active] = false;
- }
+ session->foreach_route_group (bind (mem_fun (*this, &Mixer_UI::set_route_group_activation), false));
}
void
-Mixer_UI::mix_groups_changed ()
+Mixer_UI::route_groups_changed ()
{
- ENSURE_GUI_THREAD (mem_fun (*this, &Mixer_UI::mix_groups_changed));
+ ENSURE_GUI_THREAD (mem_fun (*this, &Mixer_UI::route_groups_changed));
/* just rebuild the while thing */
@@ -1126,23 +1100,22 @@ Mixer_UI::mix_groups_changed ()
{
TreeModel::Row row;
row = *(group_model->append());
- row[group_columns.active] = false;
row[group_columns.visible] = true;
row[group_columns.text] = (_("-all-"));
row[group_columns.group] = 0;
}
- session->foreach_mix_group (mem_fun (*this, &Mixer_UI::add_mix_group));
+ session->foreach_route_group (mem_fun (*this, &Mixer_UI::add_route_group));
}
void
-Mixer_UI::new_mix_group ()
+Mixer_UI::new_route_group ()
{
- session->add_mix_group (new RouteGroup (*session, ""));
+ session->add_route_group (new RouteGroup (*session, ""));
}
void
-Mixer_UI::remove_selected_mix_group ()
+Mixer_UI::remove_selected_route_group ()
{
Glib::RefPtr<TreeSelection> selection = group_display.get_selection();
TreeView::Selection::ListHandle_Path rows = selection->get_selected_rows ();
@@ -1161,7 +1134,7 @@ Mixer_UI::remove_selected_mix_group ()
RouteGroup* rg = (*iter)[group_columns.group];
if (rg) {
- session->remove_mix_group (*rg);
+ session->remove_route_group (*rg);
}
}
}
@@ -1180,8 +1153,8 @@ Mixer_UI::group_flags_changed (void* src, RouteGroup* group)
*/
for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
- if ((*i)->mix_group() == group) {
- (*i)->mix_group_changed(0);
+ if ((*i)->route_group() == group) {
+ (*i)->route_group_changed(0);
}
}
@@ -1194,7 +1167,6 @@ Mixer_UI::group_flags_changed (void* src, RouteGroup* group)
for (i = rows.begin(); i != rows.end(); ++i) {
if ((*i)[group_columns.group] == group) {
(*i)[group_columns.visible] = !group->is_hidden ();
- (*i)[group_columns.active] = group->is_active ();
(*i)[group_columns.text] = group->name ();
break;
}
@@ -1206,7 +1178,7 @@ Mixer_UI::group_flags_changed (void* src, RouteGroup* group)
}
void
-Mixer_UI::mix_group_name_edit (const Glib::ustring& path, const Glib::ustring& new_text)
+Mixer_UI::route_group_name_edit (const Glib::ustring& path, const Glib::ustring& new_text)
{
RouteGroup* group;
TreeIter iter;
@@ -1224,7 +1196,7 @@ Mixer_UI::mix_group_name_edit (const Glib::ustring& path, const Glib::ustring& n
}
void
-Mixer_UI::mix_group_row_change (const Gtk::TreeModel::Path& path,const Gtk::TreeModel::iterator& iter)
+Mixer_UI::route_group_row_change (const Gtk::TreeModel::Path& path,const Gtk::TreeModel::iterator& iter)
{
RouteGroup* group;
@@ -1238,21 +1210,18 @@ Mixer_UI::mix_group_row_change (const Gtk::TreeModel::Path& path,const Gtk::Tree
if ((*iter)[group_columns.visible]) {
for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
- if ((*i)->mix_group() == group) {
+ if ((*i)->route_group() == group) {
show_strip (*i);
}
}
} else {
for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
- if ((*i)->mix_group() == group) {
+ if ((*i)->route_group() == group) {
hide_strip (*i);
}
}
}
- bool active = (*iter)[group_columns.active];
- group->set_active (active, this);
-
Glib::ustring name = (*iter)[group_columns.text];
if (name != group->name()) {
@@ -1262,15 +1231,14 @@ Mixer_UI::mix_group_row_change (const Gtk::TreeModel::Path& path,const Gtk::Tree
}
void
-Mixer_UI::add_mix_group (RouteGroup* group)
+Mixer_UI::add_route_group (RouteGroup* group)
{
- ENSURE_GUI_THREAD(bind (mem_fun(*this, &Mixer_UI::add_mix_group), group));
+ ENSURE_GUI_THREAD(bind (mem_fun(*this, &Mixer_UI::add_route_group), group));
bool focus = false;
in_group_row_change = true;
TreeModel::Row row = *(group_model->append());
- row[group_columns.active] = group->is_active();
row[group_columns.visible] = true;
row[group_columns.group] = group;
if (!group->name().empty()) {
@@ -1519,3 +1487,9 @@ Mixer_UI::parameter_changed (string const & p)
}
}
+void
+Mixer_UI::set_route_group_activation (RouteGroup* g, bool a)
+{
+ g->set_active (a, this);
+}
+
diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h
index 014d69ee06..673a619594 100644
--- a/gtk2_ardour/mixer_ui.h
+++ b/gtk2_ardour/mixer_ui.h
@@ -175,21 +175,21 @@ class Mixer_UI : public Gtk::Window
void show_all_audiotracks();
void hide_all_audiotracks ();
- Gtk::Menu* mix_group_context_menu;
+ Gtk::Menu* route_group_context_menu;
bool in_group_row_change;
void group_selected (gint row, gint col, GdkEvent *ev);
void group_unselected (gint row, gint col, GdkEvent *ev);
void group_display_active_clicked();
- void new_mix_group ();
- void remove_selected_mix_group ();
- void build_mix_group_context_menu ();
- void activate_all_mix_groups ();
- void disable_all_mix_groups ();
- void add_mix_group (ARDOUR::RouteGroup *);
- void mix_groups_changed ();
- void mix_group_name_edit (const Glib::ustring&, const Glib::ustring&);
- void mix_group_row_change (const Gtk::TreeModel::Path& path,const Gtk::TreeModel::iterator& iter);
+ void new_route_group ();
+ void remove_selected_route_group ();
+ void build_route_group_context_menu ();
+ void activate_all_route_groups ();
+ void disable_all_route_groups ();
+ void add_route_group (ARDOUR::RouteGroup *);
+ void route_groups_changed ();
+ void route_group_name_edit (const Glib::ustring&, const Glib::ustring&);
+ void route_group_row_change (const Gtk::TreeModel::Path& path,const Gtk::TreeModel::iterator& iter);
Gtk::Menu *track_menu;
void track_column_click (gint);
@@ -218,12 +218,10 @@ class Mixer_UI : public Gtk::Window
struct GroupDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
GroupDisplayModelColumns() {
- add (active);
add (visible);
add (text);
add (group);
}
- Gtk::TreeModelColumn<bool> active;
Gtk::TreeModelColumn<bool> visible;
Gtk::TreeModelColumn<Glib::ustring> text;
Gtk::TreeModelColumn<ARDOUR::RouteGroup*> group;
@@ -253,6 +251,7 @@ class Mixer_UI : public Gtk::Window
bool ignore_sync;
void parameter_changed (std::string const &);
+ void set_route_group_activation (ARDOUR::RouteGroup *, bool);
static const int32_t default_width = 478;
static const int32_t default_height = 765;
diff --git a/gtk2_ardour/route_group_dialog.cc b/gtk2_ardour/route_group_dialog.cc
index 0e1b549f97..3cd2a3508c 100644
--- a/gtk2_ardour/route_group_dialog.cc
+++ b/gtk2_ardour/route_group_dialog.cc
@@ -6,13 +6,26 @@
using namespace Gtk;
using namespace ARDOUR;
-RouteGroupDialog::RouteGroupDialog (RouteGroup* g)
+RouteGroupDialog::RouteGroupDialog (RouteGroup* g, StockID const & s)
: Dialog (_("Route group")),
_group (g),
- _active (_("Active"))
+ _active (_("Active")),
+ _gain (_("Gain")),
+ _mute (_("Muting")),
+ _solo (_("Soloing")),
+ _rec_enable (_("Record enable")),
+ _select (_("Selection")),
+ _edit (_("Editing"))
{
_name.set_text (_group->name ());
_active.set_active (_group->is_active ());
+
+ _gain.set_active (_group->property (RouteGroup::Gain));
+ _mute.set_active (_group->property (RouteGroup::Mute));
+ _solo.set_active (_group->property (RouteGroup::Solo));
+ _rec_enable.set_active (_group->property (RouteGroup::RecEnable));
+ _select.set_active (_group->property (RouteGroup::Select));
+ _edit.set_active (_group->property (RouteGroup::Edit));
HBox* h = manage (new HBox);
h->pack_start (*manage (new Label (_("Name:"))));
@@ -20,10 +33,17 @@ RouteGroupDialog::RouteGroupDialog (RouteGroup* g)
get_vbox()->pack_start (*h);
get_vbox()->pack_start (_active);
+ get_vbox()->pack_start (_gain);
+ get_vbox()->pack_start (_mute);
+ get_vbox()->pack_start (_solo);
+ get_vbox()->pack_start (_rec_enable);
+ get_vbox()->pack_start (_select);
+ get_vbox()->pack_start (_edit);
+
+ get_vbox()->set_border_width (8);
add_button (Stock::CANCEL, RESPONSE_CANCEL);
- /* XXX: change this depending on context */
- add_button (Stock::OK, RESPONSE_OK);
+ add_button (s, RESPONSE_OK);
show_all ();
}
@@ -36,6 +56,13 @@ RouteGroupDialog::do_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 ());
}
return r;
diff --git a/gtk2_ardour/route_group_dialog.h b/gtk2_ardour/route_group_dialog.h
index 279d4b90ae..4deb5b56a2 100644
--- a/gtk2_ardour/route_group_dialog.h
+++ b/gtk2_ardour/route_group_dialog.h
@@ -8,7 +8,7 @@
class RouteGroupDialog : public Gtk::Dialog
{
public:
- RouteGroupDialog (ARDOUR::RouteGroup *);
+ RouteGroupDialog (ARDOUR::RouteGroup *, Gtk::StockID const &);
int do_run ();
@@ -16,6 +16,12 @@ private:
ARDOUR::RouteGroup* _group;
Gtk::Entry _name;
Gtk::CheckButton _active;
+ Gtk::CheckButton _gain;
+ Gtk::CheckButton _mute;
+ Gtk::CheckButton _solo;
+ Gtk::CheckButton _rec_enable;
+ Gtk::CheckButton _select;
+ Gtk::CheckButton _edit;
};
diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc
index 3a75ea5b19..c2935ee62e 100644
--- a/gtk2_ardour/route_time_axis.cc
+++ b/gtk2_ardour/route_time_axis.cc
@@ -105,7 +105,7 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
TimeAxisView(sess,ed,(TimeAxisView*) 0, canvas),
parent_canvas (canvas),
button_table (3, 3),
- edit_group_button (_("g")), // group
+ route_group_button (_("g")), // group
playlist_button (_("p")),
size_button (_("h")), // height
automation_button (_("a")),
@@ -134,14 +134,14 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
ignore_toggle = false;
- edit_group_button.set_name ("TrackGroupButton");
+ route_group_button.set_name ("TrackGroupButton");
playlist_button.set_name ("TrackPlaylistButton");
automation_button.set_name ("TrackAutomationButton");
size_button.set_name ("TrackSizeButton");
visual_button.set_name ("TrackVisualButton");
hide_button.set_name ("TrackRemoveButton");
- edit_group_button.unset_flags (Gtk::CAN_FOCUS);
+ route_group_button.unset_flags (Gtk::CAN_FOCUS);
playlist_button.unset_flags (Gtk::CAN_FOCUS);
automation_button.unset_flags (Gtk::CAN_FOCUS);
size_button.unset_flags (Gtk::CAN_FOCUS);
@@ -151,7 +151,7 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
hide_button.add (*(manage (new Image (::get_icon("hide")))));
hide_button.show_all ();
- edit_group_button.signal_button_release_event().connect (mem_fun(*this, &RouteTimeAxisView::edit_click), false);
+ route_group_button.signal_button_release_event().connect (mem_fun(*this, &RouteTimeAxisView::edit_click), false);
playlist_button.signal_clicked().connect (mem_fun(*this, &RouteTimeAxisView::playlist_click));
automation_button.signal_clicked().connect (mem_fun(*this, &RouteTimeAxisView::automation_click));
size_button.signal_button_release_event().connect (mem_fun(*this, &RouteTimeAxisView::size_click), false);
@@ -195,12 +195,12 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
controls_table.attach (*mute_button, 6, 7, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
controls_table.attach (*solo_button, 7, 8, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
- controls_table.attach (edit_group_button, 7, 8, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
+ controls_table.attach (route_group_button, 7, 8, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
controls_table.attach (gm.get_gain_slider(), 0, 5, 1, 2, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
ARDOUR_UI::instance()->tooltips().set_tip(*solo_button,_("Solo"));
ARDOUR_UI::instance()->tooltips().set_tip(*mute_button,_("Mute"));
- ARDOUR_UI::instance()->tooltips().set_tip(edit_group_button,_("Edit Group"));
+ ARDOUR_UI::instance()->tooltips().set_tip(route_group_button, _("Route Group"));
ARDOUR_UI::instance()->tooltips().set_tip(size_button,_("Display Height"));
ARDOUR_UI::instance()->tooltips().set_tip(playlist_button,_("Playlist"));
ARDOUR_UI::instance()->tooltips().set_tip(automation_button, _("Automation"));
@@ -311,51 +311,51 @@ gint
RouteTimeAxisView::edit_click (GdkEventButton *ev)
{
if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
- _route->set_edit_group (0, this);
+ _route->set_route_group (0, this);
return FALSE;
}
using namespace Menu_Helpers;
- MenuList& items = edit_group_menu.items ();
+ MenuList& items = route_group_menu.items ();
RadioMenuItem::Group group;
items.clear ();
- items.push_back (MenuElem (_("New group..."), mem_fun (*this, &RouteTimeAxisView::set_edit_group_to_new)));
+ items.push_back (MenuElem (_("New group..."), mem_fun (*this, &RouteTimeAxisView::set_route_group_to_new)));
items.push_back (SeparatorElem ());
items.push_back (RadioMenuElem (group, _("No group"),
- bind (mem_fun(*this, &RouteTimeAxisView::set_edit_group_from_menu), (RouteGroup *) 0)));
+ bind (mem_fun(*this, &RouteTimeAxisView::set_route_group_from_menu), (RouteGroup *) 0)));
- if (_route->edit_group() == 0) {
+ if (_route->route_group() == 0) {
static_cast<RadioMenuItem*>(&items.back())->set_active ();
}
- _session.foreach_edit_group (bind (mem_fun (*this, &RouteTimeAxisView::add_edit_group_menu_item), &group));
- edit_group_menu.popup (ev->button, ev->time);
+ _session.foreach_route_group (bind (mem_fun (*this, &RouteTimeAxisView::add_route_group_menu_item), &group));
+ route_group_menu.popup (ev->button, ev->time);
return FALSE;
}
void
-RouteTimeAxisView::add_edit_group_menu_item (RouteGroup *eg, RadioMenuItem::Group* group)
+RouteTimeAxisView::add_route_group_menu_item (RouteGroup *eg, RadioMenuItem::Group* group)
{
using namespace Menu_Helpers;
- MenuList &items = edit_group_menu.items();
+ MenuList &items = route_group_menu.items();
- items.push_back (RadioMenuElem (*group, eg->name(), bind (mem_fun(*this, &RouteTimeAxisView::set_edit_group_from_menu), eg)));
- if (_route->edit_group() == eg) {
+ items.push_back (RadioMenuElem (*group, eg->name(), bind (mem_fun(*this, &RouteTimeAxisView::set_route_group_from_menu), eg)));
+ if (_route->route_group() == eg) {
static_cast<RadioMenuItem*>(&items.back())->set_active ();
}
}
void
-RouteTimeAxisView::set_edit_group_from_menu (RouteGroup *eg)
+RouteTimeAxisView::set_route_group_from_menu (RouteGroup *eg)
{
- _route->set_edit_group (eg, this);
+ _route->set_route_group (eg, this);
}
void
@@ -733,18 +733,18 @@ RouteTimeAxisView::show_timestretch (nframes_t start, nframes_t end)
}
- /* check that the time selection was made in our route, or our edit group.
- remember that edit_group() == 0 implies the route is *not* in a edit group.
+ /* check that the time selection was made in our route, or our route group.
+ remember that route_group() == 0 implies the route is *not* in a edit group.
*/
- if (!(ts.track == this || (ts.group != 0 && ts.group == _route->edit_group()))) {
+ if (!(ts.track == this || (ts.group != 0 && ts.group == _route->route_group()))) {
/* this doesn't apply to us */
return;
}
/* ignore it if our edit group is not active */
- if ((ts.track != this) && _route->edit_group() && !_route->edit_group()->is_active()) {
+ if ((ts.track != this) && _route->route_group() && !_route->route_group()->is_active()) {
return;
}
#endif
@@ -788,12 +788,12 @@ RouteTimeAxisView::show_selection (TimeSelection& ts)
#if 0
/* ignore it if our edit group is not active or if the selection was started
- in some other track or edit group (remember that edit_group() == 0 means
- that the track is not in an edit group).
+ in some other track or route group (remember that route_group() == 0 means
+ that the track is not in an route group).
*/
- if (((ts.track != this && !is_child (ts.track)) && _route->edit_group() && !_route->edit_group()->is_active()) ||
- (!(ts.track == this || is_child (ts.track) || (ts.group != 0 && ts.group == _route->edit_group())))) {
+ if (((ts.track != this && !is_child (ts.track)) && _route->route_group() && !_route->route_group()->is_active()) ||
+ (!(ts.track == this || is_child (ts.track) || (ts.group != 0 && ts.group == _route->route_group())))) {
hide_selection ();
return;
}
@@ -836,7 +836,7 @@ RouteTimeAxisView::set_height (uint32_t h)
if (rec_enable_button)
rec_enable_button->show();
- edit_group_button.show();
+ route_group_button.show();
hide_button.show();
visual_button.show();
size_button.show();
@@ -862,7 +862,7 @@ RouteTimeAxisView::set_height (uint32_t h)
if (rec_enable_button)
rec_enable_button->show();
- edit_group_button.hide ();
+ route_group_button.hide ();
hide_button.hide ();
visual_button.hide ();
size_button.hide ();
@@ -895,7 +895,7 @@ RouteTimeAxisView::set_height (uint32_t h)
if (rec_enable_button)
rec_enable_button->hide();
- edit_group_button.hide ();
+ route_group_button.hide ();
hide_button.hide ();
visual_button.hide ();
size_button.hide ();
@@ -1018,9 +1018,9 @@ RouteTimeAxisView::rename_current_playlist ()
std::string
RouteTimeAxisView::resolve_new_group_playlist_name(std::string &basename, vector<boost::shared_ptr<Playlist> > const & playlists)
{
- std::string ret(basename);
+ std::string ret (basename);
- std::string group_string = "."+edit_group()->name()+".";
+ std::string const group_string = "." + route_group()->name() + ".";
// iterate through all playlists
int maxnumber = 0;
@@ -1045,7 +1045,7 @@ RouteTimeAxisView::resolve_new_group_playlist_name(std::string &basename, vector
char buf[32];
snprintf (buf, sizeof(buf), "%d", maxnumber);
- ret = this->name()+"."+edit_group()->name()+"."+buf;
+ ret = this->name() + "." + route_group()->name () + "." + buf;
return ret;
}
@@ -1065,7 +1065,7 @@ RouteTimeAxisView::use_copy_playlist (bool prompt, vector<boost::shared_ptr<Play
name = pl->name();
- if (edit_group() && edit_group()->is_active()) {
+ if (route_group() && route_group()->is_active()) {
name = resolve_new_group_playlist_name(name, playlists_before_op);
}
@@ -1117,7 +1117,7 @@ RouteTimeAxisView::use_new_playlist (bool prompt, vector<boost::shared_ptr<Playl
name = pl->name();
- if (edit_group() && edit_group()->is_active()) {
+ if (route_group() && route_group()->is_active()) {
name = resolve_new_group_playlist_name(name,playlists_before_op);
}
@@ -1202,7 +1202,7 @@ RouteTimeAxisView::selection_click (GdkEventButton* ev)
return;
}
- PublicEditor::TrackViewList* tracks = _editor.get_valid_views (this, _route->edit_group());
+ PublicEditor::TrackViewList* tracks = _editor.get_valid_views (this, _route->route_group());
switch (Keyboard::selection_type (ev->state)) {
case Selection::Toggle:
@@ -1320,9 +1320,9 @@ RouteTimeAxisView::automation_track (AutomationType type)
}
RouteGroup*
-RouteTimeAxisView::edit_group() const
+RouteTimeAxisView::route_group () const
{
- return _route->edit_group();
+ return _route->route_group();
}
string
@@ -1552,7 +1552,7 @@ RouteTimeAxisView::build_playlist_menu (Gtk::Menu * menu)
playlist_items.push_back (MenuElem (_("Rename"), mem_fun(*this, &RouteTimeAxisView::rename_current_playlist)));
playlist_items.push_back (SeparatorElem());
- if (!edit_group() || !edit_group()->is_active()) {
+ if (!route_group() || !route_group()->is_active()) {
playlist_items.push_back (MenuElem (_("New"), bind(mem_fun(_editor, &PublicEditor::new_playlists), this)));
playlist_items.push_back (MenuElem (_("New Copy"), bind(mem_fun(_editor, &PublicEditor::copy_playlists), this)));
@@ -1592,9 +1592,9 @@ RouteTimeAxisView::use_playlist (boost::weak_ptr<Playlist> wpl)
get_diskstream()->use_playlist (apl);
- if (edit_group() && edit_group()->is_active()) {
+ if (route_group() && route_group()->is_active()) {
//PBD::stacktrace(cerr, 20);
- std::string group_string = "."+edit_group()->name()+".";
+ std::string group_string = "."+route_group()->name()+".";
std::string take_name = apl->name();
std::string::size_type idx = take_name.find(group_string);
@@ -1604,7 +1604,7 @@ RouteTimeAxisView::use_playlist (boost::weak_ptr<Playlist> wpl)
take_name = take_name.substr(idx + group_string.length()); // find the bit containing the take number / name
- for (list<Route*>::const_iterator i = edit_group()->route_list().begin(); i != edit_group()->route_list().end(); ++i) {
+ for (list<Route*>::const_iterator i = route_group()->route_list().begin(); i != route_group()->route_list().end(); ++i) {
if ( (*i) == this->route().get()) {
continue;
}
@@ -2408,17 +2408,17 @@ RouteTimeAxisView::remove_underlay(StreamView* v)
}
void
-RouteTimeAxisView::set_edit_group_to_new ()
+RouteTimeAxisView::set_route_group_to_new ()
{
RouteGroup* g = new RouteGroup (_session, "", RouteGroup::Active);
g->set_active (true, this);
- RouteGroupDialog d (g);
+ RouteGroupDialog d (g, Gtk::Stock::NEW);
int const r = d.do_run ();
if (r == Gtk::RESPONSE_OK) {
- _session.add_edit_group (g);
- _route->set_edit_group (g, this);
+ _session.add_route_group (g);
+ _route->set_route_group (g, this);
} else {
delete g;
}
diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h
index 7ed3b08efc..18733f1e74 100644
--- a/gtk2_ardour/route_time_axis.h
+++ b/gtk2_ardour/route_time_axis.h
@@ -138,7 +138,7 @@ public:
std::string name() const;
StreamView* view() const { return _view; }
- ARDOUR::RouteGroup* edit_group() const;
+ ARDOUR::RouteGroup* route_group() const;
boost::shared_ptr<ARDOUR::Playlist> playlist() const;
void fast_update ();
@@ -222,9 +222,9 @@ protected:
virtual void label_view ();
- void add_edit_group_menu_item (ARDOUR::RouteGroup *, Gtk::RadioMenuItem::Group*);
- void set_edit_group_from_menu (ARDOUR::RouteGroup *);
- void set_edit_group_to_new ();
+ void add_route_group_menu_item (ARDOUR::RouteGroup *, Gtk::RadioMenuItem::Group*);
+ void set_route_group_from_menu (ARDOUR::RouteGroup *);
+ void set_route_group_to_new ();
void reset_samples_per_unit ();
@@ -271,7 +271,7 @@ protected:
Gtk::HBox other_button_hbox;
Gtk::Table button_table;
Gtk::Button processor_button;
- Gtk::Button edit_group_button;
+ Gtk::Button route_group_button;
Gtk::Button playlist_button;
Gtk::Button size_button;
Gtk::Button automation_button;
@@ -280,7 +280,7 @@ protected:
Gtk::Menu subplugin_menu;
Gtk::Menu* automation_action_menu;
- Gtk::Menu edit_group_menu;
+ Gtk::Menu route_group_menu;
Gtk::RadioMenuItem* align_existing_item;
Gtk::RadioMenuItem* align_capture_item;
Gtk::RadioMenuItem* normal_track_mode_item;
diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc
index 8829967ac8..1ba3449cb8 100644
--- a/gtk2_ardour/route_ui.cc
+++ b/gtk2_ardour/route_ui.cc
@@ -284,7 +284,7 @@ RouteUI::mute_press(GdkEventButton* ev)
*/
if (ev->button == 1) {
- set_mix_group_mute (_route, !_route->muted());
+ set_route_group_mute (_route, !_route->muted());
}
} else {
@@ -417,7 +417,7 @@ RouteUI::solo_press(GdkEventButton* ev)
*/
if (ev->button == 1) {
- set_mix_group_solo (_route, !_route->soloed());
+ set_route_group_solo (_route, !_route->soloed());
}
} else {
@@ -500,7 +500,7 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
NOTE: Primary-button2 is MIDI learn.
*/
- set_mix_group_rec_enable (_route, !_route->record_enabled());
+ set_route_group_rec_enable (_route, !_route->record_enabled());
} else {
reversibly_apply_track_boolean ("rec-enable change", &Track::set_record_enable, !track()->record_enabled(), this);
@@ -892,14 +892,14 @@ RouteUI::toggle_solo_isolated (Gtk::CheckMenuItem* check)
}
void
-RouteUI::set_mix_group_solo(boost::shared_ptr<Route> route, bool yn)
+RouteUI::set_route_group_solo(boost::shared_ptr<Route> route, bool yn)
{
- RouteGroup* mix_group;
+ RouteGroup* route_group;
- if((mix_group = route->mix_group()) != 0){
+ if((route_group = route->route_group()) != 0){
_session.begin_reversible_command (_("mix group solo change"));
Session::GlobalSoloStateCommand *cmd = new Session::GlobalSoloStateCommand(_session, this);
- mix_group->apply(&Route::set_solo, yn, this);
+ route_group->apply(&Route::set_solo, yn, this);
cmd->mark();
_session.add_command (cmd);
_session.commit_reversible_command ();
@@ -931,14 +931,14 @@ RouteUI::reversibly_apply_track_boolean (string name, void (Track::*func)(bool,
}
void
-RouteUI::set_mix_group_mute(boost::shared_ptr<Route> route, bool yn)
+RouteUI::set_route_group_mute(boost::shared_ptr<Route> route, bool yn)
{
- RouteGroup* mix_group;
+ RouteGroup* route_group;
- if((mix_group = route->mix_group()) != 0){
+ if((route_group = route->route_group()) != 0){
_session.begin_reversible_command (_("mix group mute change"));
Session::GlobalMuteStateCommand *cmd = new Session::GlobalMuteStateCommand (_session, this);
- mix_group->apply(&Route::set_mute, yn, this);
+ route_group->apply(&Route::set_mute, yn, this);
cmd->mark();
_session.add_command(cmd);
_session.commit_reversible_command ();
@@ -948,14 +948,14 @@ RouteUI::set_mix_group_mute(boost::shared_ptr<Route> route, bool yn)
}
void
-RouteUI::set_mix_group_rec_enable(boost::shared_ptr<Route> route, bool yn)
+RouteUI::set_route_group_rec_enable(boost::shared_ptr<Route> route, bool yn)
{
- RouteGroup* mix_group;
+ RouteGroup* route_group;
- if((mix_group = route->mix_group()) != 0){
+ if((route_group = route->route_group()) != 0){
_session.begin_reversible_command (_("mix group rec-enable change"));
Session::GlobalRecordEnableStateCommand *cmd = new Session::GlobalRecordEnableStateCommand(_session, this);
- mix_group->apply (&Route::set_record_enable, yn, this);
+ route_group->apply (&Route::set_record_enable, yn, this);
cmd->mark();
_session.add_command(cmd);
_session.commit_reversible_command ();
diff --git a/gtk2_ardour/route_ui.h b/gtk2_ardour/route_ui.h
index f08495a7c6..5107b6ccda 100644
--- a/gtk2_ardour/route_ui.h
+++ b/gtk2_ardour/route_ui.h
@@ -138,9 +138,9 @@ class RouteUI : public virtual AxisView
void build_mute_menu(void);
void init_mute_menu(ARDOUR::MuteMaster::MutePoint, Gtk::CheckMenuItem*);
- void set_mix_group_solo(boost::shared_ptr<ARDOUR::Route>, bool);
- void set_mix_group_mute(boost::shared_ptr<ARDOUR::Route>, bool);
- void set_mix_group_rec_enable(boost::shared_ptr<ARDOUR::Route>, bool);
+ void set_route_group_solo (boost::shared_ptr<ARDOUR::Route>, bool);
+ void set_route_group_mute (boost::shared_ptr<ARDOUR::Route>, bool);
+ void set_route_group_rec_enable (boost::shared_ptr<ARDOUR::Route>, bool);
int set_color_from_route ();
diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc
index 28b5934c22..f1580fc07a 100644
--- a/gtk2_ardour/selection.cc
+++ b/gtk2_ardour/selection.cc
@@ -270,18 +270,14 @@ Selection::add (const list<boost::shared_ptr<Playlist> >& pllist)
void
Selection::add (const list<TimeAxisView*>& track_list)
{
- bool changed = false;
+ list<TimeAxisView*> added = tracks.add (track_list);
- for (list<TimeAxisView*>::const_iterator i = track_list.begin(); i != track_list.end(); ++i) {
- if (find (tracks.begin(), tracks.end(), (*i)) == tracks.end()) {
- void (Selection::*pmf)(TimeAxisView*) = &Selection::remove;
- (*i)->GoingAway.connect (sigc::bind (mem_fun (*this, pmf), (*i)));
- tracks.push_back (*i);
- changed = true;
- }
+ for (list<TimeAxisView*>::const_iterator i = added.begin(); i != added.end(); ++i) {
+ void (Selection::*pmf)(TimeAxisView*) = &Selection::remove;
+ (*i)->GoingAway.connect (sigc::bind (mem_fun (*this, pmf), (*i)));
}
- if (changed) {
+ if (!added.empty()) {
TracksChanged ();
}
}
@@ -590,7 +586,7 @@ Selection::set (TimeAxisView* track, nframes_t start, nframes_t end)
if (track) {
time.track = track;
- time.group = track->edit_group();
+ time.group = track->route_group();
} else {
time.track = 0;
time.group = 0;
diff --git a/gtk2_ardour/time_axis_view.h b/gtk2_ardour/time_axis_view.h
index 9ea6c91b07..486dc6404d 100644
--- a/gtk2_ardour/time_axis_view.h
+++ b/gtk2_ardour/time_axis_view.h
@@ -163,7 +163,7 @@ class TimeAxisView : public virtual AxisView, public PBD::Stateful
*/
virtual void step_height (bool bigger);
- virtual ARDOUR::RouteGroup* edit_group() const { return 0; }
+ virtual ARDOUR::RouteGroup* route_group() const { return 0; }
virtual boost::shared_ptr<ARDOUR::Playlist> playlist() const { return boost::shared_ptr<ARDOUR::Playlist> (); }
virtual void show_feature_lines (const ARDOUR::AnalysisFeatureList&);
diff --git a/gtk2_ardour/track_selection.cc b/gtk2_ardour/track_selection.cc
new file mode 100755
index 0000000000..3e428b1a94
--- /dev/null
+++ b/gtk2_ardour/track_selection.cc
@@ -0,0 +1,19 @@
+#include <algorithm>
+#include "track_selection.h"
+
+using namespace std;
+
+list<TimeAxisView*>
+TrackSelection::add (list<TimeAxisView*> const & t)
+{
+ list<TimeAxisView*> added;
+
+ for (TrackSelection::const_iterator i = t.begin(); i != t.end(); ++i) {
+ if (find (begin(), end(), *i) == end()) {
+ added.push_back (*i);
+ push_back (*i);
+ }
+ }
+
+ return added;
+}
diff --git a/gtk2_ardour/track_selection.h b/gtk2_ardour/track_selection.h
index 57b8469afb..2ca7febcf6 100644
--- a/gtk2_ardour/track_selection.h
+++ b/gtk2_ardour/track_selection.h
@@ -24,6 +24,10 @@
class TimeAxisView;
-struct TrackSelection : public std::list<TimeAxisView*> {};
+class TrackSelection : public std::list<TimeAxisView*>
+{
+public:
+ std::list<TimeAxisView*> add (std::list<TimeAxisView*> const &);
+};
#endif /* __ardour_gtk_track_selection_h__ */
diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript
index 31b79138f1..9c27e92f6c 100644
--- a/gtk2_ardour/wscript
+++ b/gtk2_ardour/wscript
@@ -142,6 +142,7 @@ def build(bld):
generic_pluginui.cc
ghostregion.cc
global_port_matrix.cc
+ group_tabs.cc
gtk-custom-hruler.c
gtk-custom-ruler.c
io_selector.cc
@@ -215,6 +216,7 @@ def build(bld):
time_axis_view_item.cc
time_fx_dialog.cc
time_selection.cc
+ track_selection.cc
ui_config.cc
utils.cc
version.cc