implement dragging for region/cue markers

This commit is contained in:
Paul Davis 2021-05-24 12:28:19 -06:00
parent c2a012545b
commit ab2357dfa1
3 changed files with 30 additions and 5 deletions

View File

@ -7158,6 +7158,7 @@ RegionMarkerDrag::RegionMarkerDrag (Editor* ed, RegionView* r, ArdourCanvas::Ite
, rv (r)
, view (static_cast<ArdourMarker*> (i->get_data ("marker")))
, model (rv->find_model_cue_marker (view))
, dragging_model (model)
{
assert (view);
}
@ -7167,27 +7168,45 @@ RegionMarkerDrag::~RegionMarkerDrag ()
}
void
RegionMarkerDrag::start_grab (GdkEvent *, Gdk::Cursor* c)
RegionMarkerDrag::start_grab (GdkEvent* ev, Gdk::Cursor* c)
{
Drag::start_grab (ev, c);
show_verbose_cursor_time (model.position());
setup_snap_delta (MusicSample (model.position(), 0));
}
void
RegionMarkerDrag::motion (GdkEvent *, bool)
RegionMarkerDrag::motion (GdkEvent* ev, bool first_move)
{
samplepos_t pos = adjusted_current_sample (ev);
if (pos < rv->region()->position() || pos >= (rv->region()->position() + rv->region()->length())) {
/* out of bounds */
return;
}
dragging_model.set_position (pos);
view->set_position (pos - rv->region()->position());
show_verbose_cursor_time (dragging_model.position() - rv->region()->position()); /* earlier */
}
void
RegionMarkerDrag::finished (GdkEvent *, bool)
RegionMarkerDrag::finished (GdkEvent *, bool did_move)
{
if (did_move) {
rv->region()->move_cue_marker (model, dragging_model.position());
}
}
void
RegionMarkerDrag::aborted (bool)
{
view->set_position (model.position());
}
void
RegionMarkerDrag::setup_pointer_sample_offset ()
{
const samplepos_t model_abs_pos = rv->region()->position() + (model.position() - rv->region()->start()); /* distance */
_pointer_sample_offset = raw_grab_sample() - model_abs_pos; /* distance */
}

View File

@ -1401,6 +1401,7 @@ class RegionMarkerDrag : public Drag
RegionView* rv;
ArdourMarker* view;
ARDOUR::CueMarker model;
ARDOUR::CueMarker dragging_model;
};
#endif /* __gtk2_ardour_editor_drag_h_ */

View File

@ -751,7 +751,12 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
if (Keyboard::modifier_state_equals (event->button.state, Keyboard::ModifierMask(Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
hide_marker (item, event);
} else {
_drags->set (new MarkerDrag (this, item), event);
ArdourMarker* marker = static_cast<ArdourMarker*> (item->get_data ("marker"));
if (marker->type() == ArdourMarker::RegionCue) {
_drags->set (new RegionMarkerDrag (this, marker->region_view(), item), event);
} else {
_drags->set (new MarkerDrag (this, item), event);
}
}
return true;