diff options
author | Antti Määttä <antti.maatta@qt.io> | 2019-09-26 11:12:33 +0300 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2019-09-26 13:59:21 +0300 |
commit | 9460bfccae565337bc4b617db6431a0ffb7ba359 (patch) | |
tree | 5d1eb92aae4d89e2b336e8ffa919b8ff42a92f5e | |
parent | 5f85a3af60f53284293a9ed8211ea557eb5519e5 (diff) |
Preserve fileids when doing cut and paste
This will use the same fileids as the original object did for the first paste
operation after cut operation, and subsequent paste operations generate
new ids.
Task-number: QT3DS-3883
Change-Id: Iedd5139e3acdffd87af68421fed9c5b94fe2f80f
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
7 files changed, 51 insertions, 29 deletions
diff --git a/src/Authoring/Client/Code/Core/Doc/Doc.cpp b/src/Authoring/Client/Code/Core/Doc/Doc.cpp index e0b6af8c..7a16aa25 100644 --- a/src/Authoring/Client/Code/Core/Doc/Doc.cpp +++ b/src/Authoring/Client/Code/Core/Doc/Doc.cpp @@ -806,12 +806,13 @@ void CDoc::CutObject(qt3dsdm::TInstanceHandleList inInstances) using namespace Q3DStudio; if (theContinueCutFlag) { - CFilePath thePath(GetDocumentReader().CopySceneGraphObjects(inInstances)); + CFilePath thePath(GetDocumentReader().CopySceneGraphObjects(inInstances, true)); Qt3DSFile theFile(thePath); CStudioClipboard::CopyObjectToClipboard( theFile, false, false, m_StudioSystem->GetClientDataModelBridge()->GetObjectType(inInstances[0])); SCOPED_DOCUMENT_EDITOR(*this, QObject::tr("Cut Object"))->DeleteInstances(inInstances); + m_firstPasteAfterCut = true; } } @@ -822,11 +823,12 @@ void CDoc::CopyObject(qt3dsdm::TInstanceHandleList inInstances) if (inInstances.empty()) return; using namespace Q3DStudio; - CFilePath thePath(GetDocumentReader().CopySceneGraphObjects(inInstances)); + CFilePath thePath(GetDocumentReader().CopySceneGraphObjects(inInstances, false)); Qt3DSFile theFile(thePath); CStudioClipboard::CopyObjectToClipboard( theFile, false, false, m_StudioSystem->GetClientDataModelBridge()->GetObjectType(inInstances[0])); + m_firstPasteAfterCut = false; } void CDoc::PasteObject(qt3dsdm::Qt3DSDMInstanceHandle inInstance) @@ -838,7 +840,9 @@ void CDoc::PasteObject(qt3dsdm::Qt3DSDMInstanceHandle inInstance) Qt3DSFile theTempAPFile = CStudioClipboard::GetObjectFromClipboard(false, dummy); SCOPED_DOCUMENT_EDITOR(*this, QObject::tr("Paste Object")) ->PasteSceneGraphObject(theTempAPFile.GetAbsolutePath(), theInstance, true, - DocumentEditorInsertType::LastChild, CPt()); + DocumentEditorInsertType::LastChild, CPt(), + m_firstPasteAfterCut); + m_firstPasteAfterCut = false; } } @@ -851,7 +855,9 @@ void CDoc::PasteObjectMaster(qt3dsdm::Qt3DSDMInstanceHandle inInstance) Qt3DSFile theTempAPFile = CStudioClipboard::GetObjectFromClipboard(false, dummy); SCOPED_DOCUMENT_EDITOR(*this, QObject::tr("Paste Object")) ->PasteSceneGraphObjectMaster(theTempAPFile.GetAbsolutePath(), theInstance, true, - DocumentEditorInsertType::LastChild, CPt()); + DocumentEditorInsertType::LastChild, CPt(), + m_firstPasteAfterCut); + m_firstPasteAfterCut = false; } } diff --git a/src/Authoring/Client/Code/Core/Doc/Doc.h b/src/Authoring/Client/Code/Core/Doc/Doc.h index af91c59e..5fedd509 100644 --- a/src/Authoring/Client/Code/Core/Doc/Doc.h +++ b/src/Authoring/Client/Code/Core/Doc/Doc.h @@ -505,6 +505,9 @@ protected: Q3DStudio::CRect m_ClientSize; Q3DStudio::CRect m_SceneRect; // The dimensions of the active scene view + // Indicate that the paste operation is first after cut operation + bool m_firstPasteAfterCut = false; + private: bool m_playbackPreviewOn = false; QString m_presentationId; diff --git a/src/Authoring/Client/Code/Core/Doc/DocumentEditor.cpp b/src/Authoring/Client/Code/Core/Doc/DocumentEditor.cpp index f1139d7d..1e60a6be 100644 --- a/src/Authoring/Client/Code/Core/Doc/DocumentEditor.cpp +++ b/src/Authoring/Client/Code/Core/Doc/DocumentEditor.cpp @@ -699,7 +699,7 @@ public: } pair<std::shared_ptr<qt3dsdm::IDOMWriter>, CFilePath> - DoCopySceneGraphObject(const TInstanceHandleList &inInstances) + DoCopySceneGraphObject(const TInstanceHandleList &inInstances, bool preserveFileIds) { if (inInstances.empty()) return pair<std::shared_ptr<qt3dsdm::IDOMWriter>, CFilePath>(); @@ -707,7 +707,8 @@ public: std::shared_ptr<IDOMWriter> theWriter(m_Doc.CreateDOMWriter()); TInstanceHandleList theInstances = ToGraphOrdering(inInstances); m_Doc.CreateSerializer()->SerializeSceneGraphObjects(*theWriter, theInstances, - GetActiveSlide(inInstances[0])); + GetActiveSlide(inInstances[0]), + preserveFileIds); CFilePath theFile = WriteWriterToFile(*theWriter, L"SceneGraph"); return make_pair(theWriter, theFile); } @@ -716,7 +717,7 @@ public: std::shared_ptr<qt3dsdm::IDOMReader> CopySceneGraphObjectsToMemory(const qt3dsdm::TInstanceHandleList &instanceList) { - return DoCopySceneGraphObject(instanceList).first->CreateDOMReader(); + return DoCopySceneGraphObject(instanceList, false).first->CreateDOMReader(); } // Exposed through document reader interface @@ -762,7 +763,7 @@ public: return theFinalPath; } - CFilePath CopySceneGraphObjects(TInstanceHandleList inInstances) override + CFilePath CopySceneGraphObjects(TInstanceHandleList inInstances, bool preserveFileIds) override { if (inInstances.empty()) return L""; @@ -773,7 +774,7 @@ public: if (!shouldCopy) return L""; - return DoCopySceneGraphObject(inInstances).second; + return DoCopySceneGraphObject(inInstances, preserveFileIds).second; } CFilePath CopyAction(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide) override @@ -3044,11 +3045,13 @@ public: bool inGenerateUniqueName, DocumentEditorInsertType::Enum inInsertType, const CPt &inPosition, + bool preserveFileIds, bool notifyRename = true) { std::shared_ptr<IComposerSerializer> theSerializer = m_Doc.CreateSerializer(); TInstanceHandleList retval = theSerializer->SerializeSceneGraphObject( - *inReader, m_Doc.GetDocumentDirectory(), inNewRoot, GetActiveSlide(inNewRoot)); + *inReader, m_Doc.GetDocumentDirectory(), inNewRoot, GetActiveSlide(inNewRoot), + preserveFileIds); for (size_t idx = 0, end = retval.size(); idx < end; ++idx) { qt3dsdm::Qt3DSDMInstanceHandle theInstance(retval[idx]); if (inInsertType == DocumentEditorInsertType::NextSibling) @@ -3067,7 +3070,8 @@ public: TInstanceHandle inNewRoot, bool inGenerateUniqueName, DocumentEditorInsertType::Enum inInsertType, - const CPt &inPosition) override + const CPt &inPosition, + bool preserveFileIds) override { qt3ds::QT3DSI32 theVersion = 0; std::shared_ptr<IDOMReader> theReader = m_Doc.CreateDOMReader( @@ -3075,13 +3079,14 @@ public: if (!theReader) return TInstanceHandleList(); return DoPasteSceneGraphObject(theReader, inNewRoot, inGenerateUniqueName, inInsertType, - inPosition, false); + inPosition, preserveFileIds, false); } virtual TInstanceHandleList PasteSceneGraphObjectMaster(const CFilePath &inFilePath, TInstanceHandle inNewRoot, bool inGenerateUniqueName, - DocumentEditorInsertType::Enum inInsertType, const CPt &inPosition) override + DocumentEditorInsertType::Enum inInsertType, const CPt &inPosition, + bool preserveFileIds) override { qt3ds::QT3DSI32 theVersion = 0; std::shared_ptr<IDOMReader> theReader = m_Doc.CreateDOMReader( @@ -3092,7 +3097,8 @@ public: std::shared_ptr<IComposerSerializer> theSerializer = m_Doc.CreateSerializer(); TInstanceHandleList retval = theSerializer->SerializeSceneGraphObject( *theReader, m_Doc.GetDocumentDirectory(), inNewRoot, - m_Doc.GetStudioSystem()->GetSlideSystem()->GetMasterSlide(GetActiveSlide(inNewRoot))); + m_Doc.GetStudioSystem()->GetSlideSystem()->GetMasterSlide(GetActiveSlide(inNewRoot)), + preserveFileIds); for (size_t idx = 0, end = retval.size(); idx < end; ++idx) { qt3dsdm::Qt3DSDMInstanceHandle theInstance(retval[idx]); if (inInsertType == DocumentEditorInsertType::NextSibling) @@ -3297,7 +3303,7 @@ public: // Paste into the master slide of the new component TInstanceHandleList insertedHandles = theSerializer->SerializeSceneGraphObject( *theReader,m_Doc.GetDocumentDirectory(), component, - m_SlideSystem.GetMasterSlide(theComponentSlide)); + m_SlideSystem.GetMasterSlide(theComponentSlide), true); // Restore the original time range for all objects. if (insertedHandles.size()) { @@ -3380,7 +3386,7 @@ public: theSerializer->SerializeSceneGraphObject( *theReader, m_Doc.GetDocumentDirectory(), targetComponent, - m_SlideSystem.GetMasterSlide(theComponentSlide)); + m_SlideSystem.GetMasterSlide(theComponentSlide), true); if (insertedHandles.size()) { // Restore the original time range for all objects. @@ -3425,7 +3431,7 @@ public: { qt3dsdm::TInstanceHandleList theInstances(ToGraphOrdering(inInstances)); std::shared_ptr<IDOMReader> theReader(CopySceneGraphObjectsToMemory(theInstances)); - return DoPasteSceneGraphObject(theReader, inDest, true, inInsertType, CPt(), false); + return DoPasteSceneGraphObject(theReader, inDest, true, inInsertType, CPt(), false, false); } Qt3DSDMActionHandle AddAction(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner, diff --git a/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.cpp b/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.cpp index c62d3fa1..3953f20d 100644 --- a/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.cpp +++ b/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.cpp @@ -2870,26 +2870,28 @@ struct SComposerSerializerImpl : public IComposerSerializer // new root. virtual qt3dsdm::TInstanceHandleList SerializeSceneGraphObject(IDOMReader &inReader, const CFilePath &inDocumentDirectory, - Qt3DSDMInstanceHandle inNewRoot, Qt3DSDMSlideHandle inActiveSlide) override + Qt3DSDMInstanceHandle inNewRoot, Qt3DSDMSlideHandle inActiveSlide, + bool preserveFileIds) override { reset(); m_ActiveSlide = inActiveSlide; - m_PreserveFileIds = false; + m_PreserveFileIds = preserveFileIds; return DoSerializeScene(inReader, inDocumentDirectory, inNewRoot); } // Write this instance and its children (and possibly its slides) to a writer. // Equivalent to the older partial serialization system void SerializeSceneGraphObjects(IDOMWriter &inWriter, - const TInstanceHandleList &inInstances, - Qt3DSDMSlideHandle inActiveSlide) override + const TInstanceHandleList &inInstances, + Qt3DSDMSlideHandle inActiveSlide, + bool preserveFileIds) override { if (inInstances.empty()) return; reset(); QT3DS_ASSERT(inActiveSlide.Valid()); m_ActiveSlide = inActiveSlide; - m_PreserveFileIds = false; + m_PreserveFileIds = preserveFileIds; // It is fine if the parent is invalid m_ActiveSlideParent = m_SlideCore.GetParentSlide(m_ActiveSlide); DoSerializeScene(inWriter, inInstances.data(), (QT3DSU32)inInstances.size()); diff --git a/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.h b/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.h index e2882cb8..8f8fbb1d 100644 --- a/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.h +++ b/src/Authoring/Client/Code/Core/Doc/IComposerSerializer.h @@ -77,13 +77,15 @@ public: // Equivalent to the older partial serialization system virtual void SerializeSceneGraphObjects(qt3dsdm::IDOMWriter &inWriter, const qt3dsdm::TInstanceHandleList &inInstances, - qt3dsdm::Qt3DSDMSlideHandle inActiveSlide) = 0; + qt3dsdm::Qt3DSDMSlideHandle inActiveSlide, + bool preserveFileIds) = 0; // Read a partial serialization into this slide, attaching the instance as the last child of the // new root. virtual qt3dsdm::TInstanceHandleList SerializeSceneGraphObject( qt3dsdm::IDOMReader &inReader, const Q3DStudio::CFilePath &inDocumentDirectory, - qt3dsdm::Qt3DSDMInstanceHandle inNewRoot, qt3dsdm::Qt3DSDMSlideHandle inActiveSlide) = 0; + qt3dsdm::Qt3DSDMInstanceHandle inNewRoot, qt3dsdm::Qt3DSDMSlideHandle inActiveSlide, + bool preserveFileIds) = 0; // Save and load just a single action virtual void SerializeAction(qt3dsdm::IDOMWriter &inWriter, qt3dsdm::Qt3DSDMSlideHandle inSlide, diff --git a/src/Authoring/Client/Code/Core/Doc/IDocumentEditor.h b/src/Authoring/Client/Code/Core/Doc/IDocumentEditor.h index da11238e..14fcd5fb 100644 --- a/src/Authoring/Client/Code/Core/Doc/IDocumentEditor.h +++ b/src/Authoring/Client/Code/Core/Doc/IDocumentEditor.h @@ -322,11 +322,13 @@ public: virtual qt3dsdm::TInstanceHandleList PasteSceneGraphObject(const CFilePath &inFilePath, Qt3DSDMInstanceHandle inNewRoot, bool inGenerateUniqueName, DocumentEditorInsertType::Enum inInsertType, - const CPt &inPosition) = 0; + const CPt &inPosition, + bool preserveFileIds) = 0; virtual qt3dsdm::TInstanceHandleList PasteSceneGraphObjectMaster( const CFilePath &inFilePath, Qt3DSDMInstanceHandle inNewRoot, bool inGenerateUniqueName, - DocumentEditorInsertType::Enum inInsertType, const CPt &inPosition) = 0; + DocumentEditorInsertType::Enum inInsertType, const CPt &inPosition, + bool preserveFileIds) = 0; virtual void RearrangeObjects(const qt3dsdm::TInstanceHandleList &inInstances, TInstanceHandle inDest, diff --git a/src/Authoring/Client/Code/Core/Doc/IDocumentReader.h b/src/Authoring/Client/Code/Core/Doc/IDocumentReader.h index c455e802..aec35f50 100644 --- a/src/Authoring/Client/Code/Core/Doc/IDocumentReader.h +++ b/src/Authoring/Client/Code/Core/Doc/IDocumentReader.h @@ -215,13 +215,14 @@ public: // Given the active slide on the document (which we query) and an instance, // produce a temporary file (Qt3DSFile::GetTemporaryFile) and serialize this object // to that temporary file. - virtual CFilePath CopySceneGraphObjects(qt3dsdm::TInstanceHandleList inInstances) = 0; + virtual CFilePath CopySceneGraphObjects(qt3dsdm::TInstanceHandleList inInstances, + bool preserveFileIds) = 0; - CFilePath CopySceneGraphObject(Qt3DSDMInstanceHandle inInstance) + CFilePath CopySceneGraphObject(Qt3DSDMInstanceHandle inInstance, bool preserveFileIds) { qt3dsdm::TInstanceHandleList theInstances; theInstances.push_back(inInstance); - return CopySceneGraphObjects(theInstances); + return CopySceneGraphObjects(theInstances, preserveFileIds); } // Copy the object just to a DOM representation, don't serialize to file. |