diff options
author | Ben Loftis <ben@glw.com> | 2010-04-16 22:07:43 +0000 |
---|---|---|
committer | Ben Loftis <ben@glw.com> | 2010-04-16 22:07:43 +0000 |
commit | 05550ae584db4e309e08628970a38d623329233d (patch) | |
tree | b1f987dbb87b8aac511684a1b4ea38ba7e69d74d | |
parent | c9188f7f76788b73cea7673dcfbbb66728f90e0b (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.cc | 4 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 4 | ||||
-rw-r--r-- | gtk2_ardour/editor_edit_groups.cc | 12 | ||||
-rw-r--r-- | gtk2_ardour/editor_mouse.cc | 14 | ||||
-rw-r--r-- | gtk2_ardour/editor_selection.cc | 86 | ||||
-rw-r--r-- | gtk2_ardour/route_time_axis.cc | 6 |
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: |