diff options
Diffstat (limited to 'src/Authoring/Studio/Palettes/Timeline/Bindings/LayerTimelineItemBinding.cpp')
-rw-r--r-- | src/Authoring/Studio/Palettes/Timeline/Bindings/LayerTimelineItemBinding.cpp | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/src/Authoring/Studio/Palettes/Timeline/Bindings/LayerTimelineItemBinding.cpp b/src/Authoring/Studio/Palettes/Timeline/Bindings/LayerTimelineItemBinding.cpp new file mode 100644 index 00000000..73d5d5d2 --- /dev/null +++ b/src/Authoring/Studio/Palettes/Timeline/Bindings/LayerTimelineItemBinding.cpp @@ -0,0 +1,317 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +//============================================================================== +// Prefix +//============================================================================== +#include "stdafx.h" + +//============================================================================== +// Includes +//============================================================================== +#include "LayerTimelineItemBinding.h" +#include "TimelineTranslationManager.h" +#include "BaseStateRow.h" +#include "ImageTimelineItemBinding.h" +#include "EmptyTimelineTimebar.h" + +// Data model specific +#include "IDoc.h" +#include "ClientDataModelBridge.h" +#include "DropSource.h" +#include "Doc.h" + +#include "UICDMHandles.h" +#include "UICDMStudioSystem.h" + +#include "UICDMMetaData.h" +#include "UICDMDataCore.h" +#include "StudioFullSystem.h" +#include "StudioCoreSystem.h" +#include "UICDMSlides.h" + +using namespace UICDM; + +namespace { + +bool ImageSlotIsFilled(UICDM::IPropertySystem *inPropertySystem, CUICDMInstanceHandle inInstance, + const TCharStr &inStr) +{ + CUICDMPropertyHandle theProperty = + inPropertySystem->GetAggregateInstancePropertyByName(inInstance, inStr); + SValue theValue; + inPropertySystem->GetInstancePropertyValue(inInstance, theProperty, theValue); + + SLong4 theLong4 = UICDM::get<SLong4>(theValue); + bool theReturn = theLong4.m_Longs[0] != 0 || theLong4.m_Longs[1] != 0 + || theLong4.m_Longs[2] != 0 || theLong4.m_Longs[3] != 0; + + return theReturn; +} + +// helper function to find the image binding class that 'represents' this property +inline CImageTimelineItemBinding *FindImageBindingByProperty(CBaseStateRow *inRow, + CUICDMPropertyHandle inProperty) +{ + if (!inRow || !inProperty.Valid()) + return nullptr; + + CImageTimelineItemBinding *theInvalidImageBinding = nullptr; + for (long theIndex = 0; theIndex < inRow->GetNumNonPropertyRows(); ++theIndex) { + CImageTimelineItemBinding *theImageBinding = dynamic_cast<CImageTimelineItemBinding *>( + inRow->GetNonPropertyRow(theIndex)->GetTimelineItemBinding()); + if (theImageBinding && theImageBinding->GetPropertyHandle() == inProperty) { + theInvalidImageBinding = theImageBinding; + break; + } + } + return theInvalidImageBinding; +} +} + +CLayerTimelineItemBinding::CLayerTimelineItemBinding(CTimelineTranslationManager *inMgr, + UICDM::CUICDMInstanceHandle inDataHandle) + : CUICDMTimelineItemBinding(inMgr, inDataHandle) +{ + UICDM::IPropertySystem *thePropertySystem = m_TransMgr->GetStudioSystem()->GetPropertySystem(); + TPropertyHandleList theProperties; + thePropertySystem->GetAggregateInstanceProperties(inDataHandle, theProperties); + + size_t thePropertyCount = theProperties.size(); + for (size_t thePropertyIndex = 0; thePropertyIndex < thePropertyCount; ++thePropertyIndex) { + CUICDMPropertyHandle theProperty = theProperties[thePropertyIndex]; + + AdditionalMetaDataType::Value theAdditionalMetaDataType = + thePropertySystem->GetAdditionalMetaDataType(inDataHandle, theProperty); + + if (theAdditionalMetaDataType == AdditionalMetaDataType::Image) { + TCharStr theName(thePropertySystem->GetName(theProperty)); + TCharStr theFormalName(thePropertySystem->GetFormalName(inDataHandle, theProperty)); + TNameFormalNamePair thePair = + std::make_tuple(theName, theFormalName, theProperty); + m_ImageNameFormalNamePairs.push_back(thePair); + } + } +} + +CLayerTimelineItemBinding::~CLayerTimelineItemBinding() +{ +} + +EStudioObjectType CLayerTimelineItemBinding::GetObjectType() const +{ + return OBJTYPE_LAYER; +} + +ITimelineItemBinding *CLayerTimelineItemBinding::GetChild(long inIndex) +{ + static const TCharStr theLayerPrefix(L"Layer_"); + UICDM::IPropertySystem *thePropertySystem = m_TransMgr->GetStudioSystem()->GetPropertySystem(); + + UICDM::CUICDMInstanceHandle theInstance = GetInstance(); + if (theInstance.Valid()) { + Q3DStudio::CGraphIterator theChildren; + CUICDMSlideHandle theActiveSlide = m_TransMgr->GetDoc()->GetActiveSlide(); + GetAssetChildrenInTimeParent(theInstance, m_TransMgr->GetDoc(), AmITimeParent(), + theChildren, theActiveSlide); + theChildren += inIndex; + + UICDM::CUICDMInstanceHandle theChildInstance = theChildren.GetCurrent(); + if (theChildInstance.Valid()) { + std::shared_ptr<IDataCore> theDataCore = + m_TransMgr->GetStudioSystem()->GetFullSystem()->GetCoreSystem()->GetDataCore(); + ISlideSystem *theSlideSystem = m_TransMgr->GetStudioSystem()->GetSlideSystem(); + ISlideCore *theSlideCore = m_TransMgr->GetStudioSystem()->GetSlideCore(); + + size_t theSlotCursor = (size_t)-1; + { + + UICDM::IPropertySystem *thePropertySystem = + m_TransMgr->GetStudioSystem()->GetPropertySystem(); + UICDM::SLong4 theGuid; + { + CUICDMPropertyHandle theTypeProperty = + thePropertySystem->GetAggregateInstancePropertyByName(theChildInstance, + L"id"); + SValue theIdValue; + thePropertySystem->GetInstancePropertyValue(theChildInstance, theTypeProperty, + theIdValue); + theGuid = UICDM::get<UICDM::SLong4>(theIdValue); + } + for (size_t theSlotIndex = 0, theSlotCount = m_ImageNameFormalNamePairs.size(); + theSlotIndex < theSlotCount; ++theSlotIndex) { + bool theIsMatch = false; + UICDM::CUICDMPropertyHandle theProperty = + std::get<2>(m_ImageNameFormalNamePairs[theSlotIndex]); + SValue theValue; + const SUICDMPropertyDefinition &theDefinition( + theDataCore->GetProperty(theProperty)); + if (theDefinition.m_Type == DataModelDataType::Long4) { + SValue theDCValue; + if (theDataCore->GetInstancePropertyValue(theInstance, theProperty, + theDCValue)) { + SLong4 thePropGuid = get<SLong4>(theDCValue); + if (thePropGuid == theGuid) + theIsMatch = true; + } + CUICDMSlideHandle theSlide = + theSlideSystem->GetAssociatedSlide(theChildInstance); + CUICDMSlideHandle theMasterSlide = theSlideSystem->GetMasterSlide(theSlide); + if (theIsMatch == false && theSlide.Valid() + && theSlideCore->GetSpecificInstancePropertyValue( + theSlide, theInstance, theProperty, theValue)) { + SLong4 thePropGuid = get<SLong4>(theValue); + if (thePropGuid == theGuid) + theIsMatch = true; + } + } + if (theIsMatch) { + theSlotCursor = theSlotIndex; + break; + } + } + } + if (theSlotCursor != (size_t)-1) { + CUICDMPropertyHandle theImageProperty = + thePropertySystem->GetAggregateInstancePropertyByName( + m_DataHandle, std::get<0>(m_ImageNameFormalNamePairs[theSlotCursor])); + return GetOrCreateImageBinding( + theImageProperty, + std::get<1>(m_ImageNameFormalNamePairs[theSlotCursor]).wide_str()); + } else + return m_TransMgr->GetOrCreate(theChildInstance); + } + } + return nullptr; +} + +void CLayerTimelineItemBinding::OnAddChild(UICDM::CUICDMInstanceHandle inInstance) +{ + using namespace UICDM; + CClientDataModelBridge *theBridge = m_TransMgr->GetStudioSystem()->GetClientDataModelBridge(); + // This is handled via the OnPropertyChanged call below + if (theBridge->IsImageInstance(inInstance)) + return; + else + CUICDMTimelineItemBinding::OnAddChild(inInstance); +} + +void CLayerTimelineItemBinding::OnPropertyChanged(CUICDMPropertyHandle inPropertyHandle) +{ + bool theHandled = false; + if (m_Row) { + UICDM::IPropertySystem *thePropertySystem = + m_TransMgr->GetStudioSystem()->GetPropertySystem(); + CClientDataModelBridge *theBridge = + m_TransMgr->GetStudioSystem()->GetClientDataModelBridge(); + UICDM::TCharStr thePropertyName = thePropertySystem->GetName(inPropertyHandle); + size_t theSlotCount = m_ImageNameFormalNamePairs.size(); + for (size_t theSlotIndex = 0; theSlotIndex < theSlotCount; ++theSlotIndex) { + UICDM::TCharStr thePropName = std::get<0>(m_ImageNameFormalNamePairs[theSlotIndex]); + if (thePropertyName == thePropName) { + if (ImageSlotIsFilled(thePropertySystem, m_DataHandle, thePropName)) { + // already created, bail! + if (m_TransMgr->GetBinding(GetImage(inPropertyHandle))) + return; + + // Image property was changed from one non-zero guid value to another, delete + // the old and and create a new one + CImageTimelineItemBinding *theReplacedImageBinding = + FindImageBindingByProperty(m_Row, inPropertyHandle); + if (theReplacedImageBinding) + m_Row->RemoveChildRow(theReplacedImageBinding); + + ITimelineItemBinding *theNextImageBinding = nullptr; + // Determine if this is inserted somewhere in the existing list. + for (size_t theNextImage = theSlotIndex + 1; theNextImage < theSlotCount; + ++theNextImage) { + UICDM::TCharStr theTempName = + std::get<0>(m_ImageNameFormalNamePairs[theNextImage]); + if (ImageSlotIsFilled(thePropertySystem, m_DataHandle, theTempName)) { + CUICDMPropertyHandle theNextImageProperty = + theBridge->GetAggregateInstancePropertyByName(m_DataHandle, + theTempName); + theNextImageBinding = + m_TransMgr->GetBinding(GetImage(theNextImageProperty)); + break; + } + } + m_Row->AddChildRow( + GetOrCreateImageBinding( + inPropertyHandle, + std::get<1>(m_ImageNameFormalNamePairs[theSlotIndex]).wide_str()), + theNextImageBinding); + } else // check for delete + { + // GetImage will not return anything valid since the value is nuked. + // From the UI end, there is no way we can tell which image is associated with + // this property, since that is "encapsulated" in the property value. + CImageTimelineItemBinding *theInvalidImageBinding = + FindImageBindingByProperty(m_Row, inPropertyHandle); + if (theInvalidImageBinding) + m_Row->RemoveChildRow(theInvalidImageBinding); + } + theHandled = true; + break; + } + } + } + if (!theHandled) + CUICDMTimelineItemBinding::OnPropertyChanged(inPropertyHandle); +} + +UICDM::CUICDMInstanceHandle +CLayerTimelineItemBinding::GetImage(UICDM::CUICDMPropertyHandle inPropertyHandle) +{ + UICDM::IPropertySystem *thePropertySystem = m_TransMgr->GetStudioSystem()->GetPropertySystem(); + SValue theImageValue; + thePropertySystem->GetInstancePropertyValue(m_DataHandle, inPropertyHandle, theImageValue); + SLong4 theImageLong4 = UICDM::get<SLong4>(theImageValue); + return m_TransMgr->GetStudioSystem()->GetClientDataModelBridge()->GetImageInstanceByGUID( + theImageLong4); +} + +ITimelineItemBinding * +CLayerTimelineItemBinding::GetOrCreateImageBinding(UICDM::CUICDMPropertyHandle inPropertyHandle, + const wchar_t *inName) +{ + UICDM::CUICDMInstanceHandle theImageInstance = GetImage(inPropertyHandle); + ITimelineItemBinding *theImageTimelineRow = m_TransMgr->GetBinding(theImageInstance); + if (!theImageTimelineRow) // create + { + theImageTimelineRow = m_TransMgr->GetOrCreate(theImageInstance); + // Set the name, by spec: the nice name. + theImageTimelineRow->GetTimelineItem()->SetName(inName); + CImageTimelineItemBinding *theImageBinding = + dynamic_cast<CImageTimelineItemBinding *>(theImageTimelineRow); + if (theImageBinding) + theImageBinding->SetPropertyHandle(inPropertyHandle); + } + return theImageTimelineRow; +} |