rationalize track selection and range selection

git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6919 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Ben Loftis 2010-04-16 22:07:43 +00:00
parent c9188f7f76
commit 05550ae584
6 changed files with 108 additions and 20 deletions

View File

@ -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 */

View File

@ -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;

View File

@ -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));
}

View File

@ -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:

View File

@ -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 (!selection->selected (clicked_trackview)) {
selection->add (clicked_trackview);
}
} else if (force) {
if (force) {
selection->set (clicked_trackview);
return;
}
AudioTimeAxisView* atv = dynamic_cast<AudioTimeAxisView*>(clicked_trackview);
if (!atv) {
return;
}
RouteGroup* group = atv->route()->edit_group();
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);
}
}
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) {

View File

@ -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: