From 0d01e73b869cd7dc6d7ed22b75edb03ceda672b9 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 13 Feb 2024 16:32:29 -0700 Subject: [PATCH] some state mgmt for EditingContexts --- gtk2_ardour/editing_context.cc | 86 ++++++++++++++++++++++++++++++++++ gtk2_ardour/editing_context.h | 3 ++ gtk2_ardour/editor.cc | 77 +----------------------------- gtk2_ardour/midi_cue_editor.cc | 25 ++++++++-- gtk2_ardour/midi_cue_editor.h | 3 ++ gtk2_ardour/trigger_page.cc | 8 ++++ 6 files changed, 122 insertions(+), 80 deletions(-) diff --git a/gtk2_ardour/editing_context.cc b/gtk2_ardour/editing_context.cc index 748d708ccd..ea4f22254b 100644 --- a/gtk2_ardour/editing_context.cc +++ b/gtk2_ardour/editing_context.cc @@ -36,6 +36,7 @@ #include "ardour_ui.h" #include "edit_note_dialog.h" #include "editing_context.h" +#include "editing_convert.h" #include "editor_drag.h" #include "keyboard.h" #include "midi_region_view.h" @@ -2211,3 +2212,88 @@ EditingContext::on_velocity_scroll_event (GdkEventScroll* ev) set_draw_velocity_to(v); return true; } + +void +EditingContext::set_common_editing_state (XMLNode const & node) +{ + double z; + if (node.get_property ("zoom", z)) { + /* older versions of ardour used floating point samples_per_pixel */ + reset_zoom (llrintf (z)); + } else { + reset_zoom (samples_per_pixel); + } + + GridType grid_type; + if (!node.get_property ("grid-type", grid_type)) { + grid_type = _grid_type; + } + grid_type_selection_done (grid_type); + + GridType draw_length; + if (!node.get_property ("draw-length", draw_length)) { + draw_length = _draw_length; + } + draw_length_selection_done (draw_length); + + int draw_vel; + if (!node.get_property ("draw-velocity", draw_vel)) { + draw_vel = _draw_velocity; + } + draw_velocity_selection_done (draw_vel); + + int draw_chan; + if (!node.get_property ("draw-channel", draw_chan)) { + draw_chan = DRAW_CHAN_AUTO; + } + draw_channel_selection_done (draw_chan); + + SnapMode sm; + if (node.get_property ("snap-mode", sm)) { + snap_mode_selection_done(sm); + /* set text of Dropdown. in case _snap_mode == SnapOff (default) + * snap_mode_selection_done() will only mark an already active item as active + * which does not trigger set_text(). + */ + set_snap_mode (sm); + } else { + set_snap_mode (_snap_mode); + } + + node.get_property ("internal-grid-type", internal_grid_type); + node.get_property ("internal-snap-mode", internal_snap_mode); + node.get_property ("pre-internal-grid-type", pre_internal_grid_type); + node.get_property ("pre-internal-snap-mode", pre_internal_snap_mode); + + std::string mm_str; + if (node.get_property ("mouse-mode", mm_str)) { + MouseMode m = str2mousemode(mm_str); + set_mouse_mode (m, true); + } else { + set_mouse_mode (MouseObject, true); + } + + samplepos_t lf_pos; + if (node.get_property ("left-frame", lf_pos)) { + if (lf_pos < 0) { + lf_pos = 0; + } + reset_x_origin (lf_pos); + } +} + +void +EditingContext::get_common_editing_state (XMLNode& node) const +{ + node.set_property ("zoom", samples_per_pixel); + node.set_property ("grid-type", _grid_type); + node.set_property ("snap-mode", _snap_mode); + node.set_property ("internal-grid-type", internal_grid_type); + node.set_property ("internal-snap-mode", internal_snap_mode); + node.set_property ("pre-internal-grid-type", pre_internal_grid_type); + node.set_property ("pre-internal-snap-mode", pre_internal_snap_mode); + node.set_property ("draw-length", _draw_length); + node.set_property ("draw-velocity", _draw_velocity); + node.set_property ("draw-channel", _draw_channel); + node.set_property ("left-frame", _leftmost_sample); +} diff --git a/gtk2_ardour/editing_context.h b/gtk2_ardour/editing_context.h index 7c49350012..390162dae6 100644 --- a/gtk2_ardour/editing_context.h +++ b/gtk2_ardour/editing_context.h @@ -556,6 +556,9 @@ public: Editing::MouseMode mouse_mode; + void set_common_editing_state (XMLNode const & node); + void get_common_editing_state (XMLNode& node) const; + private: static std::queue ec_stack; diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 39ea4cd4fa..d0c1a1dafa 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -2213,75 +2213,12 @@ Editor::set_state (const XMLNode& node, int version) node.get_property ("marker-click-behavior", marker_click_behavior); marker_click_behavior_selection_done (marker_click_behavior); - double z; - if (node.get_property ("zoom", z)) { - /* older versions of ardour used floating point samples_per_pixel */ - reset_zoom (llrintf (z)); - } else { - reset_zoom (samples_per_pixel); - } - int32_t cnt; if (node.get_property ("visible-track-count", cnt)) { set_visible_track_count (cnt); } - GridType grid_type; - if (!node.get_property ("grid-type", grid_type)) { - grid_type = _grid_type; - } - grid_type_selection_done (grid_type); - - GridType draw_length; - if (!node.get_property ("draw-length", draw_length)) { - draw_length = _draw_length; - } - draw_length_selection_done (draw_length); - - int draw_vel; - if (!node.get_property ("draw-velocity", draw_vel)) { - draw_vel = _draw_velocity; - } - draw_velocity_selection_done (draw_vel); - - int draw_chan; - if (!node.get_property ("draw-channel", draw_chan)) { - draw_chan = DRAW_CHAN_AUTO; - } - draw_channel_selection_done (draw_chan); - - SnapMode sm; - if (node.get_property ("snap-mode", sm)) { - snap_mode_selection_done(sm); - /* set text of Dropdown. in case _snap_mode == SnapOff (default) - * snap_mode_selection_done() will only mark an already active item as active - * which does not trigger set_text(). - */ - set_snap_mode (sm); - } else { - set_snap_mode (_snap_mode); - } - - node.get_property ("internal-grid-type", internal_grid_type); - node.get_property ("internal-snap-mode", internal_snap_mode); - node.get_property ("pre-internal-grid-type", pre_internal_grid_type); - node.get_property ("pre-internal-snap-mode", pre_internal_snap_mode); - - std::string mm_str; - if (node.get_property ("mouse-mode", mm_str)) { - MouseMode m = str2mousemode(mm_str); - set_mouse_mode (m, true); - } else { - set_mouse_mode (MouseObject, true); - } - - samplepos_t lf_pos; - if (node.get_property ("left-frame", lf_pos)) { - if (lf_pos < 0) { - lf_pos = 0; - } - reset_x_origin (lf_pos); - } + set_common_editing_state (node); double y_origin; if (node.get_property ("y-origin", y_origin)) { @@ -2415,23 +2352,13 @@ Editor::get_state () const node->set_property ("zoom-focus", zoom_focus); - node->set_property ("zoom", samples_per_pixel); - node->set_property ("grid-type", _grid_type); - node->set_property ("snap-mode", _snap_mode); - node->set_property ("internal-grid-type", internal_grid_type); - node->set_property ("internal-snap-mode", internal_snap_mode); - node->set_property ("pre-internal-grid-type", pre_internal_grid_type); - node->set_property ("pre-internal-snap-mode", pre_internal_snap_mode); node->set_property ("edit-point", _edit_point); node->set_property ("visible-track-count", _visible_track_count); node->set_property ("marker-click-behavior", marker_click_behavior); - node->set_property ("draw-length", _draw_length); - node->set_property ("draw-velocity", _draw_velocity); - node->set_property ("draw-channel", _draw_channel); + get_common_editing_state (*node); node->set_property ("playhead", _playhead_cursor->current_sample ()); - node->set_property ("left-frame", _leftmost_sample); node->set_property ("y-origin", vertical_adjustment.get_value ()); node->set_property ("maximised", _maximised); diff --git a/gtk2_ardour/midi_cue_editor.cc b/gtk2_ardour/midi_cue_editor.cc index 3940a7b774..105c44036e 100644 --- a/gtk2_ardour/midi_cue_editor.cc +++ b/gtk2_ardour/midi_cue_editor.cc @@ -154,12 +154,12 @@ MidiCueEditor::setup_toolbar () Gtk::HBox* _toolbar_inner = manage (new Gtk::HBox); Gtk::HBox* _toolbar_outer = manage (new Gtk::HBox); - _toolbar_inner->pack_start (*mouse_mode_box, false, true); - _toolbar_inner->pack_start (snap_box, false, true); - _toolbar_inner->pack_start (grid_box, false, true); - _toolbar_inner->pack_start (draw_box, false, true); + _toolbar_inner->pack_start (*mouse_mode_box, false, false); + _toolbar_inner->pack_start (snap_box, false, false); + _toolbar_inner->pack_start (grid_box, false, false); + _toolbar_inner->pack_start (draw_box, false, false); - _toolbar_outer->pack_start (*_toolbar_inner, true, true); + _toolbar_outer->pack_start (*_toolbar_inner, true, false); _toolbox.pack_start (*_toolbar_outer, false, false); Bindings* pr_bindings = Bindings::get_bindings (X_("Pianoroll")); @@ -1009,3 +1009,18 @@ MidiCueEditor::mouse_mode_toggled (Editing::MouseMode m) _canvas->re_enter (); } } + +int +MidiCueEditor::set_state (XMLNode const & node, int version) +{ + set_common_editing_state (node); + return 0; +} + +XMLNode& +MidiCueEditor::get_state () const +{ + XMLNode* node (new XMLNode (_("MIDICueEditor"))); + get_common_editing_state (*node); + return *node; +} diff --git a/gtk2_ardour/midi_cue_editor.h b/gtk2_ardour/midi_cue_editor.h index 01ad2b338c..d887703deb 100644 --- a/gtk2_ardour/midi_cue_editor.h +++ b/gtk2_ardour/midi_cue_editor.h @@ -87,6 +87,9 @@ class MidiCueEditor : public CueEditor ArdourCanvas::GtkCanvasViewport* get_canvas_viewport() const; ArdourCanvas::Canvas* get_canvas() const; + int set_state (const XMLNode&, int version); + XMLNode& get_state () const; + protected: Temporal::timepos_t snap_to_grid (Temporal::timepos_t const & start, Temporal::RoundMode direction, diff --git a/gtk2_ardour/trigger_page.cc b/gtk2_ardour/trigger_page.cc index 659ce8a330..8ec9eb4ffa 100644 --- a/gtk2_ardour/trigger_page.cc +++ b/gtk2_ardour/trigger_page.cc @@ -224,6 +224,8 @@ TriggerPage::get_state () const node->set_property (X_("triggerpage-hpane-pos"), _pane_upper.get_divider ()); node->set_property (X_("triggerpage-sidebar-page"), _sidebar_notebook.get_current_page ()); + node->add_child_nocopy (_midi_editor->get_state()); + return *node; } @@ -234,6 +236,12 @@ TriggerPage::set_state (const XMLNode& node, int version) if (node.get_property (X_("triggerpage-sidebar-page"), sidebar_page)) { _sidebar_notebook.set_current_page (sidebar_page); } + + XMLNode* mn = node.child (X_("MIDICueEditor")); + if (mn) { + _midi_editor->set_state (*mn, version); + } + return Tabbable::set_state (node, version); }