+ _enable_display = true;
+
+ if (_model) {
+ if (wfd) {
+ redisplay_model();
+ }
+ _model->ContentsChanged.connect(sigc::mem_fun(this, &MidiRegionView::redisplay_model));
+ }
+
+ group->signal_event().connect (mem_fun (this, &MidiRegionView::canvas_event), false);
+
+}
+
+bool
+MidiRegionView::canvas_event(GdkEvent* ev)
+{
+ enum State { None, Pressed, SelectDragging, AddDragging };
+ static int press_button = 0;
+ static State _state;
+
+ static double drag_start_x, drag_start_y;
+ static double last_x, last_y;
+ double event_x, event_y;
+
+ static ArdourCanvas::SimpleRect* drag_rect = NULL;
+
+ if (trackview.editor.current_mouse_mode() != MouseNote)
+ return false;
+
+ switch (ev->type) {
+ case GDK_KEY_PRESS:
+ if (ev->key.keyval == GDK_Delete)
+ start_remove_command();
+ break;
+
+ case GDK_KEY_RELEASE:
+ if (_command_mode == Remove && ev->key.keyval == GDK_Delete)
+ apply_command();
+ break;
+
+ case GDK_BUTTON_PRESS:
+ //group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, ev->button.time);
+ _state = Pressed;
+ press_button = ev->button.button;
+ //cerr << "PRESSED: " << press_button << endl;
+ return true;
+
+ case GDK_MOTION_NOTIFY:
+ event_x = ev->motion.x;
+ event_y = ev->motion.y;
+ group->w2i(event_x, event_y);
+
+ switch (_state) {
+ case Pressed: // Drag start
+
+ if (press_button == 1 && _command_mode != Remove) { // Select rect start
+ group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
+ Gdk::Cursor(Gdk::FLEUR), ev->motion.time);
+ last_x = event_x;
+ last_y = event_y;
+ drag_start_x = event_x;
+ drag_start_y = event_y;
+
+ drag_rect = new ArdourCanvas::SimpleRect(*group);
+ drag_rect->property_x1() = event_x;
+ drag_rect->property_y1() = event_y;
+ drag_rect->property_x2() = event_x;
+ drag_rect->property_y2() = event_y;
+ drag_rect->property_outline_what() = 0xFF;
+ drag_rect->property_outline_color_rgba() = 0xFF000099;
+ drag_rect->property_fill_color_rgba() = 0xFFDDDD33;
+
+ _state = SelectDragging;
+ return true;
+
+ } else if (press_button == 3) { // Add note drag start
+ group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
+ Gdk::Cursor(Gdk::FLEUR), ev->motion.time);
+ last_x = event_x;
+ last_y = event_y;
+ drag_start_x = event_x;
+ drag_start_y = event_y;
+
+ nframes_t event_frame = midi_view()->editor.pixel_to_frame(event_x);
+ midi_view()->editor.snap_to(event_frame);
+
+ drag_rect = new ArdourCanvas::SimpleRect(*group);
+ drag_rect->property_x1() = midi_view()->editor.frame_to_pixel(event_frame);
+
+ drag_rect->property_y1() = midi_stream_view()->note_to_y(midi_stream_view()->y_to_note(event_y));
+ drag_rect->property_x2() = event_x;
+ drag_rect->property_y2() = drag_rect->property_y1() + floor(midi_stream_view()->note_height());
+ drag_rect->property_outline_what() = 0xFF;
+ drag_rect->property_outline_color_rgba() = 0xFFFFFF99;
+ drag_rect->property_fill_color_rgba() = 0xFFFFFF66;
+
+ _state = AddDragging;
+ return true;
+ }
+
+ break;
+
+ case SelectDragging: // Select rect motion
+ case AddDragging: // Add note rect motion
+ if (ev->motion.is_hint) {
+ int t_x;
+ int t_y;
+ GdkModifierType state;
+ gdk_window_get_pointer(ev->motion.window, &t_x, &t_y, &state);
+ event_x = t_x;
+ event_y = t_y;
+ }
+
+ if (_state == AddDragging) {
+ nframes_t event_frame = midi_view()->editor.pixel_to_frame(event_x);
+ midi_view()->editor.snap_to(event_frame);
+ event_x = midi_view()->editor.frame_to_pixel(event_frame);
+ }
+
+ if (drag_rect)
+ drag_rect->property_x2() = event_x;
+
+ if (drag_rect && _state == SelectDragging)
+ drag_rect->property_y2() = event_y;
+
+ last_x = event_x;
+ last_y = event_y;
+
+ return true;
+ default:
+ _state = None;
+ break;
+ }
+ break;
+
+ case GDK_BUTTON_RELEASE:
+ event_x = ev->motion.x;
+ event_y = ev->motion.y;
+ group->w2i(event_x, event_y);
+ group->ungrab(ev->button.time);
+ switch (_state) {
+ case Pressed: // Clicked
+ if (ev->button.button == 3) {
+ nframes_t event_frame = midi_view()->editor.pixel_to_frame(event_x);
+ midi_view()->editor.snap_to(event_frame);
+ event_x = midi_view()->editor.frame_to_pixel(event_frame);
+ create_note_at(event_x, event_y, _default_note_length);
+ }
+ _state = None;
+ return true;
+ case SelectDragging: // Select drag done
+ _state = None;
+ delete drag_rect;
+ drag_rect = NULL;
+ return true;
+ case AddDragging: // Add drag done
+ _state = None;
+ if (drag_rect->property_x2() > drag_rect->property_x1() + 2) {
+ create_note_at(drag_rect->property_x1(), drag_rect->property_y1(),
+ trackview.editor.pixel_to_frame(
+ drag_rect->property_x2() - drag_rect->property_x1()));
+ }
+
+ delete drag_rect;
+ drag_rect = NULL;
+ return true;
+ default:
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ return false;
+}
+