Unbreak region brush drag wrt undo, avoid some dangling commands in the gui

- also allow moving of automation lines in internal mouse mode.
	- this is also a first pass at ensuring that if an operation does
	  nothing, avoid an undo entry.
This commit is contained in:
nick_m 2015-06-17 00:45:04 +10:00
parent 15336d06e4
commit 4c1d79af4a
4 changed files with 121 additions and 62 deletions

View File

@ -619,6 +619,11 @@ RegionMotionDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
assert(_last_pointer_time_axis_view >= 0);
_last_pointer_layer = tv.first->layer_display() == Overlaid ? 0 : tv.second;
}
if (_brushing) {
/* cross track dragging seems broken here. disabled for now. */
_y_constrained = true;
}
}
double
@ -1223,13 +1228,13 @@ void
RegionMoveDrag::motion (GdkEvent* event, bool first_move)
{
if (_copy && first_move) {
if (_x_constrained) {
if (_x_constrained && !_brushing) {
_editor->begin_reversible_command (Operations::fixed_time_region_copy);
} else {
} else if (!_brushing) {
_editor->begin_reversible_command (Operations::region_copy);
} else if (_brushing) {
_editor->begin_reversible_command (Operations::drag_region_brush);
}
/* duplicate the regionview(s) and region(s) */
list<DraggingView> new_regionviews;
@ -1287,14 +1292,14 @@ RegionMoveDrag::motion (GdkEvent* event, bool first_move)
}
} else if (!_copy && first_move) {
if (_x_constrained) {
if (_x_constrained && !_brushing) {
_editor->begin_reversible_command (_("fixed time region drag"));
} else {
} else if (!_brushing) {
_editor->begin_reversible_command (Operations::region_drag);
} else if (_brushing) {
_editor->begin_reversible_command (Operations::drag_region_brush);
}
}
RegionMotionDrag::motion (event, first_move);
}
@ -1502,12 +1507,6 @@ RegionMoveDrag::finished_no_copy (
set<RouteTimeAxisView*> views_to_update;
RouteTimeAxisView* new_time_axis_view = 0;
if (_brushing) {
/* all changes were made during motion event handlers */
_editor->commit_reversible_command ();
return;
}
typedef map<boost::shared_ptr<Playlist>, RouteTimeAxisView*> PlaylistMapping;
PlaylistMapping playlist_mapping;
@ -1621,7 +1620,6 @@ RegionMoveDrag::finished_no_copy (
}
rv->region()->set_position (where);
_editor->session()->add_command (new StatefulDiffCommand (rv->region()));
}
@ -1670,7 +1668,7 @@ RegionMoveDrag::finished_no_copy (
/* write commands for the accumulated diffs for all our modified playlists */
add_stateful_diff_commands_for_playlists (modified_playlists);
/* applies to _brushing */
_editor->commit_reversible_command ();
/* We have futzed with the layering of canvas items on our streamviews.

View File

@ -766,6 +766,11 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
return true;
break;
case AutomationLineItem:
_drags->set (new LineDrag (this, item), event);
return true;
break;
case StreamItem:
//in the past, we created a new midi region here, but perhaps that is best left to the Draw mode
break;
@ -2200,7 +2205,7 @@ Editor::mouse_brush_insert_region (RegionView* rv, framepos_t pos)
// playlist is frozen, so we have to update manually XXX this is disgusting
playlist->RegionAdded (new_region); /* EMIT SIGNAL */
//playlist->RegionAdded (new_region); /* EMIT SIGNAL */
}
gint
@ -2262,8 +2267,6 @@ Editor::add_region_brush_drag (ArdourCanvas::Item* item, GdkEvent*, RegionView*
}
_drags->add (new RegionMoveDrag (this, item, region_view, selection->regions.by_layer(), true, false));
begin_reversible_command (Operations::drag_region_brush);
}
/** Start a grab where a time range is selected, track(s) are selected, and the
@ -2303,7 +2306,6 @@ Editor::start_selection_grab (ArdourCanvas::Item* /*item*/, GdkEvent* event)
/* A selection grab currently creates two undo/redo operations, one for
creating the new region and another for moving it.
*/
begin_reversible_command (Operations::selection_grab);
boost::shared_ptr<Playlist> playlist = clicked_axisview->playlist();
@ -2316,6 +2318,7 @@ Editor::start_selection_grab (ArdourCanvas::Item* /*item*/, GdkEvent* event)
if (latest_regionviews.empty()) {
/* something went wrong */
abort_reversible_command ();
return;
}

View File

@ -336,9 +336,9 @@ Editor::move_range_selection_start_or_end_to_region_boundary (bool move_end, boo
return;
}
begin_reversible_command (_("alter selection"));
begin_reversible_selection_op (_("alter selection"));
selection->set_preserving_all_ranges (start, end);
commit_reversible_command ();
commit_reversible_selection_op ();
}
bool
@ -2172,10 +2172,7 @@ void
Editor::remove_location_at_playhead_cursor ()
{
if (_session) {
//set up for undo
begin_reversible_command (_("remove marker"));
XMLNode &before = _session->locations()->get_state();
bool removed = false;
@ -2191,6 +2188,7 @@ Editor::remove_location_at_playhead_cursor ()
//store undo
if (removed) {
begin_reversible_command (_("remove marker"));
XMLNode &after = _session->locations()->get_state();
_session->add_command(new MementoCommand<Locations>(*(_session->locations()), &before, &after));
@ -2238,8 +2236,6 @@ Editor::add_location_from_region ()
return;
}
begin_reversible_command (_("add marker"));
XMLNode &before = _session->locations()->get_state();
string markername;
@ -2256,6 +2252,7 @@ Editor::add_location_from_region ()
return;
}
begin_reversible_command (_("add marker"));
// single range spanning all selected
Location *location = new Location (*_session, selection->regions.start(), selection->regions.end_frame(), markername, Location::IsRangeMarker);
_session->locations()->add (location, true);
@ -3302,6 +3299,7 @@ void
Editor::region_fill_track ()
{
RegionSelection rs = get_regions_from_selection_and_entered ();
bool commit = false;
if (!_session || rs.empty()) {
return;
@ -3318,21 +3316,27 @@ Editor::region_fill_track ()
boost::shared_ptr<Playlist> pl = region->playlist();
if (end <= region->last_frame()) {
return;
goto out;
}
double times = (double) (end - region->last_frame()) / (double) region->length();
if (times == 0) {
return;
goto out;
}
pl->clear_changes ();
pl->add_region (RegionFactory::create (region, true), region->last_frame(), times);
_session->add_command (new StatefulDiffCommand (pl));
commit = true;
}
commit_reversible_command ();
out:
if (commit) {
commit_reversible_command ();
} else {
abort_reversible_command ();
}
}
void
@ -3362,6 +3366,7 @@ Editor::region_fill_selection ()
framepos_t selection_length = end - start;
float times = (float)selection_length / region->length();
bool commit = false;
begin_reversible_command (Operations::fill_selection);
@ -3376,9 +3381,14 @@ Editor::region_fill_selection ()
playlist->clear_changes ();
playlist->add_region (RegionFactory::create (region, true), start, times);
_session->add_command (new StatefulDiffCommand (playlist));
commit = true;
}
commit_reversible_command ();
if (commit) {
commit_reversible_command ();
} else {
abort_reversible_command ();
}
}
void
@ -3730,7 +3740,7 @@ void
Editor::trim_to_region(bool forward)
{
RegionSelection rs = get_regions_from_selection_and_entered ();
bool commit = false;
begin_reversible_command (_("trim to region"));
boost::shared_ptr<Region> next_region;
@ -3746,7 +3756,7 @@ Editor::trim_to_region(bool forward)
AudioTimeAxisView* atav = dynamic_cast<AudioTimeAxisView*> (&arv->get_time_axis_view());
if (!atav) {
return;
continue;
}
float speed = 1.0;
@ -3786,9 +3796,14 @@ Editor::trim_to_region(bool forward)
}
_session->add_command(new StatefulDiffCommand (region));
commit = true;
}
commit_reversible_command ();
if (commit) {
commit_reversible_command ();
} else {
abort_reversible_command ();
}
}
void
@ -3927,7 +3942,7 @@ Editor::bounce_range_selection (bool replace, bool enable_processing)
boost::shared_ptr<Playlist> playlist;
if ((playlist = rtv->playlist()) == 0) {
return;
continue;
}
InterThreadInfo itt;
@ -5281,6 +5296,7 @@ void
Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress)
{
RegionSelection rs = get_regions_from_selection_and_entered ();
bool commit = false;
if (rs.empty()) {
return;
@ -5331,7 +5347,6 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress
}
}
/* We might have removed regions, which alters other regions' layering_index,
so we need to do a recursive diff here.
*/
@ -5340,8 +5355,9 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress
_session->add_commands (cmds);
_session->add_command(new StatefulDiffCommand (playlist));
commit = true;
} else {
return;
goto out;
}
if (progress) {
@ -5352,8 +5368,12 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress
r = tmp;
++n;
}
commit_reversible_command ();
out:
if (commit) {
commit_reversible_command ();
} else {
abort_reversible_command ();
}
}
void
@ -5643,6 +5663,7 @@ Editor::set_fade_length (bool in)
framepos_t pos = get_preferred_edit_position();
framepos_t len;
char const * cmd;
bool commit = false;
if (pos > rv->region()->last_frame() || pos < rv->region()->first_frame()) {
/* edit point is outside the relevant region */
@ -5671,7 +5692,7 @@ Editor::set_fade_length (bool in)
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
if (!tmp) {
return;
continue;
}
boost::shared_ptr<AutomationList> alist;
@ -5690,12 +5711,16 @@ Editor::set_fade_length (bool in)
tmp->audio_region()->set_fade_out_length (len);
tmp->audio_region()->set_fade_out_active (true);
}
XMLNode &after = alist->get_state();
_session->add_command(new MementoCommand<AutomationList>(*alist, &before, &after));
commit = true;
}
commit_reversible_command ();
if (commit) {
commit_reversible_command ();
} else {
abort_reversible_command ();
}
}
void
@ -5706,14 +5731,14 @@ Editor::set_fade_in_shape (FadeShape shape)
if (rs.empty()) {
return;
}
bool commit = false;
begin_reversible_command (_("set fade in shape"));
for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
if (!tmp) {
return;
continue;
}
boost::shared_ptr<AutomationList> alist = tmp->audio_region()->fade_in();
@ -5723,10 +5748,14 @@ Editor::set_fade_in_shape (FadeShape shape)
XMLNode &after = alist->get_state();
_session->add_command(new MementoCommand<AutomationList>(*alist.get(), &before, &after));
commit = true;
}
commit_reversible_command ();
if (commit) {
commit_reversible_command ();
} else {
abort_reversible_command ();
}
}
void
@ -5737,14 +5766,14 @@ Editor::set_fade_out_shape (FadeShape shape)
if (rs.empty()) {
return;
}
bool commit = false;
begin_reversible_command (_("set fade out shape"));
for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
if (!tmp) {
return;
continue;
}
boost::shared_ptr<AutomationList> alist = tmp->audio_region()->fade_out();
@ -5754,9 +5783,14 @@ Editor::set_fade_out_shape (FadeShape shape)
XMLNode &after = alist->get_state();
_session->add_command(new MementoCommand<AutomationList>(*alist.get(), &before, &after));
commit = true;
}
commit_reversible_command ();
if (commit) {
commit_reversible_command ();
} else {
abort_reversible_command ();
}
}
void
@ -5767,14 +5801,14 @@ Editor::set_fade_in_active (bool yn)
if (rs.empty()) {
return;
}
bool commit = false;
begin_reversible_command (_("set fade in active"));
for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
if (!tmp) {
return;
continue;
}
@ -5783,9 +5817,14 @@ Editor::set_fade_in_active (bool yn)
ar->clear_changes ();
ar->set_fade_in_active (yn);
_session->add_command (new StatefulDiffCommand (ar));
commit = true;
}
commit_reversible_command ();
if (commit) {
commit_reversible_command ();
} else {
abort_reversible_command ();
}
}
void
@ -5796,14 +5835,14 @@ Editor::set_fade_out_active (bool yn)
if (rs.empty()) {
return;
}
bool commit = false;
begin_reversible_command (_("set fade out active"));
for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) {
AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
if (!tmp) {
return;
continue;
}
boost::shared_ptr<AudioRegion> ar (tmp->audio_region());
@ -5811,9 +5850,14 @@ Editor::set_fade_out_active (bool yn)
ar->clear_changes ();
ar->set_fade_out_active (yn);
_session->add_command(new StatefulDiffCommand (ar));
commit = true;
}
commit_reversible_command ();
if (commit) {
commit_reversible_command ();
} else {
abort_reversible_command ();
}
}
void
@ -5849,11 +5893,15 @@ Editor::toggle_region_fades (int dir)
}
/* XXX should this undo-able? */
bool commit = false;
begin_reversible_command (_("toggle fade active"));
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
if ((ar = boost::dynamic_pointer_cast<AudioRegion>((*i)->region())) == 0) {
continue;
}
ar->clear_changes ();
if (dir == 1 || dir == 0) {
ar->set_fade_in_active (!yn);
}
@ -5861,6 +5909,14 @@ Editor::toggle_region_fades (int dir)
if (dir == -1 || dir == 0) {
ar->set_fade_out_active (!yn);
}
_session->add_command(new StatefulDiffCommand (ar));
commit = true;
}
if (commit) {
commit_reversible_command ();
} else {
abort_reversible_command ();
}
}
@ -6958,12 +7014,11 @@ Editor::insert_time (
bool all_playlists, bool ignore_music_glue, bool markers_too, bool glued_markers_too, bool locked_markers_too, bool tempo_too
)
{
bool commit = false;
if (Config->get_edit_mode() == Lock) {
return;
}
bool commit = false;
begin_reversible_command (_("insert time"));
TrackViewList ts = selection->tracks.filter_to_unique_playlists ();
@ -7016,7 +7071,6 @@ Editor::insert_time (
RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*x);
if (rtav) {
rtav->route ()->shift (pos, frames);
commit = true;
}
}
@ -7055,6 +7109,7 @@ Editor::insert_time (
if (moved) {
XMLNode& after (_session->locations()->get_state());
_session->add_command (new MementoCommand<Locations>(*_session->locations(), &before, &after));
commit = true;
}
}
@ -7064,6 +7119,8 @@ Editor::insert_time (
if (commit) {
commit_reversible_command ();
} else {
abort_reversible_command ();
}
}
void
@ -7131,13 +7188,11 @@ void
Editor::cut_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt,
bool ignore_music_glue, bool markers_too, bool tempo_too)
{
bool commit = false;
if (Config->get_edit_mode() == Lock) {
error << (_("Cannot insert or delete time when in Lock edit.")) << endmsg;
return;
}
bool commit = false;
begin_reversible_command (_("cut time"));
for (TrackSelection::iterator x = selection->tracks.begin(); x != selection->tracks.end(); ++x) {
@ -7164,7 +7219,6 @@ Editor::cut_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt,
RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*x);
if (rtav) {
rtav->route ()->shift (pos, -frames);
commit = true;
}
}
@ -7233,6 +7287,8 @@ Editor::cut_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt,
if (commit) {
commit_reversible_command ();
} else {
abort_reversible_command ();
}
}

View File

@ -133,6 +133,8 @@ Editor::pitch_shift (RegionSelection& regions, float fraction)
if (ret == 0) {
commit_reversible_command ();
} else {
abort_reversible_command ();
}
return ret;