summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2014-12-09 14:00:12 -0500
committerDavid Robillard <d@drobilla.net>2014-12-18 20:21:05 -0500
commitcebf191cba74dea1c6630aa487a2a434a85ceb40 (patch)
tree8de469d39d0c68557ef33c630965e8bb586ccb13
parent5fef65538040fbac1b9edd1847a269aa925a49c9 (diff)
Make tools toggle-like by switching to last mode.
-rw-r--r--gtk2_ardour/editor.cc1
-rw-r--r--gtk2_ardour/editor.h1
-rw-r--r--gtk2_ardour/editor_mouse.cc108
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<Action>
+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<Action>();
+}
+
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<Action> 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<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
- assert (tact);
+ Glib::RefPtr<Action> act = get_mouse_mode_action(m);
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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<Action> act;
- Glib::RefPtr<ToggleAction> 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<ToggleAction>::cast_dynamic (act);
- assert (tact);
+ Glib::RefPtr<Action> act = get_mouse_mode_action(m);
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::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<Action> pact = get_mouse_mode_action(previous_mouse_mode);
+ Glib::RefPtr<ToggleAction> ptact = Glib::RefPtr<ToggleAction>::cast_dynamic(pact);
+ ptact->set_active(true);
+ return;
+ }
+
+ previous_mouse_mode = mouse_mode;
mouse_mode = m;
instant_save ();