Fixed timeline move selection. Fixes #1014, #1015.

This commit is contained in:
Leonardo Zide
2026-03-17 09:51:17 -07:00
parent db14a264e7
commit e6de72146f
4 changed files with 61 additions and 58 deletions
+3 -3
View File
@@ -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:
+47 -4
View File
@@ -2125,9 +2125,6 @@ lcStep lcModel::GetLastStep() const
void lcModel::InsertStep(lcStep Step)
{
BeginHistorySequence();
BeginEditHistory(lcModelHistoryEditMerge::None);
for (const std::unique_ptr<lcPiece>& Piece : mPieces)
Piece->InsertTime(Step, 1);
@@ -2136,7 +2133,14 @@ void lcModel::InsertStep(lcStep Step)
for (const std::unique_ptr<lcLight>& 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<lcPiece*> 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<std::pair<lcPiece*, lcStep>>& PieceSteps)
{
if (PieceSteps.size() != mPieces.size())
+4 -2
View File
@@ -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<typename StateType, typename ObjectType>
void LoadObjectHistoryState(const std::vector<StateType>& ObjectStates, std::vector<std::unique_ptr<ObjectType>>& Objects);
@@ -243,6 +243,7 @@ public:
void RotateFocusedTrainTrack(int Direction);
void ShowSelectedPiecesEarlier();
void ShowSelectedPiecesLater();
void InsertStepAndMoveSelectedPieces(lcStep Step);
void SetPieceSteps(const std::vector<std::pair<lcPiece*, lcStep>>& 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;
+7 -49
View File
@@ -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<QTreeWidgetItem*> 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<int>(Model->GetCurrentStep()))
Model->SetCurrentStep(Step);
}
@@ -461,35 +444,10 @@ void lcTimelineWidget::MoveSelectionAfter()
Step += 2;
const QList<QTreeWidgetItem*> 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<int>(Model->GetCurrentStep()))
Model->SetCurrentStep(Step);
}