123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #include <functional>
- #include <QGraphicsLayoutItem>
- #include <QGraphicsGridLayout>
- #include <QGraphicsScene>
- #include <qgraphicssceneevent.h>
- #include <AzCore/RTTI/TypeInfo.h>
- #include <Components/Nodes/Wrapper/WrapperNodeLayoutComponent.h>
- #include <Components/Nodes/NodeComponent.h>
- #include <Components/Nodes/NodeLayerControllerComponent.h>
- #include <Components/Nodes/General/GeneralNodeFrameComponent.h>
- #include <Components/Nodes/General/GeneralSlotLayoutComponent.h>
- #include <Components/Nodes/General/GeneralNodeTitleComponent.h>
- #include <Components/StylingComponent.h>
- #include <GraphCanvas/Components/GeometryBus.h>
- #include <GraphCanvas/Components/Slots/SlotBus.h>
- #include <GraphCanvas/Editor/AssetEditorBus.h>
- #include <GraphCanvas/Components/VisualBus.h>
- #include <GraphCanvas/Editor/GraphModelBus.h>
- #include <GraphCanvas/tools.h>
- #include <GraphCanvas/Styling/StyleHelper.h>
- #include <GraphCanvas/Utils/GraphUtils.h>
- namespace GraphCanvas
- {
- //////////////////////
- // WrappedNodeLayout
- //////////////////////
-
- WrapperNodeLayoutComponent::WrappedNodeLayout::WrappedNodeLayout(WrapperNodeLayoutComponent& wrapperLayoutComponent)
- : QGraphicsWidget(nullptr)
- , m_wrapperLayoutComponent(wrapperLayoutComponent)
- {
- setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
- m_layout = new QGraphicsLinearLayout(Qt::Vertical);
- setLayout(m_layout);
- }
- WrapperNodeLayoutComponent::WrappedNodeLayout::~WrappedNodeLayout()
- {
- }
-
- void WrapperNodeLayoutComponent::WrappedNodeLayout::RefreshStyle()
- {
- prepareGeometryChange();
- m_styleHelper.SetStyle(m_wrapperLayoutComponent.GetEntityId(), Styling::Elements::WrapperNode::NodeLayout);
- qreal margin = m_styleHelper.GetAttribute(Styling::Attribute::Margin, 0.0);
- setContentsMargins(margin, margin, margin, margin);
- setMinimumSize(m_styleHelper.GetMinimumSize());
- setMaximumSize(m_styleHelper.GetMaximumSize());
-
- // Layout spacing
- m_layout->setSpacing(m_styleHelper.GetAttribute(Styling::Attribute::Spacing, 0.0));
-
- m_layout->invalidate();
- m_layout->updateGeometry();
- updateGeometry();
- update();
- }
-
- void WrapperNodeLayoutComponent::WrappedNodeLayout::RefreshLayout()
- {
- prepareGeometryChange();
- ClearLayout();
- LayoutItems();
- }
-
- void WrapperNodeLayoutComponent::WrappedNodeLayout::LayoutItems()
- {
- if (!m_wrapperLayoutComponent.m_wrappedNodes.empty())
- {
- setVisible(true);
- for (const AZ::EntityId& nodeId : m_wrapperLayoutComponent.m_wrappedNodes)
- {
- QGraphicsLayoutItem* rootLayoutItem = nullptr;
- SceneMemberUIRequestBus::EventResult(rootLayoutItem, nodeId, &SceneMemberUIRequests::GetRootGraphicsLayoutItem);
- if (rootLayoutItem)
- {
- m_layout->addItem(rootLayoutItem);
- }
- }
- updateGeometry();
- update();
- }
- else
- {
- setVisible(false);
- }
- }
-
- void WrapperNodeLayoutComponent::WrappedNodeLayout::ClearLayout()
- {
- while (m_layout->count() > 0)
- {
- QGraphicsLayoutItem* layoutItem = m_layout->itemAt(m_layout->count() - 1);
- m_layout->removeAt(m_layout->count() - 1);
- layoutItem->setParentLayoutItem(nullptr);
- }
- }
- ////////////////////////////////////
- // WrappedNodeActionGraphicsWidget
- ////////////////////////////////////
- WrapperNodeLayoutComponent::WrappedNodeActionGraphicsWidget::WrappedNodeActionGraphicsWidget(WrapperNodeLayoutComponent& wrapperLayoutComponent)
- : QGraphicsWidget(nullptr)
- , m_wrapperLayoutComponent(wrapperLayoutComponent)
- , m_styleState(StyleState::Empty)
- {
- setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
- setFlag(ItemIsFocusable);
- setAcceptHoverEvents(true);
- setAcceptDrops(true);
- QGraphicsLinearLayout* paddingLayout = new QGraphicsLinearLayout(Qt::Vertical);
- paddingLayout->setContentsMargins(6, 6, 6, 6);
- paddingLayout->setSpacing(0);
- m_displayLabel = new GraphCanvasLabel();
- m_displayLabel->setZValue(1);
- m_displayLabel->setFlag(ItemIsFocusable);
- m_displayLabel->setFocusPolicy(Qt::StrongFocus);
- m_displayLabel->setAcceptDrops(true);
- m_displayLabel->setAcceptHoverEvents(true);
- m_displayLabel->setAcceptedMouseButtons(Qt::MouseButton::LeftButton);
- paddingLayout->addItem(m_displayLabel);
- setLayout(paddingLayout);
- }
- void WrapperNodeLayoutComponent::WrappedNodeActionGraphicsWidget::OnAddedToScene()
- {
- m_displayLabel->installSceneEventFilter(this);
- }
- void WrapperNodeLayoutComponent::WrappedNodeActionGraphicsWidget::RefreshStyle()
- {
- switch (m_styleState)
- {
- case StyleState::Empty:
- m_displayLabel->SetStyle(m_wrapperLayoutComponent.GetEntityId(), Styling::Elements::WrapperNode::ActionLabelEmptyNodes);
- break;
- case StyleState::HasElements:
- m_displayLabel->SetStyle(m_wrapperLayoutComponent.GetEntityId(), Styling::Elements::WrapperNode::ActionLabel);
- break;
- }
- }
- void WrapperNodeLayoutComponent::WrappedNodeActionGraphicsWidget::SetActionString(const QString& displayString)
- {
- m_displayLabel->SetLabel(displayString.toUtf8().data());
- }
- void WrapperNodeLayoutComponent::WrappedNodeActionGraphicsWidget::SetStyleState(StyleState state)
- {
- if (m_styleState != state)
- {
- m_styleState = state;
- RefreshStyle();
- }
- }
- bool WrapperNodeLayoutComponent::WrappedNodeActionGraphicsWidget::sceneEventFilter(QGraphicsItem*, QEvent* event)
- {
- switch (event->type())
- {
- case QEvent::GraphicsSceneDragEnter:
- {
- QGraphicsSceneDragDropEvent* dragDropEvent = static_cast<QGraphicsSceneDragDropEvent*>(event);
- if (m_wrapperLayoutComponent.ShouldAcceptDrop(dragDropEvent->mimeData()))
- {
- m_acceptDrop = true;
- dragDropEvent->accept();
- dragDropEvent->acceptProposedAction();
- m_displayLabel->GetStyleHelper().AddSelector(Styling::States::ValidDrop);
- }
- else
- {
- m_acceptDrop = false;
- m_displayLabel->GetStyleHelper().AddSelector(Styling::States::InvalidDrop);
- }
- m_displayLabel->update();
- return true;
- }
- case QEvent::GraphicsSceneDragLeave:
- {
- event->accept();
- if (m_acceptDrop)
- {
- m_displayLabel->GetStyleHelper().RemoveSelector(Styling::States::ValidDrop);
- m_acceptDrop = false;
- m_wrapperLayoutComponent.OnDragLeave();
- }
- else
- {
- m_displayLabel->GetStyleHelper().RemoveSelector(Styling::States::InvalidDrop);
- }
- m_displayLabel->update();
- return true;
- }
- case QEvent::GraphicsSceneDrop:
- {
- if (m_acceptDrop)
- {
- m_displayLabel->GetStyleHelper().RemoveSelector(Styling::States::ValidDrop);
- }
- else
- {
- m_displayLabel->GetStyleHelper().RemoveSelector(Styling::States::InvalidDrop);
- }
- m_displayLabel->update();
- break;
- }
- case QEvent::GraphicsSceneMousePress:
- {
- return true;
- }
- case QEvent::GraphicsSceneMouseRelease:
- {
- QGraphicsSceneMouseEvent* mouseEvent = static_cast<QGraphicsSceneMouseEvent*>(event);
- m_wrapperLayoutComponent.OnActionWidgetClicked(mouseEvent->scenePos(), mouseEvent->screenPos());
- return true;
- }
- default:
- break;
- }
- return false;
- }
-
- ///////////////////////////////
- // WrapperNodeLayoutComponent
- ///////////////////////////////
-
- void WrapperNodeLayoutComponent::Reflect(AZ::ReflectContext* context)
- {
- AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
- if (serializeContext)
- {
- serializeContext->Class<WrappedNodeConfiguration>()
- ->Version(1)
- ->Field("LayoutOrder", &WrappedNodeConfiguration::m_layoutOrder)
- ->Field("ElementOrder", &WrappedNodeConfiguration::m_elementOrdering)
- ;
- serializeContext->Class<WrapperNodeLayoutComponent, NodeLayoutComponent>()
- ->Version(2)
- ->Field("ElementOrdering", &WrapperNodeLayoutComponent::m_elementCounter)
- ->Field("WrappedNodeConfigurations", &WrapperNodeLayoutComponent::m_wrappedNodeConfigurations)
- ;
- }
- }
- AZ::Entity* WrapperNodeLayoutComponent::CreateWrapperNodeEntity(const char* nodeType)
- {
- // Create this Node's entity.
- AZ::Entity* entity = NodeComponent::CreateCoreNodeEntity();
- entity->CreateComponent<GeneralNodeFrameComponent>();
- entity->CreateComponent<StylingComponent>(Styling::Elements::WrapperNode::Node, AZ::EntityId(), nodeType);
- entity->CreateComponent<WrapperNodeLayoutComponent>();
- entity->CreateComponent<GeneralNodeTitleComponent>();
- entity->CreateComponent<GeneralSlotLayoutComponent>();
- entity->CreateComponent<NodeLayerControllerComponent>();
- return entity;
- }
- WrapperNodeLayoutComponent::WrapperNodeLayoutComponent()
- : m_elementCounter(0)
- , m_wrappedNodes(WrappedNodeConfigurationComparator(&m_wrappedNodeConfigurations))
- , m_title(nullptr)
- , m_slots(nullptr)
- , m_wrappedNodeLayout(nullptr)
- {
- }
- WrapperNodeLayoutComponent::~WrapperNodeLayoutComponent()
- {
- }
- void WrapperNodeLayoutComponent::Init()
- {
- NodeLayoutComponent::Init();
- m_layout = new QGraphicsLinearLayout(Qt::Vertical);
- GetLayoutAs<QGraphicsLinearLayout>()->setInstantInvalidatePropagation(true);
-
- m_wrappedNodeLayout = aznew WrappedNodeLayout((*this));
- m_wrapperNodeActionWidget = aznew WrappedNodeActionGraphicsWidget((*this));
-
- for (auto& mapPair : m_wrappedNodeConfigurations)
- {
- m_wrappedNodes.insert(mapPair.first);
- }
- }
- void WrapperNodeLayoutComponent::Activate()
- {
- NodeLayoutComponent::Activate();
- SceneMemberNotificationBus::MultiHandler::BusConnect(GetEntityId());
- NodeNotificationBus::MultiHandler::BusConnect(GetEntityId());
- WrapperNodeRequestBus::Handler::BusConnect(GetEntityId());
- }
- void WrapperNodeLayoutComponent::Deactivate()
- {
- ClearLayout();
- NodeLayoutComponent::Deactivate();
- NodeNotificationBus::MultiHandler::BusDisconnect();
- SceneMemberNotificationBus::MultiHandler::BusDisconnect();
- WrapperNodeRequestBus::Handler::BusDisconnect();
- StyleNotificationBus::Handler::BusDisconnect();
- }
- void WrapperNodeLayoutComponent::SetActionString(const QString& actionString)
- {
- m_wrapperNodeActionWidget->SetActionString(actionString);
- }
- AZStd::vector< AZ::EntityId > WrapperNodeLayoutComponent::GetWrappedNodeIds() const
- {
- return AZStd::vector< AZ::EntityId >(m_wrappedNodes.begin(), m_wrappedNodes.end());
- }
-
- void WrapperNodeLayoutComponent::WrapNode(const AZ::EntityId& nodeId, const WrappedNodeConfiguration& nodeConfiguration)
- {
- if (m_wrappedNodeConfigurations.find(nodeId) == m_wrappedNodeConfigurations.end())
- {
- NodeNotificationBus::MultiHandler::BusConnect(nodeId);
- SceneMemberNotificationBus::MultiHandler::BusConnect(nodeId);
- NodeRequestBus::Event(nodeId, &NodeRequests::SetWrappingNode, GetEntityId());
- WrapperNodeNotificationBus::Event(GetEntityId(), &WrapperNodeNotifications::OnWrappedNode, nodeId);
- m_wrappedNodeConfigurations[nodeId] = nodeConfiguration;
- m_wrappedNodeConfigurations[nodeId].m_elementOrdering = m_elementCounter;
-
- ++m_elementCounter;
-
- m_wrappedNodes.insert(nodeId);
- m_wrappedNodeLayout->RefreshLayout();
- NodeUIRequestBus::Event(GetEntityId(), &NodeUIRequests::AdjustSize);
- RootGraphicsItemEnabledState enabledState = RootGraphicsItemEnabledState::ES_Enabled;
- RootGraphicsItemRequestBus::EventResult(enabledState, GetEntityId(), &RootGraphicsItemRequests::GetEnabledState);
- RootGraphicsItemRequestBus::Event(nodeId, &RootGraphicsItemRequests::SetEnabledState, enabledState);
- RefreshActionStyle();
- }
- }
-
- void WrapperNodeLayoutComponent::UnwrapNode(const AZ::EntityId& nodeId)
- {
- auto configurationIter = m_wrappedNodeConfigurations.find(nodeId);
- if (configurationIter != m_wrappedNodeConfigurations.end())
- {
- SceneMemberNotificationBus::MultiHandler::BusDisconnect(nodeId);
- NodeNotificationBus::MultiHandler::BusDisconnect(nodeId);
- NodeRequestBus::Event(nodeId, &NodeRequests::SetWrappingNode, AZ::EntityId());
- WrapperNodeNotificationBus::Event(GetEntityId(), &WrapperNodeNotifications::OnUnwrappedNode, nodeId);
- m_wrappedNodes.erase(nodeId);
- m_wrappedNodeConfigurations.erase(configurationIter);
- m_wrappedNodeLayout->RefreshLayout();
- NodeUIRequestBus::Event(GetEntityId(), &NodeUIRequests::AdjustSize);
- // If we unwrap something just set it to enabled.
- RootGraphicsItemRequestBus::Event(nodeId, &RootGraphicsItemRequests::SetEnabledState, RootGraphicsItemEnabledState::ES_Enabled);
- RefreshActionStyle();
- }
- }
- void WrapperNodeLayoutComponent::SetWrapperType(const AZ::Crc32& wrapperType)
- {
- m_wrapperType = wrapperType;
- }
- AZ::Crc32 WrapperNodeLayoutComponent::GetWrapperType() const
- {
- return m_wrapperType;
- }
- void WrapperNodeLayoutComponent::OnNodeActivated()
- {
- AZ::EntityId nodeId = (*NodeNotificationBus::GetCurrentBusId());
- if (nodeId == GetEntityId())
- {
- CreateLayout();
- }
- }
- void WrapperNodeLayoutComponent::OnAddedToScene(const AZ::EntityId& /*sceneId*/)
- {
- AZ::EntityId nodeId = (*NodeNotificationBus::GetCurrentBusId());
- if (nodeId == GetEntityId())
- {
- for (const AZ::EntityId& wrappedNodeId : m_wrappedNodes)
- {
- NodeNotificationBus::MultiHandler::BusConnect(wrappedNodeId);
- // Test to make sure the node is activated before we signal out anything to it.
- //
- // We listen for when the node activates, so these calls will be handled there.
- if (NodeRequestBus::FindFirstHandler(wrappedNodeId) != nullptr)
- {
- NodeRequestBus::Event(wrappedNodeId, &NodeRequests::SetWrappingNode, GetEntityId());
- WrapperNodeNotificationBus::Event(GetEntityId(), &WrapperNodeNotifications::OnWrappedNode, wrappedNodeId);
- }
- }
- RefreshActionStyle();
- UpdateLayout();
- OnStyleChanged();
- // Event filtering for graphics items can only be done by items in the same scene.
- // and by objects that are in a scene. So I need to wait for them to be added to the
- // scene before installing my filters.
- m_wrapperNodeActionWidget->OnAddedToScene();
- StyleNotificationBus::Handler::BusConnect(GetEntityId());
- }
- else
- {
- NodeRequestBus::Event(nodeId, &NodeRequests::SetWrappingNode, GetEntityId());
- WrapperNodeNotificationBus::Event(GetEntityId(), &WrapperNodeNotifications::OnWrappedNode, nodeId);
- // Sort ick, but should work for now.
- // Mostly ick because it'll redo this layout waaaay to many times.
- UpdateLayout();
- }
- }
- void WrapperNodeLayoutComponent::OnSceneMemberAboutToSerialize(GraphSerialization& sceneSerialization)
- {
- AZ::EntityId nodeId = (*SceneMemberNotificationBus::GetCurrentBusId());
- if (nodeId == GetEntityId())
- {
- AZStd::unordered_set<AZ::EntityId> memberIds;
- memberIds.insert(m_wrappedNodes.begin(), m_wrappedNodes.end());
- GraphUtils::ParseMembersForSerialization(sceneSerialization, memberIds);
- }
- }
- void WrapperNodeLayoutComponent::OnSceneMemberDeserialized(const AZ::EntityId& /*graphId*/, const GraphSerialization& sceneSerialization)
- {
- AZ::EntityId nodeId = (*SceneMemberNotificationBus::GetCurrentBusId());
- if (nodeId == GetEntityId())
- {
- m_elementCounter = 0;
- m_wrappedNodes.clear();
- WrappedNodeConfigurationMap oldConfigurations = m_wrappedNodeConfigurations;
- m_wrappedNodeConfigurations.clear();
- for (const auto& configurationPair : oldConfigurations)
- {
- if (sceneSerialization.FindRemappedEntityId(configurationPair.first).IsValid())
- {
- m_wrappedNodeConfigurations.insert(configurationPair);
- m_wrappedNodes.insert(configurationPair.first);
- }
- }
- }
- }
- void WrapperNodeLayoutComponent::OnRemovedFromScene(const AZ::EntityId& sceneId)
- {
- AZ::EntityId nodeId = (*SceneMemberNotificationBus::GetCurrentBusId());
- if (nodeId == GetEntityId())
- {
- // We are about to remove everything.
- // So we don't really need to update ourselves to keep our state in order.
- SceneMemberNotificationBus::MultiHandler::BusDisconnect();
- AZStd::unordered_set< AZ::EntityId > deleteNodes(m_wrappedNodes.begin(), m_wrappedNodes.end());
- SceneRequestBus::Event(sceneId, &SceneRequests::Delete, deleteNodes);
- }
- else
- {
- UnwrapNode(nodeId);
- }
- }
- void WrapperNodeLayoutComponent::OnStyleChanged()
- {
- m_styleHelper.SetStyle(GetEntityId());
- qreal border = m_styleHelper.GetAttribute(Styling::Attribute::BorderWidth, 0.0);
- qreal spacing = m_styleHelper.GetAttribute(Styling::Attribute::Spacing, 0.0);
- qreal margin = m_styleHelper.GetAttribute(Styling::Attribute::Margin, 0.0);
- GetLayoutAs<QGraphicsLinearLayout>()->setContentsMargins(margin + border, margin + border, margin + border, margin + border);
- GetLayoutAs<QGraphicsLinearLayout>()->setSpacing(spacing);
- m_wrappedNodeLayout->RefreshStyle();
- m_wrapperNodeActionWidget->RefreshStyle();
- RefreshDisplay();
- }
- void WrapperNodeLayoutComponent::RefreshActionStyle()
- {
- if (!m_wrappedNodes.empty())
- {
- m_wrapperNodeActionWidget->SetStyleState(WrappedNodeActionGraphicsWidget::StyleState::HasElements);
- }
- else
- {
- m_wrapperNodeActionWidget->SetStyleState(WrappedNodeActionGraphicsWidget::StyleState::Empty);
- }
- }
- bool WrapperNodeLayoutComponent::ShouldAcceptDrop(const QMimeData* mimeData) const
- {
- AZ::EntityId sceneId;
- SceneMemberRequestBus::EventResult(sceneId, GetEntityId(), &SceneMemberRequests::GetScene);
- bool shouldAcceptDrop = false;
- GraphModelRequestBus::EventResult(shouldAcceptDrop, sceneId, &GraphModelRequests::ShouldWrapperAcceptDrop, GetEntityId(), mimeData);
- if (shouldAcceptDrop)
- {
- GraphModelRequestBus::Event(sceneId, &GraphModelRequests::AddWrapperDropTarget, GetEntityId());
- }
- return shouldAcceptDrop;
- }
- void WrapperNodeLayoutComponent::OnDragLeave() const
- {
- AZ::EntityId sceneId;
- SceneMemberRequestBus::EventResult(sceneId, GetEntityId(), &SceneMemberRequests::GetScene);
- GraphModelRequestBus::Event(sceneId, &GraphModelRequests::RemoveWrapperDropTarget, GetEntityId());
- }
- void WrapperNodeLayoutComponent::OnActionWidgetClicked(const QPointF& scenePoint, const QPoint& screenPoint) const
- {
- AZ::EntityId sceneId;
- SceneMemberRequestBus::EventResult(sceneId, GetEntityId(), &SceneMemberRequests::GetScene);
- EditorId editorId;
- SceneRequestBus::EventResult(editorId, sceneId, &SceneRequests::GetEditorId);
- AssetEditorRequestBus::Event(editorId, &AssetEditorRequests::OnWrapperNodeActionWidgetClicked, GetEntityId(), m_wrapperNodeActionWidget->boundingRect().toRect(), scenePoint, screenPoint);
- }
-
- void WrapperNodeLayoutComponent::ClearLayout()
- {
- if (m_layout)
- {
- for (int i=m_layout->count() - 1; i >= 0; --i)
- {
- m_layout->removeAt(i);
- }
- }
- }
- void WrapperNodeLayoutComponent::CreateLayout()
- {
- ClearLayout();
- if (m_title == nullptr)
- {
- NodeTitleRequestBus::EventResult(m_title, GetEntityId(), &NodeTitleRequests::GetGraphicsWidget);
- }
- if (m_slots == nullptr)
- {
- NodeSlotsRequestBus::EventResult(m_slots, GetEntityId(), &NodeSlotsRequests::GetGraphicsLayoutItem);
- }
- if (m_title)
- {
- GetLayoutAs<QGraphicsLinearLayout>()->addItem(m_title);
- }
- if (m_slots)
- {
- GetLayoutAs<QGraphicsLinearLayout>()->addItem(m_slots);
- }
- GetLayoutAs<QGraphicsLinearLayout>()->addItem(m_wrappedNodeLayout);
- GetLayoutAs<QGraphicsLinearLayout>()->addItem(m_wrapperNodeActionWidget);
- }
-
- void WrapperNodeLayoutComponent::UpdateLayout()
- {
- m_wrappedNodeLayout->RefreshLayout();
-
- RefreshDisplay();
- }
-
- void WrapperNodeLayoutComponent::RefreshDisplay()
- {
- m_layout->invalidate();
- m_layout->updateGeometry();
- }
- }
|