Back out big shared_ptr change. Moving to a branch. Apologies all.
[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 && edit_mode == Editing::MidiEditResize)) {
24                         double region_start = _region.get_position_pixels();
25                         event_x = ev->button.x;
26                         middle_point = region_start + x1() + (x2() - x1()) / 2.0L;
27
28                         if (event_x <= middle_point) {
29                                 cursor = Gdk::Cursor(Gdk::LEFT_SIDE);
30                                 note_end = NOTE_ON;
31                         } else {
32                                 cursor = Gdk::Cursor(Gdk::RIGHT_SIDE);
33                                 note_end = NOTE_OFF;
34                         }
35
36                         _item->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, cursor, ev->motion.time);
37
38                         if (_region.mouse_state() == MidiRegionView::SelectTouchDragging) {
39                                 _note_state = AbsoluteResize;
40                         } else {
41                                 _note_state = RelativeResize;
42                         }
43
44                         _region.note_selected(this, true);
45                         _region.begin_resizing(note_end);
46                         last_x = event_x;
47
48                         return true;
49                 } 
50                 
51         case GDK_MOTION_NOTIFY:
52                 event_x = ev->motion.x;
53
54                 if (_note_state == RelativeResize) {
55                         _region.update_resizing(note_end, event_x - last_x, true);
56                         last_x = event_x;
57                         return true;
58                 }
59
60                 if (_note_state == AbsoluteResize) {
61                         _region.update_resizing(note_end, event_x, false);
62                         return true;
63                 }
64
65         case GDK_BUTTON_RELEASE:
66                 event_x = ev->button.x;
67
68                 switch (_note_state) {
69                 case RelativeResize: // Clicked
70                         _item->ungrab(ev->button.time);
71                         _region.commit_resizing(note_end, event_x, true);
72                         _note_state = None;
73                         return true;
74
75                 case AbsoluteResize: // Clicked
76                         _item->ungrab(ev->button.time);
77                         _region.commit_resizing(note_end, event_x, false);
78                         _note_state = None;
79                         return true;
80
81                 default:
82                         return CanvasNoteEvent::on_event(ev);
83                 }
84
85         default:
86                 return CanvasNoteEvent::on_event(ev);
87         }
88 }
89
90 } // namespace Gnome
91 } // namespace Canvas