make dragging a region from the list not crash.
[ardour.git] / gtk2_ardour / midi_region_view.h
index f8cb9c058cc1d0f2c0425b13917a2d2021334176..635307d4dd7d71345e54b87f66ccad38dad5329a 100644 (file)
@@ -180,7 +180,7 @@ public:
        void note_diff_add_note (const boost::shared_ptr<NoteType> note, bool selected, bool show_velocity = false);
        void note_diff_remove_note (NoteBase* ev);
 
-       void apply_diff (bool as_subcommand = false);
+       void apply_diff (bool as_subcommand = false, bool was_copy = false);
        void abort_command();
 
        void   note_entered(NoteBase* ev);
@@ -201,7 +201,9 @@ public:
        void   invert_selection ();
 
        void move_selection(double dx, double dy, double cumulative_dy);
-       void note_dropped (NoteBase* ev, ARDOUR::frameoffset_t, int8_t d_note);
+       void note_dropped (NoteBase* ev, ARDOUR::frameoffset_t, int8_t d_note, bool copy);
+       NoteBase* copy_selection ();
+       void move_copies(double dx, double dy, double cumulative_dy);
 
        void select_notes (std::list<Evoral::event_id_t>);
        void select_matching_notes (uint8_t notenum, uint16_t channel_mask, bool add, bool extend);
@@ -359,6 +361,7 @@ private:
        friend class NoteDrag;
        friend class NoteCreateDrag;
        friend class HitCreateDrag;
+       friend class MidiGhostRegion;
 
        friend class EditNoteDialog;
 
@@ -409,9 +412,10 @@ private:
        uint8_t  _current_range_min;
        uint8_t  _current_range_max;
 
-       typedef std::list<NoteBase*>                          Events;
-       typedef std::vector< boost::shared_ptr<PatchChange> > PatchChanges;
-       typedef std::vector< boost::shared_ptr<SysEx> >       SysExes;
+       typedef boost::unordered_map<boost::shared_ptr<NoteType>, NoteBase*>                 Events;
+       typedef boost::unordered_map<ARDOUR::MidiModel::PatchChangePtr, boost::shared_ptr<PatchChange> > PatchChanges;
+       typedef std::vector< boost::shared_ptr<SysEx> >                                      SysExes;
+       typedef std::vector<NoteBase*> CopyDragEvents;
 
        ARDOUR::BeatsFramesConverter _region_relative_time_converter;
        ARDOUR::BeatsFramesConverter _source_relative_time_converter;
@@ -419,6 +423,7 @@ private:
 
        boost::shared_ptr<ARDOUR::MidiModel> _model;
        Events                               _events;
+       CopyDragEvents                       _copy_drag_events;
        PatchChanges                         _patch_changes;
        SysExes                              _sys_exes;
        Note**                               _active_notes;
@@ -438,9 +443,6 @@ private:
        /** Currently selected NoteBase objects */
        Selection _selection;
 
-       bool _sort_needed;
-       void time_sort_events ();
-
        MidiCutBuffer* selection_as_cut_buffer () const;
 
        /** New notes (created in the current command) which should be selected