From 0a40b50b868f1c81a7a8ee7d5518d471af6ce957 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sun, 29 Dec 2024 11:24:10 -0700 Subject: [PATCH] refactor zoom focus handling so that all EditingContexts can use the same code --- gtk2_ardour/cue_editor.cc | 8 +++- gtk2_ardour/editing_context.cc | 72 ++++++++++++++++++++++++++++++++++ gtk2_ardour/editing_context.h | 8 ++++ gtk2_ardour/editor.cc | 32 +++------------ gtk2_ardour/editor.h | 7 ---- gtk2_ardour/editor_actions.cc | 48 ----------------------- gtk2_ardour/midi_cue_editor.cc | 21 ++++++++++ gtk2_ardour/midi_cue_editor.h | 1 + 8 files changed, 115 insertions(+), 82 deletions(-) diff --git a/gtk2_ardour/cue_editor.cc b/gtk2_ardour/cue_editor.cc index 8928a54117..33d867160c 100644 --- a/gtk2_ardour/cue_editor.cc +++ b/gtk2_ardour/cue_editor.cc @@ -10,7 +10,7 @@ CueEditor::CueEditor (std::string const & name) { _history.Changed.connect (history_connection, invalidator (*this), std::bind (&CueEditor::history_changed, this), gui_context()); - set_zoom_focus (Editing::ZoomFocusMouse); + set_zoom_focus (Editing::ZoomFocusLeft); } CueEditor::~CueEditor () @@ -153,6 +153,12 @@ CueEditor::set_zoom_focus (Editing::ZoomFocus zf) return; } + std::string str = zoom_focus_strings[(int)zf]; + + if (str != zoom_focus_selector.get_text()) { + zoom_focus_selector.set_text (str); + } + if (_zoom_focus != zf) { _zoom_focus = zf; ZoomFocusChanged (); /* EMIT SIGNAL */ diff --git a/gtk2_ardour/editing_context.cc b/gtk2_ardour/editing_context.cc index 57007473a3..b051e03951 100644 --- a/gtk2_ardour/editing_context.cc +++ b/gtk2_ardour/editing_context.cc @@ -98,6 +98,17 @@ static const gchar *_grid_type_strings[] = { 0 }; + +static const gchar *_zoom_focus_strings[] = { + N_("Left"), + N_("Right"), + N_("Center"), + N_("Playhead"), + N_("Mouse"), + N_("Edit point"), + 0 +}; + Editing::GridType EditingContext::_draw_length (GridTypeNone); int EditingContext::_draw_velocity (DRAW_VEL_AUTO); int EditingContext::_draw_channel (DRAW_CHAN_AUTO); @@ -174,6 +185,10 @@ EditingContext::EditingContext (std::string const & name) grid_type_strings = I18N (_grid_type_strings); } + if (zoom_focus_strings.empty()) { + zoom_focus_strings = I18N (_zoom_focus_strings); + } + snap_mode_button.set_text (_("Snap")); snap_mode_button.set_name ("mouse mode button"); snap_mode_button.signal_button_press_event().connect (sigc::mem_fun (*this, &EditingContext::snap_mode_button_clicked), false); @@ -3157,3 +3172,60 @@ EditingContext::window_event_sample (GdkEvent const * event, double* pcx, double return pixel_to_sample (canvas_to_timeline (d.x)); } +void +EditingContext::zoom_focus_selection_done (ZoomFocus f) +{ + RefPtr ract = zoom_focus_action (f); + if (ract) { + ract->set_active (); + } +} + +RefPtr +EditingContext::zoom_focus_action (ZoomFocus focus) +{ + const char* action = 0; + RefPtr act; + + switch (focus) { + case ZoomFocusLeft: + action = X_("zoom-focus-left"); + break; + case ZoomFocusRight: + action = X_("zoom-focus-right"); + break; + case ZoomFocusCenter: + action = X_("zoom-focus-center"); + break; + case ZoomFocusPlayhead: + action = X_("zoom-focus-playhead"); + break; + case ZoomFocusMouse: + action = X_("zoom-focus-mouse"); + break; + case ZoomFocusEdit: + action = X_("zoom-focus-edit"); + break; + default: + fatal << string_compose (_("programming error: %1: %2"), "Editor: impossible focus type", (int) focus) << endmsg; + abort(); /*NOTREACHED*/ + } + + return ActionManager::get_radio_action (X_("Zoom"), action); +} + +void +EditingContext::zoom_focus_chosen (ZoomFocus focus) +{ + /* this is driven by a toggle on a radio group, and so is invoked twice, + once for the item that became inactive and once for the one that became + active. + */ + + RefPtr ract = zoom_focus_action (focus); + + if (ract && ract->get_active()) { + set_zoom_focus (focus); + } +} + diff --git a/gtk2_ardour/editing_context.h b/gtk2_ardour/editing_context.h index e4947e4976..dbc0090d27 100644 --- a/gtk2_ardour/editing_context.h +++ b/gtk2_ardour/editing_context.h @@ -328,6 +328,10 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider Editing::ZoomFocus zoom_focus () const { return _zoom_focus; } sigc::signal ZoomFocusChanged; + void zoom_focus_selection_done (Editing::ZoomFocus); + void zoom_focus_chosen (Editing::ZoomFocus); + Glib::RefPtr zoom_focus_action (Editing::ZoomFocus); + virtual void reposition_and_zoom (samplepos_t, double) = 0; sigc::signal ZoomChanged; @@ -720,6 +724,10 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider virtual void parameter_changed (std::string); virtual void ui_parameter_changed (std::string); + ArdourWidgets::ArdourDropdown zoom_focus_selector; + std::vector zoom_focus_strings; + virtual void build_zoom_focus_menu () = 0; + bool _mouse_changed_selection; ArdourMarker* entered_marker; TimeAxisView* entered_track; diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index b29930d7dc..4edf1f2ee5 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -202,16 +202,6 @@ static const gchar *_ripple_mode_strings[] = { 0 }; -static const gchar *_zoom_focus_strings[] = { - N_("Left"), - N_("Right"), - N_("Center"), - N_("Playhead"), - N_("Mouse"), - N_("Edit point"), - 0 -}; - #ifdef USE_RUBBERBAND static const gchar *_rb_opt_strings[] = { N_("Mushy"), @@ -407,7 +397,6 @@ Editor::Editor () selection_op_history.clear(); before.clear(); - zoom_focus_strings = I18N (_zoom_focus_strings); edit_mode_strings = I18N (_edit_mode_strings); ripple_mode_strings = I18N (_ripple_mode_strings); edit_point_strings = I18N (_edit_point_strings); @@ -3182,24 +3171,15 @@ Editor::build_zoom_focus_menu () { using namespace Menu_Helpers; - zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusLeft], sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_selection_done), (ZoomFocus) ZoomFocusLeft))); - zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusRight], sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_selection_done), (ZoomFocus) ZoomFocusRight))); - zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusCenter], sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_selection_done), (ZoomFocus) ZoomFocusCenter))); - zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusPlayhead], sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_selection_done), (ZoomFocus) ZoomFocusPlayhead))); - zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusMouse], sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_selection_done), (ZoomFocus) ZoomFocusMouse))); - zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusEdit], sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_selection_done), (ZoomFocus) ZoomFocusEdit))); + zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusLeft], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusLeft))); + zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusRight], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusRight))); + zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusCenter], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusCenter))); + zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusPlayhead], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusPlayhead))); + zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusMouse], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusMouse))); + zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusEdit], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusEdit))); zoom_focus_selector.set_sizing_texts (zoom_focus_strings); } -void -Editor::zoom_focus_selection_done (ZoomFocus f) -{ - RefPtr ract = zoom_focus_action (f); - if (ract) { - ract->set_active (); - } -} - void Editor::marker_click_behavior_selection_done (MarkerClickBehavior m) { diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index d9792411fd..bf4610a78f 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1786,14 +1786,7 @@ private: //zoom focus menu stuff Editing::ZoomFocus effective_zoom_focus() const; - ArdourWidgets::ArdourDropdown zoom_focus_selector; - void zoom_focus_selection_done (Editing::ZoomFocus); void build_zoom_focus_menu (); - std::vector zoom_focus_strings; - - void zoom_focus_chosen (Editing::ZoomFocus); - - Glib::RefPtr zoom_focus_action (Editing::ZoomFocus); /* Marker Click Radio */ Glib::RefPtr marker_click_behavior_action (Editing::MarkerClickBehavior); diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index b4ae312a24..d64c9352b8 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -1022,39 +1022,6 @@ Editor::marker_click_behavior_action (MarkerClickBehavior m) return ActionManager::get_radio_action (X_("MarkerClickBehavior"), action); } -RefPtr -Editor::zoom_focus_action (ZoomFocus focus) -{ - const char* action = 0; - RefPtr act; - - switch (focus) { - case ZoomFocusLeft: - action = X_("zoom-focus-left"); - break; - case ZoomFocusRight: - action = X_("zoom-focus-right"); - break; - case ZoomFocusCenter: - action = X_("zoom-focus-center"); - break; - case ZoomFocusPlayhead: - action = X_("zoom-focus-playhead"); - break; - case ZoomFocusMouse: - action = X_("zoom-focus-mouse"); - break; - case ZoomFocusEdit: - action = X_("zoom-focus-edit"); - break; - default: - fatal << string_compose (_("programming error: %1: %2"), "Editor: impossible focus type", (int) focus) << endmsg; - abort(); /*NOTREACHED*/ - } - - return ActionManager::get_radio_action (X_("Zoom"), action); -} - void Editor::toggle_sound_midi_notes () { @@ -1065,21 +1032,6 @@ Editor::toggle_sound_midi_notes () } } -void -Editor::zoom_focus_chosen (ZoomFocus focus) -{ - /* this is driven by a toggle on a radio group, and so is invoked twice, - once for the item that became inactive and once for the one that became - active. - */ - - RefPtr ract = zoom_focus_action (focus); - - if (ract && ract->get_active()) { - set_zoom_focus (focus); - } -} - void Editor::marker_click_behavior_chosen (Editing::MarkerClickBehavior m) { diff --git a/gtk2_ardour/midi_cue_editor.cc b/gtk2_ardour/midi_cue_editor.cc index 1f7878cc2a..895463c8fc 100644 --- a/gtk2_ardour/midi_cue_editor.cc +++ b/gtk2_ardour/midi_cue_editor.cc @@ -245,6 +245,13 @@ MidiCueEditor::build_upper_toolbar () _toolbar_outer->pack_start (full_zoom_button, false, false); _toolbar_outer->pack_start (*_toolbar_inner, true, false); + build_zoom_focus_menu (); + std::string str = zoom_focus_strings[(int)_zoom_focus]; + if (str != zoom_focus_selector.get_text()) { + zoom_focus_selector.set_text (str); + } + _toolbar_outer->pack_start (zoom_focus_selector, true, false); + _toolbox.pack_start (*_toolbar_outer, false, false); Bindings* pr_bindings = Bindings::get_bindings (X_("Pianoroll")); @@ -2026,3 +2033,17 @@ MidiCueEditor::set_note_mode (NoteMode nm) } } } + +void +MidiCueEditor::build_zoom_focus_menu () +{ + using namespace Gtk::Menu_Helpers; + using namespace Editing; + + zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusLeft], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusLeft))); + zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusRight], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusRight))); + zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusCenter], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusCenter))); + zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusMouse], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusMouse))); + zoom_focus_selector.set_sizing_texts (zoom_focus_strings); +} + diff --git a/gtk2_ardour/midi_cue_editor.h b/gtk2_ardour/midi_cue_editor.h index cd65e71f0d..437e8d84a3 100644 --- a/gtk2_ardour/midi_cue_editor.h +++ b/gtk2_ardour/midi_cue_editor.h @@ -263,6 +263,7 @@ class MidiCueEditor : public CueEditor void automation_state_changed (); + void build_zoom_focus_menu (); };