summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2008-10-20 14:22:54 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2008-10-20 14:22:54 +0000
commitfee6b1ea50e16ffe8cb151f526d939d4e69e6f81 (patch)
tree3e8f5ff549fdad6ae5140ddabd58d3c7d560923c
parentec946ac79325b5b968513861f87e15fbba06b54f (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.h2
-rw-r--r--gtk2_ardour/editor_mouse.cc55
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;