From e6de72146f35151ac43ac969f7334600f47fdef7 Mon Sep 17 00:00:00 2001 From: Leonardo Zide Date: Tue, 17 Mar 2026 09:51:17 -0700 Subject: [PATCH] Fixed timeline move selection. Fixes #1014, #1015. --- common/lc_mainwindow.cpp | 6 ++-- common/lc_model.cpp | 51 +++++++++++++++++++++++++++++--- common/lc_model.h | 6 ++-- common/lc_timelinewidget.cpp | 56 +++++------------------------------- 4 files changed, 61 insertions(+), 58 deletions(-) diff --git a/common/lc_mainwindow.cpp b/common/lc_mainwindow.cpp index 687c7d35..cebea59e 100644 --- a/common/lc_mainwindow.cpp +++ b/common/lc_mainwindow.cpp @@ -3196,15 +3196,15 @@ void lcMainWindow::HandleCommand(lcCommandId CommandId) break; case LC_VIEW_TIME_INSERT_BEFORE: - lcGetActiveModel()->InsertStep(lcGetActiveModel()->GetCurrentStep()); + lcGetActiveModel()->InsertStepAction(lcGetActiveModel()->GetCurrentStep()); break; case LC_VIEW_TIME_INSERT_AFTER: - lcGetActiveModel()->InsertStep(lcGetActiveModel()->GetCurrentStep() + 1); + lcGetActiveModel()->InsertStepAction(lcGetActiveModel()->GetCurrentStep() + 1); break; case LC_VIEW_TIME_DELETE: - lcGetActiveModel()->RemoveStep(lcGetActiveModel()->GetCurrentStep()); + lcGetActiveModel()->RemoveStepAction(lcGetActiveModel()->GetCurrentStep()); break; case LC_VIEW_VIEWPOINT_FRONT: diff --git a/common/lc_model.cpp b/common/lc_model.cpp index d56fb59f..2b9cece1 100644 --- a/common/lc_model.cpp +++ b/common/lc_model.cpp @@ -2125,9 +2125,6 @@ lcStep lcModel::GetLastStep() const void lcModel::InsertStep(lcStep Step) { - BeginHistorySequence(); - BeginEditHistory(lcModelHistoryEditMerge::None); - for (const std::unique_ptr& Piece : mPieces) Piece->InsertTime(Step, 1); @@ -2136,7 +2133,14 @@ void lcModel::InsertStep(lcStep Step) for (const std::unique_ptr& Light : mLights) Light->InsertTime(Step, 1); +} +void lcModel::InsertStepAction(lcStep Step) +{ + BeginHistorySequence(); + BeginEditHistory(lcModelHistoryEditMerge::None); + + InsertStep(Step); EndEditHistory(); EndHistorySequence(tr("Insert Step")); @@ -2144,7 +2148,7 @@ void lcModel::InsertStep(lcStep Step) SetCurrentStep(mCurrentStep); } -void lcModel::RemoveStep(lcStep Step) +void lcModel::RemoveStepAction(lcStep Step) { BeginHistorySequence(); BeginEditHistory(lcModelHistoryEditMerge::None); @@ -3103,6 +3107,45 @@ void lcModel::ShowSelectedPiecesLater() gMainWindow->UpdateSelectedObjects(false); } +void lcModel::InsertStepAndMoveSelectedPieces(lcStep Step) +{ + BeginHistorySequence(); + BeginEditHistory(lcModelHistoryEditMerge::None); + + InsertStep(Step); + + std::vector MovedPieces; + + for (auto PieceIt = mPieces.begin(); PieceIt != mPieces.end(); ) + { + lcPiece* Piece = PieceIt->get(); + + if (Piece->IsSelected()) + { + Piece->SetStepShow(Step); + + MovedPieces.emplace_back(PieceIt->release()); + PieceIt = mPieces.erase(PieceIt); + + continue; + } + + PieceIt++; + } + + for (lcPiece* Piece : MovedPieces) + { + Piece->SetFileLine(-1); + AddPiece(Piece); + } + + EndEditHistory(); + EndHistorySequence(tr("Show Pieces")); + + gMainWindow->UpdateTimeline(false, false); + gMainWindow->UpdateSelectedObjects(false); +} + void lcModel::SetPieceSteps(const std::vector>& PieceSteps) { if (PieceSteps.size() != mPieces.size()) diff --git a/common/lc_model.h b/common/lc_model.h index fd9e3ce3..8c7534ad 100644 --- a/common/lc_model.h +++ b/common/lc_model.h @@ -223,8 +223,8 @@ public: void ShowLastStep(); void ShowPreviousStep(); void ShowNextStep(); - void InsertStep(lcStep Step); - void RemoveStep(lcStep Step); + void InsertStepAction(lcStep Step); + void RemoveStepAction(lcStep Step); template void LoadObjectHistoryState(const std::vector& ObjectStates, std::vector>& Objects); @@ -243,6 +243,7 @@ public: void RotateFocusedTrainTrack(int Direction); void ShowSelectedPiecesEarlier(); void ShowSelectedPiecesLater(); + void InsertStepAndMoveSelectedPieces(lcStep Step); void SetPieceSteps(const std::vector>& PieceSteps); void RenamePiece(PieceInfo* Info); @@ -423,6 +424,7 @@ protected: void SelectGroup(lcGroup* TopGroup, bool Select); size_t AddPiece(lcPiece* Piece); + void InsertStep(lcStep Step); lcPOVRayOptions mPOVRayOptions; lcModelProperties mProperties; diff --git a/common/lc_timelinewidget.cpp b/common/lc_timelinewidget.cpp index 45125403..b87d64da 100644 --- a/common/lc_timelinewidget.cpp +++ b/common/lc_timelinewidget.cpp @@ -326,7 +326,7 @@ void lcTimelineWidget::InsertStepBefore() if (Step == -1) return; - gMainWindow->GetActiveModel()->InsertStep(Step + 1); + gMainWindow->GetActiveModel()->InsertStepAction(Step + 1); } void lcTimelineWidget::InsertStepAfter() @@ -344,7 +344,7 @@ void lcTimelineWidget::InsertStepAfter() if (Step == -1) return; - gMainWindow->GetActiveModel()->InsertStep(Step + 2); + gMainWindow->GetActiveModel()->InsertStepAction(Step + 2); } void lcTimelineWidget::RemoveStep() @@ -362,7 +362,7 @@ void lcTimelineWidget::RemoveStep() if (Step == -1) return; - gMainWindow->GetActiveModel()->RemoveStep(Step + 1); + gMainWindow->GetActiveModel()->RemoveStepAction(Step + 1); } void lcTimelineWidget::MoveSelection() @@ -419,27 +419,10 @@ void lcTimelineWidget::MoveSelectionBefore() Step++; - const QList SelectedItems = selectedItems(); - - gMainWindow->GetActiveModel()->InsertStep(Step); - - CurrentItem = topLevelItem(Step - 1); - - for (QTreeWidgetItem* PieceItem : SelectedItems) - { - QTreeWidgetItem* Parent = PieceItem->parent(); - - if (!Parent) - continue; - - int ChildIndex = Parent->indexOfChild(PieceItem); - CurrentItem->addChild(Parent->takeChild(ChildIndex)); - } - - UpdateModel(); - lcModel* Model = gMainWindow->GetActiveModel(); + Model->InsertStepAndMoveSelectedPieces(Step); + if (Step > static_cast(Model->GetCurrentStep())) Model->SetCurrentStep(Step); } @@ -461,35 +444,10 @@ void lcTimelineWidget::MoveSelectionAfter() Step += 2; - const QList SelectedItems = selectedItems(); - - gMainWindow->GetActiveModel()->InsertStep(Step); - - for (int TopLevelItemIdx = topLevelItemCount(); TopLevelItemIdx < Step; TopLevelItemIdx++) - { - QTreeWidgetItem* StepItem = new QTreeWidgetItem(this, QStringList(tr("Step %1").arg(TopLevelItemIdx + 1))); - StepItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsDropEnabled); - addTopLevelItem(StepItem); - StepItem->setExpanded(true); - } - - CurrentItem = topLevelItem(Step - 1); - - for (QTreeWidgetItem* PieceItem : SelectedItems) - { - QTreeWidgetItem* Parent = PieceItem->parent(); - - if (!Parent) - continue; - - int ChildIndex = Parent->indexOfChild(PieceItem); - CurrentItem->addChild(Parent->takeChild(ChildIndex)); - } - - UpdateModel(); - lcModel* Model = gMainWindow->GetActiveModel(); + Model->InsertStepAndMoveSelectedPieces(Step); + if (Step > static_cast(Model->GetCurrentStep())) Model->SetCurrentStep(Step); }