From 019a3a1976a623a358ee660a5839a843dc772754 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 7 Sep 2023 21:25:08 +0200 Subject: [PATCH] Allow to select Arrangement sections This also adds interaction with sections in the Arrangement Ruler. Note that selecting a range switches to the Range tool. This is enforced because time-range selection is only meaningful with tools that perform edit operations on the whole timeline. --- gtk2_ardour/editor.h | 1 + gtk2_ardour/editor_canvas_events.cc | 72 +++++++++++++++++++++++++++++ gtk2_ardour/editor_markers.cc | 1 + gtk2_ardour/editor_mouse.cc | 2 +- gtk2_ardour/editor_sections.cc | 17 +++++++ 5 files changed, 92 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 065b33d8cd..543a338bba 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -716,6 +716,7 @@ private: void location_flags_changed (ARDOUR::Location*); void refresh_location_display (); void update_section_rects (); + bool section_rect_event (GdkEvent*, ARDOUR::Location*, ArdourCanvas::Rectangle*, std::string); void refresh_location_display_internal (const ARDOUR::Locations::LocationList&); void add_new_location (ARDOUR::Location*); ArdourCanvas::Container* add_new_location_internal (ARDOUR::Location*); diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index b9eb57766c..7ae9774bdd 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -1126,6 +1126,78 @@ Editor::canvas_ruler_bar_event (GdkEvent *event, ArdourCanvas::Item* item, ItemT return typed_event (item, event, type); } +bool +Editor::section_rect_event (GdkEvent* ev, Location* loc, ArdourCanvas::Rectangle* rect, std::string color) +{ + switch (ev->type) { + case GDK_ENTER_NOTIFY: + if (UIConfiguration::instance ().get_widget_prelight ()) { + rect->set_fill_color (UIConfiguration::instance().color_mod (color, "marker bar")); + return true; + } + break; + case GDK_LEAVE_NOTIFY: + if (UIConfiguration::instance ().get_widget_prelight ()) { + rect->set_fill_color (UIConfiguration::instance().color (color)); + return true; + } + break; + case GDK_BUTTON_PRESS: + if (Keyboard::modifier_state_equals (ev->button.state, Keyboard::PrimaryModifier)) { + /* used to add markers */ + return false; + } + if (ev->button.button == 1) { + _session->request_locate (loc->start().samples()); + } + return true; + case GDK_2BUTTON_PRESS: + case GDK_3BUTTON_PRESS: + if (Keyboard::modifier_state_equals (ev->button.state, Keyboard::PrimaryModifier)) { + return false; + } + if (ev->button.button == 1) { + assert (find_location_markers (loc)); + rename_marker (find_location_markers (loc)->start); + return true; + } + break; + case GDK_BUTTON_RELEASE: + if (Keyboard::is_context_menu_event (&ev->button)) { + /* find section */ + timepos_t start (loc->start ()); + timepos_t end; + Location* l = _session->locations()->section_at (start, start, end); + assert (l); + /* set selection range */ + selection->clear (); + selection->set (start, end); + /* switch to range tool - same as EditorSections::selection_changed */ + switch (current_mouse_mode ()) { + case Editing::MouseRange: + /* OK */ + break; + case Editing::MouseObject: + if (ActionManager::get_toggle_action ("MouseMode", "set-mouse-mode-object-range")->get_active ()) { + /* smart mode; OK */ + break; + } + /*fallthrough*/ + default: + ActionManager::get_radio_action (X_("MouseMode"), X_("set-mouse-mode-range"))->set_active (true); + break; + } + /* and show section context menu */ + //popup_section_box_menu (ev->button.button, ev->button.time); + return true; + } + break; + default: + break; + } + return false; +} + bool Editor::canvas_playhead_cursor_event (GdkEvent *event, ArdourCanvas::Item* item) { diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc index bb9ed38a17..cd2c301bf9 100644 --- a/gtk2_ardour/editor_markers.cc +++ b/gtk2_ardour/editor_markers.cc @@ -677,6 +677,7 @@ Editor::update_section_rects () std::string const color = bright ? "arrangement rect" : "arrangement rect alt"; rect->set_fill_color (UIConfiguration::instance().color (color)); + rect->Event.connect (sigc::bind (sigc::mem_fun (this, &Editor::section_rect_event), l, rect, color)); Editor::LocationMarkers* markers = find_location_markers (l); if (markers) { diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index eba98335fd..bd0435d297 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -1850,7 +1850,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT return true; case SectionMarkerBarItem: - if (!_dragging_playhead) { + if (!_dragging_playhead && Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) { snap_to_with_modifier (where, event, Temporal::RoundNearest, SnapToGrid_Scaled); mouse_add_new_marker (where, Location::IsSection); } diff --git a/gtk2_ardour/editor_sections.cc b/gtk2_ardour/editor_sections.cc index bc242007aa..0bc7a955e4 100644 --- a/gtk2_ardour/editor_sections.cc +++ b/gtk2_ardour/editor_sections.cc @@ -231,6 +231,23 @@ EditorSections::selection_changed () timepos_t end = row[_columns.end]; _selection_change.block (); + + switch (PublicEditor::instance ().current_mouse_mode ()) { + case Editing::MouseRange: + /* OK */ + break; + case Editing::MouseObject: + if (ActionManager::get_toggle_action ("MouseMode", "set-mouse-mode-object-range")->get_active ()) { + /* smart mode; OK */ + break; + } + /*fallthrough*/ + default: + Glib::RefPtr ract = ActionManager::get_radio_action (X_("MouseMode"), X_("set-mouse-mode-range")); + ract->set_active (true); + break; + } + Selection& s (PublicEditor::instance ().get_selection ()); s.clear (); s.set (start, end);