more MIDI paste improvements, plus move region-mute binding to PRIMARY-m and use...
[ardour.git] / gtk2_ardour / editor_drag.cc
index 042ae5dd1f4da68ce70e4e349f6c35e68287c77d..1f7447ca0ed00166b0e2def9edf1f456f3ab9774 100644 (file)
@@ -253,6 +253,7 @@ RegionDrag::region_going_away (RegionView* v)
 
 RegionMotionDrag::RegionMotionDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v, bool b)
        : RegionDrag (e, i, p, v),
+         _dest_trackview (0),
          _dest_layer (0),
          _brushing (b)
 {
@@ -279,7 +280,7 @@ RegionMotionDrag::get_time_axis_view_summary ()
        /* get a bitmask representing the visible tracks */
 
        for (Editor::TrackViewList::iterator i = _editor->track_views.begin(); i != _editor->track_views.end(); ++i) {
-               RouteTimeAxisViewPtr rtv = boost::dynamic_pointer_cast<RouteTimeAxisView> (*i);
+               RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
                TimeAxisView::Children children_list;
                
                /* zeroes are audio/MIDI tracks. ones are other types. */
@@ -309,7 +310,7 @@ RegionMotionDrag::get_time_axis_view_summary ()
 
 bool
 RegionMotionDrag::compute_y_delta (
-       TimeAxisViewConstPtr last_pointer_view, TimeAxisViewPtr current_pointer_view,
+       TimeAxisView const * last_pointer_view, TimeAxisView* current_pointer_view,
        int32_t last_pointer_layer, int32_t current_pointer_layer,
        TimeAxisViewSummary const & tavs,
        int32_t* pointer_order_span, int32_t* pointer_layer_span,
@@ -365,9 +366,9 @@ RegionMotionDrag::compute_y_delta (
                        iy1 += _editor->vertical_adjustment.get_value() - _editor->canvas_timebars_vsize;
 
                        /* get the new trackview for this particular region */
-                       pair<TimeAxisViewPtr, int> const tvp = _editor->trackview_by_y_position (iy1);
+                       pair<TimeAxisView*, int> const tvp = _editor->trackview_by_y_position (iy1);
                        assert (tvp.first);
-                       RouteTimeAxisViewPtr rtv = boost::dynamic_pointer_cast<RouteTimeAxisView> (tvp.first);
+                       RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tvp.first);
 
                        /* XXX: not sure that we should be passing canvas_pointer_order_span in here,
                           as surely this is a per-region thing... */
@@ -494,14 +495,14 @@ RegionMotionDrag::motion (GdkEvent* event, bool first_move)
           current_pointer_layer the current layer on that TimeAxisView; in this code layer numbers
           are with respect to how the view's layers are displayed; if we are in Overlaid mode, layer
           is always 0 regardless of what the region's "real" layer is */
-       RouteTimeAxisViewPtr current_pointer_view;
+       RouteTimeAxisView* current_pointer_view;
        layer_t current_pointer_layer;
        if (!check_possible (&current_pointer_view, &current_pointer_layer)) {
                return;
        }
 
        /* TimeAxisView that we were pointing at last time we entered this method */
-       TimeAxisViewConstPtr const last_pointer_view = _dest_trackview;
+       TimeAxisView const * const last_pointer_view = _dest_trackview;
        /* the order of the track that we were pointing at last time we entered this method */
        int32_t const last_pointer_order = last_pointer_view->order ();
        /* the layer that we were pointing at last time we entered this method */
@@ -572,7 +573,7 @@ RegionMotionDrag::motion (GdkEvent* event, bool first_move)
                        
                        // hide any dependent views 
                        
-                       rv->get_time_axis_view()->hide_dependent_views (*rv);
+                       rv->get_time_axis_view().hide_dependent_views (*rv);
                        
                        /* 
                           reparent to a non scrolling group so that we can keep the 
@@ -588,8 +589,8 @@ RegionMotionDrag::motion (GdkEvent* event, bool first_move)
                }
                
                /* current view for this particular region */
-               pair<TimeAxisViewPtr, int> pos = _editor->trackview_by_y_position (iy1);
-               RouteTimeAxisViewPtr rtv = boost::dynamic_pointer_cast<RouteTimeAxisView> (pos.first);
+               pair<TimeAxisView*, int> pos = _editor->trackview_by_y_position (iy1);
+               RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (pos.first);
                
                if (pointer_order_span != 0 && !clamp_y_axis) {
                        
@@ -670,8 +671,8 @@ RegionMotionDrag::motion (GdkEvent* event, bool first_move)
                                
                                /* find out where we'll be when we move and set height accordingly */
                                
-                               pair<TimeAxisViewPtr, int> const pos = _editor->trackview_by_y_position (iy1 + y_delta);
-                               RouteTimeAxisViewConstPtr temp_rtv = boost::dynamic_pointer_cast<const RouteTimeAxisView> (pos.first);
+                               pair<TimeAxisView*, int> const pos = _editor->trackview_by_y_position (iy1 + y_delta);
+                               RouteTimeAxisView const * temp_rtv = dynamic_cast<RouteTimeAxisView*> (pos.first);
                                rv->set_height (temp_rtv->view()->child_height());
                                
                                /* if you un-comment the following, the region colours will follow
@@ -719,7 +720,7 @@ RegionMoveDrag::motion (GdkEvent* event, bool first_move)
 }
 
 void
-RegionMoveDrag::finished (GdkEvent* event, bool movement_occurred)
+RegionMoveDrag::finished (GdkEvent* /*event*/, bool movement_occurred)
 {
        bool nocommit = true;
        vector<RegionView*> copies;
@@ -733,8 +734,8 @@ RegionMoveDrag::finished (GdkEvent* event, bool movement_occurred)
        pair<PlaylistSet::iterator,bool> insert_result, frozen_insert_result;
        nframes64_t drag_delta;
        bool changed_tracks, changed_position;
-       map<RegionView*, RouteTimeAxisViewPtr> final;
-       RouteTimeAxisViewPtr source_tv;
+       map<RegionView*, RouteTimeAxisView*> final;
+       RouteTimeAxisView* source_tv;
 
        if (!movement_occurred) {
                /* just a click */
@@ -783,7 +784,7 @@ RegionMoveDrag::finished (GdkEvent* event, bool movement_occurred)
        }
 
        changed_position = (_last_frame_position != (nframes64_t) (_primary->region()->position()));
-       changed_tracks = (_dest_trackview != _primary->get_time_axis_view());
+       changed_tracks = (_dest_trackview != &_primary->get_time_axis_view());
 
        drag_delta = _primary->region()->position() - _last_frame_position;
 
@@ -795,7 +796,7 @@ RegionMoveDrag::finished (GdkEvent* event, bool movement_occurred)
        for (list<RegionView*>::const_iterator i = _views.begin(); i != _views.end(); ) {
 
                RegionView* rv = (*i);
-               RouteTimeAxisViewPtr dest_rtv = final[*i];
+               RouteTimeAxisView* dest_rtv = final[*i];
 
                nframes64_t where;
 
@@ -891,7 +892,7 @@ RegionMoveDrag::finished (GdkEvent* event, bool movement_occurred)
                           because we may have copied the region and it has not been attached to a playlist.
                        */
 
-                       assert ((source_tv = boost::dynamic_pointer_cast<RouteTimeAxisView> (rv->get_time_axis_view())));
+                       assert ((source_tv = dynamic_cast<RouteTimeAxisView*> (&rv->get_time_axis_view())));
                        assert ((ds = source_tv->get_diskstream()));
                        assert ((from_playlist = ds->playlist()));
 
@@ -1059,12 +1060,12 @@ RegionMotionDrag::copy_regions (GdkEvent* event)
 }
 
 bool
-RegionMotionDrag::check_possible (RouteTimeAxisViewPtr* tv, layer_t* layer)
+RegionMotionDrag::check_possible (RouteTimeAxisView** tv, layer_t* layer)
 {
        /* Which trackview is this ? */
 
-       pair<TimeAxisViewPtr, int> const tvp = _editor->trackview_by_y_position (current_pointer_y ());
-       (*tv) = boost::dynamic_pointer_cast<RouteTimeAxisView> (tvp.first);
+       pair<TimeAxisView*, int> const tvp = _editor->trackview_by_y_position (current_pointer_y ());
+       (*tv) = dynamic_cast<RouteTimeAxisView*> (tvp.first);
        (*layer) = tvp.second;
 
        if (*tv && (*tv)->layer_display() == Overlaid) {
@@ -1176,7 +1177,7 @@ RegionMoveDrag::RegionMoveDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p,
        : RegionMotionDrag (e, i, p, v, b),
          _copy (c)
 {
-       TimeAxisViewPtr const tv = _primary->get_time_axis_view ();
+       TimeAxisView* const tv = &_primary->get_time_axis_view ();
        
        _dest_trackview = tv;
        if (tv->layer_display() == Overlaid) {
@@ -1186,7 +1187,7 @@ RegionMoveDrag::RegionMoveDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p,
        }
 
        double speed = 1;
-       RouteTimeAxisViewPtr rtv = boost::dynamic_pointer_cast<RouteTimeAxisView> (tv);
+       RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tv);
        if (rtv && rtv->is_track()) {
                speed = rtv->get_diskstream()->speed ();
        }
@@ -1202,11 +1203,11 @@ RegionMoveDrag::start_grab (GdkEvent* event, Gdk::Cursor* c)
        _pointer_frame_offset = _grab_frame - _last_frame_position;
 }
 
-RegionInsertDrag::RegionInsertDrag (Editor* e, boost::shared_ptr<Region> r, RouteTimeAxisViewPtr v, nframes64_t pos)
+RegionInsertDrag::RegionInsertDrag (Editor* e, boost::shared_ptr<Region> r, RouteTimeAxisView* v, nframes64_t pos)
        : RegionMotionDrag (e, 0, 0, list<RegionView*> (), false)
 {
-       assert ((boost::dynamic_pointer_cast<AudioRegion> (r) && boost::dynamic_pointer_cast<AudioTimeAxisView> (v)) ||
-               (boost::dynamic_pointer_cast<MidiRegion> (r) && boost::dynamic_pointer_cast<MidiTimeAxisView> (v)));
+       assert ((boost::dynamic_pointer_cast<AudioRegion> (r) && dynamic_cast<AudioTimeAxisView*> (v)) ||
+               (boost::dynamic_pointer_cast<MidiRegion> (r) && dynamic_cast<MidiTimeAxisView*> (v)));
 
        _primary = v->view()->create_region_view (r, false, false);
        
@@ -1221,10 +1222,10 @@ RegionInsertDrag::RegionInsertDrag (Editor* e, boost::shared_ptr<Region> r, Rout
        _dest_layer = _primary->region()->layer ();
 }
 
-map<RegionView*, RouteTimeAxisViewPtr>
+map<RegionView*, RouteTimeAxisView*>
 RegionMotionDrag::find_time_axis_views ()
 {
-       map<RegionView*, RouteTimeAxisViewPtr> tav;
+       map<RegionView*, RouteTimeAxisView*> tav;
        
        for (list<RegionView*>::const_iterator i = _views.begin(); i != _views.end(); ++i) {
 
@@ -1233,8 +1234,8 @@ RegionMotionDrag::find_time_axis_views ()
                (*i)->get_canvas_frame()->i2w (ix1, iy1);
                iy1 += _editor->vertical_adjustment.get_value() - _editor->canvas_timebars_vsize;
 
-               pair<TimeAxisViewPtr, int> tv = _editor->trackview_by_y_position (iy1);
-               tav[*i] = boost::dynamic_pointer_cast<RouteTimeAxisView> (tv.first);
+               pair<TimeAxisView*, int> tv = _editor->trackview_by_y_position (iy1);
+               tav[*i] = dynamic_cast<RouteTimeAxisView*> (tv.first);
        }
 
        return tav;
@@ -1242,13 +1243,13 @@ RegionMotionDrag::find_time_axis_views ()
 
 
 void
-RegionInsertDrag::finished (GdkEvent* event, bool movement_occurred)
+RegionInsertDrag::finished (GdkEvent* /*event*/, bool /*movement_occurred*/)
 {
        _editor->update_canvas_now ();
 
-       map<RegionView*, RouteTimeAxisViewPtr> final = find_time_axis_views ();
+       map<RegionView*, RouteTimeAxisView*> final = find_time_axis_views ();
        
-       RouteTimeAxisViewPtr dest_rtv = final[_primary];
+       RouteTimeAxisView* dest_rtv = final[_primary];
 
        _primary->get_canvas_group()->reparent (*dest_rtv->view()->canvas_item());
        _primary->get_canvas_group()->property_y() = 0;
@@ -1279,9 +1280,9 @@ struct RegionSelectionByPosition {
 };
 
 void
-RegionSpliceDrag::motion (GdkEvent* event, bool)
+RegionSpliceDrag::motion (GdkEvent* /*event*/, bool)
 {
-       RouteTimeAxisViewPtr tv;
+       RouteTimeAxisView* tv;
        layer_t layer;
        
        if (!check_possible (&tv, &layer)) {
@@ -1303,7 +1304,7 @@ RegionSpliceDrag::motion (GdkEvent* event, bool)
 
        for (RegionSelection::iterator i = copy.begin(); i != copy.end(); ++i) {
 
-               RouteTimeAxisViewPtr atv = boost::dynamic_pointer_cast<RouteTimeAxisView> ((*i)->get_time_axis_view());
+               RouteTimeAxisView* atv = dynamic_cast<RouteTimeAxisView*> (&(*i)->get_time_axis_view());
 
                if (!atv) {
                        continue;
@@ -1337,13 +1338,13 @@ RegionSpliceDrag::motion (GdkEvent* event, bool)
 }
 
 void
-RegionSpliceDrag::finished (GdkEvent* event, bool)
+RegionSpliceDrag::finished (GdkEvent* /*event*/, bool)
 {
        
 }
 
 
-RegionCreateDrag::RegionCreateDrag (Editor* e, ArdourCanvas::Item* i, TimeAxisViewPtr v)
+RegionCreateDrag::RegionCreateDrag (Editor* e, ArdourCanvas::Item* i, TimeAxisView* v)
        : Drag (e, i),
          _view (v)
 {
@@ -1360,7 +1361,7 @@ RegionCreateDrag::start_grab (GdkEvent* event, Gdk::Cursor *)
 
 
 void
-RegionCreateDrag::motion (GdkEvent* event, bool first_move)
+RegionCreateDrag::motion (GdkEvent* /*event*/, bool first_move)
 {
        if (first_move) {
                // TODO: create region-create-drag region view here
@@ -1372,13 +1373,13 @@ RegionCreateDrag::motion (GdkEvent* event, bool first_move)
 void
 RegionCreateDrag::finished (GdkEvent* event, bool movement_occurred)
 {
-       MidiTimeAxisViewPtr mtv = boost::dynamic_pointer_cast<MidiTimeAxisView> (_dest_trackview);
+       MidiTimeAxisView* mtv = dynamic_cast<MidiTimeAxisView*> (_dest_trackview);
        if (!mtv) {
                return;
        }
 
        const boost::shared_ptr<MidiDiskstream> diskstream =
-               boost::dynamic_pointer_cast<MidiDiskstream>(mtv->view()->trackview()->track()->diskstream());
+               boost::dynamic_pointer_cast<MidiDiskstream>(mtv->view()->trackview().track()->diskstream());
        
        if (!diskstream) {
                warning << "Cannot create non-MIDI region" << endl;
@@ -1414,7 +1415,7 @@ RegionCreateDrag::finished (GdkEvent* event, bool movement_occurred)
 
 
 void
-RegionGainDrag::motion (GdkEvent* event, bool)
+RegionGainDrag::motion (GdkEvent* /*event*/, bool)
 {
        
 }
@@ -1435,8 +1436,8 @@ void
 TrimDrag::start_grab (GdkEvent* event, Gdk::Cursor *)
 {
        double speed = 1.0;
-       TimeAxisViewPtr tvp = _primary->get_time_axis_view ();
-       RouteTimeAxisViewPtr tv = boost::dynamic_pointer_cast<RouteTimeAxisView>(tvp);
+       TimeAxisView* tvp = &_primary->get_time_axis_view ();
+       RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
 
        if (tv && tv->is_track()) {
                speed = tv->get_diskstream()->speed();
@@ -1489,8 +1490,8 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
        */ 
 
        double speed = 1.0;
-       TimeAxisViewPtr tvp = _primary->get_time_axis_view ();
-       RouteTimeAxisViewPtr tv = boost::dynamic_pointer_cast<RouteTimeAxisView>(tvp);
+       TimeAxisView* tvp = &_primary->get_time_axis_view ();
+       RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
        pair<set<boost::shared_ptr<Playlist> >::iterator,bool> insert_result;
 
        if (tv && tv->is_track()) {
@@ -2433,7 +2434,7 @@ ControlPointDrag::ControlPointDrag (Editor* e, ArdourCanvas::Item* i)
 
 
 void
-ControlPointDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
+ControlPointDrag::start_grab (GdkEvent* event, Gdk::Cursor* /*cursor*/)
 {
        Drag::start_grab (event, _editor->fader_cursor);
 
@@ -2551,7 +2552,7 @@ LineDrag::LineDrag (Editor* e, ArdourCanvas::Item* i)
 
 }
 void
-LineDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
+LineDrag::start_grab (GdkEvent* event, Gdk::Cursor* /*cursor*/)
 {
        _line = reinterpret_cast<AutomationLine*> (_item->get_data ("line"));
        assert (_line);
@@ -2761,7 +2762,7 @@ TimeFXDrag::motion (GdkEvent* event, bool)
        }
 
        if (_current_pointer_frame > rv->region()->position()) {
-               rv->get_time_axis_view()->show_timestretch (rv->region()->position(), _current_pointer_frame);
+               rv->get_time_axis_view().show_timestretch (rv->region()->position(), _current_pointer_frame);
        }
 
        _last_pointer_frame = _current_pointer_frame;
@@ -2770,9 +2771,9 @@ TimeFXDrag::motion (GdkEvent* event, bool)
 }
 
 void
-TimeFXDrag::finished (GdkEvent* event, bool movement_occurred)
+TimeFXDrag::finished (GdkEvent* /*event*/, bool movement_occurred)
 {
-       _primary->get_time_axis_view()->hide_timestretch ();
+       _primary->get_time_axis_view().hide_timestretch ();
 
        if (!movement_occurred) {
                return;
@@ -2813,13 +2814,13 @@ ScrubDrag::start_grab (GdkEvent* event, Gdk::Cursor *)
 }
 
 void
-ScrubDrag::motion (GdkEvent* event, bool)
+ScrubDrag::motion (GdkEvent* /*event*/, bool)
 {
        _editor->scrub ();
 }
 
 void
-ScrubDrag::finished (GdkEvent* event, bool movement_occurred)
+ScrubDrag::finished (GdkEvent* /*event*/, bool movement_occurred)
 {
        if (movement_occurred && _editor->session) {
                /* make sure we stop */
@@ -3180,6 +3181,7 @@ RangeMarkerBarDrag::finished (GdkEvent* event, bool movement_occurred)
        
        if (movement_occurred) {
                motion (event, false);
+               _drag_rect->hide();
 
                switch (_operation) {
                case CreateRangeMarker:
@@ -3201,15 +3203,12 @@ RangeMarkerBarDrag::finished (GdkEvent* event, bool movement_occurred)
                        XMLNode &after = _editor->session->locations()->get_state();
                        _editor->session->add_command(new MementoCommand<Locations>(*(_editor->session->locations()), &before, &after));
                        _editor->commit_reversible_command ();
-                       
-                       _drag_rect->hide();
                        break;
                    }
 
                case CreateTransportMarker:
                        // popup menu to pick loop or punch
                        _editor->new_transport_marker_context_menu (&event->button, _item);
-                       
                        break;
                }
        } else {
@@ -3239,7 +3238,7 @@ RangeMarkerBarDrag::finished (GdkEvent* event, bool movement_occurred)
 
                        case MouseRange:
                                /* find the two markers on either side of the click and make the range out of it */
-                               _editor->selection->set (TimeAxisViewPtr (), start, end);
+                               _editor->selection->set (0, start, end);
                                break;
 
                        default: