f505504198d1356d3fc67ead42ed11f11dd1b621
[ardour.git] / gtk2_ardour / canvas-note.cc
1 #include "canvas-note.h"
2 #include "midi_region_view.h"
3 #include "public_editor.h"
4 #include "evoral/Note.hpp"
5
6 using namespace ARDOUR;
7
8 namespace Gnome {
9 namespace Canvas {
10
11 bool
12 CanvasNote::on_event(GdkEvent* ev)
13 {
14         double          event_x;
15         static double   middle_point, last_x;
16         Gdk::Cursor     cursor;
17         static NoteEnd  note_end;
18         Editing::MidiEditMode edit_mode = _region.get_trackview().editor.current_midi_edit_mode();
19
20         switch (ev->type) {
21         case GDK_BUTTON_PRESS:
22                 if (ev->button.button == 2 ||
23                                 (ev->button.button == 1 &&
24                                  edit_mode == Editing::MidiEditResize)) {
25                         double region_start = _region.get_position_pixels();
26                         event_x = ev->button.x;
27                         middle_point = region_start + x1() + (x2() - x1()) / 2.0L;
28
29                         if (event_x <= middle_point) {
30                                 cursor = Gdk::Cursor(Gdk::LEFT_SIDE);
31                                 note_end = NOTE_ON;
32                         } else {
33                                 cursor = Gdk::Cursor(Gdk::RIGHT_SIDE);
34                                 note_end = NOTE_OFF;
35                         }
36
37                         _item->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, cursor, ev->motion.time);
38
39                         if (_region.mouse_state() == MidiRegionView::SelectTouchDragging) {
40                                 _note_state = AbsoluteResize;
41                         } else {
42                                 _note_state = RelativeResize;
43                         }
44
45                         _region.note_selected(this, true);
46                         _region.begin_resizing(note_end);
47                         last_x = event_x;
48
49                         return true;
50                 } 
51                 
52         case GDK_MOTION_NOTIFY:
53                 event_x = ev->motion.x;
54
55                 if (_note_state == RelativeResize) {
56                         _region.update_resizing(note_end, event_x - last_x, true);
57                         last_x = event_x;
58                         return true;
59                 }
60
61                 if (_note_state == AbsoluteResize) {
62                         _region.update_resizing(note_end, event_x, false);
63                         return true;
64                 }
65
66         case GDK_BUTTON_RELEASE:
67                 event_x = ev->button.x;
68
69                 switch (_note_state) {
70                 case RelativeResize: // Clicked
71                         _item->ungrab(ev->button.time);
72                         _region.commit_resizing(note_end, event_x, true);
73                         _note_state = None;
74                         return true;
75
76                 case AbsoluteResize: // Clicked
77                         _item->ungrab(ev->button.time);
78                         _region.commit_resizing(note_end, event_x, false);
79                         _note_state = None;
80                         return true;
81
82                 default:
83                         return CanvasNoteEvent::on_event(ev);
84                 }
85
86         default:
87                 return CanvasNoteEvent::on_event(ev);
88         }
89 }
90
91 } // namespace Gnome
92 } // namespace Canvas