Use central method to check for engine where required
[ardour.git] / gtk2_ardour / edit_note_dialog.cc
index 17827693e7d1aa86a10fe58afbb84aee3c387624..0c7d2a6113a4950d31aecc94e57829193db70d92 100644 (file)
 
 #include "gtkmm2ext/utils.h"
 
-#include "canvas-note-event.h"
 #include "edit_note_dialog.h"
 #include "midi_region_view.h"
+#include "note_base.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -38,7 +38,7 @@ using namespace Gtkmm2ext;
  *    @param n Notes to edit.
  */
 
-EditNoteDialog::EditNoteDialog (MidiRegionView* rv, set<ArdourCanvas::CanvasNoteEvent*> n)
+EditNoteDialog::EditNoteDialog (MidiRegionView* rv, set<NoteBase*> n)
        : ArdourDialog (_("Note"))
        , _region_view (rv)
        , _events (n)
@@ -93,7 +93,8 @@ EditNoteDialog::EditNoteDialog (MidiRegionView* rv, set<ArdourCanvas::CanvasNote
 
        _time_clock.set_session (_region_view->get_time_axis_view().session ());
        _time_clock.set_mode (AudioClock::BBT);
-       _time_clock.set (_region_view->source_relative_time_converter().to ((*_events.begin())->note()->time ()), true);
+       _time_clock.set (_region_view->source_relative_time_converter().to
+                        ((*_events.begin())->note()->time()) + (_region_view->region()->position() - _region_view->region()->start()), true);
 
        l = manage (left_aligned_label (_("Length")));
        table->attach (*l, 0, 1, r, r + 1);
@@ -103,7 +104,10 @@ EditNoteDialog::EditNoteDialog (MidiRegionView* rv, set<ArdourCanvas::CanvasNote
 
        _length_clock.set_session (_region_view->get_time_axis_view().session ());
        _length_clock.set_mode (AudioClock::BBT);
-       _length_clock.set (_region_view->region_relative_time_converter().to ((*_events.begin())->note()->length ()), true);
+       _length_clock.set (
+               _region_view->region_relative_time_converter().to ((*_events.begin())->note()->end_time ()) + _region_view->region()->position(),
+               true,
+               _region_view->region_relative_time_converter().to ((*_events.begin())->note()->time ()) + _region_view->region()->position());
 
        /* Set up `set all notes...' buttons' sensitivity */
 
@@ -112,14 +116,14 @@ EditNoteDialog::EditNoteDialog (MidiRegionView* rv, set<ArdourCanvas::CanvasNote
        _velocity_all.set_sensitive (false);
        _time_all.set_sensitive (false);
        _length_all.set_sensitive (false);
-       
+
        int test_channel = (*_events.begin())->note()->channel ();
        int test_pitch = (*_events.begin())->note()->note ();
        int test_velocity = (*_events.begin())->note()->velocity ();
-       double test_time = (*_events.begin())->note()->time ();
-       double test_length = (*_events.begin())->note()->length ();
-       
-       for (set<ArdourCanvas::CanvasNoteEvent*>::iterator i = _events.begin(); i != _events.end(); ++i) {
+       Temporal::Beats test_time = (*_events.begin())->note()->time ();
+       Temporal::Beats test_length = (*_events.begin())->note()->length ();
+
+       for (set<NoteBase*>::iterator i = _events.begin(); i != _events.end(); ++i) {
                if ((*i)->note()->channel() != test_channel) {
                        _channel_all.set_sensitive (true);
                }
@@ -140,22 +144,19 @@ EditNoteDialog::EditNoteDialog (MidiRegionView* rv, set<ArdourCanvas::CanvasNote
                        _length_all.set_sensitive (true);
                }
        }
-       
+
        get_vbox()->pack_start (*table);
 
        add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
        add_button (Gtk::Stock::APPLY, Gtk::RESPONSE_ACCEPT);
        set_default_response (Gtk::RESPONSE_ACCEPT);
-
-       show_all ();
 }
 
-int
-EditNoteDialog::run ()
+void
+EditNoteDialog::done (int r)
 {
-       int const r = Dialog::run ();
        if (r != RESPONSE_ACCEPT) {
-               return r;
+               return;
        }
 
        /* These calls mean that if a value is entered using the keyboard
@@ -170,7 +171,7 @@ EditNoteDialog::run ()
        bool had_change = false;
 
        if (!_channel_all.get_sensitive() || _channel_all.get_active ()) {
-               for (set<ArdourCanvas::CanvasNoteEvent*>::iterator i = _events.begin(); i != _events.end(); ++i) {
+               for (set<NoteBase*>::iterator i = _events.begin(); i != _events.end(); ++i) {
                        if (_channel.get_value_as_int() - 1 != (*i)->note()->channel()) {
                                _region_view->change_note_channel (*i, _channel.get_value_as_int () - 1);
                                had_change = true;
@@ -179,7 +180,7 @@ EditNoteDialog::run ()
        }
 
        if (!_pitch_all.get_sensitive() || _pitch_all.get_active ()) {
-               for (set<ArdourCanvas::CanvasNoteEvent*>::iterator i = _events.begin(); i != _events.end(); ++i) {
+               for (set<NoteBase*>::iterator i = _events.begin(); i != _events.end(); ++i) {
                        if (_pitch.get_value_as_int() != (*i)->note()->note()) {
                                _region_view->change_note_note (*i, _pitch.get_value_as_int ());
                                had_change = true;
@@ -188,7 +189,7 @@ EditNoteDialog::run ()
        }
 
        if (!_velocity_all.get_sensitive() || _velocity_all.get_active ()) {
-               for (set<ArdourCanvas::CanvasNoteEvent*>::iterator i = _events.begin(); i != _events.end(); ++i) {
+               for (set<NoteBase*>::iterator i = _events.begin(); i != _events.end(); ++i) {
                        if (_velocity.get_value_as_int() != (*i)->note()->velocity()) {
                                _region_view->change_note_velocity (*i, _velocity.get_value_as_int ());
                                had_change = true;
@@ -196,10 +197,11 @@ EditNoteDialog::run ()
                }
        }
 
-       double const t = _region_view->source_relative_time_converter().from (_time_clock.current_time ());
+       samplecnt_t const region_samples = _time_clock.current_time() - (_region_view->region()->position() - _region_view->region()->start());
+       Temporal::Beats const t = _region_view->source_relative_time_converter().from (region_samples);
 
        if (!_time_all.get_sensitive() || _time_all.get_active ()) {
-               for (set<ArdourCanvas::CanvasNoteEvent*>::iterator i = _events.begin(); i != _events.end(); ++i) {
+               for (set<NoteBase*>::iterator i = _events.begin(); i != _events.end(); ++i) {
                        if (t != (*i)->note()->time()) {
                                _region_view->change_note_time (*i, t);
                                had_change = true;
@@ -207,10 +209,10 @@ EditNoteDialog::run ()
                }
        }
 
-       double const d = _region_view->region_relative_time_converter().from (_length_clock.current_duration ());
-
        if (!_length_all.get_sensitive() || _length_all.get_active ()) {
-               for (set<ArdourCanvas::CanvasNoteEvent*>::iterator i = _events.begin(); i != _events.end(); ++i) {
+               for (set<NoteBase*>::iterator i = _events.begin(); i != _events.end(); ++i) {
+                       samplepos_t const note_end_sample = region_samples + _length_clock.current_duration (_time_clock.current_time());
+                       Temporal::Beats const d = _region_view->source_relative_time_converter().from (note_end_sample) - (*i)->note()->time();
                        if (d != (*i)->note()->length()) {
                                _region_view->change_note_length (*i, d);
                                had_change = true;
@@ -224,9 +226,10 @@ EditNoteDialog::run ()
 
        _region_view->apply_diff ();
 
-       for (set<ArdourCanvas::CanvasNoteEvent*>::iterator i = _events.begin(); i != _events.end(); ++i) {
-               (*i)->set_selected ((*i)->selected()); // change color
+       list<Evoral::event_id_t> notes;
+       for (set<NoteBase*>::iterator i = _events.begin(); i != _events.end(); ++i) {
+               notes.push_back ((*i)->note()->id());
        }
 
-       return r;
+       _region_view->select_notes (notes);
 }