diff options
author | Kaj Grönholm <kaj.gronholm@qt.io> | 2020-09-18 14:40:33 +0300 |
---|---|---|
committer | Kaj Grönholm <kaj.gronholm@qt.io> | 2020-09-25 11:04:22 +0300 |
commit | 98d888b6beeda9e301625ecba8e377cf552e7231 (patch) | |
tree | 2201c7ee29accc46d78816c2f047b1e784a73df0 | |
parent | 3bcbc804004d293eba409b5e65ff5c5e38c572fe (diff) |
Improve timeline signal actionsv2.8.0-beta1
- Support new signal type object with icons. Bump generated UIP
version to 7.
- When creating a signal, also create initial onActivate action.
- Don't show basic node properties for signals, only the name.
- When adding new action to signal, default to onActivate and
emit signal.
- Show small ticks on timeline bar if onActivate or onDeactivate
actions have been set to the object.
Task-number: QT3DS-4165
Change-Id: I16d1129536ac4d22c23c27bbc95741aa66adf597
Reviewed-by: Antti Määttä <antti.maatta@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
32 files changed, 170 insertions, 6 deletions
diff --git a/src/Authoring/Client/Code/Core/Doc/ClientDataModelBridge/ClientDataModelBridge.cpp b/src/Authoring/Client/Code/Core/Doc/ClientDataModelBridge/ClientDataModelBridge.cpp index 95540fe6..d0da3c6c 100644 --- a/src/Authoring/Client/Code/Core/Doc/ClientDataModelBridge/ClientDataModelBridge.cpp +++ b/src/Authoring/Client/Code/Core/Doc/ClientDataModelBridge/ClientDataModelBridge.cpp @@ -81,6 +81,7 @@ CClientDataModelBridge::CClientDataModelBridge( , m_Camera(inDefinitions->m_Camera) , m_Text(inDefinitions->m_Text) , m_Group(inDefinitions->m_Group) + , m_Signal(inDefinitions->m_Signal) , m_Component(inDefinitions->m_Component) , m_Behavior(inDefinitions->m_Behavior) , m_Scene(inDefinitions->m_Scene) @@ -214,6 +215,9 @@ Qt3DSDMInstanceHandle CClientDataModelBridge::CreateAssetInstance(Q3DStudio::CId case OBJTYPE_GROUP: m_DataCore->DeriveInstance(theNewInstance, m_Group.m_Instance); break; + case OBJTYPE_SIGNAL: + m_DataCore->DeriveInstance(theNewInstance, m_Signal.m_Instance); + break; case OBJTYPE_COMPONENT: m_DataCore->DeriveInstance(theNewInstance, m_Component.m_Instance); break; @@ -1706,6 +1710,7 @@ bool CClientDataModelBridge::CanDelete(qt3dsdm::Qt3DSDMInstanceHandle inInstance case OBJTYPE_MODEL: case OBJTYPE_TEXT: case OBJTYPE_GROUP: + case OBJTYPE_SIGNAL: case OBJTYPE_CAMERA: case OBJTYPE_LIGHT: case OBJTYPE_IMAGE: @@ -1849,6 +1854,8 @@ CClientDataModelBridge::GetObjectType(qt3dsdm::Qt3DSDMInstanceHandle inInstance) return OBJTYPE_CAMERA; else if (theType == L"Group") return OBJTYPE_GROUP; + else if (theType == L"Signal") + return OBJTYPE_SIGNAL; else if (theType == L"Component") return OBJTYPE_COMPONENT; else if (theType == L"Image" || theType == L"LibraryImage") @@ -1904,6 +1911,11 @@ bool CClientDataModelBridge::IsGroupInstance(qt3dsdm::Qt3DSDMInstanceHandle inIn return m_DataCore->IsInstanceOrDerivedFrom(inInstance, m_Group.m_Instance); } +bool CClientDataModelBridge::IsSignalInstance(qt3dsdm::Qt3DSDMInstanceHandle inInstance) const +{ + return m_DataCore->IsInstanceOrDerivedFrom(inInstance, m_Signal.m_Instance); +} + bool CClientDataModelBridge::IsActionInstance(qt3dsdm::Qt3DSDMInstanceHandle inInstance) const { return m_DataCore->IsInstanceOrDerivedFrom(inInstance, m_ActionItem.m_Instance); diff --git a/src/Authoring/Client/Code/Core/Doc/ClientDataModelBridge/ClientDataModelBridge.h b/src/Authoring/Client/Code/Core/Doc/ClientDataModelBridge/ClientDataModelBridge.h index c3f1a90f..f0f5004d 100644 --- a/src/Authoring/Client/Code/Core/Doc/ClientDataModelBridge/ClientDataModelBridge.h +++ b/src/Authoring/Client/Code/Core/Doc/ClientDataModelBridge/ClientDataModelBridge.h @@ -75,6 +75,7 @@ typedef qt3dsdm::SComposerObjectDefinition<qt3dsdm::ComposerObjectTypes::Light> typedef qt3dsdm::SComposerObjectDefinition<qt3dsdm::ComposerObjectTypes::Camera> SDataModelCamera; typedef qt3dsdm::SComposerObjectDefinition<qt3dsdm::ComposerObjectTypes::Text> SDataModelText; typedef qt3dsdm::SComposerObjectDefinition<qt3dsdm::ComposerObjectTypes::Group> SDataModelGroup; +typedef qt3dsdm::SComposerObjectDefinition<qt3dsdm::ComposerObjectTypes::Signal> SDataModelSignal; typedef qt3dsdm::SComposerObjectDefinition<qt3dsdm::ComposerObjectTypes::Component> SDataModelComponent; typedef qt3dsdm::SComposerObjectDefinition<qt3dsdm::ComposerObjectTypes::Behavior> SDataModelBehavior; typedef qt3dsdm::SComposerObjectDefinition<qt3dsdm::ComposerObjectTypes::Scene> SDataModelScene; @@ -133,6 +134,7 @@ class CClientDataModelBridge SDataModelCamera &m_Camera; SDataModelText &m_Text; SDataModelGroup &m_Group; + SDataModelSignal &m_Signal; SDataModelComponent &m_Component; SDataModelBehavior &m_Behavior; SDataModelScene &m_Scene; @@ -232,6 +234,7 @@ public: const SDataModelCamera &GetCamera() const { return m_Camera; } const SDataModelText &GetText() const { return m_Text; } const SDataModelGroup &GetGroup() const { return m_Group; } + const SDataModelSignal &GetSignal() const { return m_Signal; } const SDataModelComponent &GetComponent() const { return m_Component; } const SDataModelBehavior &GetBehavior() const { return m_Behavior; } const SDataModelScene &GetScene() const { return m_Scene; } @@ -384,6 +387,7 @@ public: bool IsBehaviorInstance(qt3dsdm::Qt3DSDMInstanceHandle inInstance) const; bool IsCameraInstance(qt3dsdm::Qt3DSDMInstanceHandle inInstance) const; bool IsGroupInstance(qt3dsdm::Qt3DSDMInstanceHandle inInstance) const; + bool IsSignalInstance(qt3dsdm::Qt3DSDMInstanceHandle inInstance) const; bool IsActionInstance(qt3dsdm::Qt3DSDMInstanceHandle inInstance) const; bool IsComponentInstance(qt3dsdm::Qt3DSDMInstanceHandle inInstance) const; bool IsLayerInstance(qt3dsdm::Qt3DSDMInstanceHandle inInstance) const; diff --git a/src/Authoring/Client/Code/Core/Doc/Doc.cpp b/src/Authoring/Client/Code/Core/Doc/Doc.cpp index a85cc2e2..1d182b32 100644 --- a/src/Authoring/Client/Code/Core/Doc/Doc.cpp +++ b/src/Authoring/Client/Code/Core/Doc/Doc.cpp @@ -74,7 +74,7 @@ #include <QtCore/qtimer.h> #include <QtGui/qvalidator.h> -const long UIP_VERSION = 6; // current version (latest supported) +const long UIP_VERSION = 7; // current version (latest supported) const long LAST_SUPPORTED_UIP_VERSION = 1; IMPLEMENT_OBJECT_COUNTER(CDoc) diff --git a/src/Authoring/Client/Code/Core/Doc/IDocumentReader.h b/src/Authoring/Client/Code/Core/Doc/IDocumentReader.h index aec35f50..be2f739a 100644 --- a/src/Authoring/Client/Code/Core/Doc/IDocumentReader.h +++ b/src/Authoring/Client/Code/Core/Doc/IDocumentReader.h @@ -279,6 +279,8 @@ inline EStudioObjectType GetStudioObjectType(qt3dsdm::ComposerObjectTypes::Enum return OBJTYPE_MODEL; case ComposerObjectTypes::Group: return OBJTYPE_GROUP; + case ComposerObjectTypes::Signal: + return OBJTYPE_SIGNAL; case ComposerObjectTypes::Image: return OBJTYPE_IMAGE; case ComposerObjectTypes::Text: diff --git a/src/Authoring/Client/Code/Core/Utility/StudioObjectTypes.cpp b/src/Authoring/Client/Code/Core/Utility/StudioObjectTypes.cpp index 121bd747..c02d2e99 100644 --- a/src/Authoring/Client/Code/Core/Utility/StudioObjectTypes.cpp +++ b/src/Authoring/Client/Code/Core/Utility/StudioObjectTypes.cpp @@ -58,6 +58,7 @@ bool CStudioObjectTypes::AcceptableParent(EStudioObjectType inChild, EStudioObje case OBJTYPE_LIGHT: case OBJTYPE_MODEL: case OBJTYPE_GROUP: + case OBJTYPE_SIGNAL: case OBJTYPE_PATH: case OBJTYPE_COMPONENT: theAcceptible = (inParent == OBJTYPE_LAYER) || (inParent == OBJTYPE_CAMERA) @@ -132,6 +133,10 @@ const QString &CStudioObjectTypes::GetNormalIconName(EStudioObjectType inType) static QString theString = QStringLiteral("Objects-Group-Normal.png"); return theString; } + case OBJTYPE_SIGNAL: { + static QString theString = QStringLiteral("Objects-Signal-Normal.png"); + return theString; + } case OBJTYPE_ALIAS: { static QString theString = QStringLiteral("Objects-Alias-Normal.png"); return theString; @@ -234,6 +239,10 @@ const QString &CStudioObjectTypes::GetDisabledIconName(EStudioObjectType inType) static QString theString = QStringLiteral("Objects-Group-Disabled.png"); return theString; } + case OBJTYPE_SIGNAL: { + static QString theString = QStringLiteral("Objects-Signal-Disabled.png"); + return theString; + } case OBJTYPE_ALIAS: { static QString theString = QStringLiteral("Objects-Alias-Disabled.png"); return theString; @@ -335,6 +344,10 @@ const QString &CStudioObjectTypes::GetHighlightIconName(EStudioObjectType inType static QString theString = QStringLiteral("Objects-Group-Normal.png"); return theString; } + case OBJTYPE_SIGNAL: { + static QString theString = QStringLiteral("Objects-Signal-Normal.png"); + return theString; + } case OBJTYPE_PATH: { static QString theString = QStringLiteral("Objects-Path-Normal.png"); return theString; diff --git a/src/Authoring/Client/Code/Core/Utility/StudioObjectTypes.h b/src/Authoring/Client/Code/Core/Utility/StudioObjectTypes.h index 79eafc19..dc57d4c8 100644 --- a/src/Authoring/Client/Code/Core/Utility/StudioObjectTypes.h +++ b/src/Authoring/Client/Code/Core/Utility/StudioObjectTypes.h @@ -67,6 +67,7 @@ enum EStudioObjectType { OBJTYPE_PROJECT = 0x02000000, OBJTYPE_QML_STREAM = 0x04000000, OBJTYPE_MATERIALDATA = 0x08000000, + OBJTYPE_SIGNAL = 0x10000000, // filters OBJTYPE_IS_VARIANT = OBJTYPE_LAYER | OBJTYPE_TEXT | OBJTYPE_MODEL | OBJTYPE_GROUP diff --git a/src/Authoring/Client/Code/Core/Utility/StudioPreferences.cpp b/src/Authoring/Client/Code/Core/Utility/StudioPreferences.cpp index c340ff32..3fe5f377 100644 --- a/src/Authoring/Client/Code/Core/Utility/StudioPreferences.cpp +++ b/src/Authoring/Client/Code/Core/Utility/StudioPreferences.cpp @@ -84,6 +84,7 @@ static QColor s_timelineFilterButtonSelectedColor; static QColor s_timelineFilterButtonHoveredColor; static QColor s_timelineRowCommentBgColor; static QColor s_timelinePressedKeyframeColor; // pressed keyframe from multiple selection +static QColor s_timelineActionColor; static QColor s_invalidDataIndicatorColor; static int s_fontSize; @@ -158,6 +159,7 @@ void CStudioPreferences::loadPreferences() s_timelineRowSubpDescendantColor = QColor("#a263ff"); s_timelineRowCommentBgColor = QColor("#d0000000"); s_timelinePressedKeyframeColor = QColor("#ffff00"); + s_timelineActionColor = QColor("#f4be04"); s_invalidDataIndicatorColor = QColor("#ff2121"); @@ -926,6 +928,11 @@ QColor CStudioPreferences::timelinePressedKeyframeColor() return s_timelinePressedKeyframeColor; } +QColor CStudioPreferences::timelineActionColor() +{ + return s_timelineActionColor; +} + QColor CStudioPreferences::invalidDataIndicatorColor() { return s_invalidDataIndicatorColor; diff --git a/src/Authoring/Client/Code/Core/Utility/StudioPreferences.h b/src/Authoring/Client/Code/Core/Utility/StudioPreferences.h index 92a5787a..fb0b8fae 100644 --- a/src/Authoring/Client/Code/Core/Utility/StudioPreferences.h +++ b/src/Authoring/Client/Code/Core/Utility/StudioPreferences.h @@ -251,6 +251,7 @@ public: static QColor timelineRowSubpDescendantColor(); static QColor timelineRowCommentBgColor(); static QColor timelinePressedKeyframeColor(); + static QColor timelineActionColor(); static QColor invalidDataIndicatorColor(); diff --git a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportComposerTypes.cpp b/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportComposerTypes.cpp index 5c4cb11d..fdf332c5 100644 --- a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportComposerTypes.cpp +++ b/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportComposerTypes.cpp @@ -225,6 +225,8 @@ SImportAsset &SImportComposerTypes::GetImportAssetForType(ComposerObjectTypes::E return m_Asset; case ComposerObjectTypes::Group: return m_Group; + case ComposerObjectTypes::Signal: + return m_Signal; case ComposerObjectTypes::Light: return m_Light; case ComposerObjectTypes::Camera: diff --git a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportComposerTypes.h b/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportComposerTypes.h index 78df2a9b..0f069270 100644 --- a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportComposerTypes.h +++ b/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportComposerTypes.h @@ -88,6 +88,11 @@ struct SImportGroup : public SImportNode ComposerObjectTypes::Enum GetObjectType() override { return ComposerObjectTypes::Group; } }; +struct SImportSignal : public SImportNode +{ + ComposerObjectTypes::Enum GetObjectType() override { return ComposerObjectTypes::Signal; } +}; + struct SImportLight : public SImportNode { ITERATE_COMPOSER_LIGHT_PROPERTIES @@ -205,6 +210,7 @@ struct SImportComposerTypes { SImportAsset m_Asset; SImportGroup m_Group; + SImportSignal m_Signal; SImportLight m_Light; SImportCamera m_Camera; SImportModel m_Model; diff --git a/src/Authoring/Qt3DStudio/DragAndDrop/BasicObjectDropSource.cpp b/src/Authoring/Qt3DStudio/DragAndDrop/BasicObjectDropSource.cpp index d99bd9a5..ecaae33a 100644 --- a/src/Authoring/Qt3DStudio/DragAndDrop/BasicObjectDropSource.cpp +++ b/src/Authoring/Qt3DStudio/DragAndDrop/BasicObjectDropSource.cpp @@ -163,6 +163,9 @@ CCmd *CBasicObjectDropSource::GenerateAssetCommand(qt3dsdm::Qt3DSDMInstanceHandl case OBJTYPE_GROUP: theComposerType = ComposerObjectTypes::Group; break; + case OBJTYPE_SIGNAL: + theComposerType = ComposerObjectTypes::Signal; + break; case OBJTYPE_IMAGE: theComposerType = ComposerObjectTypes::Image; break; @@ -254,10 +257,17 @@ CCmd *CBasicObjectDropSource::GenerateAssetCommand(qt3dsdm::Qt3DSDMInstanceHandl Q3DStudio::ImportUtils::GetInsertTypeForDropType(inDestType), thePoint, theStartTime); } else { - SCOPED_DOCUMENT_EDITOR(*theDoc, QObject::tr("Add Instance")) - ->CreateSceneGraphInstance(theComposerType, inTarget, inSlide, theInsertType, + ScopedDocumentEditor editor( + SCOPED_DOCUMENT_EDITOR(*theDoc, QObject::tr("Add Instance"))); + Qt3DSDMInstanceHandle newHandle = + editor->CreateSceneGraphInstance(theComposerType, inTarget, inSlide, theInsertType, thePoint, (EPrimitiveType)m_PrimitiveType, theStartTime, false); + + if (theComposerType == ComposerObjectTypes::Signal) { + // When creating a signal, automatically create also onActivate action + editor->AddAction(inSlide, newHandle, L"onActivate", L"Emit Signal"); + } } } return nullptr; diff --git a/src/Authoring/Qt3DStudio/Palettes/Action/ActionView.cpp b/src/Authoring/Qt3DStudio/Palettes/Action/ActionView.cpp index 56bd80dc..cd4c4fb6 100644 --- a/src/Authoring/Qt3DStudio/Palettes/Action/ActionView.cpp +++ b/src/Authoring/Qt3DStudio/Palettes/Action/ActionView.cpp @@ -394,8 +394,17 @@ void ActionView::addAction() // Query data model bridge to see the applicable events and actions for this instance. CClientDataModelBridge *theBridge = GetBridge(); - std::wstring theEventName = theBridge->GetDefaultEvent(m_itemHandle); - std::wstring theHandlerName = theBridge->GetDefaultHandler(m_itemHandle); + // For signals, default to onActivate and emitting signal + std::wstring preferredEvent = L""; + std::wstring preferredHandler = L""; + auto info = m_objRefHelper->GetInfo(m_itemHandle); + if (info.m_Type == OBJTYPE_SIGNAL) { + preferredEvent = L"onActivate"; + preferredHandler = L"Emit Signal"; + } + + std::wstring theEventName = theBridge->GetDefaultEvent(m_itemHandle, preferredEvent); + std::wstring theHandlerName = theBridge->GetDefaultHandler(m_itemHandle, preferredHandler); Q3DStudio::SCOPED_DOCUMENT_EDITOR(*GetDoc(), QObject::tr("Add Action")) ->AddAction(GetDoc()->GetActiveSlide(), m_itemHandle, theEventName, diff --git a/src/Authoring/Qt3DStudio/Palettes/BasicObjects/BasicObjectsModel.cpp b/src/Authoring/Qt3DStudio/Palettes/BasicObjects/BasicObjectsModel.cpp index 8694fda7..65274d7b 100644 --- a/src/Authoring/Qt3DStudio/Palettes/BasicObjects/BasicObjectsModel.cpp +++ b/src/Authoring/Qt3DStudio/Palettes/BasicObjects/BasicObjectsModel.cpp @@ -55,6 +55,7 @@ const QVector<BasicObjectItem> BasicObjectsModel::InitializeObjectModel() {tr("Cone"), "Asset-Cone-Normal.png"_L1, OBJTYPE_MODEL, PRIMITIVETYPE_CONE}, {tr("Component"), "Asset-Component-Normal.png"_L1, OBJTYPE_COMPONENT, PRIMITIVETYPE_UNKNOWN}, {tr("Group"), "Asset-Group-Normal.png"_L1, OBJTYPE_GROUP, PRIMITIVETYPE_UNKNOWN}, + {tr("Signal"), "Asset-Signal-Normal.png"_L1, OBJTYPE_SIGNAL, PRIMITIVETYPE_UNKNOWN}, {tr("Text"), "Asset-Text-Normal.png"_L1, OBJTYPE_TEXT, PRIMITIVETYPE_UNKNOWN}, {tr("Camera"), "Asset-Camera-Normal.png"_L1, OBJTYPE_CAMERA, PRIMITIVETYPE_UNKNOWN}, {tr("Light"), "Asset-Light-Normal.png"_L1, OBJTYPE_LIGHT, PRIMITIVETYPE_UNKNOWN}, diff --git a/src/Authoring/Qt3DStudio/Palettes/Inspector/InspectorControlModel.cpp b/src/Authoring/Qt3DStudio/Palettes/Inspector/InspectorControlModel.cpp index 06fc9ce6..b6225dff 100644 --- a/src/Authoring/Qt3DStudio/Palettes/Inspector/InspectorControlModel.cpp +++ b/src/Authoring/Qt3DStudio/Palettes/Inspector/InspectorControlModel.cpp @@ -782,6 +782,10 @@ InspectorControlBase* InspectorControlModel::createItem(Qt3DSDMInspectable *insp if (title == "Name" && isBasicMaterial()) return nullptr; + // Hide everything else than name for signals + if (title != "Name" && getBridge()->IsSignalInstance(inspectable->getInstance())) + return nullptr; + InspectorControlBase *item = new InspectorControlBase; item->m_property = metaProperty.m_Property; item->m_instance = inspectable->GetGroupInstance(groupIndex); diff --git a/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/ITimelineItem.h b/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/ITimelineItem.h index 4308fb2b..2c8b6ecc 100644 --- a/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/ITimelineItem.h +++ b/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/ITimelineItem.h @@ -47,6 +47,13 @@ class ITimelineTimebar; class ITimelineItem : public INamable { public: + enum class ActivateAction { + None = 0, + Activate = 1, + Deactivate = 2 + }; + Q_DECLARE_FLAGS(ActivateActions, ActivateAction) + virtual ~ITimelineItem() {} virtual EStudioObjectType GetObjectType() const = 0; @@ -65,6 +72,7 @@ public: virtual bool HasAction(bool inMaster) = 0; virtual bool ChildrenHasAction(bool inMaster) = 0; virtual bool ComponentHasAction(bool inMaster) = 0; + virtual ActivateActions getActivateActions() = 0; // subpresentations virtual bool hasSubpresentation() const = 0; @@ -72,4 +80,6 @@ public: virtual ITimelineTimebar *GetTimebar() = 0; }; +Q_DECLARE_OPERATORS_FOR_FLAGS(ITimelineItem::ActivateActions) + #endif // INCLUDED_ITIMELINE_ITEM_H diff --git a/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp b/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp index 744c53a0..58529ad4 100644 --- a/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp +++ b/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp @@ -234,6 +234,34 @@ bool Qt3DSDMTimelineItemBinding::HasAction(bool inMaster) return theActions.size() > 0; } +ITimelineItem::ActivateActions Qt3DSDMTimelineItemBinding::getActivateActions() +{ + TActionHandleList theActions; + CDoc *theDoc = g_StudioApp.GetCore()->GetDoc(); + + Qt3DSDMSlideHandle theSlide = theDoc->GetActiveSlide(); + qt3dsdm::ISlideCore &theSlideCore(*m_StudioSystem->GetSlideCore()); + if (theSlideCore.IsSlide(theSlide)) { + m_StudioSystem->GetActionCore()->GetActions(theSlide, m_DataHandle, theActions); + // Check also master slide, to get actions inside component + TActionHandleList masterActions; + Qt3DSDMSlideHandle masterSlide = m_StudioSystem->GetSlideSystem()->GetMasterSlide(theSlide); + m_StudioSystem->GetActionCore()->GetActions(masterSlide, m_DataHandle, masterActions); + theActions.insert(theActions.end(), masterActions.begin(), masterActions.end()); + } + + ITimelineItem::ActivateActions activateActions = ITimelineItem::ActivateAction::None; + for (auto theIter = theActions.begin(); theIter != theActions.end(); ++theIter) { + auto info = m_StudioSystem->GetActionCore()->GetActionInfo(*theIter); + if (info.m_Event == L"onActivate") + activateActions |= ITimelineItem::ActivateAction::Activate; + else if (info.m_Event == L"onDeactivate") + activateActions |= ITimelineItem::ActivateAction::Deactivate; + } + + return activateActions; +} + bool Qt3DSDMTimelineItemBinding::ChildrenHasAction(bool inMaster) { // Get all the instances in this slidegraph diff --git a/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.h b/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.h index 3980c0e1..4f7084d2 100644 --- a/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.h +++ b/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.h @@ -107,6 +107,7 @@ public: bool IsVisible() const override; void SetVisible(bool) override; bool HasAction(bool inMaster) override; + ITimelineItem::ActivateActions getActivateActions() override; bool IsVisibilityControlled() const override; bool ChildrenHasAction(bool inMaster) override; bool ComponentHasAction(bool inMaster) override; diff --git a/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/TimelineTranslationManager.cpp b/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/TimelineTranslationManager.cpp index c03867a7..2264d232 100644 --- a/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/TimelineTranslationManager.cpp +++ b/src/Authoring/Qt3DStudio/Palettes/Timeline/Bindings/TimelineTranslationManager.cpp @@ -82,7 +82,7 @@ ITimelineItemBinding *CTimelineTranslationManager::GetOrCreate(Qt3DSDMInstanceHa theReturn = new CLayerTimelineItemBinding(this, inInstance); } else if (objType & (OBJTYPE_MODEL | OBJTYPE_TEXT | OBJTYPE_CAMERA | OBJTYPE_EFFECT | OBJTYPE_LIGHT | OBJTYPE_RENDERPLUGIN | OBJTYPE_ALIAS - | OBJTYPE_SUBPATH)) + | OBJTYPE_SUBPATH | OBJTYPE_SIGNAL)) theReturn = new Qt3DSDMTimelineItemBinding(this, inInstance); else { // Add support for additional DataModel types here. diff --git a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/TimelineConstants.h b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/TimelineConstants.h index 02d08141..365bb88b 100644 --- a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/TimelineConstants.h +++ b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/TimelineConstants.h @@ -62,6 +62,7 @@ namespace TimelineConstants const int DURATION_HANDLE_W = 14; // width of duration end handles in a timeline row const int NAVIGATION_BAR_H = 30; // height of navigation/breadcrumb bar const int TIMEBAR_TOOLTIP_OFFSET_V = 10; + const int ACTION_W = 4; // Other const int EXPAND_ANIMATION_DURATION = 200; diff --git a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/TimelineWidget.cpp b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/TimelineWidget.cpp index d05fe12d..4b599cbf 100644 --- a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/TimelineWidget.cpp +++ b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/TimelineWidget.cpp @@ -385,6 +385,9 @@ void TimelineWidget::OnNewPresentation() m_connections.push_back(theSignalProvider->ConnectActionDeleted( std::bind(&TimelineWidget::onActionEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3))); + m_connections.push_back(theSignalProvider->ConnectEventSet( + std::bind(&TimelineWidget::onActionModifiedEvent, this, + std::placeholders::_1))); // connect property linked/unlinked m_connections.push_back(theSignalProvider->ConnectPropertyLinked( @@ -741,6 +744,7 @@ void TimelineWidget::updateActionStates(const QSet<RowTree *> &rows) states |= RowTree::ActionState::ComponentAction; } row->setActionStates(states); + row->setActivateActions(binding->getActivateActions()); } } @@ -994,6 +998,15 @@ void TimelineWidget::onAsyncUpdate() m_graphicsScene->rowManager()->finalizeRowDeletions(); } +void TimelineWidget::onActionModifiedEvent(qt3dsdm::Qt3DSDMActionHandle inAction) +{ + // We don't have action owner here, so just do full reconstruct as action + // event types are anyway rarely changed. + m_fullReconstruct = true; + if (!m_asyncUpdateTimer.isActive()) + m_asyncUpdateTimer.start(); +} + void TimelineWidget::onActionEvent(qt3dsdm::Qt3DSDMActionHandle inAction, qt3dsdm::Qt3DSDMSlideHandle inSlide, qt3dsdm::Qt3DSDMInstanceHandle inOwner) diff --git a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/TimelineWidget.h b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/TimelineWidget.h index ed27f924..9804a03e 100644 --- a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/TimelineWidget.h +++ b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/TimelineWidget.h @@ -117,6 +117,7 @@ protected: qt3dsdm::Qt3DSDMPropertyHandle property); void onActionEvent(qt3dsdm::Qt3DSDMActionHandle inAction, qt3dsdm::Qt3DSDMSlideHandle inSlide, qt3dsdm::Qt3DSDMInstanceHandle inOwner); + void onActionModifiedEvent(qt3dsdm::Qt3DSDMActionHandle inAction); void onPropertyLinked(qt3dsdm::Qt3DSDMInstanceHandle inInstance, qt3dsdm::Qt3DSDMPropertyHandle inProperty); void onPropertyUnlinked(qt3dsdm::Qt3DSDMInstanceHandle inInstance, diff --git a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTimeline.cpp b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTimeline.cpp index 2d7cf19d..b2a8f6dc 100644 --- a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTimeline.cpp +++ b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTimeline.cpp @@ -219,6 +219,18 @@ void RowTimeline::paint(QPainter *painter, const QStyleOptionGraphicsItem *optio painter->drawLine(startXActual, 0, startXActual, currHeight); painter->drawLine(edgeOffset + m_endX, 0, edgeOffset + m_endX, currHeight); } + + // Paint possible timeline actions + auto actions = m_rowTree->m_activateActions; + bool paintActivate = actions.testFlag(ITimelineItem::ActivateAction::Activate); + bool paintDeactivate = actions.testFlag(ITimelineItem::ActivateAction::Deactivate); + int aw = TimelineConstants::ACTION_W; + QColor aColor = CStudioPreferences::timelineActionColor(); + if (paintActivate) + painter->fillRect(QRect(x - aw/2, 0, aw, currHeight), aColor); + if (paintDeactivate) + painter->fillRect(QRect(x + w - aw/2, 0, aw, currHeight), aColor); + } painter->restore(); diff --git a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.cpp b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.cpp index bc9f7a63..aca0ef3c 100644 --- a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.cpp +++ b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.cpp @@ -424,6 +424,7 @@ void RowTree::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q static const QPixmap pixTextNormal(":/images/Objects-Text-Normal.png"); static const QPixmap pixAliasNormal(":/images/Objects-Alias-Normal.png"); static const QPixmap pixGroupNormal(":/images/Objects-Group-Normal.png"); + static const QPixmap pixSignalNormal(":/images/Objects-Signal-Normal.png"); static const QPixmap pixComponentNormal(":/images/Objects-Component-Normal.png"); static const QPixmap pixMaterialNormal(":/images/Objects-Material-Normal.png"); static const QPixmap pixPropertyNormal(":/images/Objects-Property-Normal.png"); @@ -438,6 +439,7 @@ void RowTree::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q static const QPixmap pixTextNormal2x(":/images/Objects-Text-Normal@2x.png"); static const QPixmap pixAliasNormal2x(":/images/Objects-Alias-Normal@2x.png"); static const QPixmap pixGroupNormal2x(":/images/Objects-Group-Normal@2x.png"); + static const QPixmap pixSignalNormal2x(":/images/Objects-Signal-Normal@2x.png"); static const QPixmap pixComponentNormal2x(":/images/Objects-Component-Normal@2x.png"); static const QPixmap pixMaterialNormal2x(":/images/Objects-Material-Normal@2x.png"); static const QPixmap pixPropertyNormal2x(":/images/Objects-Property-Normal@2x.png"); @@ -453,6 +455,7 @@ void RowTree::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q static const QPixmap pixTextDisabled(":/images/Objects-Text-Disabled.png"); static const QPixmap pixAliasDisabled(":/images/Objects-Alias-Disabled.png"); static const QPixmap pixGroupDisabled(":/images/Objects-Group-Disabled.png"); + static const QPixmap pixSignalDisabled(":/images/Objects-Signal-Disabled.png"); static const QPixmap pixComponentDisabled(":/images/Objects-Component-Disabled.png"); static const QPixmap pixMaterialDisabled(":/images/Objects-Material-Disabled.png"); static const QPixmap pixPropertyDisabled(":/images/Objects-Property-Disabled.png"); @@ -467,6 +470,7 @@ void RowTree::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q static const QPixmap pixTextDisabled2x(":/images/Objects-Text-Disabled@2x.png"); static const QPixmap pixAliasDisabled2x(":/images/Objects-Alias-Disabled@2x.png"); static const QPixmap pixGroupDisabled2x(":/images/Objects-Group-Disabled@2x.png"); + static const QPixmap pixSignalDisabled2x(":/images/Objects-Signal-Disabled@2x.png"); static const QPixmap pixComponentDisabled2x(":/images/Objects-Component-Disabled@2x.png"); static const QPixmap pixMaterialDisabled2x(":/images/Objects-Material-Disabled@2x.png"); static const QPixmap pixPropertyDisabled2x(":/images/Objects-Property-Disabled@2x.png"); @@ -512,6 +516,10 @@ void RowTree::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q pixRowType = hiResIcons ? (m_locked ? pixGroupDisabled2x : pixGroupNormal2x) : (m_locked ? pixGroupDisabled : pixGroupNormal); break; + case OBJTYPE_SIGNAL: + pixRowType = hiResIcons ? (m_locked ? pixSignalDisabled2x : pixSignalNormal2x) + : (m_locked ? pixSignalDisabled : pixSignalNormal); + break; case OBJTYPE_COMPONENT: pixRowType = hiResIcons ? (m_locked ? pixComponentDisabled2x : pixComponentNormal2x) : (m_locked ? pixComponentDisabled : pixComponentNormal); @@ -1336,6 +1344,14 @@ void RowTree::setActionStates(ActionStates states) } } +void RowTree::setActivateActions(ITimelineItem::ActivateActions activateActions) +{ + if (activateActions != m_activateActions) { + m_activateActions = activateActions; + update(); + } +} + bool RowTree::isContainer() const { return !m_isProperty && m_objectType & OBJTYPE_IS_CONTAINER; diff --git a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.h b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.h index 34a851b7..179292c9 100644 --- a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.h +++ b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.h @@ -35,6 +35,7 @@ #include "StudioObjectTypes.h" #include "RowTreeLabel.h" #include "Qt3DSDMHandles.h" +#include "Bindings/ITimelineItem.h" #include <QtCore/qpropertyanimation.h> #include <QtCore/qparallelanimationgroup.h> @@ -93,6 +94,7 @@ public: void removeChild(RowTree *child); void setDnDState(DnDState state, DnDState onlyIfState = DnDState::Any, bool recursive = false); void setActionStates(ActionStates states); + void setActivateActions(ITimelineItem::ActivateActions activateActions); void setTreeWidth(double w); void setBinding(ITimelineItemBinding *binding); void setPropBinding(ITimelineItemProperty *binding); // for property rows @@ -196,6 +198,7 @@ private: bool m_onMasterSlide = false; DnDState m_dndState = DnDState::None; ActionStates m_actionStates = ActionState::None; + ITimelineItem::ActivateActions m_activateActions = ITimelineItem::ActivateAction::None; bool m_hasSubpresentation = false; int m_numDescendantSubpresentations = 0; ExpandState m_expandState = ExpandState::HiddenCollapsed; diff --git a/src/Authoring/Qt3DStudio/Render/StudioRendererTranslation.cpp b/src/Authoring/Qt3DStudio/Render/StudioRendererTranslation.cpp index dcbcc83e..b07d01ed 100644 --- a/src/Authoring/Qt3DStudio/Render/StudioRendererTranslation.cpp +++ b/src/Authoring/Qt3DStudio/Render/StudioRendererTranslation.cpp @@ -1718,6 +1718,7 @@ SGraphObjectTranslator *STranslation::CreateTranslator(qt3dsdm::Qt3DSDMInstanceH // For the subset of possible instances, pick out the valid translators. switch (theType) { case qt3dsdm::ComposerObjectTypes::Group: + case qt3dsdm::ComposerObjectTypes::Signal: case qt3dsdm::ComposerObjectTypes::Component: case qt3dsdm::ComposerObjectTypes::Node: theNewTranslator = QT3DS_NEW(m_Allocator, SNodeTranslator)(inInstance, m_Allocator); diff --git a/src/Authoring/Qt3DStudio/images.qrc b/src/Authoring/Qt3DStudio/images.qrc index b808711e..9dfdee3b 100644 --- a/src/Authoring/Qt3DStudio/images.qrc +++ b/src/Authoring/Qt3DStudio/images.qrc @@ -331,6 +331,12 @@ <file>images/gradient@2x.png</file> <file>images/gradient_disabled.png</file> <file>images/gradient_disabled@2x.png</file> + <file>images/Asset-Signal-Normal.png</file> + <file>images/Asset-Signal-Normal@2x.png</file> + <file>images/Objects-Signal-Normal.png</file> + <file>images/Objects-Signal-Normal@2x.png</file> + <file>images/Objects-Signal-Disabled.png</file> + <file>images/Objects-Signal-Disabled@2x.png</file> </qresource> <qresource prefix="/startup"> <file alias="open_dialog.png">images/open_dialog.png</file> diff --git a/src/Authoring/Qt3DStudio/images/Asset-Signal-Normal.png b/src/Authoring/Qt3DStudio/images/Asset-Signal-Normal.png Binary files differnew file mode 100644 index 00000000..dda0e2c3 --- /dev/null +++ b/src/Authoring/Qt3DStudio/images/Asset-Signal-Normal.png diff --git a/src/Authoring/Qt3DStudio/images/Asset-Signal-Normal@2x.png b/src/Authoring/Qt3DStudio/images/Asset-Signal-Normal@2x.png Binary files differnew file mode 100644 index 00000000..04f34fd1 --- /dev/null +++ b/src/Authoring/Qt3DStudio/images/Asset-Signal-Normal@2x.png diff --git a/src/Authoring/Qt3DStudio/images/Objects-Signal-Disabled.png b/src/Authoring/Qt3DStudio/images/Objects-Signal-Disabled.png Binary files differnew file mode 100644 index 00000000..e1301aa4 --- /dev/null +++ b/src/Authoring/Qt3DStudio/images/Objects-Signal-Disabled.png diff --git a/src/Authoring/Qt3DStudio/images/Objects-Signal-Disabled@2x.png b/src/Authoring/Qt3DStudio/images/Objects-Signal-Disabled@2x.png Binary files differnew file mode 100644 index 00000000..905e23a1 --- /dev/null +++ b/src/Authoring/Qt3DStudio/images/Objects-Signal-Disabled@2x.png diff --git a/src/Authoring/Qt3DStudio/images/Objects-Signal-Normal.png b/src/Authoring/Qt3DStudio/images/Objects-Signal-Normal.png Binary files differnew file mode 100644 index 00000000..2463c2f1 --- /dev/null +++ b/src/Authoring/Qt3DStudio/images/Objects-Signal-Normal.png diff --git a/src/Authoring/Qt3DStudio/images/Objects-Signal-Normal@2x.png b/src/Authoring/Qt3DStudio/images/Objects-Signal-Normal@2x.png Binary files differnew file mode 100644 index 00000000..50932af4 --- /dev/null +++ b/src/Authoring/Qt3DStudio/images/Objects-Signal-Normal@2x.png |