diff --git a/common/lc_model.cpp b/common/lc_model.cpp index 67aa8614..c20532cc 100644 --- a/common/lc_model.cpp +++ b/common/lc_model.cpp @@ -1757,7 +1757,7 @@ void lcModel::BeginMouseToolAction(lcTool Tool, lcView* View) case lcTool::Pan: case lcTool::RotateView: case lcTool::Roll: - ModelActionMouseTool->SetCameraStartState(View->GetCamera()); + ModelActionMouseTool->SaveCameraStartState(View->GetCamera()); break; case lcTool::ZoomRegion: @@ -1810,7 +1810,7 @@ void lcModel::EndMouseToolAction(lcTool Tool, lcView* View, const QString& Descr case lcTool::Pan: case lcTool::RotateView: case lcTool::Roll: - ModelActionMouseTool->SetCameraEndState(View->GetCamera()); + ModelActionMouseTool->SaveCameraEndState(View->GetCamera()); break; case lcTool::ZoomRegion: @@ -1853,6 +1853,7 @@ void lcModel::RunMouseToolAction(const lcModelActionMouseTool* ModelActionMouseT ModelActionMouseTool->LoadSelectionEndState(this); else ModelActionMouseTool->LoadSelectionStartState(this); + SetCurrentStep(mCurrentStep); break; @@ -1867,10 +1868,10 @@ void lcModel::RunMouseToolAction(const lcModelActionMouseTool* ModelActionMouseT case lcTool::Roll: if (lcCamera* Camera = GetCamera(ModelActionMouseTool->GetCameraName())) { - const QByteArray& State = Apply ? ModelActionMouseTool->GetEndState() : ModelActionMouseTool->GetStartState(); - QDataStream Stream(const_cast(&State), QIODevice::ReadOnly); - - Camera->LoadUndoData(Stream); + if (Apply) + ModelActionMouseTool->LoadCameraEndState(Camera); + else + ModelActionMouseTool->LoadCameraStartState(Camera); SetCurrentStep(mCurrentStep); } @@ -2229,11 +2230,11 @@ void lcModel::RecordStepAction(lcModelActionStepMode Mode, lcStep Step) { std::unique_ptr ModelActionStep = std::make_unique(Mode, Step); - ModelActionStep->SaveState(mPieces, mCameras, mLights); - + ModelActionStep->SaveModelState(this); + RunStepAction(ModelActionStep.get(), true); - - mActionSequence.emplace_back(std::move(ModelActionStep)); + + mActionSequence.emplace_back(std::move(ModelActionStep)); } void lcModel::RunStepAction(const lcModelActionStep* ModelActionStep, bool Apply) @@ -2280,50 +2281,7 @@ void lcModel::RunStepAction(const lcModelActionStep* ModelActionStep, bool Apply } else { - const std::vector& PieceStates = ModelActionStep->GetPieceStates(); - - if (PieceStates.size() != mPieces.size()) - return; - - for (size_t PieceIndex = 0; PieceIndex < mPieces.size(); PieceIndex++) - { - const QByteArray& PieceState = PieceStates[PieceIndex]; - lcPiece* Piece = mPieces[PieceIndex].get(); - - QDataStream Stream(const_cast(&PieceState), QIODevice::ReadOnly); - - Piece->LoadUndoData(Stream); - } - - const std::vector& CameraStates = ModelActionStep->GetCameraStates(); - - if (CameraStates.size() != mCameras.size()) - return; - - for (size_t CameraIndex = 0; CameraIndex < mCameras.size(); CameraIndex++) - { - const QByteArray& CameraState = CameraStates[CameraIndex]; - lcCamera* Camera = mCameras[CameraIndex].get(); - - QDataStream Stream(const_cast(&CameraState), QIODevice::ReadOnly); - - Camera->LoadUndoData(Stream); - } - - const std::vector& LightStates = ModelActionStep->GetLightStates(); - - if (LightStates.size() != mLights.size()) - return; - - for (size_t LightIndex = 0; LightIndex < mLights.size(); LightIndex++) - { - const QByteArray& LightState = LightStates[LightIndex]; - lcLight* Light = mLights[LightIndex].get(); - - QDataStream Stream(const_cast(&LightState), QIODevice::ReadOnly); - - Light->LoadUndoData(Stream); - } + ModelActionStep->LoadModelState(this); } SetCurrentStep(mCurrentStep); diff --git a/common/lc_modelaction.cpp b/common/lc_modelaction.cpp index 1dbc6333..2d94fbdd 100644 --- a/common/lc_modelaction.cpp +++ b/common/lc_modelaction.cpp @@ -7,6 +7,63 @@ #include "pieceinf.h" #include "lc_colors.h" +void lcModelAction::SaveUndoBuffer(QByteArray& Buffer, const lcModel* Model, bool SelectedOnly) +{ + QDataStream Stream(&Buffer, QIODevice::WriteOnly); + + const std::vector>& Pieces = Model->GetPieces(); + const std::vector>& Cameras = Model->GetCameras(); + const std::vector>& Lights = Model->GetLights(); + + size_t PieceCount = Pieces.size(), CameraCount = Cameras.size(), LightCount = Lights.size(); + + Stream << PieceCount; + Stream << CameraCount; + Stream << LightCount; + + for (const std::unique_ptr& Piece : Pieces) + if (!SelectedOnly || Piece->IsSelected()) + Piece->SaveUndoData(Stream); + + for (const std::unique_ptr& Camera : Cameras) + if (!SelectedOnly || Camera->IsSelected()) + Camera->SaveUndoData(Stream); + + for (const std::unique_ptr& Light : Lights) + if (!SelectedOnly || Light->IsSelected()) + Light->SaveUndoData(Stream); +} + +void lcModelAction::LoadUndoBuffer(const QByteArray& Buffer, lcModel* Model, bool SelectedOnly) +{ + QDataStream Stream(const_cast(&Buffer), QIODevice::ReadOnly); + + const std::vector>& Pieces = Model->GetPieces(); + const std::vector>& Cameras = Model->GetCameras(); + const std::vector>& Lights = Model->GetLights(); + + size_t PieceCount, CameraCount, LightCount; + + Stream >> PieceCount; + Stream >> CameraCount; + Stream >> LightCount; + + if (PieceCount != Pieces.size() || CameraCount != Cameras.size() || LightCount != Lights.size()) + return; + + for (const std::unique_ptr& Piece : Pieces) + if (!SelectedOnly || Piece->IsSelected()) + Piece->LoadUndoData(Stream); + + for (const std::unique_ptr& Camera : Cameras) + if (!SelectedOnly || Camera->IsSelected()) + Camera->LoadUndoData(Stream); + + for (const std::unique_ptr& Light : Lights) + if (!SelectedOnly || Light->IsSelected()) + Light->LoadUndoData(Stream); +} + lcModelActionSelection::lcModelActionSelection(lcModelActionSelectionMode Mode) : mMode(Mode) { @@ -112,98 +169,54 @@ lcModelActionMouseTool::lcModelActionMouseTool(lcTool Tool) { } -void lcModelActionMouseTool::SetCameraStartState(const lcCamera* Camera) +void lcModelActionMouseTool::SaveCameraStartState(const lcCamera* Camera) { - QDataStream Stream(&mStartState, QIODevice::WriteOnly); + QDataStream Stream(&mStartBuffer, QIODevice::WriteOnly); Camera->SaveUndoData(Stream); mCameraName = Camera->GetName(); } -void lcModelActionMouseTool::SetCameraEndState(const lcCamera* Camera) +void lcModelActionMouseTool::LoadCameraStartState(lcCamera* Camera) const { - QDataStream Stream(&mEndState, QIODevice::WriteOnly); + QDataStream Stream(const_cast(&mStartBuffer), QIODevice::ReadOnly); + + Camera->LoadUndoData(Stream); +} + +void lcModelActionMouseTool::SaveCameraEndState(const lcCamera* Camera) +{ + QDataStream Stream(&mEndBuffer, QIODevice::WriteOnly); Camera->SaveUndoData(Stream); } +void lcModelActionMouseTool::LoadCameraEndState(lcCamera* Camera) const +{ + QDataStream Stream(const_cast(&mEndBuffer), QIODevice::ReadOnly); + + Camera->LoadUndoData(Stream); +} + void lcModelActionMouseTool::SaveSelectionStartState(const lcModel* Model) { - SaveSelectionState(Model, mStartState); + SaveUndoBuffer(mStartBuffer, Model, true); } void lcModelActionMouseTool::LoadSelectionStartState(lcModel* Model) const { - LoadSelectionState(Model, mStartState); -} - -void lcModelActionMouseTool::LoadSelectionEndState(lcModel* Model) const -{ - LoadSelectionState(Model, mEndState); + LoadUndoBuffer(mStartBuffer, Model, true); } void lcModelActionMouseTool::SaveSelectionEndState(const lcModel* Model) { - SaveSelectionState(Model, mEndState); + SaveUndoBuffer(mEndBuffer, Model, true); } -void lcModelActionMouseTool::SaveSelectionState(const lcModel* Model, QByteArray& State) +void lcModelActionMouseTool::LoadSelectionEndState(lcModel* Model) const { - QTextStream Stream(&State, QIODevice::WriteOnly); - - Model->SaveLDraw(Stream, false, 0); -} - -void lcModelActionMouseTool::LoadSelectionState(lcModel* Model, const QByteArray& State) -{ - QBuffer Buffer(const_cast(&State)); - Buffer.open(QIODevice::ReadOnly); - - std::unique_ptr SavedModel = std::make_unique(QString(), Model->GetProject(), false); - SavedModel->LoadLDraw(Buffer, Model->GetProject()); - - const std::vector>& Pieces = Model->GetPieces(); - const std::vector>& SavedPieces = SavedModel->GetPieces(); - - if (Pieces.size() != SavedPieces.size()) - return; - - for (size_t PieceIndex = 0; PieceIndex < Pieces.size(); PieceIndex++) - { - lcPiece* Piece = Pieces[PieceIndex].get(); - - if (Piece->IsSelected()) - Piece->CopyProperties(*SavedPieces[PieceIndex].get()); - } - - const std::vector>& Cameras = Model->GetCameras(); - const std::vector>& SavedCameras = SavedModel->GetCameras(); - - if (Cameras.size() != SavedCameras.size()) - return; - - for (size_t CameraIndex = 0; CameraIndex < Cameras.size(); CameraIndex++) - { - lcCamera* Camera = Cameras[CameraIndex].get(); - - if (Camera->IsSelected()) - Camera->CopyProperties(*SavedCameras[CameraIndex].get()); - } - - const std::vector>& Lights = Model->GetLights(); - const std::vector>& SavedLights = SavedModel->GetLights(); - - if (Lights.size() != SavedLights.size()) - return; - - for (size_t LightIndex = 0; LightIndex < Lights.size(); LightIndex++) - { - lcLight* Light = Lights[LightIndex].get(); - - if (Light->IsSelected()) - Light->CopyProperties(*SavedLights[LightIndex].get()); - } + LoadUndoBuffer(mEndBuffer, Model, true); } lcModelActionAddPieces::lcModelActionAddPieces(lcStep Step, lcModelActionAddPieceSelectionMode SelectionMode) @@ -259,41 +272,12 @@ lcModelActionStep::lcModelActionStep(lcModelActionStepMode Mode, lcStep Step) { } -void lcModelActionStep::SaveState(const std::vector>& Pieces, const std::vector>& Cameras, const std::vector>& Lights) +void lcModelActionStep::SaveModelState(const lcModel* Model) { - mPieceStates.resize(Pieces.size()); - - for (size_t PieceIndex = 0; PieceIndex < Pieces.size(); PieceIndex++) - { - QByteArray& PieceState = mPieceStates[PieceIndex]; - const lcPiece* Piece = Pieces[PieceIndex].get(); - - QDataStream Stream(&PieceState, QIODevice::WriteOnly); - - Piece->SaveUndoData(Stream); - } + SaveUndoBuffer(mUndoBuffer, Model, false); +} - mCameraStates.resize(Cameras.size()); - - for (size_t CameraIndex = 0; CameraIndex < Cameras.size(); CameraIndex++) - { - QByteArray& CameraState = mCameraStates[CameraIndex]; - const lcCamera* Camera = Cameras[CameraIndex].get(); - - QDataStream Stream(&CameraState, QIODevice::WriteOnly); - - Camera->SaveUndoData(Stream); - } - - mLightStates.resize(Lights.size()); - - for (size_t LightIndex = 0; LightIndex < Lights.size(); LightIndex++) - { - QByteArray& LightState = mLightStates[LightIndex]; - const lcLight* Light = Lights[LightIndex].get(); - - QDataStream Stream(&LightState, QIODevice::WriteOnly); - - Light->SaveUndoData(Stream); - } +void lcModelActionStep::LoadModelState(lcModel* Model) const +{ + LoadUndoBuffer(mUndoBuffer, Model, false); } diff --git a/common/lc_modelaction.h b/common/lc_modelaction.h index 995c8841..2c9dbdbf 100644 --- a/common/lc_modelaction.h +++ b/common/lc_modelaction.h @@ -12,6 +12,10 @@ class lcModelAction public: lcModelAction() = default; virtual ~lcModelAction() = default; + +protected: + static void SaveUndoBuffer(QByteArray& Buffer, const lcModel* Model, bool SelectedOnly); + static void LoadUndoBuffer(const QByteArray& Buffer, lcModel* Model, bool SelectedOnly); }; enum class lcModelActionSelectionMode @@ -52,24 +56,16 @@ public: lcModelActionMouseTool(lcTool Tool); virtual ~lcModelActionMouseTool() = default; + void SaveCameraStartState(const lcCamera* Camera); + void LoadCameraStartState(lcCamera* Camera) const; + void SaveCameraEndState(const lcCamera* Camera); + void LoadCameraEndState(lcCamera* Camera) const; + void SaveSelectionStartState(const lcModel* Model); void LoadSelectionStartState(lcModel* Model) const; void SaveSelectionEndState(const lcModel* Model); void LoadSelectionEndState(lcModel* Model) const; - void SetCameraStartState(const lcCamera* Camera); - void SetCameraEndState(const lcCamera* Camera); - - const QByteArray& GetStartState() const - { - return mStartState; - } - - const QByteArray& GetEndState() const - { - return mEndState; - } - lcTool GetTool() const { return mTool; @@ -81,13 +77,10 @@ public: } protected: - static void SaveSelectionState(const lcModel* Model, QByteArray& State); - static void LoadSelectionState(lcModel* Model, const QByteArray& State); - lcTool mTool; QString mCameraName; - QByteArray mStartState; - QByteArray mEndState; + QByteArray mStartBuffer; + QByteArray mEndBuffer; }; enum class lcModelActionAddPieceSelectionMode @@ -249,27 +242,11 @@ public: return mStep; } - void SaveState(const std::vector>& Pieces, const std::vector>& Cameras, const std::vector>& Lights); + void SaveModelState(const lcModel* Model); + void LoadModelState(lcModel* Model) const; - const std::vector& GetPieceStates() const - { - return mPieceStates; - } - - const std::vector& GetCameraStates() const - { - return mCameraStates; - } - - const std::vector& GetLightStates() const - { - return mLightStates; - } - protected: - std::vector mPieceStates; - std::vector mCameraStates; - std::vector mLightStates; + QByteArray mUndoBuffer; lcModelActionStepMode mMode; lcStep mStep; };