mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-07 07:14:56 +01:00
numerous fixes for meter marker drag
This commit is contained in:
parent
192b2fd839
commit
265f5d8342
2 changed files with 18 additions and 39 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue