make MIDI rubber band selects use the correct canvas item so that event processing...
[ardour.git] / gtk2_ardour / editor_drag.cc
index dab2112edb0ba8c51046f310569949b46a33ded6..2419169c7fb23f7d301ece441c762e7aaced59fc 100644 (file)
@@ -178,6 +178,24 @@ DragManager::motion_handler (GdkEvent* e, bool from_autoscroll)
        return r;
 }
 
+bool
+DragManager::window_motion_handler (GdkEvent* e, bool from_autoscroll)
+{
+       bool r = false;
+
+       _current_pointer_frame = _editor->window_event_frame (e, &_current_pointer_x, &_current_pointer_y);
+
+       for (list<Drag*>::iterator i = _drags.begin(); i != _drags.end(); ++i) {
+               bool const t = (*i)->motion_handler (e, from_autoscroll);
+               if (t) {
+                       r = true;
+               }
+
+       }
+
+       return r;
+}
+
 bool
 DragManager::have_item (ArdourCanvas::Item* i) const
 {
@@ -637,6 +655,7 @@ RegionMotionDrag::motion (GdkEvent* event, bool first_move)
        double const x_delta = compute_x_delta (event, &pending_region_position);
 
        /* Work out the change in y */
+
        int delta_time_axis_view = current_pointer_time_axis_view - _last_pointer_time_axis_view;
        double delta_layer = current_pointer_layer - _last_pointer_layer;
 
@@ -670,12 +689,16 @@ RegionMotionDrag::motion (GdkEvent* event, bool first_move)
                        /* Reparent to a non scrolling group so that we can keep the
                           region selection above all time axis views.
                           Reparenting means that we will have to move the region view
-                          later, as the two parent groups have different coordinates.
+                          within its new parent, as the two parent groups have different coordinates.
                        */
 
+                       ArdourCanvas::Group* rvg = rv->get_canvas_group();
+                       Duple rv_canvas_offset = rvg->item_to_canvas (Duple (0,0));
+
                        rv->get_canvas_group()->reparent (_editor->_region_motion_group);
-                       
+
                        rv->fake_set_opaque (true);
+                       rvg->set_position (rv_canvas_offset);
                }
 
                /* If we have moved tracks, we'll fudge the layer delta so that the
@@ -725,8 +748,7 @@ RegionMotionDrag::motion (GdkEvent* event, bool first_move)
 
                        /* Get the y coordinate of the top of the track that this region is now on */
                        tv->canvas_display()->item_to_canvas (x, y);
-                       y += _editor->get_trackview_group_vertical_offset();
-                       
+
                        /* And adjust for the layer that it should be on */
                        StreamView* cv = tv->view ();
                        switch (cv->layer_display ()) {
@@ -1808,6 +1830,7 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
        TimeAxisView* tvp = &_primary->get_time_axis_view ();
        RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
        pair<set<boost::shared_ptr<Playlist> >::iterator,bool> insert_result;
+       frameoffset_t frame_delta = 0;
 
        if (tv && tv->is_track()) {
                speed = tv->track()->speed();
@@ -1904,27 +1927,11 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
 
        case ContentsTrim:
                {
-                       bool swap_direction = false;
-
-                       if (event && Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
-                               swap_direction = true;
-                       }
-
-                       framecnt_t frame_delta = 0;
-
-                       bool left_direction = false;
-                       if (last_pointer_frame() > adjusted_current_frame(event)) {
-                               left_direction = true;
-                       }
-
-                       if (left_direction) {
-                               frame_delta = (last_pointer_frame() - adjusted_current_frame(event));
-                       } else {
-                               frame_delta = (adjusted_current_frame(event) - last_pointer_frame());
-                       }
+                       frame_delta = (adjusted_current_frame(event) - last_pointer_frame());
+                       // frame_delta = (last_pointer_frame() - adjusted_current_frame(event));
 
                        for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ++i) {
-                               i->view->trim_contents (frame_delta, left_direction, swap_direction);
+                               i->view->move_contents (frame_delta);
                        }
                }
                break;
@@ -1938,7 +1945,7 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
                show_verbose_cursor_time ((framepos_t) (rv->region()->last_frame() / speed));
                break;
        case ContentsTrim:
-               show_verbose_cursor_time (adjusted_current_frame (event));
+               // show_verbose_cursor_time (frame_delta);
                break;
        }
 }
@@ -2139,7 +2146,7 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
                _marker = new MeterMarker (
                        *_editor,
                        *_editor->meter_group,
-                       ARDOUR_UI::config()->canvasvar_MeterMarker.get(),
+                       ARDOUR_UI::config()->get_canvasvar_MeterMarker(),
                        name,
                        *new MeterSection (_marker->meter())
                );
@@ -2258,7 +2265,7 @@ TempoMarkerDrag::motion (GdkEvent* event, bool first_move)
                _marker = new TempoMarker (
                        *_editor,
                        *_editor->tempo_group,
-                       ARDOUR_UI::config()->canvasvar_TempoMarker.get(),
+                       ARDOUR_UI::config()->get_canvasvar_TempoMarker(),
                        name,
                        *new TempoSection (_marker->tempo())
                        );
@@ -2331,9 +2338,10 @@ TempoMarkerDrag::aborted (bool moved)
        }
 }
 
-CursorDrag::CursorDrag (Editor* e, ArdourCanvas::Item* i, bool s)
-       : Drag (e, i),
-         _stop (s)
+CursorDrag::CursorDrag (Editor* e, EditorCursor& c, bool s)
+       : Drag (e, &c.time_bar_canvas_item())
+       , _cursor (c)
+       , _stop (s)
 {
        DEBUG_TRACE (DEBUG::Drags, "New CursorDrag\n");
 }
@@ -2366,12 +2374,17 @@ CursorDrag::start_grab (GdkEvent* event, Gdk::Cursor* c)
        _grab_zoom = _editor->samples_per_pixel;
 
        framepos_t where = _editor->canvas_event_frame (event, 0, 0);
+
        _editor->snap_to_with_modifier (where, event);
 
        _editor->_dragging_playhead = true;
 
        Session* s = _editor->session ();
 
+       /* grab the track canvas item as well */
+
+       _cursor.track_canvas_item().grab();
+
        if (s) {
                if (_was_rolling && _stop) {
                        s->request_stop ();
@@ -2415,6 +2428,8 @@ CursorDrag::finished (GdkEvent* event, bool movement_occurred)
 {
        _editor->_dragging_playhead = false;
 
+       _cursor.track_canvas_item().ungrab();
+
        if (!movement_occurred && _stop) {
                return;
        }
@@ -2432,6 +2447,8 @@ CursorDrag::finished (GdkEvent* event, bool movement_occurred)
 void
 CursorDrag::aborted (bool)
 {
+       _cursor.track_canvas_item().ungrab();
+
        if (_editor->_dragging_playhead) {
                _editor->session()->request_resume_timecode_transmission ();
                _editor->_dragging_playhead = false;
@@ -3305,7 +3322,7 @@ FeatureLineDrag::motion (GdkEvent*, bool)
                cx = 0;
        }
 
-       boost::optional<Rect> bbox = _line->bounding_box ();
+       boost::optional<ArdourCanvas::Rect> bbox = _line->bounding_box ();
        assert (bbox);
        _line->set (ArdourCanvas::Duple (cx, 2.0), ArdourCanvas::Duple (cx, bbox.get().height ()));
 
@@ -3393,7 +3410,7 @@ RubberbandSelectDrag::motion (GdkEvent* event, bool)
 
                _editor->rubberband_rect->set_y0 (y1);
                _editor->rubberband_rect->set_y1 (y2);
-
+               
                _editor->rubberband_rect->show();
                _editor->rubberband_rect->raise_to_top();
 
@@ -3919,8 +3936,8 @@ RangeMarkerBarDrag::RangeMarkerBarDrag (Editor* e, ArdourCanvas::Item* i, Operat
                                                                      physical_screen_height (_editor->get_window())));
        _drag_rect->hide ();
 
-       _drag_rect->set_fill_color (ARDOUR_UI::config()->canvasvar_RangeDragRect.get());
-       _drag_rect->set_outline_color (ARDOUR_UI::config()->canvasvar_RangeDragRect.get());
+       _drag_rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_RangeDragRect());
+       _drag_rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_RangeDragRect());
 }
 
 void
@@ -4649,7 +4666,7 @@ PatchChangeDrag::setup_pointer_frame_offset ()
 }
 
 MidiRubberbandSelectDrag::MidiRubberbandSelectDrag (Editor* e, MidiRegionView* rv)
-       : RubberbandSelectDrag (e, rv->get_canvas_frame ())
+       : RubberbandSelectDrag (e, rv->get_canvas_group ())
        , _region_view (rv)
 {
 
@@ -4682,7 +4699,7 @@ MidiRubberbandSelectDrag::deselect_things ()
 }
 
 MidiVerticalSelectDrag::MidiVerticalSelectDrag (Editor* e, MidiRegionView* rv)
-       : RubberbandSelectDrag (e, rv->get_canvas_frame ())
+       : RubberbandSelectDrag (e, rv->get_canvas_group ())
        , _region_view (rv)
 {
        _vertical_only = true;
@@ -4883,9 +4900,9 @@ CrossfadeEdgeDrag::motion (GdkEvent*, bool)
        new_length = ar->verify_xfade_bounds (new_length, start);
 
        if (start) {
-               arv->redraw_start_xfade_to (ar, new_length);
+               arv->reset_fade_in_shape_width (ar, new_length);
        } else {
-               arv->redraw_end_xfade_to (ar, new_length);
+               arv->reset_fade_out_shape_width (ar, new_length);
        }
 }