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:
parent
c9188f7f76
commit
05550ae584
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue