X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_selection.cc;h=ea6c40f1b29a7a8a3bf9bb96a42fd0db55e2c142;hb=7745a373940a0bcabd618b5b66c6b8916045ea9e;hp=26643bddd57a378e9603085fa0266de0693fc519;hpb=aed4ab6ec95d674503d580ea99a7a343255d33e3;p=ardour.git diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index 26643bddd5..ea6c40f1b2 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -30,6 +30,7 @@ #include "control_protocol/control_protocol.h" +#include "editor_drag.h" #include "editor.h" #include "actions.h" #include "audio_time_axis.h" @@ -40,6 +41,7 @@ #include "editor_regions.h" #include "editor_cursors.h" #include "midi_region_view.h" +#include "sfdb_ui.h" #include "i18n.h" @@ -190,33 +192,24 @@ Editor::set_selected_track_as_side_effect (Selection::Operation op) group = clicked_routeview->route()->route_group(); } - bool had_tracks = !selection->tracks.empty(); - RouteGroup& arg (_session->all_route_group()); - switch (op) { case Selection::Toggle: if (selection->selected (clicked_axisview)) { - if (arg.is_select() && arg.is_active()) { - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) { - selection->remove(*i); - } - } else if (group && group->is_active()) { + 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 (arg.is_select() && arg.is_active()) { - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) { - selection->add(*i); - } - } else if (group && group->is_active()) { + 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); @@ -225,17 +218,11 @@ Editor::set_selected_track_as_side_effect (Selection::Operation op) break; case Selection::Add: - if (!had_tracks && arg.is_select() && arg.is_active()) { - /* nothing was selected already, and all group is active etc. so use - all tracks. - */ - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) { - selection->add(*i); - } - } else if (group && group->is_active()) { + 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); @@ -244,17 +231,11 @@ Editor::set_selected_track_as_side_effect (Selection::Operation op) case Selection::Set: selection->clear(); - if (!had_tracks && arg.is_select() && arg.is_active()) { - /* nothing was selected already, and all group is active etc. so use - all tracks. - */ - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end (); ++i) { - selection->add(*i); - } - } else if (group && group->is_active()) { + 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); @@ -270,6 +251,8 @@ Editor::set_selected_track_as_side_effect (Selection::Operation op) void Editor::set_selected_track (TimeAxisView& view, Selection::Operation op, bool no_remove) { + begin_reversible_selection_op (X_("Set Selected Track")); + switch (op) { case Selection::Toggle: if (selection->selected (&view)) { @@ -295,6 +278,8 @@ Editor::set_selected_track (TimeAxisView& view, Selection::Operation op, bool no extend_selection_to_track (view); break; } + + commit_reversible_selection_op (); } void @@ -318,18 +303,34 @@ Editor::set_selected_control_point_from_click (bool press, Selection::Operation return false; } + bool ret = false; + switch (op) { case Selection::Set: - if (press) { + if (!selection->selected (clicked_control_point)) { selection->set (clicked_control_point); + ret = true; + } else { + /* clicked on an already selected point */ + if (press) { + break; + } else { + if (selection->points.size() > 1) { + selection->set (clicked_control_point); + ret = true; + } + } } break; + case Selection::Add: if (press) { selection->add (clicked_control_point); + ret = true; } break; case Selection::Toggle: + /* This is a bit of a hack; if we Primary-Click-Drag a control point (for push drag) we want the point we clicked on to be selected, otherwise we end up confusingly dragging an @@ -344,9 +345,11 @@ Editor::set_selected_control_point_from_click (bool press, Selection::Operation */ selection->toggle (clicked_control_point); _control_point_toggled_on_press = true; + ret = true; } else if (!press && !_control_point_toggled_on_press) { /* This is the release, and the point wasn't toggled on the press, so do it now */ selection->toggle (clicked_control_point); + ret = true; } else { /* Reset our flag */ _control_point_toggled_on_press = false; @@ -357,7 +360,7 @@ Editor::set_selected_control_point_from_click (bool press, Selection::Operation break; } - return true; + return ret; } void @@ -445,7 +448,7 @@ Editor::mapover_tracks_with_unique_playlists (sigc::slot (*i); if (v && v->route()->route_group() == group) { - + boost::shared_ptr t = v->track(); if (t) { if (playlists.insert (t->playlist()).second) { @@ -618,7 +621,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op) if (press) { if (selection->selected (clicked_routeview)) { - get_equivalent_regions (clicked_regionview, all_equivalent_regions, ARDOUR::Properties::select.property_id); + get_equivalent_regions (clicked_regionview, all_equivalent_regions, ARDOUR::Properties::group_select.property_id); } else { all_equivalent_regions.push_back (clicked_regionview); } @@ -636,7 +639,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op) case Selection::Set: if (!selection->selected (clicked_regionview)) { - get_equivalent_regions (clicked_regionview, all_equivalent_regions, ARDOUR::Properties::select.property_id); + get_equivalent_regions (clicked_regionview, all_equivalent_regions, ARDOUR::Properties::group_select.property_id); selection->set (all_equivalent_regions); commit = true; } else { @@ -644,9 +647,12 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op) 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; + if (selection->regions.size() > 1) { + /* collapse region selection down to just this one region (and its equivalents) */ + get_equivalent_regions(clicked_regionview, all_equivalent_regions, ARDOUR::Properties::group_select.property_id); + selection->set(all_equivalent_regions); + commit = true; + } } } break; @@ -785,7 +791,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op) RouteTimeAxisView* closest = 0; int distance = INT_MAX; - int key = rtv->route()->order_key (); + int key = rtv->route()->presentation_info().order (); for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ++x) { @@ -800,7 +806,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op) if (result.second) { /* newly added to already_in_selection */ - int d = artv->route()->order_key (); + int d = artv->route()->presentation_info().order (); d -= key; @@ -816,7 +822,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op) /* now add all tracks between that one and this one */ - int okey = closest->route()->order_key (); + int okey = closest->route()->presentation_info().order (); if (okey > key) { swap (okey, key); @@ -826,7 +832,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op) RouteTimeAxisView* artv = dynamic_cast(*x); if (artv && artv != rtv) { - int k = artv->route()->order_key (); + int k = artv->route()->presentation_info().order (); if (k >= okey && k <= key) { @@ -892,7 +898,7 @@ Editor::set_selected_regionview_from_region_list (boost::shared_ptr regi return; } - begin_reversible_command (_("set selected regions")); + begin_reversible_selection_op (X_("set selected regions")); switch (op) { case Selection::Toggle: @@ -910,7 +916,7 @@ Editor::set_selected_regionview_from_region_list (boost::shared_ptr regi break; } - commit_reversible_command () ; + commit_reversible_selection_op () ; } bool @@ -935,11 +941,11 @@ Editor::set_selected_regionview_from_map_event (GdkEventAny* /*ev*/, StreamView* return true; } - begin_reversible_command (_("set selected regions")); + begin_reversible_selection_op (X_("set selected regions")); selection->set (rv); - commit_reversible_command () ; + commit_reversible_selection_op () ; return true; } @@ -956,6 +962,7 @@ Editor::track_selection_changed () } RouteNotificationListPtr routes (new RouteNotificationList); + StripableNotificationListPtr stripables (new StripableNotificationList); for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { @@ -979,6 +986,7 @@ Editor::track_selection_changed () RouteTimeAxisView* rtav = dynamic_cast (*i); if (rtav) { routes->push_back (rtav->route()); + stripables->push_back (rtav->route()); } } } @@ -986,17 +994,39 @@ Editor::track_selection_changed () ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, !selection->tracks.empty()); /* notify control protocols */ - - ControlProtocol::TrackSelectionChanged (routes); + + ControlProtocol::StripableSelectionChanged (stripables); + + if (sfbrowser && _session && !_session->deletion_in_progress()) { + uint32_t audio_track_cnt = 0; + uint32_t midi_track_cnt = 0; + + for (TrackSelection::iterator x = selection->tracks.begin(); x != selection->tracks.end(); ++x) { + AudioTimeAxisView* atv = dynamic_cast(*x); + + if (atv) { + if (atv->is_audio_track()) { + audio_track_cnt++; + } + + } else { + MidiTimeAxisView* mtv = dynamic_cast(*x); + + if (mtv) { + if (mtv->is_midi_track()) { + midi_track_cnt++; + } + } + } + } + + sfbrowser->reset (audio_track_cnt, midi_track_cnt); + } } void Editor::time_selection_changed () { - if (Profile->get_sae()) { - return; - } - /* XXX this is superficially inefficient. Hide the selection in all * tracks, then show it in all selected tracks. * @@ -1019,6 +1049,19 @@ Editor::time_selection_changed () } else { ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, true); } + + /* propagate into backend, but only when there is no drag or we are at + * the end of a drag, otherwise this is too expensive (could case a + * locate per mouse motion event. + */ + + if (_session && !_drags->active()) { + if (selection->time.length() != 0) { + _session->set_range_selection (selection->time.start(), selection->time.end_frame()); + } else { + _session->clear_range_selection (); + } + } } /** Set all region actions to have a given sensitivity */ @@ -1045,7 +1088,6 @@ Editor::sensitize_all_region_actions (bool s) void Editor::sensitize_the_right_region_actions () { - RegionSelection rs = get_regions_from_selection_and_entered (); sensitize_all_region_actions (!rs.empty ()); @@ -1075,6 +1117,7 @@ Editor::sensitize_the_right_region_actions () bool have_inactive_fade_out = false; bool have_active_fade_in = false; bool have_active_fade_out = false; + bool have_transients = false; for (list::const_iterator i = rs.begin(); i != rs.end(); ++i) { @@ -1130,6 +1173,10 @@ Editor::sensitize_the_right_region_actions () have_not_at_natural_position = true; } + if (r->has_transients ()){ + have_transients = true; + } + if (ar) { if (ar->envelope_active()) { have_envelope_active = true; @@ -1155,6 +1202,8 @@ Editor::sensitize_the_right_region_actions () } } + _region_actions->get_action("split-region-at-transients")->set_sensitive (have_transients); + if (rs.size() > 1) { _region_actions->get_action("show-region-list-editor")->set_sensitive (false); _region_actions->get_action("show-region-properties")->set_sensitive (false); @@ -1181,6 +1230,9 @@ Editor::sensitize_the_right_region_actions () 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("transform-region")->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); @@ -1214,10 +1266,13 @@ Editor::sensitize_the_right_region_actions () } else { - _region_actions->get_action("analyze-region")->set_sensitive (false); + _region_actions->get_action("loudness-analyze-region")->set_sensitive (false); + _region_actions->get_action("spectral-analyze-region")->set_sensitive (false); _region_actions->get_action("reset-region-gain-envelopes")->set_sensitive (false); _region_actions->get_action("toggle-region-gain-envelope-active")->set_sensitive (false); _region_actions->get_action("pitch-shift-region")->set_sensitive (false); + _region_actions->get_action("strip-region-silence")->set_sensitive (false); + _region_actions->get_action("show-rhythm-ferret")->set_sensitive (false); } @@ -1279,7 +1334,7 @@ Editor::sensitize_the_right_region_actions () if (have_active_fade_out && have_inactive_fade_out) { // a->set_inconsistent (); } - + bool const have_active_fade = have_active_fade_in || have_active_fade_out; bool const have_inactive_fade = have_inactive_fade_in || have_inactive_fade_out; @@ -1289,7 +1344,7 @@ Editor::sensitize_the_right_region_actions () if (have_active_fade && have_inactive_fade) { // a->set_inconsistent (); } - + _ignore_region_action = false; _all_region_actions_sensitized = false; @@ -1317,16 +1372,31 @@ Editor::region_selection_changed () _regions->block_change_connection (false); editor_regions_selection_changed_connection.block(false); - if (!_all_region_actions_sensitized) { - /* This selection change might have changed what region actions - are allowed, so sensitize them all in case a key is pressed. - */ - sensitize_all_region_actions (true); + if (selection->regions.empty()) { + sensitize_all_region_actions (false); + } else { + if (!_all_region_actions_sensitized) { + /* This selection change might have changed what region actions + are allowed, so sensitize them all in case a key is pressed. + */ + sensitize_all_region_actions (true); + } } if (_session && !_session->transport_rolling() && !selection->regions.empty()) { maybe_locate_with_edit_preroll (selection->regions.start()); } + + /* propagate into backend */ + + if (_session) { + if (!selection->regions.empty()) { + _session->set_object_selection (selection->regions.start(), selection->regions.end_frame()); + } else { + _session->clear_object_selection (); + } + } + } void @@ -1346,6 +1416,8 @@ Editor::select_all_in_track (Selection::Operation op) return; } + begin_reversible_selection_op (X_("Select All in Track")); + clicked_routeview->get_selectables (0, max_framepos, 0, DBL_MAX, touched); switch (op) { @@ -1362,17 +1434,30 @@ Editor::select_all_in_track (Selection::Operation 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(*i); if (mrv) { mrv->select_all_notes (); + selected = true; } } + + MidiRegionView* mrv = dynamic_cast(entered_regionview); + if (mrv) { + mrv->select_all_notes (); + selected = true; + } + + return selected; } void @@ -1382,27 +1467,8 @@ Editor::select_all_objects (Selection::Operation op) TrackViewList ts = track_views; - if (_internal_editing) { - - bool midi_selected = false; - - for (TrackViewList::iterator iter = ts.begin(); iter != ts.end(); ++iter) { - if ((*iter)->hidden()) { - continue; - } - - RouteTimeAxisView* rtav = dynamic_cast (*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) { @@ -1414,7 +1480,7 @@ Editor::select_all_objects (Selection::Operation op) } - begin_reversible_command (_("select all")); + begin_reversible_selection_op (X_("select all")); switch (op) { case Selection::Add: selection->add (touched); @@ -1429,7 +1495,7 @@ Editor::select_all_objects (Selection::Operation op) /* meaningless, because we're selecting everything */ break; } - commit_reversible_command (); + commit_reversible_selection_op (); } void @@ -1441,8 +1507,10 @@ Editor::invert_selection_in_track () return; } + begin_reversible_selection_op (X_("Invert Selection in Track")); clicked_routeview->get_inverted_selectables (*selection, touched); selection->set (touched); + commit_reversible_selection_op (); } void @@ -1450,7 +1518,7 @@ Editor::invert_selection () { list touched; - if (_internal_editing) { + if (internal_editing()) { for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { MidiRegionView* mrv = dynamic_cast(*i); if (mrv) { @@ -1467,7 +1535,9 @@ Editor::invert_selection () (*iter)->get_inverted_selectables (*selection, touched); } + begin_reversible_selection_op (X_("Invert Selection")); selection->set (touched); + commit_reversible_selection_op (); } /** @param start Start time in session frames. @@ -1499,7 +1569,7 @@ Editor::select_all_within (framepos_t start, framepos_t end, double top, double if (preserve_if_selected && op != Selection::Toggle) { list::iterator i = found.begin(); - while (i != found.end() && (*i)->get_selected()) { + while (i != found.end() && (*i)->selected()) { ++i; } @@ -1508,7 +1578,7 @@ Editor::select_all_within (framepos_t start, framepos_t end, double top, double } } - begin_reversible_command (_("select all within")); + begin_reversible_selection_op (X_("select all within")); switch (op) { case Selection::Add: selection->add (found); @@ -1524,7 +1594,7 @@ Editor::select_all_within (framepos_t start, framepos_t end, double top, double break; } - commit_reversible_command (); + commit_reversible_selection_op (); } void @@ -1534,10 +1604,26 @@ Editor::set_selection_from_region () return; } - selection->set (selection->regions.start(), selection->regions.end_frame()); - if (!Profile->get_sae()) { - set_mouse_mode (Editing::MouseRange, false); + /* find all the tracks that have selected regions */ + + set tracks; + + for (RegionSelection::const_iterator r = selection->regions.begin(); r != selection->regions.end(); ++r) { + tracks.insert (&(*r)->get_time_axis_view()); } + + TrackViewList tvl; + tvl.insert (tvl.end(), tracks.begin(), tracks.end()); + + /* select range (this will clear the region selection) */ + + selection->set (selection->regions.start(), selection->regions.end_frame()); + + /* and select the tracks */ + + selection->set (tvl); + + set_mouse_mode (Editing::MouseRange, false); } void @@ -1566,13 +1652,11 @@ Editor::set_selection_from_loop() void Editor::set_selection_from_range (Location& loc) { - begin_reversible_command (_("set selection from range")); + begin_reversible_selection_op (X_("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); - } + set_mouse_mode (Editing::MouseRange, false); } void @@ -1606,9 +1690,9 @@ Editor::select_all_selectables_using_time_selection () (*iter)->get_selectables (start, end - 1, 0, DBL_MAX, touched); } - begin_reversible_command (_("select all from range")); + begin_reversible_selection_op (X_("select all from range")); selection->set (touched); - commit_reversible_command (); + commit_reversible_selection_op (); } @@ -1637,9 +1721,9 @@ Editor::select_all_selectables_using_punch() } (*iter)->get_selectables (location->start(), location->end() - 1, 0, DBL_MAX, touched); } - begin_reversible_command (_("select all from punch")); + begin_reversible_selection_op (X_("select all from punch")); selection->set (touched); - commit_reversible_command (); + commit_reversible_selection_op (); } @@ -1668,9 +1752,9 @@ Editor::select_all_selectables_using_loop() } (*iter)->get_selectables (location->start(), location->end() - 1, 0, DBL_MAX, touched); } - begin_reversible_command (_("select all from loop")); + begin_reversible_selection_op (X_("select all from loop")); selection->set (touched); - commit_reversible_command (); + commit_reversible_selection_op (); } @@ -1693,7 +1777,7 @@ Editor::select_all_selectables_using_cursor (EditorCursor *cursor, bool after) } } - if (_internal_editing) { + if (internal_editing()) { for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { MidiRegionView* mrv = dynamic_cast(*i); if (mrv) { @@ -1704,9 +1788,9 @@ Editor::select_all_selectables_using_cursor (EditorCursor *cursor, bool after) } if (after) { - begin_reversible_command (_("select all after cursor")); + begin_reversible_selection_op (X_("select all after cursor")); } else { - begin_reversible_command (_("select all before cursor")); + begin_reversible_selection_op (X_("select all before cursor")); } TrackViewList* ts; @@ -1724,21 +1808,21 @@ Editor::select_all_selectables_using_cursor (EditorCursor *cursor, bool after) (*iter)->get_selectables (start, end, 0, DBL_MAX, touched); } selection->set (touched); - commit_reversible_command (); + commit_reversible_selection_op (); } void -Editor::select_all_selectables_using_edit (bool after) +Editor::select_all_selectables_using_edit (bool after, bool from_context_menu) { framepos_t start; framepos_t end; list touched; if (after) { - start = get_preferred_edit_position(); + start = get_preferred_edit_position(EDIT_IGNORE_NONE, from_context_menu); end = _session->current_end_frame(); } else { - if ((end = get_preferred_edit_position()) > 1) { + if ((end = get_preferred_edit_position(EDIT_IGNORE_NONE, from_context_menu)) > 1) { start = 0; end -= 1; } else { @@ -1746,7 +1830,7 @@ Editor::select_all_selectables_using_edit (bool after) } } - if (_internal_editing) { + if (internal_editing()) { for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { MidiRegionView* mrv = dynamic_cast(*i); mrv->select_range (start, end); @@ -1755,9 +1839,9 @@ Editor::select_all_selectables_using_edit (bool after) } if (after) { - begin_reversible_command (_("select all after edit")); + begin_reversible_selection_op (X_("select all after edit")); } else { - begin_reversible_command (_("select all before edit")); + begin_reversible_selection_op (X_("select all before edit")); } TrackViewList* ts; @@ -1775,11 +1859,11 @@ Editor::select_all_selectables_using_edit (bool after) (*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; @@ -1789,7 +1873,7 @@ Editor::select_all_selectables_between (bool /*within*/) return; } - if (_internal_editing) { + if (internal_editing()) { for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { MidiRegionView* mrv = dynamic_cast(*i); mrv->select_range (start, end); @@ -1809,10 +1893,12 @@ Editor::select_all_selectables_between (bool /*within*/) 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 (X_("Select all Selectables Between")); selection->set (touched); + commit_reversible_selection_op (); } void @@ -1829,8 +1915,10 @@ Editor::select_range_between () return; } + begin_reversible_selection_op (X_("Select Range Between")); set_mouse_mode (MouseRange); selection->set (start, end); + commit_reversible_selection_op (); } bool @@ -1851,7 +1939,7 @@ Editor::get_edit_op_range (framepos_t& start, framepos_t& end) const end = 0; return false; } - + // if (!mouse_frame (m, ignored)) { // /* mouse is not in a canvas, try playhead+selected marker. // this is probably most true when using menus. @@ -1937,13 +2025,18 @@ Editor::get_edit_op_range (framepos_t& start, framepos_t& end) const void Editor::deselect_all () { + begin_reversible_selection_op (X_("Deselect All")); selection->clear (); + commit_reversible_selection_op (); } long Editor::select_range (framepos_t s, framepos_t e) { + begin_reversible_selection_op (X_("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; }