diff options
Diffstat (limited to 'src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp')
-rw-r--r-- | src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp | 1164 |
1 files changed, 0 insertions, 1164 deletions
diff --git a/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp b/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp deleted file mode 100644 index d71ef582..00000000 --- a/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp +++ /dev/null @@ -1,1164 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2008 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "Qt3DSCommonPrecompile.h" -#include "Qt3DSDMTimelineItemBinding.h" -#include "TimelineTranslationManager.h" -#include "TimeEditDlg.h" -#include "EmptyTimelineTimebar.h" -#include "Qt3DSDMTimelineTimebar.h" -#include "StudioApp.h" -#include "Core.h" -#include "Dialogs.h" -#include "GraphUtils.h" -#include "Qt3DSDMDataCore.h" -#include "DropTarget.h" - -// Data model specific -#include "IDoc.h" -#include "ClientDataModelBridge.h" -#include "Dispatch.h" -#include "DropSource.h" -#include "Qt3DSDMTimelineItemProperty.h" -#include "Qt3DSDMSlides.h" -#include "Qt3DSDMStudioSystem.h" -#include "Qt3DSDMSlideGraphCore.h" -#include "Qt3DSDMActionCore.h" -#include "Qt3DSDMAnimation.h" -#include "CmdDataModelChangeKeyframe.h" -#include "RelativePathTools.h" -#include "IDocumentEditor.h" -#include "Qt3DSFileTools.h" -#include "ImportUtils.h" - -#include <QtWidgets/qmessagebox.h> - -using namespace qt3dsdm; - -Qt3DSDMTimelineItemBinding::Qt3DSDMTimelineItemBinding(CTimelineTranslationManager *inMgr, - Qt3DSDMInstanceHandle inDataHandle) - : m_TransMgr(inMgr) - , m_DataHandle(inDataHandle) - , m_Parent(nullptr) - , m_TimelineTimebar(nullptr) - -{ - m_StudioSystem = m_TransMgr->GetStudioSystem(); -} - -Qt3DSDMTimelineItemBinding::Qt3DSDMTimelineItemBinding(CTimelineTranslationManager *inMgr) - : m_TransMgr(inMgr) - , m_DataHandle(0) - , m_Parent(nullptr) - , m_TimelineTimebar(nullptr) -{ - m_StudioSystem = m_TransMgr->GetStudioSystem(); -} - -Qt3DSDMTimelineItemBinding::~Qt3DSDMTimelineItemBinding() -{ - RemoveAllPropertyBindings(); - delete m_TimelineTimebar; -} - -// helpers -bool Qt3DSDMTimelineItemBinding::GetBoolean(qt3dsdm::Qt3DSDMPropertyHandle inProperty) const -{ - qt3dsdm::IPropertySystem *thePropertySystem = m_StudioSystem->GetPropertySystem(); - SValue theValue; - thePropertySystem->GetInstancePropertyValue(m_DataHandle, inProperty, theValue); - return qt3dsdm::get<bool>(theValue); -} - -void Qt3DSDMTimelineItemBinding::SetBoolean(qt3dsdm::Qt3DSDMPropertyHandle inProperty, - bool inValue, const QString &inNiceText) const -{ - CDoc *theDoc = dynamic_cast<CDoc *>(g_StudioApp.GetCore()->GetDoc()); - Q3DStudio::SCOPED_DOCUMENT_EDITOR(*theDoc, inNiceText) - ->SetInstancePropertyValue(m_DataHandle, inProperty, inValue); -} - -void Qt3DSDMTimelineItemBinding::SetInstanceHandle(qt3dsdm::Qt3DSDMInstanceHandle inDataHandle) -{ - m_DataHandle = inDataHandle; -} - -EStudioObjectType Qt3DSDMTimelineItemBinding::GetObjectType() const -{ - return m_StudioSystem->GetClientDataModelBridge()->GetObjectType(m_DataHandle); -} - -bool Qt3DSDMTimelineItemBinding::IsMaster() const -{ - CDoc *theDoc = dynamic_cast<CDoc *>(g_StudioApp.GetCore()->GetDoc()); - Q3DStudio::IDocumentReader &theReader(theDoc->GetDocumentReader()); - if (GetObjectType() == OBJTYPE_IMAGE) { - CClientDataModelBridge *theBridge = m_StudioSystem->GetClientDataModelBridge(); - Qt3DSDMInstanceHandle theParent; - Qt3DSDMPropertyHandle theProperty; - bool isPropertyLinked; - - theBridge->GetMaterialFromImageInstance(GetInstance(), theParent, theProperty); - isPropertyLinked = theReader.IsPropertyLinked(theParent, theProperty); - - // Also check light probe - if (!isPropertyLinked) { - theBridge->GetLayerFromImageProbeInstance(GetInstance(), theParent, theProperty); - isPropertyLinked = theReader.IsPropertyLinked(theParent, theProperty); - } - - return isPropertyLinked; - } - Qt3DSDMInstanceHandle theQueryHandle(m_DataHandle); - if (GetObjectType() == OBJTYPE_PATHANCHORPOINT) - theQueryHandle = theReader.GetParent(m_DataHandle); - - // logic: you can't unlink name, so if name is linked then, this is master. - Qt3DSDMPropertyHandle theNamePropHandle = - m_StudioSystem->GetPropertySystem()->GetAggregateInstancePropertyByName(theQueryHandle, - L"name"); - return theReader.IsPropertyLinked(theQueryHandle, theNamePropHandle); -} - -bool Qt3DSDMTimelineItemBinding::IsShy() const -{ - return GetBoolean(m_StudioSystem->GetClientDataModelBridge()->GetSceneAsset().m_Shy); -} -void Qt3DSDMTimelineItemBinding::SetShy(bool inShy) -{ - SetBoolean(m_StudioSystem->GetClientDataModelBridge()->GetSceneAsset().m_Shy, inShy, - QObject::tr("Shy Toggle")); -} -bool Qt3DSDMTimelineItemBinding::IsLocked() const -{ - return GetBoolean(m_StudioSystem->GetClientDataModelBridge()->GetSceneAsset().m_Locked); -} - -bool Qt3DSDMTimelineItemBinding::IsVisibilityControlled() const -{ - if (!m_StudioSystem->IsInstance(m_DataHandle)) - return false; - - Qt3DSDMPropertyHandle theNamePropHandle = - m_StudioSystem->GetPropertySystem()->GetAggregateInstancePropertyByName( - m_DataHandle, L"controlledproperty"); - - if (!theNamePropHandle) - return false; - SValue theNameValue; - m_StudioSystem->GetPropertySystem()->GetInstancePropertyValue(m_DataHandle, theNamePropHandle, - theNameValue); - TDataStrPtr theName = qt3dsdm::get<TDataStrPtr>(theNameValue); - - return (wcsstr(theName->GetData(), L"eyeball")); -} - -void ToggleChildrenLock(Q3DStudio::ScopedDocumentEditor &scopedDocEditor, - Qt3DSDMTimelineItemBinding *inTimelineItemBinding, - SDataModelSceneAsset inSceneAsset, bool inLocked) -{ - scopedDocEditor->SetInstancePropertyValue(inTimelineItemBinding->GetInstanceHandle(), - inSceneAsset.m_Locked, inLocked); - const QList<ITimelineItemBinding *> children = inTimelineItemBinding->GetChildren(); - for (auto child : children) { - ToggleChildrenLock(scopedDocEditor, static_cast<Qt3DSDMTimelineItemBinding *>(child), - inSceneAsset, inLocked); - } -} - -void Qt3DSDMTimelineItemBinding::SetLocked(bool inLocked) -{ - CDoc *theDoc = dynamic_cast<CDoc *>(g_StudioApp.GetCore()->GetDoc()); - Q3DStudio::ScopedDocumentEditor scopedDocEditor(*theDoc, QObject::tr("SetLock"), __FILE__, - __LINE__); - - SDataModelSceneAsset sceneAsset = m_StudioSystem->GetClientDataModelBridge()->GetSceneAsset(); - ToggleChildrenLock(scopedDocEditor, this, sceneAsset, inLocked); - - if (inLocked) - g_StudioApp.GetCore()->GetDoc()->NotifySelectionChanged(); -} - -bool Qt3DSDMTimelineItemBinding::IsVisible() const -{ - return GetBoolean(m_StudioSystem->GetClientDataModelBridge()->GetSceneAsset().m_Eyeball); -} - -void Qt3DSDMTimelineItemBinding::SetVisible(bool inVisible) -{ - SetBoolean(m_StudioSystem->GetClientDataModelBridge()->GetSceneAsset().m_Eyeball, - inVisible, QObject::tr("Visibility Toggle")); -} - -bool Qt3DSDMTimelineItemBinding::HasAction(bool inMaster) -{ - TActionHandleList theActions; - CDoc *theDoc = g_StudioApp.GetCore()->GetDoc(); - - Qt3DSDMSlideHandle theSlide = theDoc->GetActiveSlide(); - qt3dsdm::ISlideCore &theSlideCore(*m_StudioSystem->GetSlideCore()); - if (theSlideCore.IsSlide(theSlide)) { - if (inMaster) { - theSlide = - m_StudioSystem->GetSlideSystem()->GetMasterSlide(theSlide); // use the master slide - } - - m_StudioSystem->GetActionCore()->GetActions(theSlide, m_DataHandle, theActions); - } - return theActions.size() > 0; -} - -bool Qt3DSDMTimelineItemBinding::ChildrenHasAction(bool inMaster) -{ - // Get all the instances in this slidegraph - // check whehter it's an action instance and is in the slide of interst - // check also it's owner is a descendent of the viewed instances - CDoc *theDoc = g_StudioApp.GetCore()->GetDoc(); - IActionCore *theActionCore(m_StudioSystem->GetActionCore()); - CClientDataModelBridge *theBridge(m_StudioSystem->GetClientDataModelBridge()); - - Qt3DSDMSlideHandle theSlide = theDoc->GetActiveSlide(); - qt3dsdm::ISlideCore &theSlideCore(*m_StudioSystem->GetSlideCore()); - if (theSlideCore.IsSlide(theSlide)) { - if (inMaster) { - theSlide = - m_StudioSystem->GetSlideSystem()->GetMasterSlide(theSlide); // use the master slide - } - - TSlideInstancePairList theGraphInstances; - m_StudioSystem->GetSlideSystem()->GetAssociatedInstances(theSlide, theGraphInstances); - - qt3dsdm::Qt3DSDMInstanceHandle theObservedInstance = GetInstance(); - if (theObservedInstance.Valid()) { - for (TSlideInstancePairList::const_iterator theIter = theGraphInstances.begin(); - theIter != theGraphInstances.end(); ++theIter) { - if (theIter->first == theSlide && theBridge->IsActionInstance(theIter->second)) { - Qt3DSDMActionHandle theAction = - theActionCore->GetActionByInstance(theIter->second); - SActionInfo theActionInfo = theActionCore->GetActionInfo(theAction); - Qt3DSDMInstanceHandle theAcionOwner = theActionInfo.m_Owner; - if (theAcionOwner.Valid() - && IsAscendant(theAcionOwner, theObservedInstance, theDoc->GetAssetGraph())) - return true; - } - } - } - } - - return false; -} - -bool Qt3DSDMTimelineItemBinding::ComponentHasAction(bool inMaster) -{ - // Get all the instances in this component slidegraph - // check whether the instance is an action instance - // if inMaster is true, we only interest with those that are in the master slide, else we want - // those that are not in the master slide - CClientDataModelBridge *theBridge(m_StudioSystem->GetClientDataModelBridge()); - if (!theBridge->IsComponentInstance(m_DataHandle)) - return false; - - Q3DStudio::CId theAssetId = theBridge->GetGUID(m_DataHandle); - Qt3DSDMSlideHandle theMasterSlide = - m_StudioSystem->GetSlideSystem()->GetMasterSlideByComponentGuid(GuidtoSLong4(theAssetId)); - - TSlideInstancePairList theGraphInstances; - m_StudioSystem->GetSlideSystem()->GetAssociatedInstances(theMasterSlide, theGraphInstances); - - for (TSlideInstancePairList::const_iterator theIter = theGraphInstances.begin(); - theIter != theGraphInstances.end(); ++theIter) { - if (((inMaster && theIter->first == theMasterSlide) - || (!inMaster && theIter->first != theMasterSlide)) - && theBridge->IsActionInstance(theIter->second)) { - return true; - } - } - return false; -} - -bool Qt3DSDMTimelineItemBinding::hasSubpresentation() const -{ - CClientDataModelBridge *bridge(m_StudioSystem->GetClientDataModelBridge()); - IPropertySystem *propSystem = m_StudioSystem->GetPropertySystem(); - EStudioObjectType objType = GetObjectType(); - - if (objType == OBJTYPE_LAYER) { - SValue sourcePathValue; - propSystem->GetInstancePropertyValue(m_DataHandle, bridge->GetSourcePathProperty(), - sourcePathValue); - return get<TDataStrPtr>(sourcePathValue)->GetLength() > 0; - } else if (objType == OBJTYPE_IMAGE) { - SValue subPresValue; - propSystem->GetInstancePropertyValue(m_DataHandle, - bridge->GetSceneImage().m_SubPresentation, - subPresValue); - return get<TDataStrPtr>(subPresValue)->GetLength() > 0; - } - - return false; -} - -ITimelineTimebar *Qt3DSDMTimelineItemBinding::GetTimebar() -{ - if (!m_TimelineTimebar) - m_TimelineTimebar = CreateTimelineTimebar(); - return m_TimelineTimebar; -} - -Q3DStudio::CString Qt3DSDMTimelineItemBinding::GetName() const -{ - if (m_StudioSystem->IsInstance(m_DataHandle) == false) - return L""; - Qt3DSDMPropertyHandle theNamePropHandle = - m_StudioSystem->GetPropertySystem()->GetAggregateInstancePropertyByName(m_DataHandle, - L"name"); - SValue theNameValue; - m_StudioSystem->GetPropertySystem()->GetInstancePropertyValue(m_DataHandle, theNamePropHandle, - theNameValue); - TDataStrPtr theName = qt3dsdm::get<TDataStrPtr>(theNameValue); - - return (theName) ? Q3DStudio::CString(theName->GetData()) : ""; -} - -void Qt3DSDMTimelineItemBinding::SetName(const Q3DStudio::CString &inName) -{ - // Ignore if setting the name to what it currently is to avoid duplicate undo points - if (inName == GetName()) - return; - - // Display warning dialog if user tried to enter an empty string - if (inName.IsEmpty()) { - QString theTitle = QObject::tr("Rename Object Error"); - QString theString = QObject::tr("Object name cannot be an empty string."); - g_StudioApp.GetDialogs()->DisplayMessageBox(theTitle, theString, - Qt3DSMessageBox::ICON_ERROR, false); - - return; - } - - CClientDataModelBridge *theBridge = m_StudioSystem->GetClientDataModelBridge(); - const auto doc = g_StudioApp.GetCore()->GetDoc(); - - // Display warning if the name and path are the same as the material container - if (theBridge->GetParentInstance(m_DataHandle) == doc->GetSceneInstance() - && inName.toQString() == theBridge->getMaterialContainerName()) { - QString theTitle = QObject::tr("Rename Object Error"); - QString theString = theBridge->getMaterialContainerName() - + QObject::tr(" is a reserved name."); - g_StudioApp.GetDialogs()->DisplayMessageBox(theTitle, theString, - Qt3DSMessageBox::ICON_ERROR, false); - // The timeline still shows the new name so refresh the name property - m_StudioSystem->GetFullSystemSignalSender()->SendInstancePropertyValue( - m_DataHandle, theBridge->GetNameProperty()); - return; - } - - // Display warning if we had to modify the user-given name to make it unique - if (!theBridge->CheckNameUnique(theBridge->GetParentInstance(m_DataHandle), - m_DataHandle, inName)) { - // Find unique name based on the input string - Q3DStudio::SCOPED_DOCUMENT_EDITOR( - *m_TransMgr->GetDoc(), QObject::tr("Set Name"))->SetName(m_DataHandle, inName, true); - - g_StudioApp.GetDialogs()->DisplayObjectRenamed( - inName.toQString(), theBridge->GetName(m_DataHandle).toQString()); - return; - } - - Q3DStudio::SCOPED_DOCUMENT_EDITOR( - *m_TransMgr->GetDoc(), QObject::tr("Set Name"))->SetName(m_DataHandle, inName, true); -} - -ITimelineItem *Qt3DSDMTimelineItemBinding::GetTimelineItem() -{ - return this; -} - -RowTree *Qt3DSDMTimelineItemBinding::getRowTree() const -{ - return m_rowTree; -} - -void Qt3DSDMTimelineItemBinding::setRowTree(RowTree *row) -{ - m_rowTree = row; -} - -void Qt3DSDMTimelineItemBinding::SetSelected(bool inMultiSelect) -{ - if (!inMultiSelect) - g_StudioApp.GetCore()->GetDoc()->SelectDataModelObject(m_DataHandle); - else - g_StudioApp.GetCore()->GetDoc()->ToggleDataModelObjectToSelection(m_DataHandle); -} - -void Qt3DSDMTimelineItemBinding::OnCollapsed() -{ - // Preserves legacy behavior where collapsing a tree will select that root, if any of its - // descendant was selected - // TODO: This won't work for Image (because Image is Material's property, not child) - qt3dsdm::Qt3DSDMInstanceHandle theInstance = GetInstance(); - if (theInstance.Valid()) { - CDoc *theDoc = m_TransMgr->GetDoc(); - qt3dsdm::Qt3DSDMInstanceHandle theSelectedInstance = theDoc->GetSelectedInstance(); - if (theSelectedInstance.Valid() - && IsAscendant(theSelectedInstance, theInstance, theDoc->GetAssetGraph())) - SetSelected(false); - } -} - -bool Qt3DSDMTimelineItemBinding::OpenAssociatedEditor() -{ - return false; // nothing to do by default -} - -inline qt3dsdm::Qt3DSDMInstanceHandle Qt3DSDMTimelineItemBinding::GetInstance() const -{ - return m_DataHandle; -} - -void Qt3DSDMTimelineItemBinding::SetDropTarget(CDropTarget *inTarget) -{ - qt3dsdm::Qt3DSDMInstanceHandle theInstance = GetInstance(); - inTarget->SetInstance(theInstance); -} - -long Qt3DSDMTimelineItemBinding::GetChildrenCount() -{ - qt3dsdm::Qt3DSDMInstanceHandle theInstance = GetInstance(); - if (theInstance.Valid()) { - Q3DStudio::CGraphIterator theChildren; - Qt3DSDMSlideHandle theActiveSlide = m_TransMgr->GetDoc()->GetActiveSlide(); - GetAssetChildrenInTimeParent(theInstance, m_TransMgr->GetDoc(), AmITimeParent(), - theChildren, theActiveSlide); - return (long)theChildren.GetCount(); - } - return 0; -} - -ITimelineItemBinding *Qt3DSDMTimelineItemBinding::GetChild(long inIndex) -{ - qt3dsdm::Qt3DSDMInstanceHandle theInstance = GetInstance(); - if (theInstance.Valid()) { - Q3DStudio::CGraphIterator theChildren; - Qt3DSDMSlideHandle theActiveSlide = m_TransMgr->GetDoc()->GetActiveSlide(); - GetAssetChildrenInTimeParent(theInstance, m_TransMgr->GetDoc(), AmITimeParent(), - theChildren, theActiveSlide); - theChildren += inIndex; - - qt3dsdm::Qt3DSDMInstanceHandle theChildInstance = theChildren.GetCurrent(); - if (theChildInstance.Valid()) - return m_TransMgr->GetOrCreate(theChildInstance); - } - return nullptr; -} - -QList<ITimelineItemBinding *> Qt3DSDMTimelineItemBinding::GetChildren() -{ - QList<ITimelineItemBinding *> retlist; - qt3dsdm::Qt3DSDMInstanceHandle theInstance = GetInstance(); - if (theInstance.Valid()) { - Q3DStudio::CGraphIterator theChildren; - Qt3DSDMSlideHandle theActiveSlide = m_TransMgr->GetDoc()->GetActiveSlide(); - GetAssetChildrenInTimeParent(theInstance, m_TransMgr->GetDoc(), AmITimeParent(), - theChildren, theActiveSlide); - int childCount = int(theChildren.GetCount()); - retlist.reserve(childCount); - - for (int i = 0; i < childCount; ++i) { - qt3dsdm::Qt3DSDMInstanceHandle theChildInstance = theChildren.GetCurrent(); - if (theChildInstance.Valid()) - retlist.append(m_TransMgr->GetOrCreate(theChildInstance)); - ++theChildren; - } - } - - return retlist; -} - -ITimelineItemBinding *Qt3DSDMTimelineItemBinding::GetParent() -{ - return m_Parent; -} -void Qt3DSDMTimelineItemBinding::SetParent(ITimelineItemBinding *parent) -{ - if (parent != m_Parent) { - ASSERT(parent == nullptr || m_Parent == nullptr); - m_Parent = parent; - } -} - -long Qt3DSDMTimelineItemBinding::GetPropertyCount() -{ - long theCount = 0; - if (m_StudioSystem->IsInstance(m_DataHandle)) { - TPropertyHandleList theProperties; - m_StudioSystem->GetPropertySystem()->GetAggregateInstanceProperties(m_DataHandle, - theProperties); - for (size_t thePropertyIndex = 0; thePropertyIndex < theProperties.size(); - ++thePropertyIndex) { - if (m_StudioSystem->GetAnimationSystem()->IsPropertyAnimated( - m_DataHandle, theProperties[thePropertyIndex])) { - ++theCount; - } - } - } - return theCount; -} - -ITimelineItemProperty *Qt3DSDMTimelineItemBinding::GetProperty(long inIndex) -{ - TPropertyHandleList theProperties; - m_StudioSystem->GetPropertySystem()->GetAggregateInstanceProperties(m_DataHandle, - theProperties); - long theIndex = -1; - size_t thePropertyIndex = 0; - for (; thePropertyIndex < theProperties.size(); ++thePropertyIndex) { - if (m_StudioSystem->GetAnimationSystem()->IsPropertyAnimated( - m_DataHandle, theProperties[thePropertyIndex])) { - ++theIndex; - if (theIndex == inIndex) - break; - } - } - ASSERT(thePropertyIndex < theProperties.size()); // no reason why this would be out of range!! - return GetOrCreatePropertyBinding(theProperties[thePropertyIndex]); -} - -bool Qt3DSDMTimelineItemBinding::ShowToggleControls() const -{ - return true; -} - -bool Qt3DSDMTimelineItemBinding::IsLockedEnabled() const -{ - return IsLocked(); -} - -bool Qt3DSDMTimelineItemBinding::IsVisibleEnabled() const -{ - // You can only toggle visible if you aren't on the master slide. - return m_StudioSystem->GetSlideSystem()->GetSlideIndex(m_TransMgr->GetDoc()->GetActiveSlide()) - != 0; -} - -bool Qt3DSDMTimelineItemBinding::IsValidTransaction(EUserTransaction inTransaction) -{ - qt3dsdm::Qt3DSDMInstanceHandle theInstance = GetInstance(); - const auto bridge = m_StudioSystem->GetClientDataModelBridge(); - switch (inTransaction) { - case EUserTransaction_Rename: - return (GetObjectType() != OBJTYPE_SCENE && GetObjectType() != OBJTYPE_IMAGE - && (bridge->GetObjectType(theInstance) != OBJTYPE_REFERENCEDMATERIAL - || bridge->GetSourcePath(theInstance).isEmpty())); - - case EUserTransaction_Duplicate: - if (theInstance.Valid()) - return m_StudioSystem->GetClientDataModelBridge()->IsDuplicateable(theInstance); - break; - - case EUserTransaction_Cut: - return g_StudioApp.CanCut(); - - case EUserTransaction_Copy: - return g_StudioApp.CanCopy(); - - case EUserTransaction_Paste: - return m_TransMgr->GetDoc()->canPasteObjects(); - - case EUserTransaction_Delete: - if (theInstance.Valid()) - return m_StudioSystem->GetClientDataModelBridge()->CanDelete(theInstance); - break; - - case EUserTransaction_MakeComponent: { - bool theCanMakeFlag = false; - if (theInstance.Valid()) { - CClientDataModelBridge *theBridge = m_StudioSystem->GetClientDataModelBridge(); - EStudioObjectType theObjectType = theBridge->GetObjectType(theInstance); - - if (!IsLocked()) { - // Any assets that are attached to the Scene directly must not be wrapped in a - // component. - // This may include behavior assets which may be directly attached to the Scene. - // This is because by principal, components cannot exist on the Scene directly. - qt3dsdm::Qt3DSDMInstanceHandle theParentInstance = - theBridge->GetParentInstance(theInstance); - if (theObjectType != OBJTYPE_LAYER && theObjectType != OBJTYPE_SCENE - && theObjectType != OBJTYPE_MATERIAL && theObjectType != OBJTYPE_IMAGE - && theObjectType != OBJTYPE_EFFECT && theObjectType != OBJTYPE_COMPONENT - && (theParentInstance.Valid() - && theBridge->GetObjectType(theParentInstance) - != OBJTYPE_SCENE)) // This checks if the object is - // AttachedToSceneDirectly - { - theCanMakeFlag = true; - } - } - } - return theCanMakeFlag; - } - - case EUserTransaction_EditComponent: - return (GetObjectType() == OBJTYPE_COMPONENT); - - case EUserTransaction_MakeAnimatable: - if (theInstance.Valid()) { - CClientDataModelBridge *bridge = m_StudioSystem->GetClientDataModelBridge(); - EStudioObjectType type = bridge->GetObjectType(theInstance); - return !IsLocked() && type == OBJTYPE_REFERENCEDMATERIAL; - } - return false; - - case EUserTransaction_Group: - return g_StudioApp.canGroupSelectedObjects(); - - case EUserTransaction_Ungroup: - return g_StudioApp.canUngroupSelectedObjects(); - - case EUserTransaction_AddLayer: - return (GetObjectType() == OBJTYPE_SCENE); - - default: // not handled - break; - } - - return false; -} - -using namespace Q3DStudio; - -inline void DoCut(CDoc &inDoc, const qt3dsdm::TInstanceHandleList &inInstances) -{ - inDoc.DeselectAllKeyframes(); - inDoc.CutObject(inInstances); -} - -inline void DoDelete(CDoc &inDoc, const qt3dsdm::TInstanceHandleList &inInstances) -{ - inDoc.DeselectAllKeyframes(); - inDoc.DeleteObject(inInstances); -} - -inline void DoMakeComponent(CDoc &inDoc, const qt3dsdm::TInstanceHandleList &inInstances) -{ - SCOPED_DOCUMENT_EDITOR(inDoc, QObject::tr("Make Component"))->MakeComponent(inInstances); -} - -inline void doMakeAnimatable(CDoc &doc, const qt3dsdm::TInstanceHandleList &instances) -{ - SCOPED_DOCUMENT_EDITOR(doc, QObject::tr("Make Animatable"))->makeAnimatable(instances); -} - -inline void DoGroupObjects(CDoc &inDoc, const qt3dsdm::TInstanceHandleList &inInstances) -{ - g_StudioApp.groupSelectedObjects(); -} - -inline void DoUngroupObjects(CDoc &inDoc, const qt3dsdm::TInstanceHandleList &inInstances) -{ - g_StudioApp.ungroupSelectedObjects(); -} - -inline void doAddLayer(CDoc &inDoc, const qt3dsdm::TInstanceHandleList &inInstances) -{ - qt3dsdm::Qt3DSDMSlideHandle slide = inDoc.GetActiveSlide(); - qt3dsdm::Qt3DSDMInstanceHandle parent = inDoc.GetActiveLayer(); - - SCOPED_DOCUMENT_EDITOR(inDoc, QObject::tr("Add Layer")) - ->CreateSceneGraphInstance(qt3dsdm::ComposerObjectTypes::Layer, parent, slide, - DocumentEditorInsertType::PreviousSibling, - CPt(), PRIMITIVETYPE_UNKNOWN, -1); -} - -void Qt3DSDMTimelineItemBinding::PerformTransaction(EUserTransaction inTransaction) -{ - CDoc *theDoc = m_TransMgr->GetDoc(); - qt3dsdm::TInstanceHandleList theInstances = theDoc->GetSelectedValue().GetSelectedInstances(); - if (theInstances.empty()) - return; - CDispatch &theDispatch(*theDoc->GetCore()->GetDispatch()); - - // Transactions that could result in *this* object being deleted need to be executed - // via postmessage, not in this context because it could result in the currently - // active timeline row being deleted while in its own mouse handler. - switch (inTransaction) { - case EUserTransaction_Duplicate: { - theDoc->DeselectAllKeyframes(); - SCOPED_DOCUMENT_EDITOR(*theDoc, - QObject::tr("Duplicate Object"))->DuplicateInstances(theInstances); - } break; - case EUserTransaction_Cut: { - theDispatch.FireOnAsynchronousCommand( - std::bind(DoCut, std::ref(*theDoc), theInstances)); - } break; - case EUserTransaction_Copy: { - theDoc->DeselectAllKeyframes(); - theDoc->CopyObject(theInstances); - } break; - case EUserTransaction_Paste: { - theDoc->DeselectAllKeyframes(); - theDoc->PasteObject(theDoc->getPasteTarget(GetInstance())); - } break; - case EUserTransaction_Delete: { - theDispatch.FireOnAsynchronousCommand( - std::bind(DoDelete, std::ref(*theDoc), theInstances)); - } break; - case EUserTransaction_MakeComponent: { - theDispatch.FireOnAsynchronousCommand( - std::bind(DoMakeComponent, std::ref(*theDoc), theInstances)); - } break; - case EUserTransaction_MakeAnimatable: { - theDispatch.FireOnAsynchronousCommand( - std::bind(doMakeAnimatable, std::ref(*theDoc), theInstances)); - } break; - case EUserTransaction_Group: { - theDispatch.FireOnAsynchronousCommand( - std::bind(DoGroupObjects, std::ref(*theDoc), theInstances)); - } break; - case EUserTransaction_Ungroup: { - theDispatch.FireOnAsynchronousCommand( - std::bind(DoUngroupObjects, std::ref(*theDoc), theInstances)); - } break; - case EUserTransaction_AddLayer: { - theDispatch.FireOnAsynchronousCommand( - std::bind(doAddLayer, std::ref(*theDoc), theInstances)); - } break; - default: // not handled - break; - } -} - -Q3DStudio::CString Qt3DSDMTimelineItemBinding::GetObjectPath() -{ - CDoc *theDoc = m_TransMgr->GetDoc(); - // Because we are getting absolute path, the base id doesn't matter. - return CRelativePathTools::BuildAbsoluteReferenceString(m_DataHandle, theDoc); -} - -int Qt3DSDMTimelineItemBinding::getAnimatedPropertyIndex(int propertyHandle) const -{ - TPropertyHandleList theProperties; - m_StudioSystem->GetPropertySystem()->GetAggregateInstanceProperties(m_DataHandle, - theProperties); - int index = -1; - for (size_t i = 0; i < theProperties.size(); ++i) { - if (m_StudioSystem->GetAnimationSystem()->IsPropertyAnimated( - m_DataHandle, theProperties[i])) { - index++; - } - if (theProperties[i].GetHandleValue() == propertyHandle) - return index; - } - - return -1; -} - -void Qt3DSDMTimelineItemBinding::getTimeContextIndices(const QSet<int> &children, - QMap<int, int> &indexMap) -{ - qt3dsdm::Qt3DSDMInstanceHandle instance = GetInstance(); - if (instance.Valid()) { - Q3DStudio::CGraphIterator graphChildren; - Qt3DSDMSlideHandle activeSlide = m_TransMgr->GetDoc()->GetActiveSlide(); - GetAssetChildrenInTimeParent(instance, m_TransMgr->GetDoc(), AmITimeParent(), - graphChildren, activeSlide); - const size_t count = graphChildren.GetCount(); - for (size_t current = 0; current < count; ++current) { - auto handle = graphChildren.GetResult(current); - if (children.contains(handle)) - indexMap.insert(int(current), int(handle)); - } - } -} - -void Qt3DSDMTimelineItemBinding::InsertKeyframe() -{ - if (m_PropertyBindingMap.empty()) - return; - - TPropertyBindingMap::const_iterator theIter = m_PropertyBindingMap.begin(); - ScopedDocumentEditor editor(*g_StudioApp.GetCore()->GetDoc(), QObject::tr("Insert Keyframe"), - __FILE__, __LINE__); - for (; theIter != m_PropertyBindingMap.end(); ++theIter) - editor->KeyframeProperty(m_DataHandle, theIter->first, false); -} - -void Qt3DSDMTimelineItemBinding::DeleteAllChannelKeyframes() -{ - if (m_PropertyBindingMap.empty()) - return; - - CDoc *theDoc = m_TransMgr->GetDoc(); - Q3DStudio::ScopedDocumentEditor editor(*theDoc, QObject::tr("Delete Channel Keyframes"), - __FILE__, __LINE__); - for (auto &kv : m_PropertyBindingMap) - kv.second->DeleteAllKeys(); -} - -IKeyframe *Qt3DSDMTimelineItemBinding::GetKeyframeByTime(long inTime) const -{ - TAssetKeyframeList::const_iterator theIter = m_Keyframes.begin(); - for (; theIter != m_Keyframes.end(); ++theIter) { - if ((*theIter).GetTime() == inTime) - return const_cast<Qt3DSDMAssetTimelineKeyframe *>(&(*theIter)); - } - return nullptr; -} - -Qt3DSDMInstanceHandle Qt3DSDMTimelineItemBinding::GetInstanceHandle() const -{ - return m_DataHandle; -} - -long Qt3DSDMTimelineItemBinding::GetFlavor() const -{ - return QT3DS_FLAVOR_ASSET_TL; -} - -ITimelineTimebar *Qt3DSDMTimelineItemBinding::CreateTimelineTimebar() -{ - return new Qt3DSDMTimelineTimebar(m_TransMgr, m_DataHandle); -} - -ITimelineItemProperty * -Qt3DSDMTimelineItemBinding::GetPropertyBinding(Qt3DSDMPropertyHandle inPropertyHandle) -{ - TPropertyBindingMap::iterator theIter = m_PropertyBindingMap.find(inPropertyHandle); - // check if it already exists - if (theIter != m_PropertyBindingMap.end()) - return theIter->second; - return nullptr; -} - -bool Qt3DSDMTimelineItemBinding::isRootComponent() const -{ - auto bridge = g_StudioApp.GetCore()->GetDoc()->GetStudioSystem()->GetClientDataModelBridge(); - return bridge->IsActiveComponent(m_DataHandle); -} - -bool Qt3DSDMTimelineItemBinding::isDefaultMaterial() const -{ - auto bridge = g_StudioApp.GetCore()->GetDoc()->GetStudioSystem()->GetClientDataModelBridge(); - return bridge->isDefaultMaterial(m_DataHandle); -} - -ITimelineItemProperty * -Qt3DSDMTimelineItemBinding::GetOrCreatePropertyBinding(Qt3DSDMPropertyHandle inPropertyHandle) -{ - ITimelineItemProperty *theProperty = GetPropertyBinding(inPropertyHandle); - // check if it already exists - if (theProperty) - return theProperty; - - // Create - Qt3DSDMTimelineItemProperty *theTimelineProperty = - new Qt3DSDMTimelineItemProperty(m_TransMgr, inPropertyHandle, m_DataHandle); - m_PropertyBindingMap.insert(std::make_pair(inPropertyHandle, theTimelineProperty)); - - return theTimelineProperty; -} - -//============================================================================= -/** - * Add a new property row for this property. - * @param inAppend true to skip the check to find where to insert. ( true if this is a - * loading/initializing step, where the call is already done in order ) - */ -void Qt3DSDMTimelineItemBinding::AddPropertyRow(Qt3DSDMPropertyHandle inPropertyHandle, - bool inAppend /*= false */) -{ - ITimelineItemProperty *theTimelineProperty = GetPropertyBinding(inPropertyHandle); - if (theTimelineProperty) // if created, bail - return; - - if (!theTimelineProperty) - theTimelineProperty = GetOrCreatePropertyBinding(inPropertyHandle); - - // Find the row to insert this new property, if any, this preserves the order the property rows - // is displayed in the timeline. - ITimelineItemProperty *theNextProperty = nullptr; - if (!inAppend) { - TPropertyHandleList theProperties; - m_StudioSystem->GetPropertySystem()->GetAggregateInstanceProperties(m_DataHandle, - theProperties); - size_t thePropertyIndex = 0; - size_t thePropertyCount = theProperties.size(); - for (; thePropertyIndex < thePropertyCount; ++thePropertyIndex) { - if (theProperties[thePropertyIndex] == inPropertyHandle) { - ++thePropertyIndex; - break; - } - } - // Not all properties are displayed, so another loop to search for the first one that maps - // to a existing propertyrow - for (; thePropertyIndex < thePropertyCount; ++thePropertyIndex) { - TPropertyBindingMap::iterator theNextPropIter = - m_PropertyBindingMap.find(theProperties[thePropertyIndex]); - if (theNextPropIter != m_PropertyBindingMap.end()) { - theNextProperty = theNextPropIter->second; - break; - } - } - } - - // Update keyframes - AddKeyframes(theTimelineProperty); -} - -void Qt3DSDMTimelineItemBinding::RemovePropertyRow(Qt3DSDMPropertyHandle inPropertyHandle) -{ - TPropertyBindingMap::iterator theIter = m_PropertyBindingMap.find(inPropertyHandle); - if (theIter != m_PropertyBindingMap.end()) { - ITimelineItemProperty *thePropertyBinding = theIter->second; - - DeleteAssetKeyframesWhereApplicable(thePropertyBinding); - m_PropertyBindingMap.erase(theIter); - } -} - -// called when a keyframe is inserted, deleted or updated in the data model -void Qt3DSDMTimelineItemBinding::RefreshPropertyKeyframe( - qt3dsdm::Qt3DSDMPropertyHandle inPropertyHandle, qt3dsdm::Qt3DSDMKeyframeHandle inKeyframe, - ETimelineKeyframeTransaction inTransaction) -{ - TPropertyBindingMap::iterator theIter = m_PropertyBindingMap.find(inPropertyHandle); - if (theIter != m_PropertyBindingMap.end()) { - Qt3DSDMTimelineItemProperty *theProperty = theIter->second; - if (theProperty) { - if (theProperty->RefreshKeyframe(inKeyframe, inTransaction)) { - // Update asset keyframes - UpdateKeyframe(theProperty->GetKeyframeByHandle(inKeyframe), inTransaction); - } - } - } -} - -void Qt3DSDMTimelineItemBinding::OnPropertyChanged(Qt3DSDMPropertyHandle inPropertyHandle) -{ -} - -void Qt3DSDMTimelineItemBinding::OnPropertyLinked(Qt3DSDMPropertyHandle inPropertyHandle) -{ - if (m_StudioSystem->GetAnimationSystem()->IsPropertyAnimated(m_DataHandle, inPropertyHandle)) { - // Refresh property row by delete and recreate - RemovePropertyRow(inPropertyHandle); - AddPropertyRow(inPropertyHandle); - } -} - -bool Qt3DSDMTimelineItemBinding::HasDynamicKeyframes(long inTime) -{ - if (inTime == -1) { - if (GetPropertyCount() == 0) - return false; - - for (long i = 0; i < GetPropertyCount(); ++i) { - ITimelineItemProperty *theTimelineItemProperty = GetProperty(i); - if (!theTimelineItemProperty->IsDynamicAnimation()) - return false; - } - return true; - } else { - TPropertyBindingMap::const_iterator theIter = m_PropertyBindingMap.begin(); - for (; theIter != m_PropertyBindingMap.end(); ++theIter) { - IKeyframe *theKeyframe = theIter->second->GetKeyframeByTime(inTime); - if (theKeyframe && theKeyframe->IsDynamic()) - return true; - } - } - return false; -} - -void Qt3DSDMTimelineItemBinding::SetDynamicKeyframes(long inTime, bool inDynamic) -{ - TPropertyBindingMap::const_iterator theIter = m_PropertyBindingMap.begin(); - for (; theIter != m_PropertyBindingMap.end(); ++theIter) { - IKeyframe *theKeyframe = theIter->second->GetKeyframeByTime(inTime); - if (theKeyframe) - theKeyframe->SetDynamic(inDynamic); // TODO: we want this in 1 batch command - } -} - -Q3DStudio::CId Qt3DSDMTimelineItemBinding::GetGuid() const -{ - CClientDataModelBridge *theClientBridge = m_StudioSystem->GetClientDataModelBridge(); - qt3dsdm::IPropertySystem *thePropertySystem = m_StudioSystem->GetPropertySystem(); - SValue theValue; - if (thePropertySystem->GetInstancePropertyValue(m_DataHandle, theClientBridge->GetIdProperty(), - theValue)) { - SLong4 theLong4 = qt3dsdm::get<SLong4>(theValue); - return Q3DStudio::CId(theLong4.m_Longs[0], theLong4.m_Longs[1], theLong4.m_Longs[2], - theLong4.m_Longs[3]); - } - return Q3DStudio::CId(); -} - -// Delete asset keyframes at time t if no property keyframes exist at time t -//@param inSkipPropertyBinding property that to skip, e.g. in cases where property is deleted -//@return true if there are asset keyframes deleted. -bool Qt3DSDMTimelineItemBinding::DeleteAssetKeyframesWhereApplicable( - ITimelineItemProperty *inSkipPropertyBinding /*= nullptr */) -{ - // iterate through m_Keyframes because we cannot obtain time information from the Animation - // keyframes anymore, since they are deleted. - std::vector<long> theDeleteIndicesList; - for (size_t theIndex = 0; theIndex < m_Keyframes.size(); ++theIndex) { - TPropertyBindingMap::iterator theIter = m_PropertyBindingMap.begin(); - for (; theIter != m_PropertyBindingMap.end(); ++theIter) { - if ((!inSkipPropertyBinding || theIter->second != inSkipPropertyBinding) - && theIter->second->GetKeyframeByTime(m_Keyframes[theIndex].GetTime())) { - // done! - break; - } - } - if (theIter == m_PropertyBindingMap.end()) - theDeleteIndicesList.push_back((long)theIndex); - } - // start with the last item, so that the indices remain valid. - for (long i = (long)theDeleteIndicesList.size() - 1; i >= 0; --i) { - TAssetKeyframeList::iterator theKeyIter = m_Keyframes.begin(); - std::advance(theKeyIter, theDeleteIndicesList[i]); - m_Keyframes.erase(theKeyIter); - } - - return !theDeleteIndicesList.empty(); -} - -void Qt3DSDMTimelineItemBinding::RemoveAllPropertyBindings() -{ - TPropertyBindingMap::iterator theIter = m_PropertyBindingMap.begin(); - for (; theIter != m_PropertyBindingMap.end(); ++theIter) - delete theIter->second; - m_PropertyBindingMap.clear(); -} - -void Qt3DSDMTimelineItemBinding::AddKeyframes(ITimelineItemProperty *inPropertyBinding) -{ - for (long i = 0; i < inPropertyBinding->GetKeyframeCount(); ++i) - UpdateKeyframe(inPropertyBinding->GetKeyframeByIndex(i), ETimelineKeyframeTransaction_Add); -} - -// Update the asset keyframes based on the properties' keyframes. -void Qt3DSDMTimelineItemBinding::UpdateKeyframe(IKeyframe *inKeyframe, - ETimelineKeyframeTransaction inTransaction) -{ - bool theDoAddFlag = (inTransaction == ETimelineKeyframeTransaction_Add); - bool theDoDeleteFlag = (inTransaction == ETimelineKeyframeTransaction_Delete); - - // For update, if there isn't already a asset keyframe at the associated time, create one - if (inTransaction == ETimelineKeyframeTransaction_Update) { - theDoAddFlag = inKeyframe && !GetKeyframeByTime(inKeyframe->GetTime()); - theDoDeleteFlag = true; // plus, since we don't keep track of indiviual property keyframes - // here, iterate and make sure list is correct. - } - - if (theDoDeleteFlag) - DeleteAssetKeyframesWhereApplicable(); - - // Add when a new keyframe is added or MAYBE when a keyframe is moved - if (theDoAddFlag && inKeyframe) { - long theKeyframeTime = inKeyframe->GetTime(); - if (theKeyframeTime >= 0) { - bool theAppend = true; - // insert this in the order that it should be. and we trust the - TAssetKeyframeList::iterator theIter = m_Keyframes.begin(); - for (; theIter != m_Keyframes.end(); ++theIter) { - long theTime = (*theIter).GetTime(); - if (theTime == theKeyframeTime) { - theAppend = false; - break; // already exists, we are done. Because we only need 1 to represent ALL - // properties - } - } - if (theAppend) - m_Keyframes.push_back(Qt3DSDMAssetTimelineKeyframe(this, theKeyframeTime)); - } - } -} - -void Qt3DSDMTimelineItemBinding::OnAddChild(Qt3DSDMInstanceHandle inInstance) -{ - CDoc *theDoc = m_TransMgr->GetDoc(); - CClientDataModelBridge *theBridge = m_StudioSystem->GetClientDataModelBridge(); - ISlideSystem *theSlideSystem = m_StudioSystem->GetSlideSystem(); - - qt3dsdm::Qt3DSDMSlideHandle theSlide = theSlideSystem->GetAssociatedSlide(inInstance); - if (theBridge->IsInActiveComponent(inInstance) - && (theSlideSystem->IsMasterSlide(theSlide) || theSlide == theDoc->GetActiveSlide())) { - // Only add if the asset is in the current active component, and it's a master asset or in - // the current slide - ITimelineItemBinding *theNextItem = nullptr; - qt3dsdm::Qt3DSDMInstanceHandle theParentInstance = GetInstance(); - // Figure out where to insert this row, if applicable. - // CAsset has a list of children, and not necessarily all are active in this slide (e.g. - // non-master children) - Q3DStudio::TIdentifier theNextChild = 0; - if (theParentInstance.Valid()) { - // Get the next prioritized child in the same slide - Q3DStudio::CGraphIterator theChildren; - GetAssetChildrenInSlide(theDoc, theParentInstance, theDoc->GetActiveSlide(), - theChildren); - theNextChild = GetSibling(inInstance, true, theChildren); - } - - if (theNextChild != 0) - theNextItem = m_TransMgr->GetOrCreate(theNextChild); - } -} - -void Qt3DSDMTimelineItemBinding::OnDeleteChild(Qt3DSDMInstanceHandle inInstance) -{ -} - -void Qt3DSDMTimelineItemBinding::UpdateActionStatus() -{ -} - -//============================================================================= -/** - * Open the associated item as though it was double-clicked in explorer - * Respective subclasses (for example Image and Behavior) can call this function - */ -bool Qt3DSDMTimelineItemBinding::OpenSourcePathFile() -{ - // Get source path property value - CClientDataModelBridge *theClientBridge = m_StudioSystem->GetClientDataModelBridge(); - qt3dsdm::IPropertySystem *thePropertySystem = m_StudioSystem->GetPropertySystem(); - SValue theValue; - if (thePropertySystem->GetInstancePropertyValue( - m_DataHandle, theClientBridge->GetSourcePathProperty(), theValue)) { - // Open the respective file - Q3DStudio::CFilePath theSourcePath(qt3dsdm::get<qt3dsdm::TDataStrPtr>(theValue)->GetData()); - Qt3DSFile theFile(m_TransMgr->GetDoc()->GetResolvedPathToDoc(theSourcePath)); - theFile.Execute(); - return true; - } - return false; -} |