From 5cd27a4a85919b289d666a21e2b682bed8a9f970 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 21 Dec 2011 02:53:33 +0000 Subject: similar to treatment of meter markers, remove tempo marks from the tempo map while dragging, to avoid wierd side effects git-svn-id: svn://localhost/ardour2/branches/3.0@11047 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor_drag.cc | 78 +++++++++++++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 22 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 3847d144d3..b90cb88c6f 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -1947,6 +1947,17 @@ void MeterMarkerDrag::aborted (bool) { _marker->set_position (_marker->meter().frame ()); + + /* XXX problem: we don't know if we've moved yet, so we don't + know if the marker is a copy yet or not + */ + + TempoMap& map (_editor->session()->tempo_map()); + /* we removed it before, so add it back now */ + map.add_meter (_marker->meter(), _marker->meter().frame()); + // delete the dummy marker we used for visual representation while moving. + // a new visual marker will show up automatically. + delete _marker; } TempoMarkerDrag::TempoMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c) @@ -1962,14 +1973,35 @@ TempoMarkerDrag::TempoMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c) void TempoMarkerDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor) { - if (_copy) { + Drag::start_grab (event, cursor); + show_verbose_cursor_time (adjusted_current_frame (event)); +} +void +TempoMarkerDrag::setup_pointer_frame_offset () +{ + _pointer_frame_offset = raw_grab_frame() - _marker->tempo().frame(); +} + +void +TempoMarkerDrag::motion (GdkEvent* event, bool first_move) +{ + if (first_move) { + + // create a dummy marker for visual representation of moving the + // section, because whether its a copy or not, we're going to + // leave or lose the original marker (leave if its a copy; lose if its + // not, because we'll remove it from the map). + // create a dummy marker for visual representation of moving the copy. // The actual copying is not done before we reach the finish callback. + char name[64]; snprintf (name, sizeof (name), "%.2f", _marker->tempo().beats_per_minute()); - TempoMarker* new_marker = new TempoMarker ( + TempoSection section (_marker->tempo()); + + _marker = new TempoMarker ( *_editor, *_editor->tempo_group, ARDOUR_UI::config()->canvasvar_TempoMarker.get(), @@ -1977,25 +2009,16 @@ TempoMarkerDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor) *new TempoSection (_marker->tempo()) ); - _item = &new_marker->the_item (); - _marker = new_marker; + /* use the new marker for the grab */ + swap_grab (&_marker->the_item(), 0, GDK_CURRENT_TIME); + if (!_copy) { + TempoMap& map (_editor->session()->tempo_map()); + /* remove the section while we drag it */ + map.remove_tempo (section); + } } - Drag::start_grab (event, cursor); - - show_verbose_cursor_time (adjusted_current_frame (event)); -} - -void -TempoMarkerDrag::setup_pointer_frame_offset () -{ - _pointer_frame_offset = raw_grab_frame() - _marker->tempo().frame(); -} - -void -TempoMarkerDrag::motion (GdkEvent* event, bool) -{ framepos_t const pf = adjusted_current_frame (event); _marker->set_position (pf); show_verbose_cursor_time (pf); @@ -2023,23 +2046,34 @@ TempoMarkerDrag::finished (GdkEvent* event, bool movement_occurred) _editor->session()->add_command (new MementoCommand(map, &before, &after)); _editor->commit_reversible_command (); - // delete the dummy marker we used for visual representation of copying. - // a new visual marker will show up automatically. - delete _marker; } else { _editor->begin_reversible_command (_("move tempo mark")); XMLNode &before = map.get_state(); - map.move_tempo (_marker->tempo(), when); + /* we removed it before, so add it back now */ + map.add_tempo (_marker->tempo(), when); XMLNode &after = map.get_state(); _editor->session()->add_command (new MementoCommand(map, &before, &after)); _editor->commit_reversible_command (); } + + // delete the dummy marker we used for visual representation while moving. + // a new visual marker will show up automatically. + delete _marker; } void TempoMarkerDrag::aborted (bool) { _marker->set_position (_marker->tempo().frame()); + /* XXX problem: we don't know if we've moved yet, so we don't + know if the marker is a copy yet or not + */ + TempoMap& map (_editor->session()->tempo_map()); + /* we removed it before, so add it back now */ + map.add_tempo (_marker->tempo(), _marker->tempo().frame()); + // delete the dummy marker we used for visual representation while moving. + // a new visual marker will show up automatically. + delete _marker; } CursorDrag::CursorDrag (Editor* e, ArdourCanvas::Item* i, bool s) -- cgit v1.2.3