diff options
author | Carl Hetherington <carl@carlh.net> | 2010-05-25 23:14:41 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2010-05-25 23:14:41 +0000 |
commit | f7bff95fbce75cb0d4c717b1400677edd814f7be (patch) | |
tree | ad4e1bce3e7d30f5e22ece30dd3df740dac1e73e /gtk2_ardour/midi_region_view.cc | |
parent | 6b19aee3b511eaae2800837175e9b9a931d325e7 (diff) |
Rudimentary ghost note when adding MIDI notes to a region, as per #3180.
git-svn-id: svn://localhost/ardour2/branches/3.0@7162 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/midi_region_view.cc')
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index c78386ab02..c1c7f650e7 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -85,6 +85,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView & , _note_group(new ArdourCanvas::Group(*parent)) , _delta_command(0) , _diff_command(0) + , _ghost_note(0) , _mouse_state(None) , _pressed_button(0) , _sort_needed (true) @@ -107,6 +108,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView & , _note_group(new ArdourCanvas::Group(*parent)) , _delta_command(0) , _diff_command(0) + , _ghost_note(0) , _mouse_state(None) , _pressed_button(0) , _sort_needed (true) @@ -130,6 +132,7 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other) , _note_group(new ArdourCanvas::Group(*get_canvas_group())) , _delta_command(0) , _diff_command(0) + , _ghost_note(0) , _mouse_state(None) , _pressed_button(0) , _sort_needed (true) @@ -156,6 +159,7 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other, boost::shared_ptr<M , _note_group(new ArdourCanvas::Group(*get_canvas_group())) , _delta_command(0) , _diff_command(0) + , _ghost_note(0) , _mouse_state(None) , _pressed_button(0) , _sort_needed (true) @@ -216,6 +220,8 @@ MidiRegionView::init (Gdk::Color const & basic_color, bool wfd) midi_view()->signal_midi_patch_settings_changed().connect( sigc::mem_fun(this, &MidiRegionView::midi_patch_settings_changed)); + + trackview.editor().SnapChanged.connect (snap_changed_connection, invalidator (*this), ui_bind (&MidiRegionView::snap_changed, this), gui_context ()); } bool @@ -363,12 +369,26 @@ MidiRegionView::canvas_event(GdkEvent* ev) return true; case GDK_ENTER_NOTIFY: + { /* FIXME: do this on switch to note tool, too, if the pointer is already in */ Keyboard::magic_widget_grab_focus(); group->grab_focus(); + + if (editor.current_mouse_mode() == MouseRange) { + create_ghost_note (ev->crossing.x, ev->crossing.y); + } + break; + } + + case GDK_LEAVE_NOTIFY: + { + delete _ghost_note; + _ghost_note = 0; break; + } case GDK_MOTION_NOTIFY: + { event_x = ev->motion.x; event_y = ev->motion.y; group->w2i(event_x, event_y); @@ -379,6 +399,10 @@ MidiRegionView::canvas_event(GdkEvent* ev) // convert event_frame back to local coordinates relative to position event_frame -= _region->position(); + if (_ghost_note) { + update_ghost_note (ev->motion.x, ev->motion.y); + } + switch (_mouse_state) { case Pressed: // Maybe start a drag, if we've moved a bit @@ -477,6 +501,7 @@ MidiRegionView::canvas_event(GdkEvent* ev) break; } break; + } case GDK_BUTTON_RELEASE: event_x = ev->motion.x; @@ -533,7 +558,7 @@ MidiRegionView::canvas_event(GdkEvent* ev) drag_rect = 0; default: break; } - + default: break; } @@ -2689,3 +2714,54 @@ MidiRegionView::selection_as_notelist (Notes& selected, bool allow_all_if_none_s } } } + +void +MidiRegionView::update_ghost_note (double x, double y) +{ + _last_ghost_x = x; + _last_ghost_y = y; + + group->w2i (x, y); + nframes64_t f = trackview.editor().pixel_to_frame (x) + _region->position (); + trackview.editor().snap_to (f); + f -= _region->position (); + + bool success; + Evoral::MusicalTime beats = trackview.editor().get_grid_type_as_beats (success, f); + if (!success) { + beats = 1; + } + + double length = frames_to_beats (snap_frame_to_frame (f + beats_to_frames (beats)) - f); + + _ghost_note->note()->set_time (frames_to_beats (f + _region->start())); + _ghost_note->note()->set_length (length); + _ghost_note->note()->set_note (midi_stream_view()->y_to_note (y)); + + update_note (_ghost_note); +} + +void +MidiRegionView::create_ghost_note (double x, double y) +{ + delete _ghost_note; + _ghost_note = 0; + + boost::shared_ptr<NoteType> g (new NoteType); + _ghost_note = new NoEventCanvasNote (*this, *group, g); + update_ghost_note (x, y); + _ghost_note->show (); + + _last_ghost_x = x; + _last_ghost_y = y; +} + +void +MidiRegionView::snap_changed () +{ + if (!_ghost_note) { + return; + } + + create_ghost_note (_last_ghost_x, _last_ghost_y); +} |