add new Playhead snap mode

This commit is contained in:
Paul Davis
2023-04-28 15:57:27 -06:00
parent 5c0886379b
commit 78216b422f
4 changed files with 28 additions and 1 deletions

View File

@@ -22,6 +22,7 @@
/* Changing this order will break the menu */
GRIDTYPE(GridTypeNone)
GRIDTYPE(GridTypePlayhead)
GRIDTYPE(GridTypeBar)
GRIDTYPE(GridTypeBeat)
GRIDTYPE(GridTypeBeatDiv2)

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);