remove all MIDI-specific editing modes by making standard work either at object level...
[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         PublicEditor& editor (_region.get_trackview().editor());
15
16         if (!editor.internal_editing()) {
17                 return false;
18         }
19
20         double          event_x;
21         static double   middle_point, last_x;
22         Gdk::Cursor     cursor;
23         static NoteEnd  note_end;
24
25         switch (ev->type) {
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;
32
33                         if (event_x <= middle_point) {
34                                 cursor = Gdk::Cursor(Gdk::LEFT_SIDE);
35                                 note_end = NOTE_ON;
36                         } else {
37                                 cursor = Gdk::Cursor(Gdk::RIGHT_SIDE);
38                                 note_end = NOTE_OFF;
39                         }
40
41                         _item->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, cursor, ev->motion.time);
42
43                         if (_region.mouse_state() == MidiRegionView::SelectTouchDragging) {
44                                 _note_state = AbsoluteResize;
45                         } else {
46                                 _note_state = RelativeResize;
47                         }
48
49                         _region.note_selected(this, true);
50                         _region.begin_resizing(note_end);
51                         last_x = event_x;
52
53                         return true;
54                 } 
55                 
56         case GDK_MOTION_NOTIFY:
57                 event_x = ev->motion.x;
58
59                 if (_note_state == RelativeResize) {
60                         _region.update_resizing(note_end, event_x - last_x, true);
61                         last_x = event_x;
62                         return true;
63                 }
64
65                 if (_note_state == AbsoluteResize) {
66                         _region.update_resizing(note_end, event_x, false);
67                         return true;
68                 }
69
70         case GDK_BUTTON_RELEASE:
71                 event_x = ev->button.x;
72
73                 switch (_note_state) {
74                 case RelativeResize: // Clicked
75                         _item->ungrab(ev->button.time);
76                         _region.commit_resizing(note_end, event_x, true);
77                         _note_state = None;
78                         return true;
79
80                 case AbsoluteResize: // Clicked
81                         _item->ungrab(ev->button.time);
82                         _region.commit_resizing(note_end, event_x, false);
83                         _note_state = None;
84                         return true;
85
86                 default:
87                         return CanvasNoteEvent::on_event(ev);
88                 }
89
90         default:
91                 return CanvasNoteEvent::on_event(ev);
92         }
93 }
94
95 } // namespace Gnome
96 } // namespace Canvas