summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2012-02-13 14:34:21 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2012-02-13 14:34:21 +0000
commit671ec99bac183b84f43dc4c2114b9b93fca3aee0 (patch)
tree809edcb592aaa1a5633863fae5e0f6d96ba93eb3 /gtk2_ardour
parent8ef8bfc64ffba6d87cdb8ffcd6ecd535e2391641 (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.in5
-rw-r--r--gtk2_ardour/editor.cc40
-rw-r--r--gtk2_ardour/editor.h11
-rw-r--r--gtk2_ardour/editor_actions.cc240
-rw-r--r--gtk2_ardour/editor_mouse.cc16
-rw-r--r--gtk2_ardour/enums.cc46
-rw-r--r--gtk2_ardour/mnemonic-us.bindings.in11
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