From cebf191cba74dea1c6630aa487a2a434a85ceb40 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Tue, 9 Dec 2014 14:00:12 -0500 Subject: Make tools toggle-like by switching to last mode. --- gtk2_ardour/editor.cc | 1 + gtk2_ardour/editor.h | 1 + gtk2_ardour/editor_mouse.cc | 108 ++++++++++++++------------------------------ 3 files changed, 37 insertions(+), 73 deletions(-) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index c91337bb6e..7f3cd2216e 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -668,6 +668,7 @@ Editor::Editor () set_snap_to (_snap_type); _snap_mode = SnapOff; set_snap_mode (_snap_mode); + previous_mouse_mode = MouseObject; set_mouse_mode (MouseObject, true); set_edit_point_preference (EditAtMouse, true); diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 168f3dcc90..b37ee700d4 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -544,6 +544,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void set_samples_per_pixel (framecnt_t); Editing::MouseMode mouse_mode; + Editing::MouseMode previous_mouse_mode; Editing::MouseMode effective_mouse_mode () const; enum JoinObjectRangeState { diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 68899e67a2..ab153b943b 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -221,6 +221,28 @@ Editor::mouse_mode_object_range_toggled() set_mouse_mode(m, true); //call this so the button styles can get updated } +static Glib::RefPtr +get_mouse_mode_action(MouseMode m) +{ + switch (m) { + case MouseRange: + return ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-range")); + case MouseObject: + return ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-object")); + case MouseCut: + return ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-cut")); + case MouseDraw: + return ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-draw")); + case MouseTimeFX: + return ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-timefx")); + case MouseContent: + return ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-content")); + case MouseAudition: + return ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-audition")); + } + return Glib::RefPtr(); +} + void Editor::set_mouse_mode (MouseMode m, bool force) { @@ -236,42 +258,8 @@ Editor::set_mouse_mode (MouseMode m, bool force) if ( m == MouseCut) m = MouseObject; } - Glib::RefPtr act; - - switch (m) { - case MouseRange: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-range")); - break; - - case MouseCut: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-cut")); - break; - - case MouseObject: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-object")); - break; - - case MouseDraw: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-draw")); - break; - - case MouseTimeFX: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-timefx")); - break; - - case MouseContent: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-content")); - break; - - case MouseAudition: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-audition")); - break; - } - - assert (act); - - Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); - assert (tact); + 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); @@ -283,47 +271,12 @@ Editor::set_mouse_mode (MouseMode m, bool force) void Editor::mouse_mode_toggled (MouseMode m) { - Glib::RefPtr act; - Glib::RefPtr tact; - if (ARDOUR::Profile->get_mixbus()) { if ( m == MouseCut) m = MouseObject; } - switch (m) { - case MouseRange: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-range")); - break; - - case MouseObject: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-object")); - break; - - case MouseCut: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-cut")); - break; - - case MouseDraw: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-draw")); - break; - - case MouseTimeFX: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-timefx")); - break; - - case MouseContent: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-content")); - break; - - case MouseAudition: - act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-audition")); - break; - } - - assert (act); - - tact = Glib::RefPtr::cast_dynamic (act); - assert (tact); + Glib::RefPtr act = get_mouse_mode_action(m); + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); if (!tact->get_active()) { /* this was just the notification that the old mode has been @@ -339,6 +292,15 @@ Editor::mouse_mode_toggled (MouseMode m) _session->request_transport_speed (0.0, true); } + if (mouse_mode == m) { + /* switch "in to" the same mode, act like a toggle and switch back to previous mode */ + Glib::RefPtr pact = get_mouse_mode_action(previous_mouse_mode); + Glib::RefPtr ptact = Glib::RefPtr::cast_dynamic(pact); + ptact->set_active(true); + return; + } + + previous_mouse_mode = mouse_mode; mouse_mode = m; instant_save (); -- cgit v1.2.3