summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Loftis <ben@glw.com>2010-04-16 22:07:43 +0000
committerBen Loftis <ben@glw.com>2010-04-16 22:07:43 +0000
commit05550ae584db4e309e08628970a38d623329233d (patch)
treeb1f987dbb87b8aac511684a1b4ea38ba7e69d74d
parentc9188f7f76788b73cea7673dcfbbb66728f90e0b (diff)
rationalize track selection and range selection
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6919 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/editor.cc4
-rw-r--r--gtk2_ardour/editor.h4
-rw-r--r--gtk2_ardour/editor_edit_groups.cc12
-rw-r--r--gtk2_ardour/editor_mouse.cc14
-rw-r--r--gtk2_ardour/editor_selection.cc86
-rw-r--r--gtk2_ardour/route_time_axis.cc6
6 files changed, 107 insertions, 19 deletions
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index a0cc3e4090..d6dcfc949b 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -272,6 +272,8 @@ Editor::Editor ()
selection = new Selection;
cut_buffer = new Selection;
+ all_group_is_active = false;
+
selection->TimeChanged.connect (mem_fun(*this, &Editor::time_selection_changed));
selection->TracksChanged.connect (mem_fun(*this, &Editor::track_selection_changed));
selection->RegionsChanged.connect (mem_fun(*this, &Editor::region_selection_changed));
@@ -3717,7 +3719,7 @@ Editor::get_valid_views (TimeAxisView* track, RouteGroup* group)
v = new TrackViewList;
- if (track == 0 && group == 0) {
+ if (all_group_is_active || (track == 0 && group == 0) ) {
/* all views */
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index eaa52398d2..95f2c2eb05 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -549,7 +549,7 @@ class Editor : public PublicEditor
bool set_selected_control_point_from_click (Selection::Operation op = Selection::Set, bool no_remove=false);
void set_selected_track_from_click (bool press, Selection::Operation op = Selection::Set, bool no_remove=false);
- void set_selected_track_as_side_effect (bool force = false);
+ void set_selected_track_as_side_effect (Selection::Operation op, bool force = false);
bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set, bool no_track_remove=false);
void set_selected_regionview_from_region_list (boost::shared_ptr<ARDOUR::Region> region, Selection::Operation op = Selection::Set);
@@ -1807,6 +1807,8 @@ public:
Gtk::TreeModelColumn<ARDOUR::RouteGroup*> routegroup;
};
+ bool all_group_is_active;
+
GroupListModelColumns group_columns;
Glib::RefPtr<Gtk::ListStore> group_model;
Glib::RefPtr<Gtk::TreeSelection> group_selection;
diff --git a/gtk2_ardour/editor_edit_groups.cc b/gtk2_ardour/editor_edit_groups.cc
index 3383e6bfe9..2bd31e55f6 100644
--- a/gtk2_ardour/editor_edit_groups.cc
+++ b/gtk2_ardour/editor_edit_groups.cc
@@ -210,6 +210,9 @@ Editor::edit_group_row_change (const Gtk::TreeModel::Path& path,const Gtk::TreeM
}
if ((group = (*iter)[group_columns.routegroup]) == 0) {
+ string name = (*iter)[group_columns.text];
+ if (name == "-all-")
+ all_group_is_active = (*iter)[group_columns.is_active];
return;
}
@@ -281,6 +284,15 @@ Editor::edit_groups_changed ()
group_model->clear ();
+ {
+ 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));
}
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc
index a1a2296cb4..a2ba0476a0 100644
--- a/gtk2_ardour/editor_mouse.cc
+++ b/gtk2_ardour/editor_mouse.cc
@@ -437,7 +437,7 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it
if (mouse_mode != MouseRange) {
set_selected_regionview_from_click (press, op, true);
} else if (event->type == GDK_BUTTON_PRESS) {
- set_selected_track_as_side_effect ();
+ set_selected_track_as_side_effect (op);
}
break;
@@ -446,7 +446,7 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it
if (mouse_mode != MouseRange) {
set_selected_regionview_from_click (press, op, true);
} else if (event->type == GDK_BUTTON_PRESS) {
- set_selected_track_as_side_effect ();
+ set_selected_track_as_side_effect (op);
}
break;
@@ -457,14 +457,14 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it
if (mouse_mode != MouseRange) {
set_selected_regionview_from_click (press, op, true);
} else if (event->type == GDK_BUTTON_PRESS) {
- set_selected_track_as_side_effect ();
+ set_selected_track_as_side_effect (op);
}
break;
case GainAutomationControlPointItem:
case PanAutomationControlPointItem:
case RedirectAutomationControlPointItem:
- set_selected_track_as_side_effect ();
+ set_selected_track_as_side_effect (op);
if (mouse_mode != MouseRange) {
set_selected_control_point_from_click (op, false);
}
@@ -473,14 +473,14 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it
case StreamItem:
/* for context click or range selection, select track */
if (event->button.button == 3) {
- set_selected_track_as_side_effect ();
+ set_selected_track_as_side_effect (op);
} else if (event->type == GDK_BUTTON_PRESS && mouse_mode == MouseRange) {
- set_selected_track_as_side_effect ();
+ set_selected_track_as_side_effect (op);
}
break;
case AutomationTrackItem:
- set_selected_track_as_side_effect (true);
+ set_selected_track_as_side_effect (op, true);
break;
default:
diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc
index b82d296429..baaca99850 100644
--- a/gtk2_ardour/editor_selection.cc
+++ b/gtk2_ardour/editor_selection.cc
@@ -170,20 +170,81 @@ Editor::select_all_tracks ()
}
void
-Editor::set_selected_track_as_side_effect (bool force)
+Editor::set_selected_track_as_side_effect (Selection::Operation op, bool force)
{
if (!clicked_trackview) {
return;
}
- if (!selection->tracks.empty()) {
+ if (force) {
+ selection->set (clicked_trackview);
+ return;
+ }
+
+ AudioTimeAxisView* atv = dynamic_cast<AudioTimeAxisView*>(clicked_trackview);
+ if (!atv) {
+ return;
+ }
+ RouteGroup* group = atv->route()->edit_group();
- if (!selection->selected (clicked_trackview)) {
- selection->add (clicked_trackview);
+ switch (op) {
+ case Selection::Toggle: {
+ if (selection->selected (clicked_trackview)) {
+ if (all_group_is_active) {
+ for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) {
+ selection->remove(*i);
+ }
+ } else if (group && group->is_active()) {
+ for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) {
+ if ( (*i)->edit_group() == group)
+ selection->remove(*i);
+ }
+ } else
+ selection->remove (clicked_trackview);
+ } else {
+ if (all_group_is_active) {
+ for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) {
+ selection->add(*i);
+ }
+ } else if (group && group->is_active())
+ for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) {
+ if ( (*i)->edit_group() == group)
+ selection->add(*i);
+ }
+ else
+ selection->add (clicked_trackview);
}
-
- } else if (force) {
- selection->set (clicked_trackview);
+ }
+ break;
+
+ case Selection::Add: {
+ selection->clear();
+ cerr << ("Editor::set_selected_track_as_side_effect case Selection::Add not yet implemented\n");
+ }
+ break;
+
+ case Selection::Set:{
+ selection->clear();
+ if (all_group_is_active) {
+ for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) {
+ selection->add(*i);
+ }
+ } else if (group && group->is_active())
+ for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) {
+ if ( (*i)->edit_group() == group)
+ selection->add(*i);
+ }
+ else
+ selection->set (clicked_trackview);
+ }
+ break;
+
+ case Selection::Extend: {
+ selection->clear();
+ cerr << ("Editor::set_selected_track_as_side_effect case Selection::Add not yet implemented\n");
+ }
+ break;
+
}
}
@@ -276,7 +337,14 @@ Editor::get_relevant_audio_tracks (set<AudioTimeAxisView*>& relevant_tracks)
RouteGroup* group = atv->route()->edit_group();
- if (group && group->is_active()) {
+ if ( all_group_is_active ) {
+ for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+ AudioTimeAxisView* tatv;
+ if ((tatv = dynamic_cast<AudioTimeAxisView*> (*i)) != 0) {
+ relevant_tracks.insert (tatv);
+ }
+ }
+ } else if (group && group->is_active()) {
/* active group for this track, loop over all tracks and get every member of the group */
@@ -322,7 +390,7 @@ Editor::mapover_audio_tracks (slot<void,AudioTimeAxisView&,uint32_t> sl, TimeAxi
tracks.insert (audio_basis);
RouteGroup* group = audio_basis->route()->edit_group();
- if (group && group->is_active()) {
+ if ( all_group_is_active || (group && group->is_active()) ) {
/* the basis is a member of an active edit group; find other members */
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc
index 3127f71203..880517cafd 100644
--- a/gtk2_ardour/route_time_axis.cc
+++ b/gtk2_ardour/route_time_axis.cc
@@ -1091,7 +1091,11 @@ RouteTimeAxisView::selection_click (GdkEventButton* ev)
break;
case Selection::Set:
- editor.get_selection().set (*tracks);
+ if (find (editor.get_selection().tracks.begin(), editor.get_selection().tracks.end(), this) != editor.get_selection().tracks.end()) {
+ editor.get_selection().remove (*tracks);
+ } else {
+ editor.get_selection().set (*tracks);
+ }
break;
case Selection::Extend: