diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2012-02-13 14:34:21 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2012-02-13 14:34:21 +0000 |
commit | 671ec99bac183b84f43dc4c2114b9b93fca3aee0 (patch) | |
tree | 809edcb592aaa1a5633863fae5e0f6d96ba93eb3 /gtk2_ardour | |
parent | 8ef8bfc64ffba6d87cdb8ffcd6ecd535e2391641 (diff) |
(1) remove magic number voodoo when saving zoom focus/snap settings to instant.xml etc. (this has a minor breaking-behaviour for existing sessions etc (2) keep track of grid type/settings in and out of note edit mode and switch back and forth, thus allowing independent grids while working at the note or region level
git-svn-id: svn://localhost/ardour2/branches/3.0@11486 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/ardour.menus.in | 5 | ||||
-rw-r--r-- | gtk2_ardour/editor.cc | 40 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 11 | ||||
-rw-r--r-- | gtk2_ardour/editor_actions.cc | 240 | ||||
-rw-r--r-- | gtk2_ardour/editor_mouse.cc | 16 | ||||
-rw-r--r-- | gtk2_ardour/enums.cc | 46 | ||||
-rw-r--r-- | gtk2_ardour/mnemonic-us.bindings.in | 11 |
7 files changed, 351 insertions, 18 deletions
diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index e789eef10f..cc8236bf5b 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -373,7 +373,10 @@ <menuitem action='snap-magnetic'/> <separator/> <menuitem action='cycle-snap-mode'/> - <menuitem action='cycle-snap-choice'/> + <menuitem action='next-snap-choice'/> + <menuitem action='prev-snap-choice'/> + <menuitem action='next-snap-choice-music-only'/> + <menuitem action='prev-snap-choice-music-only'/> </menu> <menu name='SnapTo' action='SnapTo'> <menuitem action='snap-to-cd-frame'/> diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index a2e6fa83a7..b7ce74448c 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -647,6 +647,10 @@ Editor::Editor () set_snap_mode (_snap_mode); set_mouse_mode (MouseObject, true); pre_internal_mouse_mode = MouseObject; + pre_internal_snap_type = _snap_type; + pre_internal_snap_mode = _snap_mode; + internal_snap_type = _snap_type; + internal_snap_mode = _snap_mode; set_edit_point_preference (EditAtMouse, true); _playlist_selector = new PlaylistSelector(); @@ -2222,7 +2226,7 @@ Editor::set_state (const XMLNode& node, int /*version*/) } if ((prop = node.property ("zoom-focus"))) { - set_zoom_focus ((ZoomFocus) atoi (prop->value())); + set_zoom_focus ((ZoomFocus) string_2_enum (prop->value(), zoom_focus)); } if ((prop = node.property ("zoom"))) { @@ -2232,11 +2236,27 @@ Editor::set_state (const XMLNode& node, int /*version*/) } if ((prop = node.property ("snap-to"))) { - set_snap_to ((SnapType) atoi (prop->value())); + set_snap_to ((SnapType) string_2_enum (prop->value(), _snap_type)); } if ((prop = node.property ("snap-mode"))) { - set_snap_mode ((SnapMode) atoi (prop->value())); + set_snap_mode ((SnapMode) string_2_enum (prop->value(), _snap_mode)); + } + + if ((prop = node.property ("internal-snap-to"))) { + internal_snap_type = (SnapType) string_2_enum (prop->value(), internal_snap_type); + } + + if ((prop = node.property ("internal-snap-mode"))) { + internal_snap_mode = (SnapMode) string_2_enum (prop->value(), internal_snap_mode); + } + + if ((prop = node.property ("pre-internal-snap-to"))) { + pre_internal_snap_type = (SnapType) string_2_enum (prop->value(), pre_internal_snap_type); + } + + if ((prop = node.property ("pre-internal-snap-mode"))) { + pre_internal_snap_mode = (SnapMode) string_2_enum (prop->value(), pre_internal_snap_mode); } if ((prop = node.property ("mouse-mode"))) { @@ -2420,15 +2440,15 @@ Editor::get_state () maybe_add_mixer_strip_width (*node); - snprintf (buf, sizeof(buf), "%d", (int) zoom_focus); - node->add_property ("zoom-focus", buf); + node->add_property ("zoom-focus", enum_2_string (zoom_focus)); snprintf (buf, sizeof(buf), "%f", frames_per_unit); node->add_property ("zoom", buf); - snprintf (buf, sizeof(buf), "%d", (int) _snap_type); - node->add_property ("snap-to", buf); - snprintf (buf, sizeof(buf), "%d", (int) _snap_mode); - node->add_property ("snap-mode", buf); - + node->add_property ("snap-to", enum_2_string (_snap_type)); + node->add_property ("snap-mode", enum_2_string (_snap_mode)); + node->add_property ("internal-snap-to", enum_2_string (internal_snap_type)); + node->add_property ("internal-snap-mode", enum_2_string (internal_snap_mode)); + node->add_property ("pre-internal-snap-to", enum_2_string (pre_internal_snap_type)); + node->add_property ("pre-internal-snap-mode", enum_2_string (pre_internal_snap_mode)); node->add_property ("edit-point", enum_2_string (_edit_point)); snprintf (buf, sizeof (buf), "%" PRIi64, playhead_cursor->current_frame); diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index a9ba49ee91..76544fe636 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -169,7 +169,12 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD } void cycle_snap_mode (); - void cycle_snap_choice (); + void next_snap_choice (); + void next_snap_choice_music_only (); + void next_snap_choice_music_and_time (); + void prev_snap_choice (); + void prev_snap_choice_music_only (); + void prev_snap_choice_music_and_time (); void set_snap_to (Editing::SnapType); void set_snap_mode (Editing::SnapMode); void set_snap_threshold (double pixel_distance) {snap_threshold = pixel_distance;} @@ -512,6 +517,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Editing::MouseMode mouse_mode; Editing::MouseMode pre_internal_mouse_mode; + Editing::SnapType pre_internal_snap_type; + Editing::SnapMode pre_internal_snap_mode; + Editing::SnapType internal_snap_type; + Editing::SnapMode internal_snap_mode; bool _internal_editing; Editing::MouseMode effective_mouse_mode () const; diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index f50cd5e734..be174148c3 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -473,7 +473,10 @@ Editor::register_actions () ActionManager::register_radio_action (editor_actions, snap_mode_group, X_("snap-magnetic"), _("Magnetic"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapMagnetic))); ActionManager::register_action (editor_actions, X_("cycle-snap-mode"), _("Next Snap Mode"), sigc::mem_fun (*this, &Editor::cycle_snap_mode)); - ActionManager::register_action (editor_actions, X_("cycle-snap-choice"), _("Next Snap Choice"), sigc::mem_fun (*this, &Editor::cycle_snap_choice)); + ActionManager::register_action (editor_actions, X_("next-snap-choice"), _("Next Snap Choice"), sigc::mem_fun (*this, &Editor::next_snap_choice)); + ActionManager::register_action (editor_actions, X_("next-snap-choice-music-only"), _("Next Musical Snap Choice"), sigc::mem_fun (*this, &Editor::next_snap_choice_music_only)); + ActionManager::register_action (editor_actions, X_("prev-snap-choice"), _("Previous Snap Choice"), sigc::mem_fun (*this, &Editor::prev_snap_choice)); + ActionManager::register_action (editor_actions, X_("prev-snap-choice-music-only"), _("Previous Musical Snap Choice"), sigc::mem_fun (*this, &Editor::prev_snap_choice_music_only)); Glib::RefPtr<ActionGroup> snap_actions = ActionGroup::create (X_("Snap")); RadioAction::Group snap_choice_group; @@ -853,7 +856,7 @@ Editor::snap_type_action (SnapType type) } void -Editor::cycle_snap_choice() +Editor::next_snap_choice () { switch (_snap_type) { case Editing::SnapToCDFrame: @@ -944,6 +947,239 @@ Editor::cycle_snap_choice() } void +Editor::prev_snap_choice () +{ + switch (_snap_type) { + case Editing::SnapToCDFrame: + set_snap_to (Editing::SnapToTimecodeFrame); + break; + case Editing::SnapToTimecodeFrame: + set_snap_to (Editing::SnapToTimecodeSeconds); + break; + case Editing::SnapToTimecodeSeconds: + set_snap_to (Editing::SnapToTimecodeMinutes); + break; + case Editing::SnapToTimecodeMinutes: + set_snap_to (Editing::SnapToSeconds); + break; + case Editing::SnapToSeconds: + set_snap_to (Editing::SnapToMinutes); + break; + case Editing::SnapToMinutes: + set_snap_to (Editing::SnapToBeatDiv32); + break; + case Editing::SnapToBeatDiv32: + set_snap_to (Editing::SnapToBeatDiv28); + break; + case Editing::SnapToBeatDiv28: + set_snap_to (Editing::SnapToBeatDiv24); + break; + case Editing::SnapToBeatDiv24: + set_snap_to (Editing::SnapToBeatDiv20); + break; + case Editing::SnapToBeatDiv20: + set_snap_to (Editing::SnapToBeatDiv16); + break; + case Editing::SnapToBeatDiv16: + set_snap_to (Editing::SnapToBeatDiv14); + break; + case Editing::SnapToBeatDiv14: + set_snap_to (Editing::SnapToBeatDiv12); + break; + case Editing::SnapToBeatDiv12: + set_snap_to (Editing::SnapToBeatDiv10); + break; + case Editing::SnapToBeatDiv10: + set_snap_to (Editing::SnapToBeatDiv8); + break; + case Editing::SnapToBeatDiv8: + set_snap_to (Editing::SnapToBeatDiv7); + break; + case Editing::SnapToBeatDiv7: + set_snap_to (Editing::SnapToBeatDiv6); + break; + case Editing::SnapToBeatDiv6: + set_snap_to (Editing::SnapToBeatDiv5); + break; + case Editing::SnapToBeatDiv5: + set_snap_to (Editing::SnapToBeatDiv4); + break; + case Editing::SnapToBeatDiv4: + set_snap_to (Editing::SnapToBeatDiv3); + break; + case Editing::SnapToBeatDiv3: + set_snap_to (Editing::SnapToBeatDiv2); + break; + case Editing::SnapToBeatDiv2: + set_snap_to (Editing::SnapToBeat); + break; + case Editing::SnapToBeat: + set_snap_to (Editing::SnapToBar); + break; + case Editing::SnapToBar: + set_snap_to (Editing::SnapToMark); + break; + case Editing::SnapToMark: + set_snap_to (Editing::SnapToRegionStart); + break; + case Editing::SnapToRegionStart: + set_snap_to (Editing::SnapToRegionEnd); + break; + case Editing::SnapToRegionEnd: + set_snap_to (Editing::SnapToRegionSync); + break; + case Editing::SnapToRegionSync: + set_snap_to (Editing::SnapToRegionBoundary); + break; + case Editing::SnapToRegionBoundary: + set_snap_to (Editing::SnapToCDFrame); + break; + } +} + +void +Editor::next_snap_choice_music_only () +{ + switch (_snap_type) { + case Editing::SnapToMark: + case Editing::SnapToRegionStart: + case Editing::SnapToRegionEnd: + case Editing::SnapToRegionSync: + case Editing::SnapToRegionBoundary: + case Editing::SnapToCDFrame: + case Editing::SnapToTimecodeFrame: + case Editing::SnapToTimecodeSeconds: + case Editing::SnapToTimecodeMinutes: + case Editing::SnapToSeconds: + case Editing::SnapToMinutes: + set_snap_to (Editing::SnapToBeatDiv32); + break; + case Editing::SnapToBeatDiv32: + set_snap_to (Editing::SnapToBeatDiv28); + break; + case Editing::SnapToBeatDiv28: + set_snap_to (Editing::SnapToBeatDiv24); + break; + case Editing::SnapToBeatDiv24: + set_snap_to (Editing::SnapToBeatDiv20); + break; + case Editing::SnapToBeatDiv20: + set_snap_to (Editing::SnapToBeatDiv16); + break; + case Editing::SnapToBeatDiv16: + set_snap_to (Editing::SnapToBeatDiv14); + break; + case Editing::SnapToBeatDiv14: + set_snap_to (Editing::SnapToBeatDiv12); + break; + case Editing::SnapToBeatDiv12: + set_snap_to (Editing::SnapToBeatDiv10); + break; + case Editing::SnapToBeatDiv10: + set_snap_to (Editing::SnapToBeatDiv8); + break; + case Editing::SnapToBeatDiv8: + set_snap_to (Editing::SnapToBeatDiv7); + break; + case Editing::SnapToBeatDiv7: + set_snap_to (Editing::SnapToBeatDiv6); + break; + case Editing::SnapToBeatDiv6: + set_snap_to (Editing::SnapToBeatDiv5); + break; + case Editing::SnapToBeatDiv5: + set_snap_to (Editing::SnapToBeatDiv4); + break; + case Editing::SnapToBeatDiv4: + set_snap_to (Editing::SnapToBeatDiv3); + break; + case Editing::SnapToBeatDiv3: + set_snap_to (Editing::SnapToBeatDiv2); + break; + case Editing::SnapToBeatDiv2: + set_snap_to (Editing::SnapToBeat); + break; + case Editing::SnapToBeat: + set_snap_to (Editing::SnapToBar); + break; + case Editing::SnapToBar: + set_snap_to (Editing::SnapToBeatDiv32); + break; + } +} + +void +Editor::prev_snap_choice_music_only () +{ + switch (_snap_type) { + case Editing::SnapToMark: + case Editing::SnapToRegionStart: + case Editing::SnapToRegionEnd: + case Editing::SnapToRegionSync: + case Editing::SnapToRegionBoundary: + case Editing::SnapToCDFrame: + case Editing::SnapToTimecodeFrame: + case Editing::SnapToTimecodeSeconds: + case Editing::SnapToTimecodeMinutes: + case Editing::SnapToSeconds: + case Editing::SnapToMinutes: + set_snap_to (Editing::SnapToBar); + break; + case Editing::SnapToBeatDiv32: + set_snap_to (Editing::SnapToBeat); + break; + case Editing::SnapToBeatDiv28: + set_snap_to (Editing::SnapToBeatDiv32); + break; + case Editing::SnapToBeatDiv24: + set_snap_to (Editing::SnapToBeatDiv28); + break; + case Editing::SnapToBeatDiv20: + set_snap_to (Editing::SnapToBeatDiv24); + break; + case Editing::SnapToBeatDiv16: + set_snap_to (Editing::SnapToBeatDiv20); + break; + case Editing::SnapToBeatDiv14: + set_snap_to (Editing::SnapToBeatDiv16); + break; + case Editing::SnapToBeatDiv12: + set_snap_to (Editing::SnapToBeatDiv14); + break; + case Editing::SnapToBeatDiv10: + set_snap_to (Editing::SnapToBeatDiv12); + break; + case Editing::SnapToBeatDiv8: + set_snap_to (Editing::SnapToBeatDiv10); + break; + case Editing::SnapToBeatDiv7: + set_snap_to (Editing::SnapToBeatDiv8); + break; + case Editing::SnapToBeatDiv6: + set_snap_to (Editing::SnapToBeatDiv7); + break; + case Editing::SnapToBeatDiv5: + set_snap_to (Editing::SnapToBeatDiv6); + break; + case Editing::SnapToBeatDiv4: + set_snap_to (Editing::SnapToBeatDiv5); + break; + case Editing::SnapToBeatDiv3: + set_snap_to (Editing::SnapToBeatDiv4); + break; + case Editing::SnapToBeatDiv2: + set_snap_to (Editing::SnapToBeatDiv3); + break; + case Editing::SnapToBeat: + set_snap_to (Editing::SnapToBeatDiv2); + break; + case Editing::SnapToBar: + set_snap_to (Editing::SnapToBeat); + break; + } +} + +void Editor::snap_type_chosen (SnapType type) { /* this is driven by a toggle on a radio group, and so is invoked twice, diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 16f87d920d..a3a563340f 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -2705,16 +2705,29 @@ Editor::escape () void Editor::set_internal_edit (bool yn) { + if (_internal_editing == yn) { + return; + } + _internal_editing = yn; if (yn) { pre_internal_mouse_mode = mouse_mode; + pre_internal_snap_type = _snap_type; + pre_internal_snap_mode = _snap_mode; for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { (*i)->enter_internal_edit_mode (); } + set_snap_to (internal_snap_type); + set_snap_mode (internal_snap_mode); + } else { + + internal_snap_mode = _snap_mode; + internal_snap_type = _snap_type; + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { (*i)->leave_internal_edit_mode (); } @@ -2723,6 +2736,9 @@ Editor::set_internal_edit (bool yn) /* we were drawing .. flip back to something sensible */ set_mouse_mode (pre_internal_mouse_mode); } + + set_snap_to (pre_internal_snap_type); + set_snap_mode (pre_internal_snap_mode); } set_canvas_cursor (); diff --git a/gtk2_ardour/enums.cc b/gtk2_ardour/enums.cc index 930ac7e2d6..28d64ef969 100644 --- a/gtk2_ardour/enums.cc +++ b/gtk2_ardour/enums.cc @@ -41,6 +41,9 @@ setup_gtk_ardour_enums () EditPoint edit_point; LayerDisplay layer_display; RegionListSortType region_list_sort_type; + SnapType snap_type; + SnapMode snap_mode; + ZoomFocus zoom_focus; #define REGISTER(e) enum_writer.register_distinct (typeid(e).name(), i, s); i.clear(); s.clear() #define REGISTER_BITS(e) enum_writer.register_bits (typeid(e).name(), i, s); i.clear(); s.clear() @@ -83,4 +86,47 @@ setup_gtk_ardour_enums () REGISTER_ENUM (ByStartInFile); REGISTER_ENUM (ByTimestamp); REGISTER (region_list_sort_type); + + REGISTER_ENUM (SnapToCDFrame); + REGISTER_ENUM (SnapToTimecodeFrame); + REGISTER_ENUM (SnapToTimecodeSeconds); + REGISTER_ENUM (SnapToTimecodeMinutes); + REGISTER_ENUM (SnapToSeconds); + REGISTER_ENUM (SnapToMinutes); + REGISTER_ENUM (SnapToBeatDiv32); + REGISTER_ENUM (SnapToBeatDiv28); + REGISTER_ENUM (SnapToBeatDiv24); + REGISTER_ENUM (SnapToBeatDiv20); + REGISTER_ENUM (SnapToBeatDiv16); + REGISTER_ENUM (SnapToBeatDiv14); + REGISTER_ENUM (SnapToBeatDiv12); + REGISTER_ENUM (SnapToBeatDiv10); + REGISTER_ENUM (SnapToBeatDiv8); + REGISTER_ENUM (SnapToBeatDiv7); + REGISTER_ENUM (SnapToBeatDiv6); + REGISTER_ENUM (SnapToBeatDiv5); + REGISTER_ENUM (SnapToBeatDiv4); + REGISTER_ENUM (SnapToBeatDiv3); + REGISTER_ENUM (SnapToBeatDiv2); + REGISTER_ENUM (SnapToBeat); + REGISTER_ENUM (SnapToBar); + REGISTER_ENUM (SnapToMark); + REGISTER_ENUM (SnapToRegionStart); + REGISTER_ENUM (SnapToRegionEnd); + REGISTER_ENUM (SnapToRegionSync); + REGISTER_ENUM (SnapToRegionBoundary); + REGISTER (snap_type); + + REGISTER_ENUM (SnapOff); + REGISTER_ENUM (SnapNormal); + REGISTER_ENUM (SnapMagnetic); + REGISTER (snap_mode); + + REGISTER_ENUM (ZoomFocusLeft); + REGISTER_ENUM (ZoomFocusRight); + REGISTER_ENUM (ZoomFocusCenter); + REGISTER_ENUM (ZoomFocusPlayhead); + REGISTER_ENUM (ZoomFocusMouse); + REGISTER_ENUM (ZoomFocusEdit); + REGISTER (zoom_focus); } diff --git a/gtk2_ardour/mnemonic-us.bindings.in b/gtk2_ardour/mnemonic-us.bindings.in index 39add85521..51460edcb6 100644 --- a/gtk2_ardour/mnemonic-us.bindings.in +++ b/gtk2_ardour/mnemonic-us.bindings.in @@ -329,10 +329,13 @@ This mode provides many different operations on both regions and control points, ;; numbers @eep|Editor/cycle-snap-mode|2|cycle to next grid snap mode -@eep|Editor/cycle-snap-choice|3|cycle to next grid unit -@trans|Editor/step-mouse-mode|4|toggle auto play -@trans|Transport/ToggleAutoReturn|5|toggle auto return -@trans|Transport/ToggleClick|6|toggle auto input +@eep|Editor/prev-snap-choice|3|use next grid unit +@eep|Editor/prev-snap-choice-music-only|<@PRIMARY@>3|use previous grid unit +@eep|Editor/next-snap-choice|4|use next grid unit +@eep|Editor/next-snap-choice-music-only|<@PRIMARY@>4|use next musical grid unit +@trans|Transport/ToggleAutoPlay|5|toggle auto play +@trans|Transport/ToggleAutoReturn|6|toggle auto return +@trans|Transport/ToggleClick|7|toggle click (metronome) @ranges|Editor/set-tempo-from-region|9|set tempo (1 bar) from region(s) @ranges|Editor/set-tempo-from-edit-range|0|set tempo (1 bar) from edit range |