From 46bf3334f52ce287e0a77f6b35fc70a0f66593c3 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 29 Dec 2021 00:42:59 -0800 Subject: [PATCH] reworked reselection code Fixes #1811 --- app/widget/timelinewidget/timelinewidget.cpp | 68 ++++++++++++-------- app/widget/timelinewidget/timelinewidget.h | 2 +- 2 files changed, 41 insertions(+), 29 deletions(-) diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index 3416f6e05..49b02f6f5 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -920,6 +920,10 @@ void TimelineWidget::AddBlock(Block *block) connect(block, &Block::PreviewChanged, this, &TimelineWidget::BlockUpdated); added_blocks_.append(block); + + if (selections_[block->track()->ToReference()].contains(block->range()) && !selected_blocks_.contains(block)) { + selected_blocks_.append(block); + } } } @@ -1195,9 +1199,20 @@ void TimelineWidget::UpdateViewTimebases() } } -void TimelineWidget::NudgeInternal(const rational &amount) +void TimelineWidget::NudgeInternal(rational amount) { if (!selected_blocks_.isEmpty()) { + // Validate + foreach (Block* b, selected_blocks_) { + if (b->in() + amount < 0) { + amount = -b->in(); + } + } + + if (amount.isNull()) { + return; + } + MultiUndoCommand *command = new MultiUndoCommand(); foreach (Block* b, selected_blocks_) { @@ -1552,31 +1567,6 @@ QVector TimelineWidget::GetBlocksInGlobalRect(const QPoint &p1, const Q return blocks_in_rect; } -QVector TimelineWidget::GetBlocksInSelection(const TimelineWidgetSelections &sel) -{ - QVector blocks; - - for (auto it=sel.cbegin(); it!=sel.cend(); it++) { - const Track::Reference &ref = it.key(); - const TimeRangeList &list = it.value(); - - for (const TimeRange &r : list) { - Track *track = GetTrackFromReference(ref); - if (track) { - for (Block *b : track->Blocks()) { - if (r.Contains(b->range())) { - blocks.append(b); - } else if (b->in() >= r.out()) { - break; - } - } - } - } - } - - return blocks; -} - void TimelineWidget::HideSnaps() { foreach (TimelineAndTrackView* tview, views_) { @@ -1701,8 +1691,30 @@ void TimelineWidget::SetSelections(const TimelineWidgetSelections &s, bool proce } if (process_block_changes) { - SignalDeselectedBlocks(GetBlocksInSelection(selections_.Subtracted(s))); - SignalSelectedBlocks(GetBlocksInSelection(s.Subtracted(selections_))); + QVector deselected; + QVector selected; + + foreach (Block *b, selected_blocks_) { + if (!s[b->track()->ToReference()].contains(b->range())) { + deselected.append(b); + } + } + + for (auto it=s.cbegin(); it!=s.cend(); it++) { + Track *track = GetTrackFromReference(it.key()); + if (track) { + const TimeRangeList &ranges = it.value(); + + foreach (Block *b, track->Blocks()) { + if (!selected_blocks_.contains(b) && ranges.contains(b->range())) { + selected.append(b); + } + } + } + } + + SignalDeselectedBlocks(deselected); + SignalSelectedBlocks(selected); } selections_ = s; diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index 6082e2e51..418ec41fd 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -359,7 +359,7 @@ private: void UpdateViewTimebases(); - void NudgeInternal(const rational &amount); + void NudgeInternal(rational amount); void MoveToPlayheadInternal(bool out);