X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmidi_region_view.cc;h=c0d8a3c59968892b545cbc6b98a8fda0198cc5ec;hb=47d186d1a301c8cbc8ed8c3b6cbe0c84bb6b681f;hp=9e0bbb3a97a0842cbd13d9bf56dc1fece17138df;hpb=d9dea0a3aaabeec001ef3f430f11ecce7aa94f9f;p=ardour.git diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 9e0bbb3a97..c0d8a3c599 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -122,7 +122,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent, , _last_event_y (0) , _grabbed_keyboard (false) , _entered (false) - , _note_entered (false) + , _entered_note (0) , _mouse_changed_selection (false) { CANVAS_DEBUG_NAME (_note_group, string_compose ("note group for %1", get_item_name())); @@ -165,7 +165,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent, , _last_event_y (0) , _grabbed_keyboard (false) , _entered (false) - , _note_entered (false) + , _entered_note (0) , _mouse_changed_selection (false) { CANVAS_DEBUG_NAME (_note_group, string_compose ("note group for %1", get_item_name())); @@ -213,7 +213,7 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other) , _last_event_y (0) , _grabbed_keyboard (false) , _entered (false) - , _note_entered (false) + , _entered_note (0) , _mouse_changed_selection (false) { init (false); @@ -245,7 +245,7 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other, boost::shared_ptrbutton; - _mouse_state = Pressed; + + if (m == MouseDraw || (m == MouseContent && Keyboard::modifier_state_contains (ev->state, Keyboard::insert_note_modifier()))) { + + if (midi_view()->note_mode() == Percussive) { + editor->drags()->set (new HitCreateDrag (dynamic_cast (editor), group, this), (GdkEvent *) ev); + } else { + editor->drags()->set (new NoteCreateDrag (dynamic_cast (editor), group, this), (GdkEvent *) ev); + } + + _mouse_state = AddDragging; + remove_ghost_note (); + hide_verbose_cursor (); + } else { + _mouse_state = Pressed; + } return true; } @@ -541,29 +555,13 @@ MidiRegionView::button_release (GdkEventButton* ev) case MouseTimeFX: { _mouse_changed_selection = true; - - if (Keyboard::is_insert_note_event(ev)) { - - double event_x, event_y; - - event_x = ev->x; - event_y = ev->y; - group->canvas_to_item (event_x, event_y); - - Evoral::Beats beats = get_grid_beats(editor.pixel_to_sample(event_x) + _region->position()); - create_note_at (editor.pixel_to_sample (event_x), event_y, beats, ev->state, true); - } else { - clear_editor_note_selection (); - } + clear_editor_note_selection (); break; } case MouseDraw: - { - Evoral::Beats beats = get_grid_beats(editor.pixel_to_sample(event_x) + _region->position()); - create_note_at (editor.pixel_to_sample (event_x), event_y, beats, ev->state, true); - break; - } + break; + default: break; } @@ -572,8 +570,8 @@ MidiRegionView::button_release (GdkEventButton* ev) break; case AddDragging: - /* Only create a ghost note when we added a note, not when we were drag-selecting. */ - create_ghost_note (ev->x, ev->y, ev->state); + /* Don't a ghost note when we added a note - wait until motion to avoid visual confusion. + we don't want one when we were drag-selecting either. */ case SelectRectDragging: editor.drags()->end_grab ((GdkEvent *) ev); _mouse_state = None; @@ -597,7 +595,7 @@ MidiRegionView::motion (GdkEventMotion* ev) { PublicEditor& editor = trackview.editor (); - if (!_note_entered) { + if (!_entered_note) { if (_mouse_state == AddDragging) { if (_ghost_note) { @@ -644,13 +642,7 @@ MidiRegionView::motion (GdkEventMotion* ev) MouseMode m = editor.current_mouse_mode(); - if (m == MouseDraw || (m == MouseContent && Keyboard::modifier_state_contains (ev->state, Keyboard::insert_note_modifier()))) { - editor.drags()->set (new NoteCreateDrag (dynamic_cast (&editor), group, this), (GdkEvent *) ev); - _mouse_state = AddDragging; - remove_ghost_note (); - hide_verbose_cursor (); - return true; - } else if (m == MouseContent) { + if (m == MouseContent && !Keyboard::modifier_state_contains (ev->state, Keyboard::insert_note_modifier())) { editor.drags()->set (new MidiRubberbandSelectDrag (dynamic_cast (&editor), this), (GdkEvent *) ev); if (!Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { clear_editor_note_selection (); @@ -728,11 +720,14 @@ MidiRegionView::key_press (GdkEventKey* ev) detectable auto-repeat is the name of the game and only sends repeated presses, carry out key actions at key press, not release. */ - bool unmodified = Keyboard::no_modifier_keys_pressed (ev); if (unmodified && (ev->keyval == GDK_Alt_L || ev->keyval == GDK_Alt_R)) { - _mouse_state = SelectTouchDragging; + + if (_mouse_state != AddDragging) { + _mouse_state = SelectTouchDragging; + } + return true; } else if (ev->keyval == GDK_Escape && unmodified) { @@ -1388,7 +1383,7 @@ MidiRegionView::~MidiRegionView () if (_active_notes) { end_write(); } - + _entered_note = 0; _selection.clear(); clear_events (); @@ -1720,7 +1715,7 @@ MidiRegionView::update_sustained (Note* ev, bool update_ghost_regions) double y1; /* trim note display to not overlap the end of its region */ - if (note->length() > 0) { + if (note->length().to_double() > 0.0) { double note_end_time = note->end_time().to_double(); if (note_end_time > mr->start_beats() + mr->length_beats()) { @@ -2114,6 +2109,10 @@ MidiRegionView::step_patch (PatchChange& patch, bool bank, int delta) void MidiRegionView::note_deleted (NoteBase* cne) { + if (_entered_note && cne == _entered_note) { + _entered_note = 0; + } + if (_selection.empty()) { return; } @@ -2143,6 +2142,7 @@ MidiRegionView::delete_selection() _selection.clear(); apply_diff (); + hide_verbose_cursor (); } @@ -3339,7 +3339,7 @@ MidiRegionView::change_channel(uint8_t channel) void MidiRegionView::note_entered(NoteBase* ev) { - _note_entered = true; + _entered_note = ev; Editor* editor = dynamic_cast(&trackview.editor()); @@ -3362,7 +3362,7 @@ MidiRegionView::note_entered(NoteBase* ev) void MidiRegionView::note_left (NoteBase*) { - _note_entered = false; + _entered_note = 0; for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) { (*i)->hide_velocity (); @@ -3394,7 +3394,7 @@ MidiRegionView::patch_left (PatchChange *) void MidiRegionView::sysex_entered (SysEx* p) { - ostringstream s; + // ostringstream s; // CAIROCANVAS // need a way to extract text from p->_flag->_text // s << p->text(); @@ -3752,7 +3752,8 @@ MidiRegionView::update_ghost_note (double x, double y, uint32_t state) framepos_t const unsnapped_frame = editor.pixel_to_sample (x); const int32_t divisions = editor.get_grid_music_divisions (state); - const Evoral::Beats snapped_beats = snap_frame_to_grid_underneath (unsnapped_frame, divisions, true); + const bool shift_snap = midi_view()->note_mode() != Percussive; + const Evoral::Beats snapped_beats = snap_frame_to_grid_underneath (unsnapped_frame, divisions, shift_snap); /* ghost note may have been snapped before region */ if (_ghost_note && snapped_beats.to_double() < 0.0) {