Allow to drag time selection markers

This commit is contained in:
Robin Gareus 2023-06-01 21:34:50 +02:00
parent c063be6a76
commit 921b4aaa75
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
4 changed files with 81 additions and 3 deletions

View File

@ -1480,7 +1480,6 @@ Editor::which_canvas_cursor(ItemType type) const
case MinsecRulerItem:
case BBTRulerItem:
case SamplesRulerItem:
case SelectionMarkerItem:
cursor = _cursors->timebar;
break;
@ -1498,6 +1497,7 @@ Editor::which_canvas_cursor(ItemType type) const
case VideoBarItem:
case TransportMarkerBarItem:
case DropZoneItem:
case SelectionMarkerItem:
cursor = _cursors->grabber;
break;

View File

@ -5805,6 +5805,64 @@ SelectionDrag::aborted (bool)
/* XXX: TODO */
}
SelectionMarkerDrag::SelectionMarkerDrag (Editor* e, ArdourCanvas::Item* i)
: Drag (e, i, e->default_time_domain ())
, _edit_start (true)
{
DEBUG_TRACE (DEBUG::Drags, "New SelectionMarkerDrag\n");
bool ok = _editor->get_selection_extents (_start_at_start, _end_at_start);
assert (ok);
// SelectionStart, SelectionEnd
cout << " SelectionMarkerDrag " << _start_at_start << " - " << _end_at_start << " " << i->whoami() << "\n";
}
void
SelectionMarkerDrag::start_grab (GdkEvent* event, Gdk::Cursor*)
{
Drag::start_grab (event);
timepos_t const pos = adjusted_current_time (event, false);
_edit_start = pos.distance (_start_at_start).abs () < pos.distance (_end_at_start).abs ();
}
void
SelectionMarkerDrag::motion (GdkEvent* event, bool first_move)
{
if (first_move) {
_editor->begin_reversible_selection_op (X_("set time selection"));
}
timepos_t const pos = adjusted_current_time (event, true);
if (_edit_start) {
if (pos < _end_at_start) {
_editor->get_selection ().clear_time ();
_editor->get_selection ().add (pos, _end_at_start);
}
} else {
if (pos > _start_at_start) {
_editor->get_selection ().clear_time ();
_editor->get_selection ().add (_start_at_start, pos);
}
}
}
void
SelectionMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
{
if (movement_occurred) {
_editor->commit_reversible_selection_op ();
}
}
void
SelectionMarkerDrag::aborted (bool movement_occurred)
{
if (movement_occurred) {
_editor->abort_reversible_selection_op ();
}
_editor->get_selection ().clear_time ();
_editor->get_selection ().add (_start_at_start, _end_at_start);
}
RangeMarkerBarDrag::RangeMarkerBarDrag (Editor* e, ArdourCanvas::Item* i, Operation o)
: Drag (e, i, e->default_time_domain (), false)
, _operation (o)

View File

@ -1378,6 +1378,23 @@ private:
Temporal::timepos_t end_at_start;
};
/** Drag time-selection markers */
class SelectionMarkerDrag : public Drag
{
public:
SelectionMarkerDrag (Editor*, ArdourCanvas::Item*);
void start_grab (GdkEvent*, Gdk::Cursor* c = 0);
void motion (GdkEvent*, bool);
void finished (GdkEvent *, bool);
void aborted (bool);
private:
bool _edit_start;
Temporal::timepos_t _start_at_start;
Temporal::timepos_t _end_at_start;
};
/** Range marker drag */
class RangeMarkerBarDrag : public Drag
{

View File

@ -800,6 +800,10 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
_drags->set (new BBTMarkerDrag (this, item), event);
return true;
case SelectionMarkerItem:
_drags->set (new SelectionMarkerDrag (this, item), event);
return true;
case MeterMarkerItem:
_drags->set (
new MeterMarkerDrag (
@ -849,7 +853,6 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
case SamplesRulerItem:
case MinsecRulerItem:
case MarkerBarItem:
case SelectionMarkerItem:
if (!Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)
&& !ArdourKeyboard::indicates_constraint (event->button.state)) {
_drags->set (new CursorDrag (this, *_playhead_cursor, false), event);
@ -1794,6 +1797,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
case AutomationLineItem:
case StartSelectionTrimItem:
case EndSelectionTrimItem:
case SelectionMarkerItem:
return true;
case MarkerBarItem:
@ -1841,7 +1845,6 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
case SamplesRulerItem:
case MinsecRulerItem:
case BBTRulerItem:
case SelectionMarkerItem:
return true;
break;