From f8df9669145a73893c48a4292d2543091c8520d2 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 24 Nov 2020 18:25:34 -0700 Subject: [PATCH] clean up MeterMarkerDrag --- gtk2_ardour/editor_drag.cc | 80 +++++++++++++++++++------------------- gtk2_ardour/editor_drag.h | 2 +- gtk2_ardour/marker.cc | 13 +++++++ gtk2_ardour/marker.h | 4 ++ 4 files changed, 59 insertions(+), 40 deletions(-) diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 56e4377ccc..9b47732203 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -3373,16 +3373,16 @@ TrimDrag::setup_pointer_offset () MeterMarkerDrag::MeterMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c) : Drag (e, i) + , _marker (reinterpret_cast (_item->get_data ("marker"))) , _copy (c) , _old_grid_type (e->grid_type()) , _old_snap_mode (e->snap_mode()) , before_state (0) { DEBUG_TRACE (DEBUG::Drags, "New MeterMarkerDrag\n"); - _marker = reinterpret_cast (_item->get_data ("marker")); assert (_marker); - _real_section = &_marker->meter(); + _movable = !e->session()->tempo_map().is_initial (_marker->meter()); } void @@ -3401,73 +3401,80 @@ MeterMarkerDrag::setup_pointer_offset () void MeterMarkerDrag::motion (GdkEvent* event, bool first_move) { -#warning NUTEMPO fixme needs new tempo map -#if 0 + TempoMap& map (_editor->session()->tempo_map()); if (first_move) { // create a dummy marker to catch events, then hide it. char name[64]; - snprintf (name, sizeof(name), "%g/%g", _marker->meter().divisions_per_bar(), _marker->meter().note_divisor ()); + snprintf (name, sizeof(name), "%d/%d", _marker->meter().divisions_per_bar(), _marker->meter().note_value ()); _marker = new MeterMarker ( *_editor, *_editor->meter_group, UIConfiguration::instance().color ("meter marker"), name, - *new MeterSection (_marker->meter()) - ); + _marker->meter() + ); /* use the new marker for the grab */ swap_grab (&_marker->the_item(), 0, GDK_CURRENT_TIME); _marker->hide(); - TempoMap& map (_editor->session()->tempo_map()); /* get current state */ before_state = &map.get_state(); if (!_copy) { _editor->begin_reversible_command (_("move meter mark")); } else { - _editor->begin_reversible_command (_("copy meter mark")); - Temporal::BBT_Time bbt = _real_section->bbt(); + 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 (_real_section->time() < adjusted_current_time (event, false)) { + if (bbt < pointer_bbt) { ++bbt.bars; } else { --bbt.bars; } - const samplepos_t sample = map.sample_at_bbt (bbt); - _real_section = map.add_meter (Meter (_marker->meter().divisions_per_bar(), _marker->meter().note_divisor()) - , bbt, sample, _real_section->position_time_domain()); - if (!_real_section) { - aborted (true); - return; + + _editor->begin_reversible_command (_("copy meter mark")); + + timepos_t pos; + + if (map.time_domain() == AudioTime) { + pos = timepos_t (map.sample_at (bbt, _editor->session()->sample_rate())); + } else { + pos = timepos_t (map.quarter_note_at (bbt)); } -1 } + + _marker->reset_meter (map.set_meter (meter, pos)); + } + /* only snap to bars. leave snap mode alone for audio locked meters.*/ - if (_real_section->position_time_domain() != AudioTime) { + if (map.time_domain() != AudioTime) { _editor->set_grid_to (GridTypeBar); _editor->set_snap_mode (SnapMagnetic); } } - timepos_t pf = adjusted_current_time (event); + if (_movable && (!first_move || !_copy)) { - if (_real_section->position_time_domain() == Temporal::AudioTime && _editor->grid_musical()) { - /* never snap to music for audio locked */ - pf = adjusted_current_sample (event, false); + timepos_t pos; + + if (_editor->grid_musical()) { + /* not useful to try to snap to a grid we're about to change */ + pos = adjusted_current_time (event, false); + } else { + pos = adjusted_current_time (event); + } + + map.move_meter (_marker->meter(), pos, false); + + show_verbose_cursor_time (timepos_t (_marker->meter().beats())); + _editor->set_snapped_cursor_position (timepos_t (_marker->meter().sample(_editor->session()->sample_rate()))); } - - _editor->session()->tempo_map().gui_set_meter_position (_real_section, pf); - - /* fake marker meeds to stay under the mouse, unlike the real one. */ - _marker->set_position (adjusted_current_time (event, false)); - - show_verbose_cursor_time (_real_section->time()); - _editor->set_snapped_cursor_position(_real_section->sample()); -#endif } void @@ -3484,14 +3491,11 @@ MeterMarkerDrag::finished (GdkEvent* event, bool movement_occurred) _editor->set_grid_to (_old_grid_type); _editor->set_snap_mode (_old_snap_mode); -#warning NUTEMPO fixme needs new tempo map -#if 0 TempoMap& map (_editor->session()->tempo_map()); XMLNode &after = map.get_state(); _editor->session()->add_command(new MementoCommand(map, before_state, &after)); _editor->commit_reversible_command (); -#endif // delete the dummy marker we used for visual representation while moving. // a new visual marker will show up automatically. @@ -3501,9 +3505,8 @@ MeterMarkerDrag::finished (GdkEvent* event, bool movement_occurred) void MeterMarkerDrag::aborted (bool moved) { -#warning NUTEMPO fixme needs new tempo map -#if 0 - _marker->set_position (_marker->meter().sample ()); + _marker->set_position (_marker->meter().time()); + if (moved) { /* reinstate old snap setting */ _editor->set_grid_to (_old_grid_type); @@ -3514,7 +3517,6 @@ MeterMarkerDrag::aborted (bool moved) // a new visual marker will show up automatically. delete _marker; } -#endif } TempoMarkerDrag::TempoMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c) diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index bd43c345a2..e2784caf25 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -840,9 +840,9 @@ public: private: MeterMarker* _marker; - Temporal::MeterPoint* _real_section; bool _copy; + bool _movable; Editing::GridType _old_grid_type; Editing::SnapMode _old_snap_mode; XMLNode* before_state; diff --git a/gtk2_ardour/marker.cc b/gtk2_ardour/marker.cc index 9ecdb9ad20..459135f2df 100644 --- a/gtk2_ardour/marker.cc +++ b/gtk2_ardour/marker.cc @@ -665,6 +665,13 @@ TempoMarker::update_height_mark (const double ratio) mark->set (*points); } +void +TempoMarker::reset_tempo (Temporal::TempoPoint & t) +{ + _tempo = t; +} + + /***********************************************************************/ MeterMarker::MeterMarker (PublicEditor& editor, ArdourCanvas::Container& parent, guint32 rgba, const string& text, @@ -681,3 +688,9 @@ MeterMarker::MeterMarker (PublicEditor& editor, ArdourCanvas::Container& parent, MeterMarker::~MeterMarker () { } + +void +MeterMarker::reset_meter (Temporal::MeterPoint & m) +{ + _meter = m; +} diff --git a/gtk2_ardour/marker.h b/gtk2_ardour/marker.h index 13ae5f4f9d..fff407d617 100644 --- a/gtk2_ardour/marker.h +++ b/gtk2_ardour/marker.h @@ -160,6 +160,8 @@ class TempoMarker : public ArdourMarker TempoMarker (PublicEditor& editor, ArdourCanvas::Container &, guint32 rgba, const std::string& text, Temporal::TempoPoint&); ~TempoMarker (); + void reset_tempo (Temporal::TempoPoint & t); + Temporal::TempoPoint& tempo() const { return _tempo; } void update_height_mark (const double ratio); @@ -173,6 +175,8 @@ class MeterMarker : public ArdourMarker MeterMarker (PublicEditor& editor, ArdourCanvas::Container &, guint32 rgba, const std::string& text, Temporal::MeterPoint&); ~MeterMarker (); + void reset_meter (Temporal::MeterPoint & m); + Temporal::MeterPoint& meter() const { return _meter; } private: