implement dragging for region/cue markers
This commit is contained in:
parent
c2a012545b
commit
ab2357dfa1
|
@ -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 */
|
||||
}
|
||||
|
||||
|
|
|
@ -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_ */
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue