diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2011-12-13 19:43:41 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2011-12-13 19:43:41 +0000 |
commit | b6d1fb0707dbc80e9f05dfcb2458e8e7e6f1c6e3 (patch) | |
tree | 8d5a9f319e0531430d25f3a27fd60e6657c6106f /gtk2_ardour | |
parent | 88d49cdb5734632ada27d2de018533ecd13ac31e (diff) |
fix meter marker drags by not using a fake marker till first move, and swapping the grabbed item to the copy when we do
git-svn-id: svn://localhost/ardour2/branches/3.0@10999 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/editor_drag.cc | 69 |
1 files changed, 35 insertions, 34 deletions
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 20ebe7f98d..3847d144d3 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -1845,7 +1845,6 @@ MeterMarkerDrag::MeterMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c) _copy (c) { DEBUG_TRACE (DEBUG::Drags, "New MeterMarkerDrag\n"); - _marker = reinterpret_cast<MeterMarker*> (_item->get_data ("marker")); assert (_marker); } @@ -1853,36 +1852,6 @@ MeterMarkerDrag::MeterMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c) void MeterMarkerDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor) { - // 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). - - MeterSection section (_marker->meter()); - - if (!section.movable()) { - return; - } - - char name[64]; - snprintf (name, sizeof(name), "%g/%g", _marker->meter().divisions_per_bar(), _marker->meter().note_divisor ()); - - _marker = new MeterMarker ( - *_editor, - *_editor->meter_group, - ARDOUR_UI::config()->canvasvar_MeterMarker.get(), - name, - *new MeterSection (_marker->meter()) - ); - - _item = &_marker->the_item (); - - if (!_copy) { - TempoMap& map (_editor->session()->tempo_map()); - /* remove the section while we drag it */ - map.remove_meter (section); - } - Drag::start_grab (event, cursor); show_verbose_cursor_time (adjusted_current_frame(event)); } @@ -1894,12 +1863,44 @@ MeterMarkerDrag::setup_pointer_frame_offset () } void -MeterMarkerDrag::motion (GdkEvent* event, bool) +MeterMarkerDrag::motion (GdkEvent* event, bool first_move) { - framepos_t const pf = adjusted_current_frame (event); + if (first_move) { - _marker->set_position (pf); + // 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). + + MeterSection section (_marker->meter()); + + if (!section.movable()) { + return; + } + + char name[64]; + snprintf (name, sizeof(name), "%g/%g", _marker->meter().divisions_per_bar(), _marker->meter().note_divisor ()); + + _marker = new MeterMarker ( + *_editor, + *_editor->meter_group, + ARDOUR_UI::config()->canvasvar_MeterMarker.get(), + name, + *new MeterSection (_marker->meter()) + ); + + /* 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_meter (section); + } + } + + framepos_t const pf = adjusted_current_frame (event); + _marker->set_position (pf); show_verbose_cursor_time (pf); } |