clean up MeterMarkerDrag
This commit is contained in:
parent
1098b27b35
commit
f8df966914
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue