diff options
Diffstat (limited to 'src/Authoring/Client')
-rw-r--r-- | src/Authoring/Client/Code/Core/Doc/Doc.cpp | 12 | ||||
-rw-r--r-- | src/Authoring/Client/Code/Core/Doc/DocumentEditor.cpp | 35 | ||||
-rw-r--r-- | src/Authoring/Client/Code/Core/Doc/IDocumentEditor.h | 3 |
3 files changed, 41 insertions, 9 deletions
diff --git a/src/Authoring/Client/Code/Core/Doc/Doc.cpp b/src/Authoring/Client/Code/Core/Doc/Doc.cpp index b64ceea7..d947e4f1 100644 --- a/src/Authoring/Client/Code/Core/Doc/Doc.cpp +++ b/src/Authoring/Client/Code/Core/Doc/Doc.cpp @@ -1970,19 +1970,13 @@ bool CDoc::CanCut() //============================================================================== /** * Handles the duplicate command passed by mainframe. - * Makes a copy of the currently selected item (if there is one) and attaches + * Makes an alias copy of the currently selected item (if there is one) and attaches * it to the same parent as the original. */ void CDoc::HandleDuplicateCommand() { - qt3dsdm::Qt3DSDMInstanceHandle theSelectedInstance = GetSelectedInstance(); - - // If we have a valid object to duplicate - if (m_StudioSystem->GetClientDataModelBridge()->IsDuplicateable(theSelectedInstance)) { - using namespace Q3DStudio; - SCOPED_DOCUMENT_EDITOR(*this, QObject::tr("Duplicate Object")) - ->DuplicateInstance(GetSelectedInstance()); - } + Q3DStudio::SCOPED_DOCUMENT_EDITOR(*this, QObject::tr("Alias Duplicate")) + ->CreateAliasDuplicates(GetSelectedValue().GetSelectedInstances(), GetActiveSlide()); } //============================================================================= diff --git a/src/Authoring/Client/Code/Core/Doc/DocumentEditor.cpp b/src/Authoring/Client/Code/Core/Doc/DocumentEditor.cpp index e58e6007..1de23ac5 100644 --- a/src/Authoring/Client/Code/Core/Doc/DocumentEditor.cpp +++ b/src/Authoring/Client/Code/Core/Doc/DocumentEditor.cpp @@ -85,6 +85,7 @@ #include <QtCore/qdir.h> #include <unordered_set> #include "Runtime/Include/q3dsqmlbehavior.h" +#include "DataModelObjectReferenceHelper.h" namespace { @@ -2380,6 +2381,40 @@ public: return component; } + void CreateAliasDuplicates(const qt3dsdm::TInstanceHandleList &inInstances, + qt3dsdm::Qt3DSDMSlideHandle theSlide) override + { + for (int i = 0; i < inInstances.size(); i++) { + qt3dsdm::Qt3DSDMInstanceHandle theSelectedInstance = inInstances.at(i); + if (m_Bridge.IsDuplicateable(theSelectedInstance)) { + CPt thePoint(0, 0); + Qt3DSDMInstanceHandle addedInstance = CreateSceneGraphInstance( + ComposerObjectTypes::Alias, theSelectedInstance, theSlide, + DocumentEditorInsertType::NextSibling, thePoint, + PRIMITIVETYPE_UNKNOWN, -1); + + // Compose name and verify it's unique + Q3DStudio::CString name = m_Bridge.GetName(addedInstance); + name.append(m_Bridge.GetName(theSelectedInstance)); + if (!m_Bridge.CheckNameUnique(addedInstance, name)) { + name = m_Bridge.GetUniqueChildName(m_Bridge.GetParentInstance(addedInstance), + addedInstance, name); + } + m_Bridge.SetName(addedInstance, name); + + // Object reference + qt3dsdm::SObjectRefType objRef = + m_Doc.GetDataModelObjectReferenceHelper()->GetAssetRefValue( + theSelectedInstance, addedInstance, + CRelativePathTools::EPathType::EPATHTYPE_GUID); + qt3dsdm::Qt3DSDMPropertyHandle theProperty = + m_Doc.GetPropertySystem()->GetAggregateInstancePropertyByName( + addedInstance, L"referencednode"); + SetInstancePropertyValue(addedInstance, theProperty, objRef); + } + } + } + void DuplicateInstances(const qt3dsdm::TInstanceHandleList &inInstances) override { diff --git a/src/Authoring/Client/Code/Core/Doc/IDocumentEditor.h b/src/Authoring/Client/Code/Core/Doc/IDocumentEditor.h index 694267a7..8793d731 100644 --- a/src/Authoring/Client/Code/Core/Doc/IDocumentEditor.h +++ b/src/Authoring/Client/Code/Core/Doc/IDocumentEditor.h @@ -290,6 +290,9 @@ public: // Returns the new component. virtual TInstanceHandle MakeComponent(const qt3dsdm::TInstanceHandleList &inInstances) = 0; + virtual void CreateAliasDuplicates(const qt3dsdm::TInstanceHandleList &inInstances, + qt3dsdm::Qt3DSDMSlideHandle theSlide) = 0; + virtual qt3dsdm::TInstanceHandleList DuplicateInstances(const qt3dsdm::TInstanceHandleList &inInstances, TInstanceHandle inDest, DocumentEditorInsertType::Enum inInsertType) = 0; |