From 22a5113b59a48a367b8ad4c5334c156b97fee993 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 15 Jan 2025 20:20:18 -0700 Subject: [PATCH] change how mouse mode actions are defined they now use a lambda for the functor, and the lambda calls current_editing_context() to pick which EditingContext will be affected. this design replaces one where each EditingContext had its own set of mouse mode actions defined, using its own name as the action group --- gtk2_ardour/ardour.keys.in | 16 ++++----- gtk2_ardour/editing_context.cc | 66 +++++++++++++++++++--------------- gtk2_ardour/editing_context.h | 3 +- gtk2_ardour/editor_actions.cc | 20 ++--------- gtk2_ardour/pianoroll.bindings | 8 ----- gtk2_ardour/pianoroll.cc | 20 ++++++++--- gtk2_ardour/pianoroll.h | 1 + 7 files changed, 67 insertions(+), 67 deletions(-) delete mode 100644 gtk2_ardour/pianoroll.bindings diff --git a/gtk2_ardour/ardour.keys.in b/gtk2_ardour/ardour.keys.in index 496eeb0311..ac6614db50 100644 --- a/gtk2_ardour/ardour.keys.in +++ b/gtk2_ardour/ardour.keys.in @@ -159,22 +159,22 @@ This mode provides many different operations on both regions and control points, @gmark|Common/jump-backward-to-mark| q|to previous mark @sess|Common/Quit| <@PRIMARY@>q|quit @gmark|Common/jump-forward-to-mark| w|to next mark -@mmode|Editor/set-mouse-mode-content| e|content mode +@mmode|Editing/set-mouse-mode-content| e|content mode @sess|Main/QuickExport| <@PRIMARY@>e|quick export session @rop|Region/export-region| <@PRIMARY@><@SECONDARY@>e|export selected region(s) @sess|Main/ExportAudio| <@SECONDARY@>e|export session @sess|Main/StemExport| <@SECONDARY@><@TERTIARY@>e|stem export selected tracks @select|Editor/select-all-after-edit-cursor| <@PRIMARY@><@TERTIARY@>e|select all after EP @vis|Editor/show-editor-mixer| <@TERTIARY@>e|toggle editor window mixer -@mmode|Editor/set-mouse-mode-range| r|range mode +@mmode|Editing/set-mouse-mode-range| r|range mode @wvis|Common/show-recorder| <@SECONDARY@>r|show recorder page @editing|Editing/redo| <@PRIMARY@>r|redo @edit|Editor/select-from-regions| <@PRIMARY@><@TERTIARY@>r|set Range to selected regions @edit|Editor/add-range-marker-from-selection| <@SECONDARY@><@TERTIARY@>r|Add single Range marker from selection @trans|Transport/Record| <@TERTIARY@>r|engage record -@mmode|Editor/set-mouse-mode-timefx| t|timefx mode +@mmode|Editing/set-mouse-mode-timefx| t|timefx mode @gselect|Common/select-all-visible-lanes| <@PRIMARY@>t|select all visible lanes -@mmode|Editor/set-mouse-mode-grid| y|grid mode +@mmode|Editing/set-mouse-mode-grid| y|grid mode @editing|Editing/alternate-redo| <@PRIMARY@>y|redo @select|Editor/select-all-between-cursors| <@PRIMARY@>u|select all regions enclosed by Range @select|Editor/select-all-within-cursors| u|select all regions touched by Range @@ -202,7 +202,7 @@ This mode provides many different operations on both regions and control points, @sess|Main/SnapshotStay| <@PRIMARY@><@TERTIARY@>s|snapshot session @edtrk|Editor/track-solo-toggle| <@SECONDARY@>s|toggle track solo status @edit|Editor/ToggleSummary| <@TERTIARY@>s|toggle summary -@mmode|Editor/set-mouse-mode-draw| d|note-draw mode +@mmode|Editing/set-mouse-mode-draw| d|note-draw mode @edit|Editor/duplicate| <@PRIMARY@>d|duplicate (once) @edit|Editor/multi-duplicate| <@SECONDARY@>d|duplicate (multi) @select|Editor/select-all-in-punch-range| <@TERTIARY@>d|select all in punch range @@ -212,7 +212,7 @@ This mode provides many different operations on both regions and control points, @rop|Region/show-rhythm-ferret| <@SECONDARY@>f|show rhythm ferret window @wvis|Common/ToggleMaximalEditor| <@PRIMARY@><@SECONDARY@>f|maximise editor space @wvis|Common/ToggleMaximalMixer| <@PRIMARY@><@TERTIARY@>f|maximise mixer space -@mmode|Editor/set-mouse-mode-object| g|object mode +@mmode|Editing/set-mouse-mode-object| g|object mode @edit|Editor/group-selected-regions| <@PRIMARY@>g|group selected regions @edit|Editor/ungroup-selected-regions| <@PRIMARY@><@TERTIARY@>g|ungroup selected regions @edit|Region/play-selected-regions| h|play selected region(s) @@ -233,7 +233,7 @@ This mode provides many different operations on both regions and control points, @aep|Region/align-regions-sync-relative| x|align sync points (relative) @editing|Editing/editor-cut| <@PRIMARY@>x|cut @edit|Editor/cut-paste-section| <@PRIMARY@><@TERTIARY@>x|cut \& paste section -@mmode|Editor/set-mouse-mode-cut| c|cut mode +@mmode|Editing/set-mouse-mode-cut| c|cut mode @editing|Editing/editor-copy| <@PRIMARY@>c|copy @wvis|Common/show-trigger| <@SECONDARY@>c|show cues page @edit|Editor/editor-crop| <@PRIMARY@><@SECONDARY@>c|crop range @@ -393,7 +393,7 @@ This mode provides many different operations on both regions and control points, @eep|Editor/cycle-edit-mode| 1|cycle edit mode {slide, lock, ripple} @eep|Editor/cycle-edit-point| 2|next EP w/o marker {playhead, mouse} @eep|Editor/cycle-edit-point-with-marker| <@PRIMARY@>2|next EP w/marker {playhead, mouse, marker} -@mmode|Editor/set-mouse-mode-object-range| 3|Smart Mode (provide some Range tools in Object mode) +@mmode|Editing/set-mouse-mode-object-range| 3|Smart Mode (provide some Range tools in Object mode) @gmode|Transport/ToggleFollowEdits| <@PRIMARY@>3|toggle playhead follows edits @grid|Editor/cycle-snap-mode| 4|cycle to next snap mode {On/Off} @grid|Editor/prev-grid-choice| 5|use prev grid unit diff --git a/gtk2_ardour/editing_context.cc b/gtk2_ardour/editing_context.cc index 32ea608eeb..af141578ac 100644 --- a/gtk2_ardour/editing_context.cc +++ b/gtk2_ardour/editing_context.cc @@ -313,6 +313,16 @@ EditingContext::register_common_actions (Bindings* common_bindings) reg_sens (_common_actions, "editor-cut", _("Cut"), []() { current_editing_context()->cut() ; }); reg_sens (_common_actions, "editor-copy", _("Copy"), []() { current_editing_context()->copy() ; }); reg_sens (_common_actions, "editor-paste", _("Paste"), []() { current_editing_context()->keyboard_paste() ; }); + + RadioAction::Group mouse_mode_group; + + ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-object", _("Grab (Object Tool)"), []() { current_editing_context()->mouse_mode_toggled (Editing::MouseObject); }); + ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-range", _("Range Tool"), []() { current_editing_context()->mouse_mode_toggled (Editing::MouseRange); }); + ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-draw", _("Note Drawing Tool"), []() { current_editing_context()->mouse_mode_toggled (Editing::MouseDraw); }); + ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-timefx", _("Time FX Tool"), []() { current_editing_context()->mouse_mode_toggled (Editing::MouseTimeFX); }); + ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-grid", _("Grid Tool"), []() { current_editing_context()->mouse_mode_toggled (Editing::MouseGrid); }); + ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-content", _("Internal Edit (Content Tool)"), []() { current_editing_context()->mouse_mode_toggled (Editing::MouseContent); }); + ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-cut", _("Cut Tool"), []() { current_editing_context()->mouse_mode_toggled (Editing::MouseCut); }); } void @@ -2157,46 +2167,25 @@ EditingContext::pack_snap_box () Glib::RefPtr EditingContext::get_mouse_mode_action (MouseMode m) const { - char const * group_name = _name.c_str(); /* use char* to force correct ::get_action variant */ - switch (m) { case MouseRange: - return ActionManager::get_action (group_name, X_("set-mouse-mode-range")); + return ActionManager::get_action (X_("Editing"), X_("set-mouse-mode-range")); case MouseObject: - return ActionManager::get_action (group_name, X_("set-mouse-mode-object")); + return ActionManager::get_action (X_("Editing"), X_("set-mouse-mode-object")); case MouseCut: - return ActionManager::get_action (group_name, X_("set-mouse-mode-cut")); + return ActionManager::get_action (X_("Editing"), X_("set-mouse-mode-cut")); case MouseDraw: - return ActionManager::get_action (group_name, X_("set-mouse-mode-draw")); + return ActionManager::get_action (X_("Editing"), X_("set-mouse-mode-draw")); case MouseTimeFX: - return ActionManager::get_action (group_name, X_("set-mouse-mode-timefx")); + return ActionManager::get_action (X_("Editing"), X_("set-mouse-mode-timefx")); case MouseGrid: - return ActionManager::get_action (group_name, X_("set-mouse-mode-grid")); + return ActionManager::get_action (X_("Editing"), X_("set-mouse-mode-grid")); case MouseContent: - return ActionManager::get_action (group_name, X_("set-mouse-mode-content")); + return ActionManager::get_action (X_("Editing"), X_("set-mouse-mode-content")); } return Glib::RefPtr(); } -void -EditingContext::register_mouse_mode_actions () -{ - RefPtr act; - std::string group_name = _name; - Glib::RefPtr mouse_mode_actions = ActionManager::create_action_group (bindings, group_name); - RadioAction::Group mouse_mode_group; - - act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-object", _("Grab (Object Tool)"), std::bind (&EditingContext::mouse_mode_toggled, this, Editing::MouseObject)); - act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-range", _("Range Tool"), std::bind (&EditingContext::mouse_mode_toggled, this, Editing::MouseRange)); - act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-draw", _("Note Drawing Tool"), std::bind (&EditingContext::mouse_mode_toggled, this, Editing::MouseDraw)); - act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-timefx", _("Time FX Tool"), std::bind (&EditingContext::mouse_mode_toggled, this, Editing::MouseTimeFX)); - act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-grid", _("Grid Tool"), std::bind (&EditingContext::mouse_mode_toggled, this, Editing::MouseGrid)); - act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-content", _("Internal Edit (Content Tool)"), std::bind (&EditingContext::mouse_mode_toggled, this, Editing::MouseContent)); - act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-cut", _("Cut Tool"), std::bind (&EditingContext::mouse_mode_toggled, this, Editing::MouseCut)); - - add_mouse_mode_actions (mouse_mode_actions); -} - void EditingContext::bind_mouse_mode_buttons () { @@ -3275,4 +3264,25 @@ EditingContext::copy () cut_copy (Copy); } +void +EditingContext::load_shared_bindings () +{ + /* This set of bindings may expand in the future to include things + * other than MIDI editing, but for now this is all we've got as far as + * bindings that need to be distinct from the Editors (because some of + * the keys may overlap. + */ + Bindings* midi_bindings = Bindings::get_bindings (X_("MIDI")); + register_midi_actions (midi_bindings); + + Bindings* shared_bindings = Bindings::get_bindings (X_("Editing")); + register_common_actions (shared_bindings); + + /* Give this editing context the chance to add more mode mode actions */ + add_mouse_mode_actions (_common_actions); + + /* Attach bindings to the canvas for this editing context */ + get_canvas()->set_data ("ardour-bindings", midi_bindings); + get_canvas_viewport()->set_data ("ardour-bindings", shared_bindings); +} diff --git a/gtk2_ardour/editing_context.h b/gtk2_ardour/editing_context.h index 40dfa005da..0c9b7951bd 100644 --- a/gtk2_ardour/editing_context.h +++ b/gtk2_ardour/editing_context.h @@ -481,6 +481,8 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider static Glib::RefPtr _midi_actions; static Glib::RefPtr _common_actions; + void load_shared_bindings (); + Editing::GridType pre_internal_grid_type; Editing::SnapMode pre_internal_snap_mode; Editing::GridType internal_grid_type; @@ -679,7 +681,6 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider void register_grid_actions (); Glib::RefPtr get_mouse_mode_action (Editing::MouseMode m) const; - void register_mouse_mode_actions (); void bind_mouse_mode_buttons (); virtual void add_mouse_mode_actions (Glib::RefPtr) {} diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index ad0e5e8bf1..9e61efb4c1 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -554,7 +554,6 @@ Editor::register_actions () act->set_sensitive (false); } - register_mouse_mode_actions (); bind_mouse_mode_buttons (); ActionManager::register_action (editor_actions, "step-mouse-mode", _("Step Mouse Mode"), sigc::bind (sigc::mem_fun(*this, &Editor::step_mouse_mode), true)); @@ -765,20 +764,7 @@ Editor::load_bindings () bindings = Bindings::get_bindings (editor_name()); contents().set_data ("ardour-bindings", bindings); - /* This set of bindings may expand in the future to include things - * other than MIDI editing, but for now this is all we've got as far as - * bindings that need to be distinct from the Editors (because some of - * the keys may overlap. - */ - - Bindings* midi_bindings = Bindings::get_bindings (X_("MIDI")); - register_midi_actions (midi_bindings); - - Bindings* shared_bindings = Bindings::get_bindings (X_("Editing")); - register_common_actions (shared_bindings); - - _track_canvas_viewport->canvas()->set_data ("ardour-bindings", midi_bindings); - _track_canvas_viewport->set_data ("ardour-bindings", shared_bindings); + EditingContext::load_shared_bindings (); } void @@ -1341,11 +1327,11 @@ Editor::register_region_actions () } void -Editor::add_mouse_mode_actions (Glib::RefPtr mouse_mode_actions) +Editor::add_mouse_mode_actions (Glib::RefPtr action_group) { RefPtr act; - act = ActionManager::register_toggle_action (mouse_mode_actions, "set-mouse-mode-object-range", _("Smart Mode"), sigc::mem_fun (*this, &Editor::mouse_mode_object_range_toggled)); + act = ActionManager::register_toggle_action (action_group, "set-mouse-mode-object-range", _("Smart Mode"), sigc::mem_fun (*this, &Editor::mouse_mode_object_range_toggled)); smart_mode_action = Glib::RefPtr::cast_static (act); smart_mode_button.set_related_action (smart_mode_action); smart_mode_button.set_text (_("Smart")); diff --git a/gtk2_ardour/pianoroll.bindings b/gtk2_ardour/pianoroll.bindings deleted file mode 100644 index 5119ca477d..0000000000 --- a/gtk2_ardour/pianoroll.bindings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/gtk2_ardour/pianoroll.cc b/gtk2_ardour/pianoroll.cc index c7d86dc713..4a0882cf56 100644 --- a/gtk2_ardour/pianoroll.cc +++ b/gtk2_ardour/pianoroll.cc @@ -70,10 +70,6 @@ Pianoroll::Pianoroll (std::string const & name) mouse_mode = Editing::MouseContent; autoscroll_vertical_allowed = false; - bindings = Bindings::get_bindings (editor_name()); - - register_actions (); - build_grid_type_menu (); build_draw_midi_menus(); @@ -81,7 +77,14 @@ Pianoroll::Pianoroll (std::string const & name) build_canvas (); build_lower_toolbar (); + load_bindings (); + register_actions (); + + /* this is weird because it will use an action that uses current_editing_context */ + EditingContext* ec = current_editing_context (); + switch_editing_context (this); set_mouse_mode (Editing::MouseContent, true); + switch_editing_context (ec); } Pianoroll::~Pianoroll () @@ -89,11 +92,18 @@ Pianoroll::~Pianoroll () delete bindings; } +void +Pianoroll::load_bindings () +{ + bindings = Bindings::get_bindings (editor_name()); + load_shared_bindings (); +} + void Pianoroll::register_actions () { editor_actions = ActionManager::create_action_group (bindings, editor_name()); - register_mouse_mode_actions (); + bind_mouse_mode_buttons (); register_grid_actions (); } diff --git a/gtk2_ardour/pianoroll.h b/gtk2_ardour/pianoroll.h index 8cae40005b..3e93203225 100644 --- a/gtk2_ardour/pianoroll.h +++ b/gtk2_ardour/pianoroll.h @@ -132,6 +132,7 @@ class Pianoroll : public CueEditor void cut_copy (Editing::CutCopyOp); protected: + void load_bindings (); void register_actions (); Temporal::timepos_t snap_to_grid (Temporal::timepos_t const & start,