avoid .h pollution in last commit
[ardour.git] / gtk2_ardour / midi_region_view.cc
index d76c173af1fa317621cee634a00773d0fb0bbcac..2644be763ab4939b07a628b32dd4cef388c53a65 100644 (file)
@@ -37,6 +37,7 @@
 #include "ardour/midi_diskstream.h"
 #include "ardour/midi_model.h"
 #include "ardour/midi_patch_manager.h"
+#include "ardour/session.h"
 
 #include "evoral/Parameter.hpp"
 #include "evoral/Control.hpp"
@@ -584,7 +585,8 @@ MidiRegionView::display_model(boost::shared_ptr<MidiModel> model)
 {
        _model = model;
        content_connection.disconnect ();
-       content_connection = _model->ContentsChanged.connect(sigc::mem_fun(this, &MidiRegionView::redisplay_model));
+       content_connection = _model->ContentsChanged.connect(
+                       sigc::mem_fun(this, &MidiRegionView::redisplay_model));
        clear_events ();
 
        if (_enable_display) {
@@ -772,7 +774,7 @@ MidiRegionView::redisplay_model()
                (*i)->invalidate ();
        }
 
-       _model->read_lock();
+       MidiModel::ReadLock lock(_model->read_lock());
 
        MidiModel::Notes& notes (_model->notes());
        _optimization_iterator = _events.begin();
@@ -832,8 +834,6 @@ MidiRegionView::redisplay_model()
        display_sysexes();
        display_program_changes();
 
-       _model->read_unlock();
-
        _marked_for_selection.clear ();
        _marked_for_velocity.clear ();
 
@@ -2204,9 +2204,15 @@ MidiRegionView::nudge_notes (bool forward)
        nframes64_t unused;
        nframes64_t distance;
 
-       if ((distance = trackview.editor().get_nudge_distance (ref_point, unused)) == 0) {
+       if (trackview.editor().snap_mode() == Editing::SnapOff) {
+               
+               /* grid is off - use nudge distance */
+
+               distance = trackview.editor().get_nudge_distance (ref_point, unused);
 
-               /* no nudge distance set - use grid */
+       } else {
+
+               /* use grid */
 
                nframes64_t next_pos = ref_point;
 
@@ -2266,11 +2272,12 @@ MidiRegionView::note_entered(ArdourCanvas::CanvasNoteEvent* ev)
                note_selected(ev, true);
        }
 
-       PublicEditor& editor (trackview.editor());
        char buf[4];
        snprintf (buf, sizeof (buf), "%d", (int) ev->note()->note());
+       // This causes an infinite loop on note add sometimes
+       //PublicEditor& editor (trackview.editor());
        //editor.show_verbose_canvas_cursor_with (Evoral::midi_note_name (ev->note()->note()));
-       editor.show_verbose_canvas_cursor_with (buf);
+       //editor.show_verbose_canvas_cursor_with (buf);
 }
 
 void
@@ -2368,17 +2375,12 @@ MidiRegionView::cut_copy_clear (Editing::CutCopyOp op)
 MidiCutBuffer*
 MidiRegionView::selection_as_cut_buffer () const
 {
-       NoteList notes;
+       Notes notes;
 
        for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
-               notes.push_back (boost::shared_ptr<NoteType> (new NoteType (*((*i)->note().get()))));
+               notes.insert (boost::shared_ptr<NoteType> (new NoteType (*((*i)->note().get()))));
        }
 
-       /* sort them into time order */
-
-       Evoral::Sequence<Evoral::MusicalTime>::LaterNoteComparator cmp;
-       sort (notes.begin(), notes.end(),  cmp);
-
        MidiCutBuffer* cb = new MidiCutBuffer (trackview.session());
        cb->set (notes);
 
@@ -2399,16 +2401,16 @@ MidiRegionView::paste (nframes64_t pos, float times, const MidiCutBuffer& mcb)
        Evoral::MusicalTime duration;
        Evoral::MusicalTime end_point;
 
-       duration = mcb.notes().back()->end_time() - mcb.notes().front()->time();
+       duration = (*mcb.notes().rbegin())->end_time() - (*mcb.notes().begin())->time();
        paste_pos_beats = frames_to_beats (pos - _region->position());
-       beat_delta = mcb.notes().front()->time() - paste_pos_beats;
+       beat_delta = (*mcb.notes().begin())->time() - paste_pos_beats;
        paste_pos_beats = 0;
 
        _selection.clear ();
 
        for (int n = 0; n < (int) times; ++n) {
 
-               for (NoteList::const_iterator i = mcb.notes().begin(); i != mcb.notes().end(); ++i) {
+               for (Notes::const_iterator i = mcb.notes().begin(); i != mcb.notes().end(); ++i) {
 
                        boost::shared_ptr<NoteType> copied_note (new NoteType (*((*i).get())));
                        copied_note->set_time (paste_pos_beats + copied_note->time() - beat_delta);
@@ -2516,15 +2518,13 @@ MidiRegionView::goto_previous_note ()
 }
 
 void
-MidiRegionView::selection_as_notelist (NoteList& selected)
+MidiRegionView::selection_as_notelist (Notes& selected)
 {
        time_sort_events ();
 
        for (Events::iterator i = _events.begin(); i != _events.end(); ++i) {
                if ((*i)->selected()) {
-                       selected.push_back ((*i)->note());
+                       selected.insert ((*i)->note());
                }
        }
 }
-
-