diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2008-10-20 14:22:54 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2008-10-20 14:22:54 +0000 |
commit | fee6b1ea50e16ffe8cb151f526d939d4e69e6f81 (patch) | |
tree | 3e8f5ff549fdad6ae5140ddabd58d3c7d560923c | |
parent | ec946ac79325b5b968513861f87e15fbba06b54f (diff) |
fix up region gain line dragging; prevent press-drag-release from creating new region gain points, only click should do that
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@3984 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | gtk2_ardour/editor.h | 2 | ||||
-rw-r--r-- | gtk2_ardour/editor_mouse.cc | 55 |
2 files changed, 47 insertions, 10 deletions
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index fab3e8ec03..d8b9c66dbf 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1303,6 +1303,8 @@ class Editor : public PublicEditor Gtk::Menu fade_context_menu; void popup_fade_context_menu (int, int, ArdourCanvas::Item*, ItemType); + void region_gain_motion_callback (ArdourCanvas::Item*, GdkEvent*); + void start_fade_in_grab (ArdourCanvas::Item*, GdkEvent*); void start_fade_out_grab (ArdourCanvas::Item*, GdkEvent*); void fade_in_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*); diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 77b71b963b..9e656464c6 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -702,7 +702,13 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp case MouseGain: switch (item_type) { case RegionItem: - // start_line_grab_from_regionview (item, event); + /* start a grab so that if we finish after moving + we can tell what happened. + */ + drag_info.item = item; + drag_info.motion_callback = &Editor::region_gain_motion_callback; + drag_info.finished_callback = 0; + start_grab (event, current_canvas_cursor); break; case GainControlPointItem: @@ -1107,7 +1113,13 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT switch (item_type) { case RegionItem: - dynamic_cast<AudioRegionView*>(clicked_regionview)->add_gain_point_event (item, event); + /* check that we didn't drag before releasing, since + its really annoying to create new control + points when doing this. + */ + if (drag_info.first_move) { + dynamic_cast<AudioRegionView*>(clicked_regionview)->add_gain_point_event (item, event); + } return true; break; @@ -1733,7 +1745,9 @@ Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item if (!from_autoscroll) { maybe_autoscroll_horizontally (&event->motion); } - (this->*(drag_info.motion_callback)) (item, event); + if (drag_info.motion_callback) { + (this->*(drag_info.motion_callback)) (item, event); + } goto handled; } goto not_handled; @@ -1743,6 +1757,15 @@ Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item } switch (mouse_mode) { + case MouseGain: + if (item_type == RegionItem) { + if (drag_info.item && drag_info.motion_callback) { + (this->*(drag_info.motion_callback)) (item, event); + } + goto handled; + } + break; + case MouseObject: case MouseRange: case MouseZoom: @@ -1752,7 +1775,9 @@ Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item if (!from_autoscroll) { maybe_autoscroll (&event->motion); } - (this->*(drag_info.motion_callback)) (item, event); + if (drag_info.motion_callback) { + (this->*(drag_info.motion_callback)) (item, event); + } goto handled; } goto not_handled; @@ -1922,6 +1947,14 @@ Editor::end_grab (ArdourCanvas::Item* item, GdkEvent* event) } void +Editor::region_gain_motion_callback (ArdourCanvas::Item* item, GdkEvent* event) +{ + if (drag_info.first_move && drag_info.move_threshold_passed) { + drag_info.first_move = false; + } +} + +void Editor::start_fade_in_grab (ArdourCanvas::Item* item, GdkEvent* event) { drag_info.item = item; @@ -3042,8 +3075,11 @@ Editor::start_line_grab (AutomationLine* line, GdkEvent* event) start_grab (event, fader_cursor); - /* fix grab y */ - + /* store grab start in parent frame */ + + drag_info.grab_x = cx; + drag_info.grab_y = cy; + double fraction = 1.0 - (cy / line->height()); line->start_drag (0, drag_info.grab_frame, fraction); @@ -3059,20 +3095,18 @@ Editor::line_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event) AutomationLine* line = reinterpret_cast<AutomationLine *> (drag_info.data); double dy = drag_info.current_pointer_y - drag_info.last_pointer_y; - + if (event->button.state & Keyboard::SecondaryModifier) { dy *= 0.1; } - double cx = drag_info.current_pointer_x; double cy = drag_info.grab_y + drag_info.cumulative_y_drag + dy; // calculate zero crossing point. back off by .01 to stay on the // positive side of zero - double _unused = 0; double zero_gain_y = (1.0 - ZERO_GAIN_FRACTION) * line->height() - .01; - line->parent_group().i2w(_unused, zero_gain_y); + // line->parent_group().i2w(_unused, zero_gain_y); // make sure we hit zero when passing through if ((cy < zero_gain_y and (cy - dy) > zero_gain_y) @@ -3085,6 +3119,7 @@ Editor::line_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event) cy = max (0.0, cy); cy = min ((double) line->height(), cy); + double fraction = 1.0 - (cy / line->height()); bool push; |