diff --git a/gtk2_ardour/editing_syms.h b/gtk2_ardour/editing_syms.h index fb076d28b7..9e3ea41212 100644 --- a/gtk2_ardour/editing_syms.h +++ b/gtk2_ardour/editing_syms.h @@ -22,6 +22,7 @@ /* Changing this order will break the menu */ GRIDTYPE(GridTypeNone) +GRIDTYPE(GridTypePlayhead) GRIDTYPE(GridTypeBar) GRIDTYPE(GridTypeBeat) GRIDTYPE(GridTypeBeatDiv2) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 89d7a812fd..7ac79034f6 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -180,6 +180,7 @@ double Editor::timebar_height = 15.0; static const gchar *_grid_type_strings[] = { N_("No Grid"), + N_("Playhead"), N_("Bar"), N_("1/4 Note"), N_("1/8 Note"), @@ -2197,6 +2198,7 @@ Editor::grid_type_is_musical(GridType gt) const case GridTypeBar: return true; case GridTypeNone: + case GridTypePlayhead: case GridTypeTimecode: case GridTypeMinSec: case GridTypeCDFrame: @@ -3030,6 +3032,7 @@ Editor::_snap_to_bbt (timepos_t const & presnap, Temporal::RoundMode direction, divisor = 1; break; case GridTypeNone: + case GridTypePlayhead: return ret; default: divisor = 2; @@ -3154,10 +3157,16 @@ Editor::snap_to_internal (timepos_t& start, Temporal::RoundMode direction, SnapP UIConfiguration const& uic (UIConfiguration::instance ()); const timepos_t presnap = start; + timepos_t test = timepos_t::max (start.time_domain()); // for each snap, we'll use this value timepos_t dist = timepos_t::max (start.time_domain()); // this records the distance of the best snap result we've found so far timepos_t best = timepos_t::max (start.time_domain()); // this records the best snap-result we've found so far + if (_grid_type == GridTypePlayhead) { + best = timepos_t (_session->transport_sample ()); + goto check_distance; + } + /* check snap-to-marker */ if ((pref == SnapToAny_Visual) && uic.get_snap_to_marks ()) { test = snap_to_marker (presnap, direction); @@ -3207,6 +3216,7 @@ Editor::snap_to_internal (timepos_t& start, Temporal::RoundMode direction, SnapP return; } + check_distance: /* now check "magnetic" state: is the grid within reasonable on-screen distance to trigger a snap? * this also helps to avoid snapping to somewhere the user can't see. (i.e.: I clicked on a region and it disappeared!!) * ToDo: Perhaps this should only occur if EditPointMouse? @@ -3508,6 +3518,7 @@ Editor::build_grid_type_menu () /* main grid: bars, quarter-notes, etc */ grid_type_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeNone], sigc::bind (sigc::mem_fun(*this, &Editor::grid_type_selection_done), (GridType) GridTypeNone))); grid_type_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBar], sigc::bind (sigc::mem_fun(*this, &Editor::grid_type_selection_done), (GridType) GridTypeBar))); + grid_type_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypePlayhead], sigc::bind (sigc::mem_fun(*this, &Editor::grid_type_selection_done), (GridType) GridTypePlayhead))); grid_type_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBeat], sigc::bind (sigc::mem_fun(*this, &Editor::grid_type_selection_done), (GridType) GridTypeBeat))); grid_type_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBeatDiv2], sigc::bind (sigc::mem_fun(*this, &Editor::grid_type_selection_done), (GridType) GridTypeBeatDiv2))); grid_type_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBeatDiv4], sigc::bind (sigc::mem_fun(*this, &Editor::grid_type_selection_done), (GridType) GridTypeBeatDiv4))); @@ -4366,6 +4377,7 @@ Editor::get_grid_beat_divisions (GridType gt) case GridTypeBar: return -1; case GridTypeNone: return 0; + case GridTypePlayhead: return 0; case GridTypeTimecode: return 0; case GridTypeMinSec: return 0; case GridTypeCDFrame: return 0; diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index 2f0e0bc7dd..4dfa2a9deb 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -704,6 +704,7 @@ Editor::register_actions () ActionManager::register_radio_action (snap_actions, grid_choice_group, X_("grid-type-beat"), grid_type_strings[(int)GridTypeBeat].c_str(), (sigc::bind (sigc::mem_fun(*this, &Editor::grid_type_chosen), Editing::GridTypeBeat))); ActionManager::register_radio_action (snap_actions, grid_choice_group, X_("grid-type-bar"), grid_type_strings[(int)GridTypeBar].c_str(), (sigc::bind (sigc::mem_fun(*this, &Editor::grid_type_chosen), Editing::GridTypeBar))); + ActionManager::register_radio_action (snap_actions, grid_choice_group, X_("grid-type-playhead"), grid_type_strings[(int)GridTypePlayhead].c_str(), (sigc::bind (sigc::mem_fun(*this, &Editor::grid_type_chosen), Editing::GridTypePlayhead))); ActionManager::register_radio_action (snap_actions, grid_choice_group, X_("grid-type-none"), grid_type_strings[(int)GridTypeNone].c_str(), (sigc::bind (sigc::mem_fun(*this, &Editor::grid_type_chosen), Editing::GridTypeNone))); @@ -1249,6 +1250,9 @@ Editor::draw_length_action (GridType type) case Editing::GridTypeBar: action = "draw-length-bar"; break; + case Editing::GridTypePlayhead: + action = "draw-length-playhead"; + break; case Editing::GridTypeNone: action = "draw-length-auto"; break; @@ -1330,6 +1334,9 @@ Editor::grid_type_action (GridType type) case Editing::GridTypeBar: action = "grid-type-bar"; break; + case Editing::GridTypePlayhead: + action = "grid-type-playhead"; + break; case Editing::GridTypeNone: action = "grid-type-none"; break; @@ -1385,6 +1392,9 @@ Editor::next_grid_choice () set_grid_to (Editing::GridTypeBeat); break; case Editing::GridTypeNone: + set_grid_to (Editing::GridTypePlayhead); + break; + case Editing::GridTypePlayhead: set_grid_to (Editing::GridTypeBar); break; case Editing::GridTypeBeatDiv3: @@ -1427,7 +1437,10 @@ Editor::prev_grid_choice () set_grid_to (Editing::GridTypeBar); break; case Editing::GridTypeBar: - set_grid_to (Editing::GridTypeNone); + set_grid_to (Editing::GridTypePlayhead); + break; + case Editing::GridTypePlayhead: + set_grid_to (Editing::GridTypeBar); break; case Editing::GridTypeNone: set_grid_to (Editing::GridTypeBeatDiv32); diff --git a/gtk2_ardour/enums.cc b/gtk2_ardour/enums.cc index f4f79ce5db..d1ebd8f154 100644 --- a/gtk2_ardour/enums.cc +++ b/gtk2_ardour/enums.cc @@ -106,6 +106,7 @@ setup_gtk_ardour_enums () REGISTER (region_list_sort_type); REGISTER_ENUM (GridTypeNone); + REGISTER_ENUM (GridTypePlayhead); REGISTER_ENUM (GridTypeBar); REGISTER_ENUM (GridTypeBeat); REGISTER_ENUM (GridTypeBeatDiv2);