NO-OP; clean up script spacing and remove goto
[ardour.git] / gtk2_ardour / midi_region_view.cc
index 195cc6f828356801defcde4b56389fcfb4a224f0..b495fe5c640479dd6cb241b65e3775cede3f91ac 100644 (file)
@@ -1144,6 +1144,18 @@ MidiRegionView::find_canvas_patch_change (MidiModel::PatchChangePtr p)
        return boost::shared_ptr<PatchChange>();
 }
 
+boost::shared_ptr<SysEx>
+MidiRegionView::find_canvas_sys_ex (MidiModel::SysExPtr s)
+{
+       SysExes::const_iterator f = _sys_exes.find (s);
+
+       if (f != _sys_exes.end()) {
+               return f->second;
+       }
+
+       return boost::shared_ptr<SysEx>();
+}
+
 void
 MidiRegionView::get_events (Events& e, Evoral::Sequence<Evoral::Beats>::NoteOperator op, uint8_t val, int chan_mask)
 {
@@ -1284,8 +1296,6 @@ MidiRegionView::redisplay_model()
                }
        }
 
-       _sys_exes.clear();
-
        display_sysexes();
        display_patch_changes ();
 
@@ -1329,7 +1339,7 @@ MidiRegionView::display_patch_changes_on_channel (uint8_t channel, bool active_c
                                const double x = trackview.editor().sample_to_pixel (region_frames);
                                const string patch_name = instrument_info().get_patch_name ((*i)->bank(), (*i)->program(), channel);
                                p->canvas_item()->set_position (ArdourCanvas::Duple (x, 1.0));
-                               p->flag()->set_text (patch_name);
+                               p->set_text (patch_name);
 
                                p->show();
                        }
@@ -1377,7 +1387,8 @@ MidiRegionView::display_sysexes()
        }
 
        for (MidiModel::SysExes::const_iterator i = _model->sysexes().begin(); i != _model->sysexes().end(); ++i) {
-               Evoral::Beats time = (*i)->time();
+               MidiModel::SysExPtr sysex_ptr = *i;
+               Evoral::Beats time = sysex_ptr->time();
 
                if ((*i)->is_spp() || (*i)->is_mtc_quarter() || (*i)->is_mtc_full()) {
                        if (!display_periodic_messages) {
@@ -1401,9 +1412,16 @@ MidiRegionView::display_sysexes()
 
                // CAIROCANVAS: no longer passing *i (the sysex event) to the
                // SysEx canvas object!!!
+               boost::shared_ptr<SysEx> sysex = find_canvas_sys_ex (sysex_ptr);
 
-               boost::shared_ptr<SysEx> sysex = boost::shared_ptr<SysEx>(
-                       new SysEx (*this, _note_group, text, height, x, 1.0));
+               if (!sysex) {
+                       sysex = boost::shared_ptr<SysEx>(
+                               new SysEx (*this, _note_group, text, height, x, 1.0, sysex_ptr));
+                       _sys_exes.insert (make_pair (sysex_ptr, sysex));
+               } else {
+                       sysex->set_height (height);
+                       sysex->item().set_position (ArdourCanvas::Duple (x, 1.0));
+               }
 
                // Show unless message is beyond the region bounds
                if (time - _region->start() >= _region->length() || time < _region->start()) {
@@ -1411,8 +1429,6 @@ MidiRegionView::display_sysexes()
                } else {
                        sysex->show();
                }
-
-               _sys_exes.push_back(sysex);
        }
 }
 
@@ -1475,7 +1491,7 @@ MidiRegionView::reset_width_dependent_items (double pixel_width)
        bool hide_all = false;
        PatchChanges::iterator x = _patch_changes.begin();
        if (x != _patch_changes.end()) {
-               hide_all = x->second->flag()->width() >= _pixel_width;
+               hide_all = x->second->width() >= _pixel_width;
        }
 
        if (hide_all) {
@@ -2533,11 +2549,9 @@ MidiRegionView::add_to_selection (NoteBase* ev)
        }
 }
 
-void
-MidiRegionView::move_selection(double dx, double dy, double cumulative_dy)
+Evoral::Beats
+MidiRegionView::earliest_in_selection ()
 {
-       typedef vector<boost::shared_ptr<NoteType> > PossibleChord;
-       PossibleChord to_play;
        Evoral::Beats earliest = Evoral::MaxBeats;
 
        for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
@@ -2546,11 +2560,37 @@ MidiRegionView::move_selection(double dx, double dy, double cumulative_dy)
                }
        }
 
+       return earliest;
+}
+
+void
+MidiRegionView::move_selection(double dx_qn, double dy, double cumulative_dy)
+{
+       typedef vector<boost::shared_ptr<NoteType> > PossibleChord;
+       Editor* editor = dynamic_cast<Editor*> (&trackview.editor());
+       TempoMap& tmap (editor->session()->tempo_map());
+       PossibleChord to_play;
+       Evoral::Beats earliest = earliest_in_selection();
+
        for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
-               if ((*i)->note()->time() == earliest) {
-                       to_play.push_back ((*i)->note());
+               NoteBase* n = *i;
+               if (n->note()->time() == earliest) {
+                       to_play.push_back (n->note());
                }
+               double const note_time_qn = session_relative_qn (n->note()->time().to_double());
+               double const dx = editor->sample_to_pixel_unrounded (tmap.frame_at_quarter_note (note_time_qn + dx_qn))
+                       - n->item()->item_to_canvas (ArdourCanvas::Duple (n->x0(), 0)).x;
+
                (*i)->move_event(dx, dy);
+
+               /* update length */
+               if (midi_view()->note_mode() == Sustained) {
+                       Note* sus = dynamic_cast<Note*> (*i);
+                       double const len_dx = editor->sample_to_pixel_unrounded (
+                               tmap.frame_at_quarter_note (note_time_qn + dx_qn + n->note()->length().to_double()));
+
+                       sus->set_x1 (n->item()->canvas_to_item (ArdourCanvas::Duple (len_dx, 0)).x);
+               }
        }
 
        if (dy && !_selection.empty() && !_no_sound_notes && UIConfiguration::instance().get_sound_midi_notes()) {
@@ -2577,15 +2617,17 @@ MidiRegionView::move_selection(double dx, double dy, double cumulative_dy)
 }
 
 NoteBase*
-MidiRegionView::copy_selection ()
+MidiRegionView::copy_selection (NoteBase* primary)
 {
-       NoteBase* note;
        _copy_drag_events.clear ();
 
        if (_selection.empty()) {
                return 0;
        }
 
+       NoteBase* note;
+       NoteBase* ret = 0;
+
        for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
                boost::shared_ptr<NoteType> g (new NoteType (*((*i)->note())));
                if (midi_view()->note_mode() == Sustained) {
@@ -2598,30 +2640,43 @@ MidiRegionView::copy_selection ()
                        note = h;
                }
 
+               if ((*i) == primary) {
+                       ret = note;
+               }
+
                _copy_drag_events.push_back (note);
        }
 
-       return _copy_drag_events.front ();
+       return ret;
 }
 
 void
-MidiRegionView::move_copies (double dx, double dy, double cumulative_dy)
+MidiRegionView::move_copies (double dx_qn, double dy, double cumulative_dy)
 {
        typedef vector<boost::shared_ptr<NoteType> > PossibleChord;
+       Editor* editor = dynamic_cast<Editor*> (&trackview.editor());
+       TempoMap& tmap (editor->session()->tempo_map());
        PossibleChord to_play;
-       Evoral::Beats earliest = Evoral::MaxBeats;
+       Evoral::Beats earliest = earliest_in_selection();
 
        for (CopyDragEvents::iterator i = _copy_drag_events.begin(); i != _copy_drag_events.end(); ++i) {
-               if ((*i)->note()->time() < earliest) {
-                       earliest = (*i)->note()->time();
+               NoteBase* n = *i;
+               if (n->note()->time() == earliest) {
+                       to_play.push_back (n->note());
                }
-       }
+               double const note_time_qn = session_relative_qn (n->note()->time().to_double());
+               double const dx = editor->sample_to_pixel_unrounded (tmap.frame_at_quarter_note (note_time_qn + dx_qn))
+                       - n->item()->item_to_canvas (ArdourCanvas::Duple (n->x0(), 0)).x;
 
-       for (CopyDragEvents::iterator i = _copy_drag_events.begin(); i != _copy_drag_events.end(); ++i) {
-               if ((*i)->note()->time() == earliest) {
-                       to_play.push_back ((*i)->note());
-               }
                (*i)->move_event(dx, dy);
+
+               if (midi_view()->note_mode() == Sustained) {
+                       Note* sus = dynamic_cast<Note*> (*i);
+                       double const len_dx = editor->sample_to_pixel_unrounded (
+                               tmap.frame_at_quarter_note (note_time_qn + dx_qn + n->note()->length().to_double()));
+
+                       sus->set_x1 (n->item()->canvas_to_item (ArdourCanvas::Duple (len_dx, 0)).x);
+               }
        }
 
        if (dy && !_copy_drag_events.empty() && !_no_sound_notes && UIConfiguration::instance().get_sound_midi_notes()) {
@@ -2648,7 +2703,7 @@ MidiRegionView::move_copies (double dx, double dy, double cumulative_dy)
 }
 
 void
-MidiRegionView::note_dropped(NoteBase *, frameoffset_t dt, int8_t dnote, bool copy)
+MidiRegionView::note_dropped(NoteBase *, double d_qn, int8_t dnote, bool copy)
 {
        uint8_t lowest_note_in_selection  = 127;
        uint8_t highest_note_in_selection = 0;
@@ -2677,15 +2732,13 @@ MidiRegionView::note_dropped(NoteBase *, frameoffset_t dt, int8_t dnote, bool co
                if (highest_note_in_selection + dnote > 127) {
                        highest_note_difference = highest_note_in_selection - 127;
                }
-               TempoMap& map (trackview.session()->tempo_map());
 
                start_note_diff_command (_("move notes"));
 
                for (Selection::iterator i = _selection.begin(); i != _selection.end() ; ++i) {
 
-                       double const start_qn = _region->quarter_note() - midi_region()->start_beats();
-                       framepos_t new_frames = map.frame_at_quarter_note (start_qn + (*i)->note()->time().to_double()) + dt;
-                       Evoral::Beats new_time = Evoral::Beats (map.quarter_note_at_frame (new_frames) - start_qn);
+                       Evoral::Beats new_time = Evoral::Beats ((*i)->note()->time().to_double() + d_qn);
+
                        if (new_time < 0) {
                                continue;
                        }
@@ -2718,16 +2771,12 @@ MidiRegionView::note_dropped(NoteBase *, frameoffset_t dt, int8_t dnote, bool co
                        highest_note_difference = highest_note_in_selection - 127;
                }
 
-               TempoMap& map (trackview.session()->tempo_map());
                start_note_diff_command (_("copy notes"));
 
                for (CopyDragEvents::iterator i = _copy_drag_events.begin(); i != _copy_drag_events.end() ; ++i) {
 
                        /* update time */
-
-                       double const start_qn = _region->quarter_note() - midi_region()->start_beats();
-                       framepos_t new_frames = map.frame_at_quarter_note (start_qn + (*i)->note()->time().to_double()) + dt;
-                       Evoral::Beats new_time = Evoral::Beats (map.quarter_note_at_frame (new_frames) - start_qn);
+                       Evoral::Beats new_time = Evoral::Beats ((*i)->note()->time().to_double() + d_qn);
 
                        if (new_time < 0) {
                                continue;
@@ -2774,7 +2823,7 @@ framepos_t
 MidiRegionView::snap_pixel_to_sample(double x, bool ensure_snap)
 {
        PublicEditor& editor (trackview.editor());
-       return snap_frame_to_frame (editor.pixel_to_sample (x), ensure_snap);
+       return snap_frame_to_frame (editor.pixel_to_sample (x), ensure_snap).frame;
 }
 
 /** @param x Pixel relative to the region position.
@@ -4353,3 +4402,9 @@ MidiRegionView::note_to_y(uint8_t note) const
 {
        return contents_height() - (note + 1 - _current_range_min) * note_height() + 1;
 }
+
+double
+MidiRegionView::session_relative_qn (double qn) const
+{
+       return qn + (region()->quarter_note() - midi_region()->start_beats());
+}