numerous fixes for meter marker drag

This commit is contained in:
Paul Davis 2022-05-30 21:14:51 -06:00
parent 192b2fd839
commit 265f5d8342
2 changed files with 18 additions and 39 deletions

View file

@ -3383,13 +3383,13 @@ TrimDrag::setup_pointer_offset ()
MeterMarkerDrag::MeterMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c) MeterMarkerDrag::MeterMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c)
: Drag (e, i, Temporal::BeatTime) : Drag (e, i, Temporal::BeatTime)
, _marker (reinterpret_cast<MeterMarker*> (_item->get_data ("marker"))) , _marker (reinterpret_cast<MeterMarker*> (_item->get_data ("marker")))
, _copy (c)
, _old_grid_type (e->grid_type()) , _old_grid_type (e->grid_type())
, _old_snap_mode (e->snap_mode()) , _old_snap_mode (e->snap_mode())
, before_state (0) , before_state (0)
{ {
DEBUG_TRACE (DEBUG::Drags, "New MeterMarkerDrag\n"); DEBUG_TRACE (DEBUG::Drags, "New MeterMarkerDrag\n");
assert (_marker); assert (_marker);
_movable = !TempoMap::use()->is_initial (_marker->meter());
} }
void void
@ -3403,6 +3403,7 @@ MeterMarkerDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
*/ */
map = _editor->begin_tempo_map_edit (); map = _editor->begin_tempo_map_edit ();
initial_sclock = _marker->meter().sclock();
} }
void void
@ -3434,28 +3435,7 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
/* get current state */ /* get current state */
before_state = &map->get_state(); before_state = &map->get_state();
if (!_copy) { _editor->begin_reversible_command (_("move meter mark"));
_editor->begin_reversible_command (_("move meter mark"));
} else {
timepos_t const pointer = adjusted_current_time (event, false);
BBT_Time pointer_bbt = map->bbt_at (pointer);
Temporal::MeterPoint const & meter = map->metric_at (pointer).meter();
BBT_Time bbt = meter.bbt();
/* we can't add a meter where one currently exists */
if (bbt < pointer_bbt) {
++bbt.bars;
} else {
--bbt.bars;
}
_editor->begin_reversible_command (_("copy meter mark"));
const timepos_t pos (map->quarters_at (bbt));
_marker->reset_meter (map->set_meter (meter, pos));
}
/* only snap to bars. */ /* only snap to bars. */
@ -3463,21 +3443,19 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
_editor->set_snap_mode (SnapMagnetic); _editor->set_snap_mode (SnapMagnetic);
} }
if (_movable && (!first_move || !_copy)) { if (!_movable) {
return;
}
timepos_t pos; timepos_t pos;
const bool leftward_earlier = (current_pointer_x() < last_pointer_x());
if (_editor->grid_musical()) { /* not useful to try to snap to a grid we're about to change */
/* not useful to try to snap to a grid we're about to change */ pos = adjusted_current_time (event, false);
pos = adjusted_current_time (event, false);
} else {
pos = adjusted_current_time (event);
}
if (map->move_meter (_marker->meter(), pos, false)) { if (map->move_meter (_marker->meter(), pos, leftward_earlier, false)) {
/* it was moved */ /* it was moved */
_editor->tempo_map_changed (); _editor->mid_tempo_change ();
}
show_verbose_cursor_time (timepos_t (_marker->meter().beats())); show_verbose_cursor_time (timepos_t (_marker->meter().beats()));
_editor->set_snapped_cursor_position (timepos_t (_marker->meter().sample(_editor->session()->sample_rate()))); _editor->set_snapped_cursor_position (timepos_t (_marker->meter().sample(_editor->session()->sample_rate())));
} }
@ -3488,7 +3466,7 @@ MeterMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
{ {
if (!movement_occurred) { if (!movement_occurred) {
/* reset thread local tempo map to the original state */ /* reset thread local tempo map to the original state */
TempoMap::abort_update (); _editor->abort_tempo_map_edit ();
if (was_double_click()) { if (was_double_click()) {
_editor->edit_meter_marker (*_marker); _editor->edit_meter_marker (*_marker);
} }
@ -3499,15 +3477,16 @@ MeterMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
_editor->set_grid_to (_old_grid_type); _editor->set_grid_to (_old_grid_type);
_editor->set_snap_mode (_old_snap_mode); _editor->set_snap_mode (_old_snap_mode);
TempoMap::update (map);
XMLNode &after = map->get_state(); XMLNode &after = map->get_state();
_editor->session()->add_command (new Temporal::TempoCommand (_("move time signature"), before_state, &after)); _editor->session()->add_command (new Temporal::TempoCommand (_("move time signature"), before_state, &after));
_editor->commit_reversible_command (); _editor->commit_reversible_command ();
TempoMap::update (map);
// delete the dummy marker we used for visual representation while moving. // delete the dummy marker we used for visual representation while moving.
// a new visual marker will show up automatically. // a new visual marker will show up automatically.
delete _marker; delete _marker;
} }
void void

View file

@ -853,8 +853,8 @@ public:
private: private:
MeterMarker* _marker; MeterMarker* _marker;
Temporal::TempoMap::WritableSharedPtr map; Temporal::TempoMap::WritableSharedPtr map;
Temporal::superclock_t initial_sclock;
bool _copy;
bool _movable; bool _movable;
Editing::GridType _old_grid_type; Editing::GridType _old_grid_type;
Editing::SnapMode _old_snap_mode; Editing::SnapMode _old_snap_mode;