From e6e89d6a62deb11d51947e1ae3f391150db407cc Mon Sep 17 00:00:00 2001 From: Tomi Korpipaa Date: Fri, 4 May 2018 10:11:44 +0300 Subject: Replace Ctrl+D duplicate with alias Replace deep copy duplicate with alias duplicate. Task-number: QT3DS-1525 Change-Id: I98eeaf3003e2f6ebc6206b52a85ed8a44363dcd8 Reviewed-by: Miikka Heikkinen --- src/Authoring/Client/Code/Core/Doc/Doc.cpp | 12 ++------ .../Client/Code/Core/Doc/DocumentEditor.cpp | 35 ++++++++++++++++++++++ .../Client/Code/Core/Doc/IDocumentEditor.h | 3 ++ src/Authoring/Studio/MainFrm.ui | 3 ++ .../Bindings/Qt3DSDMTimelineItemBinding.cpp | 2 +- 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 #include #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 @@ &Duplicate + + Create an Alias Duplicate + Ctrl+D 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( -- cgit v1.2.3