From f48fe3f740ca322e7f66bf497f99278dde4d6a87 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 13 Jun 2025 17:20:00 -0600 Subject: [PATCH] numerous fix ups to the behavior of button presses in any pianoroll header --- gtk2_ardour/prh_base.cc | 55 ++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/gtk2_ardour/prh_base.cc b/gtk2_ardour/prh_base.cc index 44fee1b8be..6269193d99 100644 --- a/gtk2_ardour/prh_base.cc +++ b/gtk2_ardour/prh_base.cc @@ -646,10 +646,21 @@ PianoRollHeaderBase::button_press_handler (GdkEventButton* ev) _scroomer_button_state = _scroomer_state; - if (ev->button == 1 && ev->x <= _scroomer_size){ - if (ev->type == GDK_2BUTTON_PRESS && _view) { - _view->set_visibility_note_range (MidiStreamView::ContentsRange, false); + if (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS) { + if (_midi_context.visibility_range_style () == MidiViewBackground::FullRange) { + _midi_context.set_note_visibility_range_style (MidiViewBackground::ContentsRange); + } else { + _midi_context.set_note_visibility_range_style (MidiViewBackground::FullRange); + } + return true; + } + + if (ev->x <= _scroomer_size) { + + /* button press on scroomer handler */ + + if (ev->button != 1) { return true; } @@ -660,28 +671,27 @@ PianoRollHeaderBase::button_press_handler (GdkEventButton* ev) return true; } else { - int note = _midi_context.y_to_note(evy); + + /* button press on note keys */ + + int note = _midi_context.y_to_note (evy); bool tertiary = Keyboard::modifier_state_contains (ev->state, Keyboard::TertiaryModifier); bool primary = Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier); + bool is_selection_click = (ev->type == GDK_BUTTON_PRESS) && + (((ev->button == 2) && Keyboard::no_modifiers_active (ev->state)) || ((ev->button == 1) && tertiary)); - if (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS) { - if (primary) { - _adj.set_value (0.0); - _adj.set_page_size (127.0); - _adj.value_changed (); - redraw (); - return false; - } - return false; - } else if (ev->button == 2 && Keyboard::no_modifiers_active (ev->state)) { - SetNoteSelection (note); // EMIT SIGNAL - return true; - } else if (tertiary && (ev->button == 1 || ev->button == 2)) { + + /* Note that shift-button1 actually ends up invoking + * ExtendNoteSelection, but this has the same effect as + * SetNoteSelection when there is no existing selection + */ + + if (tertiary && (ev->button == 1 || ev->button == 2)) { ExtendNoteSelection (note); // EMIT SIGNAL - return true; + } else if (is_selection_click ) { + SetNoteSelection (note); // EMIT SIGNAL } else if (primary && (ev->button == 1 || ev->button == 2)) { ToggleNoteSelection (note); // EMIT SIGNAL - return true; } else if (ev->button == 1 && note >= 0 && note < 128) { do_grab (); _dragging = true; @@ -689,14 +699,15 @@ PianoRollHeaderBase::button_press_handler (GdkEventButton* ev) if (!_active_notes[note]) { _active_notes[note] = true; _clicked_note = note; - send_note_on(note); + send_note_on (note); - invalidate_note_range(note, note); + invalidate_note_range (note, note); } else { - reset_clicked_note(note); + reset_clicked_note (note); } } } + return true; }