123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- /*
- * 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 <QCoreApplication>
- #include <QGraphicsLayoutItem>
- #include <QGraphicsScene>
- #include <QGraphicsSceneEvent>
- #include <QSizePolicy>
- #include <Components/Slots/Extender/ExtenderSlotLayoutComponent.h>
- #include <GraphCanvas/Components/Slots/SlotBus.h>
- #include <GraphCanvas/Components/Slots/Extender/ExtenderSlotBus.h>
- #include <GraphCanvas/Editor/GraphModelBus.h>
- #include <GraphCanvas/GraphCanvasBus.h>
- #include <GraphCanvas/GraphicsItems/GraphCanvasSceneEventFilter.h>
- #include <Components/Slots/Extender/ExtenderSlotConnectionPin.h>
- #include <Widgets/GraphCanvasLabel.h>
- namespace GraphCanvas
- {
- class ExtenderLabelEventFilter
- : public SceneEventFilter
- {
- public:
- AZ_CLASS_ALLOCATOR(ExtenderLabelEventFilter, AZ::SystemAllocator);
- ExtenderLabelEventFilter(const SlotId& slotId)
- : SceneEventFilter(nullptr)
- , m_trackClick(false)
- , m_slotId(slotId)
- {
- }
- bool sceneEventFilter(QGraphicsItem* item, QEvent* event) override
- {
- switch (event->type())
- {
- case QEvent::GraphicsSceneMousePress:
- {
- m_trackClick = true;
- return true;
- }
- case QEvent::GraphicsSceneMouseRelease:
- {
- QGraphicsSceneMouseEvent* mouseEvent = static_cast<QGraphicsSceneMouseEvent*>(event);
- if (m_trackClick && item->sceneBoundingRect().contains(mouseEvent->scenePos()))
- {
- m_trackClick = false;
- ExtenderSlotRequestBus::Event(m_slotId, &ExtenderSlotRequests::TriggerExtension);
- }
- return true;
- }
- default:
- break;
- }
- return false;
- }
- private:
- bool m_trackClick;
- SlotId m_slotId;
- };
- ///////////////////////
- // ExtenderSlotLayout
- ///////////////////////
- ExtenderSlotLayout::ExtenderSlotLayout(ExtenderSlotLayoutComponent& owner)
- : m_connectionType(ConnectionType::CT_Invalid)
- , m_owner(owner)
- {
- setInstantInvalidatePropagation(true);
- setOrientation(Qt::Horizontal);
- // Event Filter needs to be in the same scene. Ergo we will wait until the scene is set before trying
- // to install this event filter.
- m_slotLabelFilter = aznew ExtenderLabelEventFilter(owner.GetEntityId());
- m_slotConnectionPin = aznew ExtenderSlotConnectionPin(owner.GetEntityId());
- m_slotText = aznew GraphCanvasLabel();
- m_slotText->setAcceptHoverEvents(true);
- m_slotText->setAcceptedMouseButtons(Qt::MouseButton::LeftButton);
- }
- ExtenderSlotLayout::~ExtenderSlotLayout()
- {
- m_slotText->removeSceneEventFilter(m_slotLabelFilter);
- delete m_slotLabelFilter;
- }
- void ExtenderSlotLayout::Activate()
- {
- SceneMemberNotificationBus::Handler::BusConnect(m_owner.GetEntityId());
- SlotNotificationBus::Handler::BusConnect(m_owner.GetEntityId());
- StyleNotificationBus::Handler::BusConnect(m_owner.GetEntityId());
- m_slotConnectionPin->Activate();
- }
- void ExtenderSlotLayout::Deactivate()
- {
- m_slotConnectionPin->Deactivate();
- SceneMemberNotificationBus::Handler::BusDisconnect();
- SlotNotificationBus::Handler::BusDisconnect();
- StyleNotificationBus::Handler::BusDisconnect();
- }
- void ExtenderSlotLayout::OnSceneSet(const AZ::EntityId& graphId)
- {
- SlotRequestBus::EventResult(m_connectionType, m_owner.GetEntityId(), &SlotRequests::GetConnectionType);
- AZStd::string slotName;
- SlotRequestBus::EventResult(slotName, m_owner.GetEntityId(), &SlotRequests::GetName);
- m_slotText->SetLabel(slotName);
- AZStd::string toolTip;
- SlotRequestBus::EventResult(toolTip, m_owner.GetEntityId(), &SlotRequests::GetTooltip);
- OnTooltipChanged(toolTip);
- QGraphicsScene* graphicsScene = nullptr;
- SceneRequestBus::EventResult(graphicsScene, graphId, &SceneRequests::AsQGraphicsScene);
- if (graphicsScene)
- {
- graphicsScene->addItem(m_slotLabelFilter);
- }
- UpdateLayout();
- OnStyleChanged();
- }
- void ExtenderSlotLayout::OnSceneReady()
- {
- OnStyleChanged();
- }
- void ExtenderSlotLayout::OnRegisteredToNode(const AZ::EntityId& /*nodeId*/)
- {
- OnStyleChanged();
- }
- void ExtenderSlotLayout::OnNameChanged(const AZStd::string& name)
- {
- m_slotText->SetLabel(name);
- }
- void ExtenderSlotLayout::OnTooltipChanged(const AZStd::string& tooltip)
- {
- m_slotConnectionPin->setToolTip(tooltip.c_str());
- m_slotText->setToolTip(tooltip.c_str());
- }
-
- void ExtenderSlotLayout::OnStyleChanged()
- {
- m_style.SetStyle(m_owner.GetEntityId());
- switch (m_connectionType)
- {
- case ConnectionType::CT_Input:
- m_slotText->SetStyle(m_owner.GetEntityId(), ".inputSlotName");
- break;
- case ConnectionType::CT_Output:
- m_slotText->SetStyle(m_owner.GetEntityId(), ".outputSlotName");
- break;
- default:
- m_slotText->SetStyle(m_owner.GetEntityId(), ".slotName");
- break;
- };
- m_slotConnectionPin->RefreshStyle();
- qreal padding = m_style.GetAttribute(Styling::Attribute::Padding, 2.);
- setContentsMargins(padding, padding, padding, padding);
- setSpacing(m_style.GetAttribute(Styling::Attribute::Spacing, 2.));
- UpdateGeometry();
- }
- void ExtenderSlotLayout::UpdateLayout()
- {
- for (int i = count() - 1; i >= 0; --i)
- {
- removeAt(i);
- }
- switch (m_connectionType)
- {
- case ConnectionType::CT_Input:
- addItem(m_slotConnectionPin);
- setAlignment(m_slotConnectionPin, Qt::AlignLeft);
- addItem(m_slotText);
- setAlignment(m_slotText, Qt::AlignLeft);
- break;
- case ConnectionType::CT_Output:
- addItem(m_slotText);
- setAlignment(m_slotText, Qt::AlignRight);
- addItem(m_slotConnectionPin);
- setAlignment(m_slotConnectionPin, Qt::AlignRight);
- break;
- default:
- addItem(m_slotConnectionPin);
- addItem(m_slotText);
- break;
- }
- if (m_slotText)
- {
- m_slotText->installSceneEventFilter(m_slotLabelFilter);
- }
- }
- void ExtenderSlotLayout::UpdateGeometry()
- {
- m_slotConnectionPin->updateGeometry();
- m_slotText->update();
- invalidate();
- updateGeometry();
- }
- ////////////////////////////////
- // ExtenderSlotLayoutComponent
- ////////////////////////////////
- void ExtenderSlotLayoutComponent::Reflect(AZ::ReflectContext* reflectContext)
- {
- AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(reflectContext);
- if (serializeContext)
- {
- serializeContext->Class<ExtenderSlotLayoutComponent, AZ::Component>()
- ->Version(1)
- ;
- }
- }
- ExtenderSlotLayoutComponent::ExtenderSlotLayoutComponent()
- : m_layout(nullptr)
- {
- }
- void ExtenderSlotLayoutComponent::Init()
- {
- SlotLayoutComponent::Init();
- m_layout = aznew ExtenderSlotLayout((*this));
- SetLayout(m_layout);
- }
- void ExtenderSlotLayoutComponent::Activate()
- {
- SlotLayoutComponent::Activate();
- m_layout->Activate();
- }
- void ExtenderSlotLayoutComponent::Deactivate()
- {
- SlotLayoutComponent::Deactivate();
- m_layout->Deactivate();
- }
- }
|