diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2020-04-16 12:13:53 -0600 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2020-04-16 17:48:12 -0600 |
commit | 8545250936accdd002be280b9b5a46249e66ecc7 (patch) | |
tree | 436098f75e6d6e991ade2e87f176c97897b076bd /gtk2_ardour/midi_region_view.cc | |
parent | eca78880479557443a7eae564b780996bd400521 (diff) |
MidiRegionView no longer handles any keypresses or alters editor "note selection"
1. Alt is still handled to change drag behavior
2. Selection doesn't store notes unless they are part of the cut buffer, which means we should not
be altering the note selection in the editor's selection object most of the time.
Diffstat (limited to 'gtk2_ardour/midi_region_view.cc')
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 201 |
1 files changed, 47 insertions, 154 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 751733fcd3..fc5e190859 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -127,7 +127,6 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent, , _last_display_zoom (0) , _last_event_x (0) , _last_event_y (0) - , _grabbed_keyboard (false) , _entered (false) , _entered_note (0) , _mouse_changed_selection (false) @@ -175,7 +174,6 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent, , _last_display_zoom (0) , _last_event_x (0) , _last_event_y (0) - , _grabbed_keyboard (false) , _entered (false) , _entered_note (0) , _mouse_changed_selection (false) @@ -230,7 +228,6 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other) , _last_display_zoom (0) , _last_event_x (0) , _last_event_y (0) - , _grabbed_keyboard (false) , _entered (false) , _entered_note (0) , _mouse_changed_selection (false) @@ -261,7 +258,6 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other, boost::shared_ptr<M , _last_display_zoom (0) , _last_event_x (0) , _last_event_y (0) - , _grabbed_keyboard (false) , _entered (false) , _entered_note (0) , _mouse_changed_selection (false) @@ -466,12 +462,6 @@ MidiRegionView::enter_internal (uint32_t state) create_ghost_note(_last_event_x, _last_event_y, state); } - if (!_selection.empty()) { - // Grab keyboard for moving selected notes with arrow keys - Keyboard::magic_widget_grab_focus(); - _grabbed_keyboard = true; - } - // Lower frame handles below notes so they don't steal events if (frame_handle_start) { frame_handle_start->lower_to_bottom(); @@ -488,11 +478,6 @@ MidiRegionView::leave_internal() remove_ghost_note (); _entered_note = 0; - if (_grabbed_keyboard) { - Keyboard::magic_widget_drop_focus(); - _grabbed_keyboard = false; - } - // Raise frame handles above notes so they catch events if (frame_handle_start) { frame_handle_start->raise_to_top(); @@ -569,18 +554,15 @@ MidiRegionView::button_release (GdkEventButton* ev) switch (editor.current_mouse_mode()) { case MouseRange: /* no motion occurred - simple click */ - clear_editor_note_selection (); + clear_selection_internal (); _mouse_changed_selection = true; break; case MouseContent: case MouseTimeFX: - { - _mouse_changed_selection = true; - clear_editor_note_selection (); - - break; - } + _mouse_changed_selection = true; + clear_selection_internal (); + break; case MouseDraw: break; @@ -667,7 +649,7 @@ MidiRegionView::motion (GdkEventMotion* ev) if (m == MouseContent && !Keyboard::modifier_state_contains (ev->state, Keyboard::insert_note_modifier())) { editor.drags()->set (new MidiRubberbandSelectDrag (dynamic_cast<Editor *> (&editor), this), (GdkEvent *) ev); if (!Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { - clear_editor_note_selection (); + clear_selection_internal (); _mouse_changed_selection = true; } _mouse_state = SelectRectDragging; @@ -743,99 +725,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)) { + if (Keyboard::no_modifier_keys_pressed(ev) && (ev->keyval == GDK_Alt_L || ev->keyval == GDK_Alt_R)) { if (_mouse_state != AddDragging) { _mouse_state = SelectTouchDragging; } return true; - - } else if (ev->keyval == GDK_Escape && unmodified) { - clear_editor_note_selection (); - _mouse_state = None; - - } else if (ev->keyval == GDK_comma || ev->keyval == GDK_period) { - - bool start = (ev->keyval == GDK_comma); - bool end = (ev->keyval == GDK_period); - bool shorter = Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier); - bool fine = Keyboard::modifier_state_contains (ev->state, Keyboard::SecondaryModifier); - - change_note_lengths (fine, shorter, Temporal::Beats(), start, end); - - return true; - - } else if ((ev->keyval == GDK_BackSpace || ev->keyval == GDK_Delete) && unmodified) { - - if (_selection.empty()) { - return false; - } - - delete_selection(); - return true; - - } else if (ev->keyval == GDK_Tab || ev->keyval == GDK_ISO_Left_Tab) { - - trackview.editor().begin_reversible_selection_op (X_("Select Adjacent Note")); - - if (Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier)) { - goto_previous_note (Keyboard::modifier_state_contains (ev->state, Keyboard::TertiaryModifier)); - } else { - goto_next_note (Keyboard::modifier_state_contains (ev->state, Keyboard::TertiaryModifier)); - } - - trackview.editor().commit_reversible_selection_op(); - - return true; - - } else if (ev->keyval == GDK_Up) { - - bool allow_smush = Keyboard::modifier_state_contains (ev->state, Keyboard::TertiaryModifier); - bool fine = !Keyboard::modifier_state_contains (ev->state, Keyboard::SecondaryModifier); - bool together = Keyboard::modifier_state_contains (ev->state, Keyboard::Level4Modifier); - - if (Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier)) { - change_velocities (true, fine, allow_smush, together); - } else { - transpose (true, fine, allow_smush); - } - return true; - - } else if (ev->keyval == GDK_Down) { - - bool allow_smush = Keyboard::modifier_state_contains (ev->state, Keyboard::TertiaryModifier); - bool fine = !Keyboard::modifier_state_contains (ev->state, Keyboard::SecondaryModifier); - bool together = Keyboard::modifier_state_contains (ev->state, Keyboard::Level4Modifier); - - if (Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier)) { - change_velocities (false, fine, allow_smush, together); - } else { - transpose (false, fine, allow_smush); - } - return true; - - } else if (ev->keyval == GDK_Left) { - - bool fine = !Keyboard::modifier_state_contains (ev->state, Keyboard::SecondaryModifier); - nudge_notes (false, fine); - return true; - - } else if (ev->keyval == GDK_Right) { - - bool fine = !Keyboard::modifier_state_contains (ev->state, Keyboard::SecondaryModifier); - nudge_notes (true, fine); - return true; - - } else if (ev->keyval == GDK_c && unmodified) { - channel_edit (); - return true; - - } else if (ev->keyval == GDK_v && unmodified) { - velocity_edit (); - return true; } return false; @@ -982,8 +879,8 @@ MidiRegionView::create_note_at (samplepos_t t, double y, Temporal::Beats length, void MidiRegionView::clear_events () { - // clear selection without signaling - clear_selection_internal (); + // clear selection without signaling or trying to change state of event objects + _selection.clear (); MidiGhostRegion* gr; for (std::vector<GhostRegion*>::iterator g = ghosts.begin(); g != ghosts.end(); ++g) { @@ -1110,7 +1007,7 @@ MidiRegionView::abort_command() delete _note_diff_command; _note_diff_command = 0; trackview.editor().abort_reversible_command(); - clear_editor_note_selection(); + clear_selection_internal (); } NoteBase* @@ -1938,7 +1835,7 @@ MidiRegionView::step_add_note (uint8_t channel, uint8_t number, uint8_t velocity start_note_diff_command (_("step add")); - clear_editor_note_selection (); + clear_selection_internal (); note_diff_add_note (new_note, true, false); apply_diff(); @@ -2214,19 +2111,12 @@ MidiRegionView::delete_note (boost::shared_ptr<NoteType> n) } void -MidiRegionView::clear_editor_note_selection () -{ - DEBUG_TRACE(DEBUG::Selection, "MRV::clear_editor_note_selection\n"); - PublicEditor& editor(trackview.editor()); - editor.get_selection().clear_midi_notes(); -} - -void MidiRegionView::clear_selection () { clear_selection_internal(); PublicEditor& editor(trackview.editor()); - editor.get_selection().remove(this); + editor.get_selection().remove (this); + _mouse_state = None; } void @@ -2239,26 +2129,18 @@ MidiRegionView::clear_selection_internal () (*i)->hide_velocity(); } _selection.clear(); - - if (_entered) { - // Clearing selection entirely, ungrab keyboard - Keyboard::magic_widget_drop_focus(); - _grabbed_keyboard = false; - } } void MidiRegionView::unique_select(NoteBase* ev) { - clear_editor_note_selection(); + clear_selection (); add_to_selection(ev); } void MidiRegionView::select_all_notes () { - clear_editor_note_selection (); - for (Events::iterator i = _events.begin(); i != _events.end(); ++i) { add_to_selection (i->second); } @@ -2267,8 +2149,6 @@ MidiRegionView::select_all_notes () void MidiRegionView::select_range (samplepos_t start, samplepos_t end) { - clear_editor_note_selection (); - for (Events::iterator i = _events.begin(); i != _events.end(); ++i) { samplepos_t t = source_beats_to_absolute_samples(i->first->time()); if (t >= start && t <= end) { @@ -2332,7 +2212,6 @@ MidiRegionView::select_matching_notes (uint8_t notenum, uint16_t channel_mask, b } if (!add) { - clear_editor_note_selection (); if (!extend && (low_note == high_note) && (high_note == notenum)) { /* only note previously selected is the one we are @@ -2407,7 +2286,7 @@ void MidiRegionView::note_selected (NoteBase* ev, bool add, bool extend) { if (!add) { - clear_editor_note_selection(); + clear_selection_internal (); add_to_selection (ev); } @@ -2536,11 +2415,6 @@ MidiRegionView::remove_from_selection (NoteBase* ev) if (i != _selection.end()) { _selection.erase (i); - if (_selection.empty() && _grabbed_keyboard) { - // Ungrab keyboard - Keyboard::magic_widget_drop_focus(); - _grabbed_keyboard = false; - } } ev->set_selected (false); @@ -2548,7 +2422,10 @@ MidiRegionView::remove_from_selection (NoteBase* ev) if (_selection.empty()) { PublicEditor& editor (trackview.editor()); + cerr << "Removing MRV from selection\n"; editor.get_selection().remove (this); + } else { + cerr << "note selection not empty\n"; } } @@ -2560,11 +2437,6 @@ MidiRegionView::add_to_selection (NoteBase* ev) if (_selection.insert (ev).second) { ev->set_selected (true); start_playing_midi_note ((ev)->note()); - if (selection_was_empty && _entered) { - // Grab keyboard for moving notes with arrow keys - Keyboard::magic_widget_grab_focus(); - _grabbed_keyboard = true; - } } if (selection_was_empty) { @@ -2801,7 +2673,7 @@ MidiRegionView::note_dropped(NoteBase *, double d_qn, int8_t dnote, bool copy) } } else { - clear_editor_note_selection (); + clear_selection_internal (); for (CopyDragEvents::iterator i = _copy_drag_events.begin(); i != _copy_drag_events.end(); ++i) { uint8_t pitch = (*i)->note()->note(); @@ -3667,15 +3539,21 @@ MidiRegionView::note_mouse_position (float x_fraction, float /*y_fraction*/, boo uint32_t MidiRegionView::get_fill_color() const { - const std::string mod_name = (_dragging ? "dragging region" : - trackview.editor().internal_editing() ? "editable region" : - "midi frame base"); + const std::string mod_name = (_dragging ? "dragging region" : "midi frame base"); + if (_selected) { - return UIConfiguration::instance().color_mod ("selected region base", mod_name); - } else if ((!UIConfiguration::instance().get_show_name_highlight() || high_enough_for_name) && - !UIConfiguration::instance().get_color_regions_using_track_color()) { + + if (!trackview.editor().internal_editing()) { + return UIConfiguration::instance().color_mod ("selected region base", mod_name); + } + + } + + if ((!UIConfiguration::instance().get_show_name_highlight() || high_enough_for_name) && + !UIConfiguration::instance().get_color_regions_using_track_color()) { return UIConfiguration::instance().color_mod ("midi frame base", mod_name); } + return UIConfiguration::instance().color_mod (fill_color, mod_name); } @@ -3824,8 +3702,6 @@ MidiRegionView::paste_internal (samplepos_t pos, unsigned paste_count, float tim duration, pos, _region->position(), quarter_note)); - clear_editor_note_selection (); - for (int n = 0; n < (int) times; ++n) { for (Notes::const_iterator i = mcb.notes().begin(); i != mcb.notes().end(); ++i) { @@ -3877,6 +3753,12 @@ MidiRegionView::goto_next_note (bool add_to_selection) MidiModel::ReadLock lock(_model->read_lock()); MidiModel::Notes& notes (_model->notes()); + if (notes.empty()) { + return; + } + + trackview.editor().begin_reversible_selection_op (X_("Select Adjacent Note")); + for (MidiModel::Notes::iterator n = notes.begin(); n != notes.end(); ++n) { NoteBase* cne = 0; if ((cne = find_canvas_note (*n))) { @@ -3907,6 +3789,9 @@ MidiRegionView::goto_next_note (bool add_to_selection) if (!_events.empty() && first_note) { unique_select (first_note); } + + + trackview.editor().commit_reversible_selection_op(); } void @@ -3921,6 +3806,12 @@ MidiRegionView::goto_previous_note (bool add_to_selection) MidiModel::ReadLock lock(_model->read_lock()); MidiModel::Notes& notes (_model->notes()); + if (notes.empty()) { + return; + } + + trackview.editor().begin_reversible_selection_op (X_("Select Adjacent Note")); + for (MidiModel::Notes::reverse_iterator n = notes.rbegin(); n != notes.rend(); ++n) { NoteBase* cne = 0; if ((cne = find_canvas_note (*n))) { @@ -3952,6 +3843,8 @@ MidiRegionView::goto_previous_note (bool add_to_selection) if (!_events.empty() && last_note) { unique_select (last_note); } + + trackview.editor().commit_reversible_selection_op(); } void |