diff --git a/gtk2_ardour/audio_clip_editor.cc b/gtk2_ardour/audio_clip_editor.cc index a9ade693b9..18420b0ca6 100644 --- a/gtk2_ardour/audio_clip_editor.cc +++ b/gtk2_ardour/audio_clip_editor.cc @@ -109,14 +109,17 @@ AudioClipEditor::AudioClipEditor (std::string const & name, bool with_transport) , scroll_fraction (0) , current_line_drag (0) { - build_upper_toolbar (); - build_canvas (); - build_lower_toolbar (); - load_bindings (); register_actions (); + build_canvas (); + build_grid_type_menu (); + + build_upper_toolbar (); + build_lower_toolbar (); + + set_action_defaults (); } void diff --git a/gtk2_ardour/cue_editor.cc b/gtk2_ardour/cue_editor.cc index 381ce2d6ec..1f4b682cdc 100644 --- a/gtk2_ardour/cue_editor.cc +++ b/gtk2_ardour/cue_editor.cc @@ -61,7 +61,6 @@ CueEditor::CueEditor (std::string const & name, bool with_transport) horizontal_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &CueEditor::scrolled)); _history.Changed.connect (history_connection, invalidator (*this), std::bind (&CueEditor::history_changed, this), gui_context()); - set_zoom_focus (Editing::ZoomFocusLeft); } CueEditor::~CueEditor () @@ -203,16 +202,7 @@ 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 */ - } + zoom_focus_actions[zf]->set_active (true); } void @@ -415,7 +405,7 @@ CueEditor::build_upper_toolbar () _toolbar_outer->pack_start (*_toolbar_inner, true, false); build_zoom_focus_menu (); - zoom_focus_selector.set_text (zoom_focus_strings[(int)_zoom_focus]); + zoom_focus_selector.set_text (zoom_focus_strings[(int)zoom_focus()]); _toolbar_left->pack_start (zoom_in_button, false, false); _toolbar_left->pack_start (zoom_out_button, false, false); @@ -436,10 +426,10 @@ CueEditor::build_zoom_focus_menu () using namespace Gtk::Menu_Helpers; using namespace Editing; - zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusLeft], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusLeft))); - zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusRight], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusRight))); - zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusCenter], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusCenter))); - zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusMouse], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusMouse))); + zoom_focus_selector.append (zoom_focus_actions[ZoomFocusLeft]); + zoom_focus_selector.append (zoom_focus_actions[ZoomFocusRight]); + zoom_focus_selector.append (zoom_focus_actions[ZoomFocusCenter]); + zoom_focus_selector.append (zoom_focus_actions[ZoomFocusMouse]); zoom_focus_selector.set_sizing_texts (zoom_focus_strings); } @@ -968,12 +958,6 @@ CueEditor::catch_pending_show_region () } } -Editing::MouseMode -CueEditor::current_mouse_mode () const -{ - return mouse_mode; -} - RegionSelection CueEditor::region_selection() { @@ -983,12 +967,9 @@ CueEditor::region_selection() } void -CueEditor::mouse_mode_toggled (Editing::MouseMode m) +CueEditor::mouse_mode_chosen (Editing::MouseMode m) { - Glib::RefPtr act = get_mouse_mode_action (m); - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); - - if (!tact->get_active()) { + if (!mouse_mode_actions[m]->get_active()) { /* this was just the notification that the old mode has been * left. we'll get called again with the new mode active in a * jiffy. @@ -996,8 +977,6 @@ CueEditor::mouse_mode_toggled (Editing::MouseMode m) return; } - mouse_mode = m; - /* this should generate a new enter event which will trigger the appropriate cursor. */ diff --git a/gtk2_ardour/cue_editor.h b/gtk2_ardour/cue_editor.h index e6ccba6f70..95c62e93df 100644 --- a/gtk2_ardour/cue_editor.h +++ b/gtk2_ardour/cue_editor.h @@ -101,13 +101,9 @@ class CueEditor : public EditingContext, public PBD::HistoryOwner * @param next true to move to the next, otherwise move to the previous */ void step_mouse_mode (bool next); - /** @return The current mouse mode (gain, object, range, timefx etc.) - * (defined in editing_syms.inc.h) - */ - Editing::MouseMode current_mouse_mode () const; /** cue editors are *always* used for internal editing */ bool internal_editing() const { return true; } - void mouse_mode_toggled (Editing::MouseMode); + void mouse_mode_chosen (Editing::MouseMode); Gdk::Cursor* get_canvas_cursor () const; MouseCursors const* cursors () const { diff --git a/gtk2_ardour/editing_context.cc b/gtk2_ardour/editing_context.cc index 5401552106..4cb5d2c614 100644 --- a/gtk2_ardour/editing_context.cc +++ b/gtk2_ardour/editing_context.cc @@ -131,7 +131,6 @@ EditingContext::EditingContext (std::string const & name) , _selection_memento (new SelectionMemento()) , _verbose_cursor (nullptr) , samples_per_pixel (2048) - , _zoom_focus (ZoomFocusPlayhead) , bbt_ruler_scale (bbt_show_many) , bbt_bars (0) , bbt_bar_helper_on (0) @@ -142,7 +141,6 @@ EditingContext::EditingContext (std::string const & name) , vertical_adjustment (0.0, 0.0, 10.0, 400.0) , horizontal_adjustment (0.0, 0.0, 1e16) , own_bindings (nullptr) - , mouse_mode (MouseObject) , visual_change_queued (false) , autoscroll_horizontal_allowed (false) , autoscroll_vertical_allowed (false) @@ -329,6 +327,34 @@ EditingContext::disable_automation_bindings () } } +void +EditingContext::set_action_defaults () +{ +#ifndef LIVETRAX + follow_playhead_action->set_active (true); +#else + follow_playhead_action->set_active (false); +#endif + mouse_mode_actions[Editing::MouseObject]->set_active (true); + zoom_focus_actions[Editing::ZoomFocusLeft]->set_active (true); + + if (snap_mode_actions[Editing::SnapMagnetic]) { + snap_mode_actions[Editing::SnapMagnetic]->set_active (true); + } + if (grid_actions[Editing::GridTypeBeat]) { + grid_actions[Editing::GridTypeBeat]->set_active (true); + } + if (draw_length_actions[DRAW_LEN_AUTO]) { + draw_length_actions[DRAW_LEN_AUTO]->set_active (true); + } + if (draw_velocity_actions[DRAW_VEL_AUTO]) { + draw_velocity_actions[DRAW_VEL_AUTO]->set_active (true); + } + if (draw_channel_actions[DRAW_CHAN_AUTO]) { + draw_channel_actions[DRAW_CHAN_AUTO]->set_active (true); + } +} + void EditingContext::register_common_actions (Bindings* common_bindings, std::string const & prefix) { @@ -337,7 +363,10 @@ EditingContext::register_common_actions (Bindings* common_bindings, std::string reg_sens (_common_actions, "temporal-zoom-out", _("Zoom Out"), sigc::bind (sigc::mem_fun (*this, &EditingContext::temporal_zoom_step), true)); reg_sens (_common_actions, "temporal-zoom-in", _("Zoom In"), sigc::bind (sigc::mem_fun (*this, &EditingContext::temporal_zoom_step), false)); - follow_playhead_action = toggle_reg_sens (_common_actions, "toggle-follow-playhead", _("Follow Playhead"), (sigc::mem_fun(*this, &EditingContext::toggle_follow_playhead))); + /* toggle action that represents state */ + follow_playhead_action = toggle_reg_sens (_common_actions, "follow-playhead", _("Follow Playhead"), sigc::mem_fun (*this, &EditingContext::follow_playhead_chosen)); + /* invokable action that toggles the stateful action */ + reg_sens (_common_actions, "toggle-follow-playhead", _("Follow Playhead"), sigc::mem_fun (*this, &EditingContext::toggle_follow_playhead)); undo_action = reg_sens (_common_actions, "undo", S_("Command|Undo"), sigc::bind (sigc::mem_fun (*this, &EditingContext::undo), 1U)); redo_action = reg_sens (_common_actions, "redo", _("Redo"), sigc::bind (sigc::mem_fun (*this, &EditingContext::redo), 1U)); @@ -353,23 +382,23 @@ EditingContext::register_common_actions (Bindings* common_bindings, std::string RadioAction::Group mouse_mode_group; - ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-object", _("Grab (Object Tool)"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_toggled), Editing::MouseObject)); - ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-range", _("Range Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_toggled), Editing::MouseRange)); - ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-draw", _("Note Drawing Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_toggled), Editing::MouseDraw)); - ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-timefx", _("Time FX Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_toggled), Editing::MouseTimeFX)); - ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-grid", _("Grid Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_toggled), Editing::MouseGrid)); - ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-content", _("Internal Edit (Content Tool)"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_toggled), Editing::MouseContent)); - ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-cut", _("Cut Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_toggled), Editing::MouseCut)); + mouse_mode_actions[Editing::MouseObject] = ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-object", _("Grab (Object Tool)"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_chosen), Editing::MouseObject)); + mouse_mode_actions[Editing::MouseRange] = ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-range", _("Range Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_chosen), Editing::MouseRange)); + mouse_mode_actions[Editing::MouseDraw] = ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-draw", _("Note Drawing Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_chosen), Editing::MouseDraw)); + mouse_mode_actions[Editing::MouseTimeFX] = ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-timefx", _("Time FX Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_chosen), Editing::MouseTimeFX)); + mouse_mode_actions[Editing::MouseGrid] = ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-grid", _("Grid Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_chosen), Editing::MouseGrid)); + mouse_mode_actions[Editing::MouseContent] = ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-content", _("Internal Edit (Content Tool)"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_chosen), Editing::MouseContent)); + mouse_mode_actions[Editing::MouseCut] = ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-cut", _("Cut Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_chosen), Editing::MouseCut)); zoom_actions = ActionManager::create_action_group (common_bindings, prefix + X_("Zoom")); RadioAction::Group zoom_group; - radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-left", _("Zoom Focus Left"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusLeft)); - radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-right", _("Zoom Focus Right"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusRight)); - radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-center", _("Zoom Focus Center"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusCenter)); - radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-playhead", _("Zoom Focus Playhead"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusPlayhead)); - radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-mouse", _("Zoom Focus Mouse"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusMouse)); - radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-edit", _("Zoom Focus Edit Point"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusEdit)); + zoom_focus_actions[Editing::ZoomFocusLeft] = radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-left", _("Zoom Focus Left"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusLeft)); + zoom_focus_actions[Editing::ZoomFocusRight] = radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-right", _("Zoom Focus Right"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusRight)); + zoom_focus_actions[Editing::ZoomFocusCenter] = radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-center", _("Zoom Focus Center"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusCenter)); + zoom_focus_actions[Editing::ZoomFocusPlayhead] = radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-playhead", _("Zoom Focus Playhead"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusPlayhead)); + zoom_focus_actions[Editing::ZoomFocusMouse] = radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-mouse", _("Zoom Focus Mouse"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusMouse)); + zoom_focus_actions[Editing::ZoomFocusEdit] = radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-edit", _("Zoom Focus Edit Point"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusEdit)); ActionManager::register_action (zoom_actions, X_("cycle-zoom-focus"), _("Next Zoom Focus"), sigc::mem_fun (*this, &EditingContext::cycle_zoom_focus)); @@ -507,16 +536,16 @@ EditingContext::register_midi_actions (Bindings* midi_bindings, std::string cons draw_length_actions[Editing::GridTypeBeatDiv14] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-fourteenths"), grid_type_strings[(int)GridTypeBeatDiv14].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv14)); draw_length_actions[Editing::GridTypeBeatDiv12] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-twelfths"), grid_type_strings[(int)GridTypeBeatDiv12].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv12)); draw_length_actions[Editing::GridTypeBeatDiv10] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-tenths"), grid_type_strings[(int)GridTypeBeatDiv10].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv10)); - draw_length_actions[Editing::GridTypeBeatDiv8] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-eighths"), grid_type_strings[(int)GridTypeBeatDiv8].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv8)); - draw_length_actions[Editing::GridTypeBeatDiv7] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-sevenths"), grid_type_strings[(int)GridTypeBeatDiv7].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv7)); - draw_length_actions[Editing::GridTypeBeatDiv6] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-sixths"), grid_type_strings[(int)GridTypeBeatDiv6].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv6)); - draw_length_actions[Editing::GridTypeBeatDiv5] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-fifths"), grid_type_strings[(int)GridTypeBeatDiv5].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv5)); - draw_length_actions[Editing::GridTypeBeatDiv4] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-quarters"), grid_type_strings[(int)GridTypeBeatDiv4].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv4)); - draw_length_actions[Editing::GridTypeBeatDiv3] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-thirds"), grid_type_strings[(int)GridTypeBeatDiv3].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv3)); - draw_length_actions[Editing::GridTypeBeatDiv2] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-halves"), grid_type_strings[(int)GridTypeBeatDiv2].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv2)); - draw_length_actions[Editing::GridTypeBeat] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-beat"), grid_type_strings[(int)GridTypeBeat].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeat)); - draw_length_actions[Editing::GridTypeBar] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-bar"), grid_type_strings[(int)GridTypeBar].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBar)); - draw_length_actions[DRAW_LEN_AUTO] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-auto"), _("Auto"), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), DRAW_LEN_AUTO)); + draw_length_actions[Editing::GridTypeBeatDiv8] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-eighths"), grid_type_strings[(int)GridTypeBeatDiv8].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv8)); + draw_length_actions[Editing::GridTypeBeatDiv7] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-sevenths"), grid_type_strings[(int)GridTypeBeatDiv7].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv7)); + draw_length_actions[Editing::GridTypeBeatDiv6] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-sixths"), grid_type_strings[(int)GridTypeBeatDiv6].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv6)); + draw_length_actions[Editing::GridTypeBeatDiv5] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-fifths"), grid_type_strings[(int)GridTypeBeatDiv5].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv5)); + draw_length_actions[Editing::GridTypeBeatDiv4] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-quarters"), grid_type_strings[(int)GridTypeBeatDiv4].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv4)); + draw_length_actions[Editing::GridTypeBeatDiv3] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-thirds"), grid_type_strings[(int)GridTypeBeatDiv3].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv3)); + draw_length_actions[Editing::GridTypeBeatDiv2] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-halves"), grid_type_strings[(int)GridTypeBeatDiv2].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv2)); + draw_length_actions[Editing::GridTypeBeat] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-beat"), grid_type_strings[(int)GridTypeBeat].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeat)); + draw_length_actions[Editing::GridTypeBar] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-bar"), grid_type_strings[(int)GridTypeBar].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBar)); + draw_length_actions[DRAW_LEN_AUTO] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-auto"), _("Auto"), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), DRAW_LEN_AUTO)); velocity_actions = ActionManager::create_action_group (midi_bindings, prefix + X_("DrawVelocity")); RadioAction::Group draw_velocity_group; @@ -673,8 +702,6 @@ EditingContext::grid_type_chosen (GridType gt) auto ti = grid_actions.find (gt); assert (ti != grid_actions.end()); - std::cerr << "gt chosen, type " << enum_2_string (gt) << " active ? " << ti->second->get_active () << std::endl; - if (!ti->second->get_active()) { return; } @@ -701,11 +728,10 @@ EditingContext::grid_type_chosen (GridType gt) compute_bbt_ruler_scale (_leftmost_sample, _leftmost_sample + current_page_samples()); update_tempo_based_rulers (); } else if (current_mouse_mode () == Editing::MouseGrid) { - Glib::RefPtr ract = Glib::RefPtr::cast_dynamic (get_mouse_mode_action (Editing::MouseObject)); - ract->set_active (true); + mouse_mode_actions[Editing::MouseObject]->set_active (true); } - get_mouse_mode_action (Editing::MouseGrid)->set_sensitive (grid_is_musical); + mouse_mode_actions[Editing::MouseGrid]->set_sensitive (grid_is_musical); mark_region_boundary_cache_dirty (); @@ -728,7 +754,7 @@ EditingContext::draw_length_chosen (GridType type) return; } - if (!grid_type_is_musical (type) ) { // is this is sensible sanity check ? + if ((DRAW_LEN_AUTO != type) && !grid_type_is_musical (type) ) { // is this is sensible sanity check ? set_draw_length (DRAW_LEN_AUTO); return; } @@ -830,10 +856,7 @@ EditingContext::snap_mode_chosen (SnapMode mode) mode = SnapMagnetic; } - auto si = snap_mode_actions.find (mode); - assert (si != snap_mode_actions.end()); - - if (!si->second->get_active()) { + if (!snap_mode_actions[mode]->get_active()) { return; } @@ -1144,8 +1167,13 @@ EditingContext::time_domain () const void EditingContext::toggle_follow_playhead () { - RefPtr tact = ActionManager::get_toggle_action ((_name + X_("Editing")).c_str(), X_("toggle-follow-playhead")); - set_follow_playhead (tact->get_active()); + set_follow_playhead (!follow_playhead_action->get_active(), true); +} + +void +EditingContext::follow_playhead_chosen () +{ + instant_save (); } /** @param yn true to follow playhead, otherwise false. @@ -1155,14 +1183,10 @@ void EditingContext::set_follow_playhead (bool yn, bool catch_up) { assert (follow_playhead_action); - if (follow_playhead() != yn) { - follow_playhead_action->set_active (yn); - if (yn && catch_up) { - /* catch up */ - reset_x_origin_to_follow_playhead (); - } - std::cerr << editor_name() << " SFP instant save\n"; - instant_save (); + follow_playhead_action->set_active (yn); + if (yn && catch_up) { + /* catch up */ + reset_x_origin_to_follow_playhead (); } } @@ -1969,28 +1993,6 @@ EditingContext::pack_snap_box () snap_box.pack_start (grid_type_selector, false, false); } -Glib::RefPtr -EditingContext::get_mouse_mode_action (MouseMode m) const -{ - switch (m) { - case MouseRange: - return ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("set-mouse-mode-range")); - case MouseObject: - return ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("set-mouse-mode-object")); - case MouseCut: - return ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("set-mouse-mode-cut")); - case MouseDraw: - return ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("set-mouse-mode-draw")); - case MouseTimeFX: - return ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("set-mouse-mode-timefx")); - case MouseGrid: - return ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("set-mouse-mode-grid")); - case MouseContent: - return ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("set-mouse-mode-content")); - } - return Glib::RefPtr(); -} - void EditingContext::bind_mouse_mode_buttons () { @@ -2001,37 +2003,36 @@ EditingContext::bind_mouse_mode_buttons () act = ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("temporal-zoom-out")); zoom_out_button.set_related_action (act); - act = ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("toggle-follow-playhead")); - follow_playhead_button.set_related_action (act); + follow_playhead_button.set_related_action (follow_playhead_action); act = ActionManager::get_action (X_("Transport"), X_("ToggleFollowEdits")); follow_edits_button.set_related_action (act); - mouse_move_button.set_related_action (get_mouse_mode_action (Editing::MouseObject)); + mouse_move_button.set_related_action (mouse_mode_actions[Editing::MouseObject]); mouse_move_button.set_icon (ArdourWidgets::ArdourIcon::ToolGrab); mouse_move_button.set_name ("mouse mode button"); - mouse_select_button.set_related_action (get_mouse_mode_action (Editing::MouseRange)); + mouse_select_button.set_related_action (mouse_mode_actions[Editing::MouseRange]); mouse_select_button.set_icon (ArdourWidgets::ArdourIcon::ToolRange); mouse_select_button.set_name ("mouse mode button"); - mouse_draw_button.set_related_action (get_mouse_mode_action (Editing::MouseDraw)); + mouse_draw_button.set_related_action (mouse_mode_actions[Editing::MouseDraw]); mouse_draw_button.set_icon (ArdourWidgets::ArdourIcon::ToolDraw); mouse_draw_button.set_name ("mouse mode button"); - mouse_timefx_button.set_related_action (get_mouse_mode_action (Editing::MouseTimeFX)); + mouse_timefx_button.set_related_action (mouse_mode_actions[Editing::MouseTimeFX]); mouse_timefx_button.set_icon (ArdourWidgets::ArdourIcon::ToolStretch); mouse_timefx_button.set_name ("mouse mode button"); - mouse_grid_button.set_related_action (get_mouse_mode_action (Editing::MouseGrid)); + mouse_grid_button.set_related_action (mouse_mode_actions[Editing::MouseGrid]); mouse_grid_button.set_icon (ArdourWidgets::ArdourIcon::ToolGrid); mouse_grid_button.set_name ("mouse mode button"); - mouse_content_button.set_related_action (get_mouse_mode_action (Editing::MouseContent)); + mouse_content_button.set_related_action (mouse_mode_actions[Editing::MouseContent]); mouse_content_button.set_icon (ArdourWidgets::ArdourIcon::ToolContent); mouse_content_button.set_name ("mouse mode button"); - mouse_cut_button.set_related_action (get_mouse_mode_action (Editing::MouseCut)); + mouse_cut_button.set_related_action (mouse_mode_actions[Editing::MouseCut]); mouse_cut_button.set_icon (ArdourWidgets::ArdourIcon::ToolCut); mouse_cut_button.set_name ("mouse mode button"); @@ -2044,6 +2045,18 @@ EditingContext::bind_mouse_mode_buttons () set_tooltip (mouse_content_button, _("Internal Edit Mode (edit notes and automation points)")); } +Editing::MouseMode +EditingContext::current_mouse_mode() const +{ + for (auto & [mode,action] : mouse_mode_actions) { + if (action->get_active()) { + return mode; + } + } + + return MouseObject; +} + void EditingContext::set_mouse_mode (MouseMode m, bool force) { @@ -2051,21 +2064,13 @@ EditingContext::set_mouse_mode (MouseMode m, bool force) return; } - if (!force && m == mouse_mode) { - return; + if (force && mouse_mode_actions[m]->get_active()) { + mouse_mode_actions[m]->set_active (false); } - Glib::RefPtr act = get_mouse_mode_action(m); - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); - - /* go there and back to ensure that the toggled handler is called to set up mouse_mode */ - tact->set_active (false); - tact->set_active (true); - - /* NOTE: this will result in a call to mouse_mode_toggled which does the heavy lifting */ + mouse_mode_actions[m]->set_active (true); } - bool EditingContext::on_velocity_scroll_event (GdkEventScroll* ev) { @@ -2545,7 +2550,7 @@ EditingContext::follow_playhead_clicked () void EditingContext::cycle_zoom_focus () { - switch (_zoom_focus) { + switch (zoom_focus()) { case ZoomFocusLeft: set_zoom_focus (ZoomFocusRight); break; @@ -2570,7 +2575,8 @@ EditingContext::cycle_zoom_focus () void EditingContext::temporal_zoom_step_mouse_focus_scale (bool zoom_out, double scale) { - PBD::Unwinder zf (_zoom_focus, Editing::ZoomFocusMouse); +#warning paul how to unwind a failed attempt here + // PBD::Unwinder zf (zoom_focus(), Editing::ZoomFocusMouse); temporal_zoom_step_scale (zoom_out, scale); } @@ -2931,47 +2937,16 @@ 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) +Editing::ZoomFocus +EditingContext::zoom_focus () const { - 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*/ + for (auto & [mode,action] : zoom_focus_actions) { + if (action->get_active()) { + return mode; + } } - - return ActionManager::get_radio_action ((_name + X_("Zoom")).c_str(), action); + return ZoomFocusLeft; } void @@ -2982,11 +2957,13 @@ EditingContext::zoom_focus_chosen (ZoomFocus focus) active. */ - RefPtr ract = zoom_focus_action (focus); - - if (ract && ract->get_active()) { - set_zoom_focus (focus); + if (!zoom_focus_actions[focus]->get_active()) { + return; } + + zoom_focus_selector.set_active (zoom_focus_strings[(int)focus]); + + instant_save (); } void @@ -3152,6 +3129,7 @@ EditingContext::set_loop_range (timepos_t const & start, timepos_t const & end, bool EditingContext::allow_trim_cursors () const { + auto mouse_mode = current_mouse_mode(); return mouse_mode == MouseContent || mouse_mode == MouseTimeFX || mouse_mode == MouseDraw; } diff --git a/gtk2_ardour/editing_context.h b/gtk2_ardour/editing_context.h index 209b11012f..bf457dd071 100644 --- a/gtk2_ardour/editing_context.h +++ b/gtk2_ardour/editing_context.h @@ -332,12 +332,9 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider, virtual void cycle_zoom_focus (); virtual void set_zoom_focus (Editing::ZoomFocus) = 0; - Editing::ZoomFocus zoom_focus () const { return _zoom_focus; } - sigc::signal ZoomFocusChanged; + Editing::ZoomFocus zoom_focus () const; - 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; @@ -363,8 +360,8 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider, /** @return The current mouse mode (gain, object, range, timefx etc.) * (defined in editing_syms.inc.h) */ - Editing::MouseMode current_mouse_mode () const { return mouse_mode; } - virtual Editing::MouseMode effective_mouse_mode () const { return mouse_mode; } + Editing::MouseMode current_mouse_mode () const; + virtual Editing::MouseMode effective_mouse_mode () const { return current_mouse_mode(); } virtual void use_appropriate_mouse_mode_for_sections () {} /** @return Whether the current mouse mode is an "internal" editing mode. */ @@ -426,6 +423,7 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider, void register_midi_actions (Gtkmm2ext::Bindings*, std::string const &); void register_common_actions (Gtkmm2ext::Bindings*, std::string const &); void register_automation_actions (Gtkmm2ext::Bindings*, std::string const &); + void set_action_defaults (); ArdourCanvas::Rectangle* rubberband_rect; @@ -445,7 +443,7 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider, virtual ArdourCanvas::GtkCanvasViewport* get_canvas_viewport() const = 0; virtual ArdourCanvas::GtkCanvas* get_canvas() const = 0; - virtual void mouse_mode_toggled (Editing::MouseMode) = 0; + virtual void mouse_mode_chosen (Editing::MouseMode) = 0; bool on_velocity_scroll_event (GdkEventScroll*); void pre_render (); @@ -531,6 +529,8 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider, std::map > grid_actions; std::map > snap_mode_actions; std::map > draw_length_actions; + std::map > mouse_mode_actions; + std::map > zoom_focus_actions; std::map > draw_velocity_actions; std::map > draw_channel_actions; @@ -594,6 +594,7 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider, EditorCursor* _snapped_cursor; Glib::RefPtr follow_playhead_action; + void follow_playhead_chosen (); /* selection process */ @@ -608,8 +609,8 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider, VerboseCursor* _verbose_cursor; samplecnt_t samples_per_pixel; - Editing::ZoomFocus _zoom_focus; - virtual Editing::ZoomFocus effective_zoom_focus() const { return _zoom_focus; } + + virtual Editing::ZoomFocus effective_zoom_focus() const { return zoom_focus(); } Temporal::timepos_t snap_to_bbt_via_grid (Temporal::timepos_t const & start, Temporal::RoundMode direction, @@ -698,7 +699,6 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider, virtual void register_actions() = 0; void register_grid_actions (); - Glib::RefPtr get_mouse_mode_action (Editing::MouseMode m) const; void bind_mouse_mode_buttons (); Gtk::HBox snap_box; @@ -714,8 +714,6 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider, Gtkmm2ext::BindingSet bindings; Gtkmm2ext::Bindings* own_bindings; - Editing::MouseMode mouse_mode; - void set_common_editing_state (XMLNode const & node); void get_common_editing_state (XMLNode& node) const; diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index a83f27f226..52b8362b1e 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -654,6 +654,7 @@ Editor::Editor () load_bindings (); register_actions (); bind_mouse_mode_buttons (); + set_action_defaults (); build_edit_mode_menu(); build_zoom_focus_menu(); @@ -2199,8 +2200,11 @@ Editor::set_state (const XMLNode& node, int version) node.get_property ("mixer-width", editor_mixer_strip_width); - node.get_property ("zoom-focus", _zoom_focus); - zoom_focus_selection_done (_zoom_focus); + ZoomFocus zf; + if (!node.get_property ("zoom-focus", zf)) { + zf = ZoomFocusLeft; + } + set_zoom_preset (zf); node.get_property ("marker-click-behavior", marker_click_behavior); marker_click_behavior_selection_done (marker_click_behavior); @@ -2223,7 +2227,7 @@ Editor::set_state (const XMLNode& node, int version) /* do it twice to force the change */ smart_mode_action->set_active (!yn); smart_mode_action->set_active (yn); - set_mouse_mode (mouse_mode, true); + set_mouse_mode (current_mouse_mode(), true); } EditPoint ep; @@ -2316,26 +2320,6 @@ Editor::set_state (const XMLNode& node, int version) nudge_clock->set_duration (timecnt_t (_session->sample_rate() * 5), true); } - { - /* apply state - * Not all properties may have been in XML, but - * those that are linked to a private variable may need changing - */ - RefPtr tact; - - tact = ActionManager::get_toggle_action ((editor_name () + X_("Editing")).c_str(), X_("toggle-follow-playhead")); - yn = follow_playhead(); - if (tact->get_active() != yn) { - tact->set_active (yn); - } - - tact = ActionManager::get_toggle_action (X_("Editor"), X_("toggle-stationary-playhead")); - yn = _stationary_playhead; - if (tact->get_active() != yn) { - tact->set_active (yn); - } - } - return 0; } @@ -2352,7 +2336,7 @@ Editor::get_state () const maybe_add_mixer_strip_width (*node); - node->set_property ("zoom-focus", _zoom_focus); + node->set_property ("zoom-focus", zoom_focus()); node->set_property ("edit-point", _edit_point); node->set_property ("visible-track-count", _visible_track_count); @@ -2366,7 +2350,7 @@ Editor::get_state () const node->set_property ("maximised", _maximised); node->set_property ("follow-playhead", follow_playhead()); node->set_property ("stationary-playhead", _stationary_playhead); - node->set_property ("mouse-mode", mouse_mode); + node->set_property ("mouse-mode", current_mouse_mode()); node->set_property ("join-object-range", smart_mode_action->get_active ()); node->set_property (X_("show-editor-mixer"), show_editor_mixer_action->get_active()); @@ -3210,12 +3194,12 @@ Editor::build_zoom_focus_menu () { using namespace Menu_Helpers; - zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusLeft], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusLeft))); - zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusRight], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusRight))); - zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusCenter], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusCenter))); - zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusPlayhead], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusPlayhead))); - zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusMouse], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusMouse))); - zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusEdit], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusEdit))); + zoom_focus_selector.append (zoom_focus_actions[ZoomFocusLeft]); + zoom_focus_selector.append (zoom_focus_actions[ZoomFocusRight]); + zoom_focus_selector.append (zoom_focus_actions[ZoomFocusCenter]); + zoom_focus_selector.append (zoom_focus_actions[ZoomFocusPlayhead]); + zoom_focus_selector.append (zoom_focus_actions[ZoomFocusMouse]); + zoom_focus_selector.append (zoom_focus_actions[ZoomFocusEdit]); zoom_focus_selector.set_sizing_texts (zoom_focus_strings); } @@ -3384,17 +3368,7 @@ Editor::mouse_select_button_release (GdkEventButton* ev) void Editor::set_zoom_focus (ZoomFocus f) { - string str = zoom_focus_strings[(int)f]; - - if (str != zoom_focus_selector.get_text()) { - zoom_focus_selector.set_text (str); - } - - if (_zoom_focus != f) { - _zoom_focus = f; - instant_save (); - ZoomFocusChanged (); /* EMIT SIGNAL */ - } + zoom_focus_actions[f]->set_active (true); } void @@ -3812,7 +3786,7 @@ Editor::current_visual_state (bool with_tracks) vs->y_position = vertical_adjustment.get_value(); vs->samples_per_pixel = samples_per_pixel; vs->_leftmost_sample = _leftmost_sample; - vs->zoom_focus = _zoom_focus; + vs->zoom_focus = zoom_focus(); if (with_tracks) { vs->gui_state->set_state (ARDOUR_UI::instance()->gui_object_state->get_state()); diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 79d3c1bf55..b2d0b57f03 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1768,7 +1768,7 @@ private: ArdourWidgets::ArdourButton smart_mode_button; Glib::RefPtr smart_mode_action; - void mouse_mode_toggled (Editing::MouseMode m); + void mouse_mode_chosen (Editing::MouseMode m); void mouse_mode_object_range_toggled (); bool ignore_mouse_mode_toggle; diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index 2932232dd7..f854970a59 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -1123,7 +1123,7 @@ Editor::which_mode_cursor () const { Gdk::Cursor* mode_cursor = MouseCursors::invalid_cursor (); - switch (mouse_mode) { + switch (current_mouse_mode()) { case MouseRange: mode_cursor = _cursors->selector; break; @@ -1213,6 +1213,7 @@ Gdk::Cursor* Editor::which_canvas_cursor(ItemType type) const { Gdk::Cursor* cursor = which_mode_cursor (); + auto mouse_mode = current_mouse_mode(); if (mouse_mode == MouseRange) { switch (type) { @@ -1385,6 +1386,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ TempoMarker* t_marker = 0; double fraction; bool ret = true; + auto mouse_mode = current_mouse_mode(); /* by the time we reach here, entered_regionview and entered trackview * will have already been set as appropriate. Things are done this diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index f3f56aa7b6..7c2304a4f1 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -121,16 +121,13 @@ Editor::set_current_movable (std::shared_ptr m) void Editor::mouse_mode_object_range_toggled() { - set_mouse_mode (mouse_mode, true); /* updates set-mouse-mode-range */ + set_mouse_mode (current_mouse_mode(), true); /* updates set-mouse-mode-range */ } void -Editor::mouse_mode_toggled (MouseMode m) +Editor::mouse_mode_chosen (MouseMode m) { - Glib::RefPtr act = get_mouse_mode_action(m); - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); - - if (!tact->get_active()) { + if (!mouse_mode_actions[m]->get_active()) { /* this was just the notification that the old mode has been * left. we'll get called again with the new mode active in a * jiffy. @@ -140,8 +137,6 @@ Editor::mouse_mode_toggled (MouseMode m) const bool was_internal = internal_editing(); - mouse_mode = m; - /* Ben ToDo: once we have a dedicated 'region edit panel', we can store * one snap mode in the editor canvas and another one in the editor, * relieving the complexity here */ @@ -174,6 +169,8 @@ Editor::mouse_mode_toggled (MouseMode m) update_time_selection_display (); + auto mouse_mode = current_mouse_mode (); + if (mouse_mode == MouseDraw) { draw_box.show(); _draw_box_spacer.show(); @@ -239,12 +236,14 @@ Editor::mouse_mode_toggled (MouseMode m) bool Editor::internal_editing() const { + auto mouse_mode = current_mouse_mode (); return mouse_mode == Editing::MouseContent || mouse_mode == Editing::MouseDraw; } void Editor::update_time_selection_display () { + auto mouse_mode = current_mouse_mode (); switch (mouse_mode) { case MouseRange: selection->clear_objects (); @@ -328,6 +327,7 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it */ MouseMode eff_mouse_mode = effective_mouse_mode (); + auto mouse_mode = current_mouse_mode (); if (eff_mouse_mode == MouseCut) { /* never change selection in cut mode */ @@ -1751,6 +1751,8 @@ Editor::determine_mapping_grid_snap (timepos_t t) bool Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, bool from_autoscroll) { + auto mouse_mode = current_mouse_mode (); + _last_motion_y = event->motion.y; if (event->motion.is_hint) { @@ -2274,6 +2276,8 @@ Editor::escape () void Editor::update_join_object_range_location (double y) { + auto mouse_mode = current_mouse_mode (); + if (!get_smart_mode()) { _join_object_range_state = JOIN_OBJECT_RANGE_NONE; return; @@ -2352,7 +2356,7 @@ Editor::effective_mouse_mode () const return MouseRange; } - return mouse_mode; + return current_mouse_mode (); } void @@ -2382,16 +2386,7 @@ Editor::use_appropriate_mouse_mode_for_sections () /*fallthrough*/ default: /* switch to range mode */ - Glib::RefPtr ract = Glib::RefPtr::cast_static (get_mouse_mode_action (Editing::MouseRange)); - if (!ract) { - /* missing action */ - fatal << X_("programming error: missing mouse-mode-range action") << endmsg; - /*NOTREACHED*/ - break; - } - if (ract) { - ract->set_active (true); - } + mouse_mode_actions[Editing::MouseRange]->set_active (true); break; } } @@ -2417,6 +2412,7 @@ Editor::get_pointer_position (double& x, double& y) const void Editor::choose_mapping_drag (ArdourCanvas::Item* item, GdkEvent* event) { + /* In a departure from convention, this event is not handled by a widget * 'on' the ruler-bar, like a tempo marker, but is instead handled by the * whole canvas. The intent is for the user to feel that they @@ -2433,6 +2429,8 @@ Editor::choose_mapping_drag (ArdourCanvas::Item* item, GdkEvent* event) /* if tempo-mapping, set a cursor to indicate whether we are close to a bar line, beat line, or neither */ bool ramped = false; + auto mouse_mode = current_mouse_mode (); + if (mouse_mode == MouseGrid && item ==_canvas_grid_zone) { GridType gt = determine_mapping_grid_snap (timepos_t (where)); if (gt == GridTypeBar) { diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index e7bdd9456b..0e2a641e0c 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -380,7 +380,7 @@ Editor::split_regions_at (timepos_t const & where, RegionSelection& regions) } //if the user wants newly-created regions to be selected, then select them: - if (mouse_mode == MouseObject) { + if (current_mouse_mode() == MouseObject) { for (RegionSelection::iterator ri = latest_regionviews.begin(); ri != latest_regionviews.end(); ri++) { if ((*ri)->region()->position() < where) { // new regions created before the split @@ -1201,7 +1201,7 @@ Editor::cursor_to_selection_start (EditorCursor *cursor) { timepos_t pos; - switch (mouse_mode) { + switch (current_mouse_mode()) { case MouseObject: if (!selection->regions.empty()) { pos = selection->regions.start_time(); @@ -1230,7 +1230,7 @@ Editor::cursor_to_selection_end (EditorCursor *cursor) { timepos_t pos; - switch (mouse_mode) { + switch (current_mouse_mode()) { case MouseObject: if (!selection->regions.empty()) { pos = selection->regions.end_time(); @@ -1400,7 +1400,7 @@ Editor::selected_marker_to_selection_start () return; } - switch (mouse_mode) { + switch (current_mouse_mode()) { case MouseObject: if (!selection->regions.empty()) { pos = selection->regions.start_time(); @@ -1435,7 +1435,7 @@ Editor::selected_marker_to_selection_end () return; } - switch (mouse_mode) { + switch (current_mouse_mode()) { case MouseObject: if (!selection->regions.empty()) { pos = selection->regions.end_time(); @@ -4394,7 +4394,7 @@ Editor::cut_copy (CutCopyOp op) return; } - switch (mouse_mode) { + switch (current_mouse_mode()) { case MouseDraw: case MouseContent: begin_reversible_command (opname + ' ' + X_("MIDI")); @@ -9451,11 +9451,13 @@ Editor::ripple_marks (std::shared_ptr target_playlist, timepos_t at, t Editing::ZoomFocus Editor::effective_zoom_focus() const { - if (_zoom_focus == ZoomFocusEdit && _edit_point == EditAtMouse) { + auto zf = zoom_focus(); + + if (zf == ZoomFocusEdit && _edit_point == EditAtMouse) { return ZoomFocusMouse; } - return _zoom_focus; + return zf; } void diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index 2bf9d3f5f3..745b7c850b 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -1710,7 +1710,7 @@ Editor::region_selection_changed () /* if in TimeFX mode and there's just 1 region selected * (i.e. we just clicked on it), leave things as they are */ - if (selection->regions.size() > 1 || mouse_mode != Editing::MouseTimeFX) { + if (selection->regions.size() > 1 || current_mouse_mode() != Editing::MouseTimeFX) { set_mouse_mode (MouseObject, false); } } @@ -1998,7 +1998,7 @@ Editor::set_selection_from_region () selection->set (tvl); - if (!get_smart_mode () || !(mouse_mode == Editing::MouseObject) ) { + if (!get_smart_mode () || !(current_mouse_mode() == Editing::MouseObject) ) { set_mouse_mode (Editing::MouseRange, false); } } @@ -2041,7 +2041,7 @@ Editor::set_selection_from_range (Location& loc) commit_reversible_selection_op (); - if (!get_smart_mode () || mouse_mode != Editing::MouseObject) { + if (!get_smart_mode () || current_mouse_mode() != Editing::MouseObject) { set_mouse_mode (MouseRange, false); } } @@ -2312,7 +2312,7 @@ Editor::select_range_between () return; } - if (!get_smart_mode () || mouse_mode != Editing::MouseObject) { + if (!get_smart_mode () || current_mouse_mode() != Editing::MouseObject) { set_mouse_mode (MouseRange, false); } @@ -2326,16 +2326,16 @@ Editor::get_edit_op_range (timepos_t& start, timepos_t& end) const { /* if an explicit range exists, use it */ - if ((mouse_mode == MouseRange || get_smart_mode()) && !selection->time.empty()) { + if ((current_mouse_mode() == MouseRange || get_smart_mode()) && !selection->time.empty()) { /* we know that these are ordered */ start = selection->time.start_time(); end = selection->time.end_time(); return true; - } else { - start = timepos_t (); - end = timepos_t (); - return false; } + + start = timepos_t (); + end = timepos_t (); + return false; } void diff --git a/gtk2_ardour/pianoroll.cc b/gtk2_ardour/pianoroll.cc index 9c6e90bcb1..6b34a252d3 100644 --- a/gtk2_ardour/pianoroll.cc +++ b/gtk2_ardour/pianoroll.cc @@ -75,19 +75,20 @@ Pianoroll::Pianoroll (std::string const & name, bool with_transport) , _note_mode (Sustained) , ignore_channel_changes (false) { - mouse_mode = Editing::MouseContent; autoscroll_vertical_allowed = false; - build_upper_toolbar (); - build_canvas (); - build_lower_toolbar (); - load_bindings (); register_actions (); + build_upper_toolbar (); + build_canvas (); + build_grid_type_menu (); build_draw_midi_menus(); + build_lower_toolbar (); + + set_action_defaults (); set_mouse_mode (Editing::MouseContent, true); } @@ -780,7 +781,7 @@ bool Pianoroll::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type) { NoteBase* note = nullptr; - + Editing::MouseMode mouse_mode = current_mouse_mode(); switch (item_type) { case NoteItem: if (mouse_mode == Editing::MouseContent) { @@ -1052,7 +1053,7 @@ Pianoroll::which_mode_cursor () const { Gdk::Cursor* mode_cursor = MouseCursors::invalid_cursor (); - switch (mouse_mode) { + switch (current_mouse_mode()) { case Editing::MouseContent: mode_cursor = _cursors->grabber; break; @@ -1081,6 +1082,7 @@ Gdk::Cursor* Pianoroll::which_canvas_cursor (ItemType type) const { Gdk::Cursor* cursor = which_mode_cursor (); + Editing::MouseMode mouse_mode = current_mouse_mode (); if (mouse_mode == Editing::MouseContent) { @@ -1618,7 +1620,7 @@ Pianoroll::cut_copy (Editing::CutCopyOp op) cut_buffer->clear (); } - switch (mouse_mode) { + switch (current_mouse_mode()) { case MouseDraw: case MouseContent: if (view) { @@ -1781,6 +1783,7 @@ Pianoroll::map_transport_state () bool Pianoroll::allow_trim_cursors () const { + auto mouse_mode = current_mouse_mode (); return mouse_mode == Editing::MouseContent || mouse_mode == Editing::MouseTimeFX; }