X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fcanvas-midi-event.cc;h=298743509085c871066360a00f4491253d2c7552;hb=14dcc3f0170f8c723bcef0a59562adce0e8e7596;hp=63acd0fef902de1eca445eb1fc91d6079e4c0959;hpb=7185f8e53fdc664e5af9e212bb3b219ae47ab268;p=ardour.git diff --git a/gtk2_ardour/canvas-midi-event.cc b/gtk2_ardour/canvas-midi-event.cc index 63acd0fef9..2987435090 100644 --- a/gtk2_ardour/canvas-midi-event.cc +++ b/gtk2_ardour/canvas-midi-event.cc @@ -31,15 +31,35 @@ namespace Gnome { namespace Canvas { -CanvasMidiEvent::CanvasMidiEvent(MidiRegionView& region, Item* item, const ARDOUR::MidiModel::Note* note) +CanvasMidiEvent::CanvasMidiEvent(MidiRegionView& region, Item* item, + const boost::shared_ptr note) : _region(region) , _item(item) , _state(None) , _note(note) + , _selected(false) { } +void +CanvasMidiEvent::selected(bool yn) +{ + if (!_note) { + return; + } else if (yn) { + set_fill_color(UINT_INTERPOLATE(note_fill_color(_note->velocity()), + ARDOUR_UI::config()->canvasvar_MidiNoteSelectedOutline.get(), 0.85)); + set_outline_color(ARDOUR_UI::config()->canvasvar_MidiNoteSelectedOutline.get()); + } else { + set_fill_color(note_fill_color(_note->velocity())); + set_outline_color(note_outline_color(_note->velocity())); + } + + _selected = yn; +} + + bool CanvasMidiEvent::on_event(GdkEvent* ev) { @@ -48,28 +68,33 @@ 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; if (_region.get_time_axis_view().editor.current_mouse_mode() != Editing::MouseNote) return false; switch (ev->type) { case GDK_KEY_PRESS: + cerr << "EV KEY PRESS\n"; if (_note && ev->key.keyval == GDK_Delete) { + cerr << "EV DELETE KEY\n"; + selected(true); _region.start_remove_command(); _region.command_remove_note(this); } break; case GDK_KEY_RELEASE: + cerr << "EV KEY RELEASE\n"; if (ev->key.keyval == GDK_Delete) { _region.apply_command(); } break; case GDK_ENTER_NOTIFY: - Keyboard::magic_widget_grab_focus(); - _item->grab_focus(); _region.note_entered(this); + _item->grab_focus(); + Keyboard::magic_widget_grab_focus(); break; case GDK_LEAVE_NOTIFY: @@ -89,13 +114,16 @@ CanvasMidiEvent::on_event(GdkEvent* ev) switch (_state) { case Pressed: // Drag begin - _item->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, - Gdk::Cursor(Gdk::FLEUR), ev->motion.time); - _state = Dragging; - last_x = event_x; - last_y = event_y; - drag_delta_x = 0; - drag_delta_note = 0; + 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; + last_x = event_x; + last_y = event_y; + drag_delta_x = 0; + drag_delta_note = 0; + _region.note_selected(this, true); + } return true; case Dragging: // Drag motion @@ -134,7 +162,7 @@ CanvasMidiEvent::on_event(GdkEvent* ev) last_y = last_y + dy; } - _item->move(dx, dy); + _region.move_selection(dx, dy); return true; default: @@ -143,34 +171,38 @@ CanvasMidiEvent::on_event(GdkEvent* ev) break; case GDK_BUTTON_RELEASE: + select_mod = (ev->motion.state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)); event_x = ev->button.x; event_y = ev->button.y; _item->property_parent().get_value()->w2i(event_x, event_y); switch (_state) { case Pressed: // Clicked - _state = None; + if (_region.midi_view()->editor.current_midi_edit_mode() == Editing::MidiEditSelect) { + _state = None; + + if (_selected && !select_mod && _region.selection_size() > 1) + _region.unique_select(this); + else if (_selected) + _region.note_deselected(this, select_mod); + else + _region.note_selected(this, select_mod); + } else if (_region.midi_view()->editor.current_midi_edit_mode() == Editing::MidiEditErase) { + _region.start_remove_command(); + _region.command_remove_note(this); + _region.apply_command(); + } + return true; case Dragging: // Dropped _item->ungrab(ev->button.time); _state = None; - if (_note) { - // This would be nicer with a MoveCommand that doesn't need to copy... - _region.start_delta_command(); - _region.command_remove_note(this); - MidiModel::Note copy(*_note); - - double delta_t = _region.midi_view()->editor.pixel_to_frame( - abs(drag_delta_x)); - if (drag_delta_x < 0) - delta_t *= -1; - - copy.set_time(_note->time() + delta_t); - copy.set_note(_note->note() + drag_delta_note); - _region.command_add_note(copy); - _region.apply_command(); - } + if (_note) + _region.note_dropped(this, + _region.midi_view()->editor.pixel_to_frame(abs(drag_delta_x)) + * ((drag_delta_x < 0.0) ? -1 : 1), + drag_delta_note); return true; default: break;