summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2007-04-26 16:17:40 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2007-04-26 16:17:40 +0000
commitf857460dd3a8af83253f72f276a5e038b21edb56 (patch)
tree0c372ffdf32810cf48184673afbf8ce421b2aaf4
parentee8f2979896a2c634aeb225933f63e1b1e92702f (diff)
fix issues with copy-fixed-time drag
git-svn-id: svn://localhost/ardour2/trunk@1750 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/editor_mouse.cc55
-rw-r--r--svn_revision.h2
2 files changed, 40 insertions, 17 deletions
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc
index c46571ada6..5a25c2e4b8 100644
--- a/gtk2_ardour/editor_mouse.cc
+++ b/gtk2_ardour/editor_mouse.cc
@@ -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;
}
@@ -2768,7 +2767,7 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
drag_info.want_move_threshold = false; // don't copy again
/* duplicate the region(s) */
-
+
vector<RegionView*> new_regionviews;
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) {
@@ -2801,7 +2800,7 @@ Editor::region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
/* reset drag_info data to reflect the fact that we are dragging the copies */
drag_info.data = new_regionviews.front();
-
+
swap_grab (new_regionviews.front()->get_canvas_group (), 0, event->motion.time);
}
@@ -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;
}
@@ -3296,7 +3309,7 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
vector<RegionView*> new_selection;
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ) {
-
+
RegionView* rv = (*i);
double ix1, ix2, iy1, iy2;
@@ -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,12 +3377,19 @@ 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 (selection->regions.empty()) {
- break;
- } else {
- i = selection->regions.by_layer().begin();
+ if (drag_info.copy) {
+ ++i;
+ } else {
+ if (selection->regions.empty()) {
+ break;
+ } else {
+ i = selection->regions.by_layer().begin();
+ }
}
}
@@ -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
diff --git a/svn_revision.h b/svn_revision.h
index d65b195c56..06531d2966 100644
--- a/svn_revision.h
+++ b/svn_revision.h
@@ -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