return;
}
- if (!clicked_routeview) {
- return;
+ RouteGroup* group = NULL;
+ if (clicked_routeview) {
+ group = clicked_routeview->route()->route_group();
}
bool had_tracks = !selection->tracks.empty();
- RouteGroup* group = clicked_routeview->route()->route_group();
RouteGroup& arg (_session->all_route_group());
switch (op) {
}
} else if (group && group->is_active()) {
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) {
- if ((*i)->route_group() == group)
+ if ((*i)->route_group() == group) {
selection->remove(*i);
+ }
}
} else {
selection->remove (clicked_axisview);
}
} else if (group && group->is_active()) {
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) {
- if ( (*i)->route_group() == group)
+ if ((*i)->route_group() == group) {
selection->add(*i);
+ }
}
} else {
selection->add (clicked_axisview);
}
} else if (group && group->is_active()) {
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) {
- if ((*i)->route_group() == group)
+ if ((*i)->route_group() == group) {
selection->add(*i);
+ }
}
} else {
selection->add (clicked_axisview);
}
} else if (group && group->is_active()) {
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) {
- if ((*i)->route_group() == group)
+ if ((*i)->route_group() == group) {
selection->add(*i);
+ }
}
} else {
selection->set (clicked_axisview);
void
Editor::set_selected_track (TimeAxisView& view, Selection::Operation op, bool no_remove)
{
+ begin_reversible_selection_op(_("Set Selected Track"));
+
switch (op) {
case Selection::Toggle:
if (selection->selected (&view)) {
extend_selection_to_track (view);
break;
}
+
+ commit_reversible_selection_op ();
}
void
selection->set (all_equivalent_regions);
commit = true;
} else {
- /* no commit necessary: clicked on an already selected region */
- goto out;
+ /* clicked on an already selected region */
+ if (press)
+ goto out;
+ else {
+ get_equivalent_regions(clicked_regionview, all_equivalent_regions, ARDOUR::Properties::select.property_id);
+ selection->set(all_equivalent_regions);
+ commit = true;
+ }
}
break;
return;
}
- begin_reversible_command (_("set selected regions"));
+ begin_reversible_selection_op (_("set selected regions"));
switch (op) {
case Selection::Toggle:
break;
}
- commit_reversible_command () ;
+ commit_reversible_selection_op () ;
}
bool
return true;
}
- begin_reversible_command (_("set selected regions"));
+ begin_reversible_selection_op (_("set selected regions"));
selection->set (rv);
- commit_reversible_command () ;
+ commit_reversible_selection_op () ;
return true;
}
return;
}
+ /* XXX this is superficially inefficient. Hide the selection in all
+ * tracks, then show it in all selected tracks.
+ *
+ * However, if you investigate what this actually does, it isn't
+ * anywhere nearly as bad as it may appear. Remember: nothing is
+ * redrawn or even recomputed during these two loops - that only
+ * happens when we next render ...
+ */
+
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
(*i)->hide_selection ();
}
} else {
ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, true);
}
-
- if (_session && Config->get_always_play_range() && !_session->transport_rolling() && !selection->time.empty()) {
- _session->request_locate (selection->time.start());
- }
}
/** Set all region actions to have a given sensitivity */
editor_menu_actions->get_action("RegionMenuMIDI")->set_sensitive (false);
_region_actions->get_action("show-region-list-editor")->set_sensitive (false);
_region_actions->get_action("quantize-region")->set_sensitive (false);
+ _region_actions->get_action("legatize-region")->set_sensitive (false);
+ _region_actions->get_action("remove-overlap")->set_sensitive (false);
_region_actions->get_action("fork-region")->set_sensitive (false);
_region_actions->get_action("insert-patch-change-context")->set_sensitive (false);
_region_actions->get_action("insert-patch-change")->set_sensitive (false);
return;
}
+ begin_reversible_selection_op(_("Select All in Track"));
+
clicked_routeview->get_selectables (0, max_framepos, 0, DBL_MAX, touched);
switch (op) {
selection->add (touched);
break;
}
+
+ commit_reversible_selection_op ();
}
-void
+bool
Editor::select_all_internal_edit (Selection::Operation)
{
+ bool selected = false;
+
for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*i);
if (mrv) {
mrv->select_all_notes ();
+ selected = true;
}
}
+
+ MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(entered_regionview);
+ if (mrv) {
+ mrv->select_all_notes ();
+ selected = true;
+ }
+
+ return selected;
}
void
-Editor::select_all (Selection::Operation op)
+Editor::select_all_objects (Selection::Operation op)
{
list<Selectable *> touched;
- TrackViewList ts;
-
- if (selection->tracks.empty()) {
- if (entered_track) {
- ts.push_back (entered_track);
- } else {
- ts = track_views;
- }
- } else {
- ts = selection->tracks;
- }
-
- if (_internal_editing) {
-
- bool midi_selected = false;
+ TrackViewList ts = track_views;
- for (TrackViewList::iterator iter = ts.begin(); iter != ts.end(); ++iter) {
- if ((*iter)->hidden()) {
- continue;
- }
-
- RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*iter);
-
- if (rtav && rtav->is_midi_track()) {
- midi_selected = true;
- break;
- }
- }
-
- if (midi_selected) {
- select_all_internal_edit (op);
- return;
- }
+ if (internal_editing() && select_all_internal_edit(op)) {
+ return; // Selected notes
}
for (TrackViewList::iterator iter = ts.begin(); iter != ts.end(); ++iter) {
continue;
}
(*iter)->get_selectables (0, max_framepos, 0, DBL_MAX, touched);
+ selection->add (*iter);
}
- begin_reversible_command (_("select all"));
+
+ begin_reversible_selection_op (_("select all"));
switch (op) {
case Selection::Add:
selection->add (touched);
/* meaningless, because we're selecting everything */
break;
}
- commit_reversible_command ();
+ commit_reversible_selection_op ();
}
void
return;
}
+ begin_reversible_selection_op(_("Invert Selection in Track"));
clicked_routeview->get_inverted_selectables (*selection, touched);
selection->set (touched);
+ commit_reversible_selection_op ();
}
void
{
list<Selectable *> touched;
- if (_internal_editing) {
+ if (internal_editing()) {
for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*i);
if (mrv) {
(*iter)->get_inverted_selectables (*selection, touched);
}
+ begin_reversible_selection_op(_("Invert Selection"));
selection->set (touched);
+ commit_reversible_selection_op ();
}
/** @param start Start time in session frames.
}
}
- begin_reversible_command (_("select all within"));
+ begin_reversible_selection_op (_("select all within"));
switch (op) {
case Selection::Add:
selection->add (found);
break;
}
- commit_reversible_command ();
+ commit_reversible_selection_op ();
}
void
}
selection->set (selection->regions.start(), selection->regions.end_frame());
+
+ //we must now select tracks, because otherwise set_selection_from_region would appear to do nothing
+ //perhaps too drastic; perhaps the user really only wants the region's track selected
+ //but I can't think of any use-case for that (why wouldn't you just select the region?)
+ select_all_tracks();
+
if (!Profile->get_sae()) {
set_mouse_mode (Editing::MouseRange, false);
}
void
Editor::set_selection_from_range (Location& loc)
{
- begin_reversible_command (_("set selection from range"));
+ begin_reversible_selection_op (_("set selection from range"));
selection->set (loc.start(), loc.end());
- commit_reversible_command ();
+ commit_reversible_selection_op ();
if (!Profile->get_sae()) {
set_mouse_mode (Editing::MouseRange, false);
(*iter)->get_selectables (start, end - 1, 0, DBL_MAX, touched);
}
- begin_reversible_command (_("select all from range"));
+ begin_reversible_selection_op (_("select all from range"));
selection->set (touched);
- commit_reversible_command ();
+ commit_reversible_selection_op ();
}
}
(*iter)->get_selectables (location->start(), location->end() - 1, 0, DBL_MAX, touched);
}
- begin_reversible_command (_("select all from punch"));
+ begin_reversible_selection_op (_("select all from punch"));
selection->set (touched);
- commit_reversible_command ();
+ commit_reversible_selection_op ();
}
}
(*iter)->get_selectables (location->start(), location->end() - 1, 0, DBL_MAX, touched);
}
- begin_reversible_command (_("select all from loop"));
+ begin_reversible_selection_op (_("select all from loop"));
selection->set (touched);
- commit_reversible_command ();
+ commit_reversible_selection_op ();
}
}
}
- if (_internal_editing) {
+ if (internal_editing()) {
for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*i);
if (mrv) {
}
if (after) {
- begin_reversible_command (_("select all after cursor"));
+ begin_reversible_selection_op (_("select all after cursor"));
} else {
- begin_reversible_command (_("select all before cursor"));
+ begin_reversible_selection_op (_("select all before cursor"));
}
TrackViewList* ts;
(*iter)->get_selectables (start, end, 0, DBL_MAX, touched);
}
selection->set (touched);
- commit_reversible_command ();
+ commit_reversible_selection_op ();
}
void
list<Selectable *> touched;
if (after) {
- start = get_preferred_edit_position();
+ start = get_preferred_edit_position(false, true);
end = _session->current_end_frame();
} else {
- if ((end = get_preferred_edit_position()) > 1) {
+ if ((end = get_preferred_edit_position(false, true)) > 1) {
start = 0;
end -= 1;
} else {
}
}
- if (_internal_editing) {
+ if (internal_editing()) {
for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*i);
mrv->select_range (start, end);
}
if (after) {
- begin_reversible_command (_("select all after edit"));
+ begin_reversible_selection_op (_("select all after edit"));
} else {
- begin_reversible_command (_("select all before edit"));
+ begin_reversible_selection_op (_("select all before edit"));
}
TrackViewList* ts;
(*iter)->get_selectables (start, end, 0, DBL_MAX, touched);
}
selection->set (touched);
- commit_reversible_command ();
+ commit_reversible_selection_op ();
}
void
-Editor::select_all_selectables_between (bool /*within*/)
+Editor::select_all_selectables_between (bool within)
{
framepos_t start;
framepos_t end;
return;
}
- if (_internal_editing) {
+ if (internal_editing()) {
for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*i);
mrv->select_range (start, end);
if ((*iter)->hidden()) {
continue;
}
- (*iter)->get_selectables (start, end, 0, DBL_MAX, touched);
+ (*iter)->get_selectables (start, end, 0, DBL_MAX, touched, within);
}
+ begin_reversible_selection_op(_("Select all Selectables Between"));
selection->set (touched);
+ commit_reversible_selection_op ();
}
void
return;
}
+ begin_reversible_selection_op(_("Select Range Between"));
set_mouse_mode (MouseRange);
selection->set (start, end);
+ commit_reversible_selection_op ();
}
bool
Editor::get_edit_op_range (framepos_t& start, framepos_t& end) const
{
- framepos_t m;
- bool ignored;
+// framepos_t m;
+// bool ignored;
/* if an explicit range exists, use it */
- if (!selection->time.empty()) {
+ if ( (mouse_mode == MouseRange || get_smart_mode() ) && !selection->time.empty()) {
/* we know that these are ordered */
start = selection->time.start();
end = selection->time.end_frame();
return true;
- }
-
- if (!mouse_frame (m, ignored)) {
- /* mouse is not in a canvas, try playhead+selected marker.
- this is probably most true when using menus.
- */
-
- if (selection->markers.empty()) {
- return false;
- }
-
- start = selection->markers.front()->position();
- end = _session->audible_frame();
-
} else {
-
- switch (_edit_point) {
- case EditAtPlayhead:
- if (selection->markers.empty()) {
- /* use mouse + playhead */
- start = m;
- end = _session->audible_frame();
- } else {
- /* use playhead + selected marker */
- start = _session->audible_frame();
- end = selection->markers.front()->position();
- }
- break;
-
- case EditAtMouse:
- /* use mouse + selected marker */
- if (selection->markers.empty()) {
- start = m;
- end = _session->audible_frame();
- } else {
- start = selection->markers.front()->position();
- end = m;
- }
- break;
-
- case EditAtSelectedMarker:
- /* use mouse + selected marker */
- if (selection->markers.empty()) {
-
- MessageDialog win (_("No edit range defined"),
- false,
- MESSAGE_INFO,
- BUTTONS_OK);
-
- win.set_secondary_text (
- _("the edit point is Selected Marker\nbut there is no selected marker."));
-
-
- win.set_default_response (RESPONSE_CLOSE);
- win.set_position (Gtk::WIN_POS_MOUSE);
- win.show_all();
-
- win.run ();
-
- return false; // NO RANGE
- }
- start = selection->markers.front()->position();
- end = m;
- break;
- }
- }
-
- if (start == end) {
+ start = 0;
+ end = 0;
return false;
}
-
- if (start > end) {
- swap (start, end);
- }
+
+// if (!mouse_frame (m, ignored)) {
+// /* mouse is not in a canvas, try playhead+selected marker.
+// this is probably most true when using menus.
+// */
+//
+// if (selection->markers.empty()) {
+// return false;
+// }
+
+// start = selection->markers.front()->position();
+// end = _session->audible_frame();
+
+// } else {
+
+// switch (_edit_point) {
+// case EditAtPlayhead:
+// if (selection->markers.empty()) {
+// /* use mouse + playhead */
+// start = m;
+// end = _session->audible_frame();
+// } else {
+// /* use playhead + selected marker */
+// start = _session->audible_frame();
+// end = selection->markers.front()->position();
+// }
+// break;
+
+// case EditAtMouse:
+// /* use mouse + selected marker */
+// if (selection->markers.empty()) {
+// start = m;
+// end = _session->audible_frame();
+// } else {
+// start = selection->markers.front()->position();
+// end = m;
+// }
+// break;
+
+// case EditAtSelectedMarker:
+// /* use mouse + selected marker */
+// if (selection->markers.empty()) {
+
+// MessageDialog win (_("No edit range defined"),
+// false,
+// MESSAGE_INFO,
+// BUTTONS_OK);
+
+// win.set_secondary_text (
+// _("the edit point is Selected Marker\nbut there is no selected marker."));
+
+
+// win.set_default_response (RESPONSE_CLOSE);
+// win.set_position (Gtk::WIN_POS_MOUSE);
+// win.show_all();
+
+// win.run ();
+
+// return false; // NO RANGE
+// }
+// start = selection->markers.front()->position();
+// end = m;
+// break;
+// }
+// }
+
+// if (start == end) {
+// return false;
+// }
+
+// if (start > end) {
+// swap (start, end);
+// }
/* turn range into one delimited by start...end,
not start...end-1
*/
- end++;
+// end++;
- return true;
+// return true;
}
void
Editor::deselect_all ()
{
+ begin_reversible_selection_op(_("Deselect All"));
selection->clear ();
+ commit_reversible_selection_op ();
}
long
Editor::select_range (framepos_t s, framepos_t e)
{
+ begin_reversible_selection_op(_("Select Range"));
selection->add (clicked_axisview);
selection->time.clear ();
- return selection->set (s, e);
+ long ret = selection->set (s, e);
+ commit_reversible_selection_op ();
+ return ret;
}