mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-20 13:46:30 +01:00
fix issues with copy-fixed-time drag
git-svn-id: svn://localhost/ardour2/trunk@1750 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
ee8f297989
commit
f857460dd3
2 changed files with 40 additions and 17 deletions
|
|
@ -1620,7 +1620,6 @@ Editor::end_grab (ArdourCanvas::Item* item, GdkEvent* event)
|
|||
stop_canvas_autoscroll ();
|
||||
|
||||
if (drag_info.item == 0) {
|
||||
cerr << "end grab with no item\n";
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -3234,6 +3233,7 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
|||
RouteTimeAxisView* atv;
|
||||
bool regionview_y_movement;
|
||||
bool regionview_x_movement;
|
||||
vector<RegionView*> copies;
|
||||
|
||||
/* first_move is set to false if the regionview has been moved in the
|
||||
motion handler.
|
||||
|
|
@ -3241,6 +3241,12 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
|||
|
||||
if (drag_info.first_move) {
|
||||
/* just a click */
|
||||
|
||||
if (drag_info.copy) {
|
||||
for (list<RegionView*>::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
|
||||
copies.push_back (*i);
|
||||
}
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
@ -3254,6 +3260,13 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
|||
|
||||
if (drag_info.brushing) {
|
||||
/* all changes were made during motion event handlers */
|
||||
|
||||
if (drag_info.copy) {
|
||||
for (list<RegionView*>::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
|
||||
copies.push_back (*i);
|
||||
}
|
||||
}
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
@ -3332,6 +3345,12 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
|||
session->add_command (new MementoCommand<Playlist>(*from_playlist, &from_playlist->get_state(), 0));
|
||||
from_playlist->remove_region ((rv->region()));
|
||||
session->add_command (new MementoCommand<Playlist>(*from_playlist, 0, &from_playlist->get_state()));
|
||||
|
||||
} else {
|
||||
|
||||
/* the regionview we dragged around is a temporary copy, queue it for deletion */
|
||||
|
||||
copies.push_back (rv);
|
||||
}
|
||||
|
||||
latest_regionview = 0;
|
||||
|
|
@ -3346,11 +3365,6 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
|||
new_selection.push_back (latest_regionview);
|
||||
}
|
||||
|
||||
if (drag_info.copy) {
|
||||
// get rid of the copy
|
||||
delete rv;
|
||||
}
|
||||
|
||||
/* OK, this is where it gets tricky. If the playlist was being used by >1 tracks, and the region
|
||||
was selected in all of them, then removing it from the playlist will have removed all
|
||||
trace of it from the selection (i.e. there were N regions selected, we removed 1,
|
||||
|
|
@ -3363,14 +3377,21 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
|||
here. if the region selection is not empty, then restart the loop because we know that
|
||||
we must have removed at least the region(view) we've just been working on as well as any
|
||||
that we processed on previous iterations.
|
||||
|
||||
EXCEPT .... if we are doing a copy drag, then the selection hasn't been modified and
|
||||
we can just iterate.
|
||||
*/
|
||||
|
||||
if (drag_info.copy) {
|
||||
++i;
|
||||
} else {
|
||||
if (selection->regions.empty()) {
|
||||
break;
|
||||
} else {
|
||||
i = selection->regions.by_layer().begin();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
selection->set (new_selection);
|
||||
|
||||
|
|
@ -3462,10 +3483,8 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
|||
|
||||
session->add_command (new MementoCommand<Playlist>(*to_playlist, 0, &to_playlist->get_state()));
|
||||
|
||||
/* get rid of the copy */
|
||||
|
||||
if (drag_info.copy) {
|
||||
delete rv;
|
||||
copies.push_back (rv);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3475,6 +3494,10 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
|
|||
if (!nocommit) {
|
||||
commit_reversible_command ();
|
||||
}
|
||||
|
||||
for (vector<RegionView*>::iterator x = copies.begin(); x != copies.end(); ++x) {
|
||||
delete *x;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __ardour_svn_revision_h__
|
||||
#define __ardour_svn_revision_h__
|
||||
static const char* ardour_svn_revision = "1744";
|
||||
static const char* ardour_svn_revision = "1745";
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue