diff options
Diffstat (limited to 'src/Authoring')
5 files changed, 45 insertions, 10 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; diff --git a/src/Authoring/Studio/MainFrm.ui b/src/Authoring/Studio/MainFrm.ui index a28a8e8b..c4b2e911 100644 --- a/src/Authoring/Studio/MainFrm.ui +++ b/src/Authoring/Studio/MainFrm.ui @@ -455,6 +455,9 @@ <property name="text"> <string>&Duplicate</string> </property> + <property name="toolTip"> + <string>Create an Alias Duplicate</string> + </property> <property name="shortcut"> <string>Ctrl+D</string> </property> diff --git a/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp b/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp index 29120c09..931bc27a 100644 --- a/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp +++ b/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp @@ -657,7 +657,7 @@ void Qt3DSDMTimelineItemBinding::PerformTransaction(EUserTransaction inTransacti switch (inTransaction) { case EUserTransaction_Duplicate: { theDoc->DeselectAllKeyframes(); - SCOPED_DOCUMENT_EDITOR(*theDoc, QObject::tr("Duplicate Object"))->DuplicateInstances(theInstances); + theDoc->HandleDuplicateCommand(); } break; case EUserTransaction_Cut: { theDispatch.FireOnAsynchronousCommand( |