diff --git a/gtk2_ardour/canvas-midi-event.cc b/gtk2_ardour/canvas-midi-event.cc index 02497753cc..0ff479eaf3 100644 --- a/gtk2_ardour/canvas-midi-event.cc +++ b/gtk2_ardour/canvas-midi-event.cc @@ -66,7 +66,7 @@ CanvasMidiEvent::on_event(GdkEvent* ev) static double last_x, last_y; double event_x, event_y, dx, dy; nframes_t event_frame; - bool select_mod = false; + bool select_mod; if (_region.get_time_axis_view().editor.current_mouse_mode() != Editing::MouseNote) return false; @@ -90,14 +90,9 @@ CanvasMidiEvent::on_event(GdkEvent* ev) break; case GDK_ENTER_NOTIFY: - select_mod = (ev->motion.state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)); - cerr << "ENTER: " << select_mod << " - " << ev->motion.state << endl; - if (select_mod) { - _region.note_selected(this, true); - } + _region.note_entered(this); _item->grab_focus(); Keyboard::magic_widget_grab_focus(); - _region.note_entered(this); break; case GDK_LEAVE_NOTIFY: @@ -110,7 +105,6 @@ CanvasMidiEvent::on_event(GdkEvent* ev) return true; case GDK_MOTION_NOTIFY: - select_mod = (ev->motion.state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)); event_x = ev->motion.x; event_y = ev->motion.y; //cerr << "MOTION @ " << event_x << ", " << event_y << endl; @@ -118,7 +112,7 @@ CanvasMidiEvent::on_event(GdkEvent* ev) switch (_state) { case Pressed: // Drag begin - if (!select_mod) { + if (_region.mouse_state() != MidiRegionView::SelectTouchDragging) { _item->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, Gdk::Cursor(Gdk::FLEUR), ev->motion.time); _state = Dragging; diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index dfcd630d16..373de46ee7 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -147,20 +147,20 @@ MidiRegionView::canvas_event(GdkEvent* ev) switch (ev->type) { case GDK_KEY_PRESS: - cerr << "REGION KEY PRESS\n"; if (ev->key.keyval == GDK_Delete && !delete_mod) { delete_mod = true; original_mode = trackview.editor.current_midi_edit_mode(); trackview.editor.set_midi_edit_mode(MidiEditErase); start_remove_command(); - _mouse_state = EraseDragging; + _mouse_state = EraseTouchDragging; + } else if (ev->key.keyval == GDK_Shift_L || ev->key.keyval == GDK_Control_L) { + _mouse_state = SelectTouchDragging; } return true; case GDK_KEY_RELEASE: - cerr << "REGION KEY RELEASE\n"; if (ev->key.keyval == GDK_Delete) { - if (_mouse_state == EraseDragging) { + if (_mouse_state == EraseTouchDragging) { delete_selection(); apply_command(); } @@ -168,14 +168,15 @@ MidiRegionView::canvas_event(GdkEvent* ev) trackview.editor.set_midi_edit_mode(original_mode); delete_mod = false; } + } else if (ev->key.keyval == GDK_Shift_L || ev->key.keyval == GDK_Control_L) { + _mouse_state = None; } return true; case GDK_BUTTON_PRESS: - //group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, ev->button.time); - _mouse_state = Pressed; + if (_mouse_state != SelectTouchDragging && _mouse_state != EraseTouchDragging) + _mouse_state = Pressed; _pressed_button = ev->button.button; - //cerr << "PRESSED: " << press_button << endl; return true; case GDK_ENTER_NOTIFY: @@ -197,7 +198,6 @@ MidiRegionView::canvas_event(GdkEvent* ev) // Select drag start if (_pressed_button == 1 && trackview.editor.current_midi_edit_mode() == MidiEditSelect) { - cerr << "SELECT START\n"; group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, Gdk::Cursor(Gdk::FLEUR), ev->motion.time); last_x = event_x; @@ -216,12 +216,11 @@ MidiRegionView::canvas_event(GdkEvent* ev) drag_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MidiSelectRectFill.get(); - _mouse_state = SelectDragging; + _mouse_state = SelectRectDragging; return true; // Add note drag start } else if (trackview.editor.current_midi_edit_mode() == MidiEditPencil) { - cerr << "PENCIL START\n"; group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, Gdk::Cursor(Gdk::FLEUR), ev->motion.time); last_x = event_x; @@ -245,14 +244,13 @@ MidiRegionView::canvas_event(GdkEvent* ev) // Eraser drag start } else if (trackview.editor.current_midi_edit_mode() == MidiEditErase) { - cerr << "ERASE DRAGGING\n"; - _mouse_state = EraseDragging; - return false; // ? + _mouse_state = EraseTouchDragging; + return false; // Don't ask me... } - break; + return false; - case SelectDragging: // Select drag motion + case SelectRectDragging: // Select drag motion case AddDragging: // Add note drag motion if (ev->motion.is_hint) { int t_x; @@ -272,7 +270,7 @@ MidiRegionView::canvas_event(GdkEvent* ev) else drag_rect->property_x1() = event_x; - if (drag_rect && _mouse_state == SelectDragging) { + if (drag_rect && _mouse_state == SelectRectDragging) { if (event_y > drag_start_y) drag_rect->property_y2() = event_y; else @@ -284,11 +282,11 @@ MidiRegionView::canvas_event(GdkEvent* ev) last_x = event_x; last_y = event_y; - case EraseDragging: - return true; + case EraseTouchDragging: + case SelectTouchDragging: + return false; default: - _mouse_state = None; break; } break; @@ -315,7 +313,7 @@ MidiRegionView::canvas_event(GdkEvent* ev) } _mouse_state = None; return true; - case SelectDragging: // Select drag done + case SelectRectDragging: // Select drag done _mouse_state = None; delete drag_rect; drag_rect = NULL; @@ -661,7 +659,9 @@ MidiRegionView::unique_select(ArdourCanvas::CanvasMidiEvent* ev) _selection.clear(); _selection.insert(ev); - ev->selected(true); + + if ( ! ev->selected()) + ev->selected(true); } void @@ -671,7 +671,9 @@ MidiRegionView::note_selected(ArdourCanvas::CanvasMidiEvent* ev, bool add) clear_selection_except(ev); _selection.insert(ev); - ev->selected(true); + + if ( ! ev->selected()) + ev->selected(true); } @@ -682,7 +684,9 @@ MidiRegionView::note_deselected(ArdourCanvas::CanvasMidiEvent* ev, bool add) clear_selection_except(ev); _selection.erase(ev); - ev->selected(false); + + if (ev->selected()) + ev->selected(false); } diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index fb3e4d3449..a625fdeff3 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -112,11 +112,12 @@ class MidiRegionView : public RegionView } void note_entered(ArdourCanvas::CanvasMidiEvent* ev) { - cerr << "ENTERED, STATE = " << _mouse_state << endl; - if (_mouse_state == EraseDragging) { + if (ev->note() && _mouse_state == EraseTouchDragging) { start_delta_command(); ev->selected(true); _delta_command->remove(*ev->note()); + } else if (_mouse_state == SelectTouchDragging) { + note_selected(ev, true); } } @@ -142,7 +143,10 @@ class MidiRegionView : public RegionView void move_selection(double dx, double dy); void note_dropped(ArdourCanvas::CanvasMidiEvent* ev, double dt, uint8_t dnote); - + + enum MouseState { None, Pressed, SelectTouchDragging, SelectRectDragging, AddDragging, EraseTouchDragging }; + MouseState mouse_state() const { return _mouse_state; } + protected: /* this constructor allows derived types @@ -182,8 +186,7 @@ class MidiRegionView : public RegionView ArdourCanvas::CanvasNote** _active_notes; ArdourCanvas::Group* _note_group; ARDOUR::MidiModel::DeltaCommand* _delta_command; - - enum MouseState { None, Pressed, SelectDragging, AddDragging, EraseDragging }; + MouseState _mouse_state; int _pressed_button;