clean up MeterMarkerDrag

This commit is contained in:
Paul Davis 2020-11-24 18:25:34 -07:00
parent 1098b27b35
commit f8df966914
4 changed files with 59 additions and 40 deletions

View File

@ -3373,16 +3373,16 @@ TrimDrag::setup_pointer_offset ()
MeterMarkerDrag::MeterMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c)
: Drag (e, i)
, _marker (reinterpret_cast<MeterMarker*> (_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<MeterMarker*> (_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<TempoMap>(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)

View File

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

View File

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

View File

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