1 #include "canvas-note.h"
2 #include "midi_region_view.h"
3 #include "public_editor.h"
4 #include "evoral/Note.hpp"
6 using namespace ARDOUR;
12 CanvasNote::on_event(GdkEvent* ev)
14 PublicEditor& editor (_region.get_trackview().editor());
16 if (!editor.internal_editing()) {
21 static double middle_point, last_x;
23 static NoteEnd note_end;
26 case GDK_BUTTON_PRESS:
27 if (ev->button.button == 2 ||
28 (ev->button.button == 1 && editor.current_mouse_mode() == Editing::MouseTimeFX)) {
29 double region_start = _region.get_position_pixels();
30 event_x = ev->button.x;
31 middle_point = region_start + x1() + (x2() - x1()) / 2.0L;
33 if (event_x <= middle_point) {
34 cursor = Gdk::Cursor(Gdk::LEFT_SIDE);
37 cursor = Gdk::Cursor(Gdk::RIGHT_SIDE);
41 _item->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, cursor, ev->motion.time);
43 if (_region.mouse_state() == MidiRegionView::SelectTouchDragging) {
44 _note_state = AbsoluteResize;
46 _note_state = RelativeResize;
49 _region.note_selected(this, true);
50 _region.begin_resizing(note_end);
56 case GDK_MOTION_NOTIFY:
57 event_x = ev->motion.x;
59 if (_note_state == RelativeResize) {
60 _region.update_resizing(note_end, event_x - last_x, true);
65 if (_note_state == AbsoluteResize) {
66 _region.update_resizing(note_end, event_x, false);
70 case GDK_BUTTON_RELEASE:
71 event_x = ev->button.x;
73 switch (_note_state) {
74 case RelativeResize: // Clicked
75 _item->ungrab(ev->button.time);
76 _region.commit_resizing(note_end, event_x, true);
80 case AbsoluteResize: // Clicked
81 _item->ungrab(ev->button.time);
82 _region.commit_resizing(note_end, event_x, false);
87 return CanvasNoteEvent::on_event(ev);
91 return CanvasNoteEvent::on_event(ev);