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
This commit is contained in:
Paul Davis 2025-01-15 20:20:18 -07:00
parent 462c5ad400
commit 22a5113b59
7 changed files with 67 additions and 67 deletions

View file

@ -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

View file

@ -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<Action>
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<Action>();
}
void
EditingContext::register_mouse_mode_actions ()
{
RefPtr<Action> act;
std::string group_name = _name;
Glib::RefPtr<ActionGroup> 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);
}

View file

@ -481,6 +481,8 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider
static Glib::RefPtr<Gtk::ActionGroup> _midi_actions;
static Glib::RefPtr<Gtk::ActionGroup> _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<Gtk::Action> 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<Gtk::ActionGroup>) {}

View file

@ -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<ActionGroup> mouse_mode_actions)
Editor::add_mouse_mode_actions (Glib::RefPtr<ActionGroup> action_group)
{
RefPtr<Action> 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<ToggleAction>::cast_static (act);
smart_mode_button.set_related_action (smart_mode_action);
smart_mode_button.set_text (_("Smart"));

View file

@ -1,8 +0,0 @@
<Bindings name="Pianoroll">
<Press>
<Binding key="d" action="Pianoroll/set-mouse-mode-draw" group="pianoroll"/>
<Binding key="e" action="Pianoroll/set-mouse-mode-content" group="pianoroll"/>
<Binding key="equal" action="Pianoroll/zoom-in" group="pianoroll"/>
<Binding key="minus" action="Pianoroll/zoom-in" group="pianoroll"/>
</Press>
</Bindings>

View file

@ -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 ();
}

View file

@ -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,