You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/VariableDockWidget.h

212 lines
6.9 KiB
C++

/*
* 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
*
*/
#pragma once
#if !defined(Q_MOC_RUN)
#include <AzCore/PlatformDef.h>
AZ_PUSH_DISABLE_WARNING(4244 4251 4800, "-Wunknown-warning-option")
#include <QAbstractListModel>
#include <QAbstractItemView>
#include <QListView>
#include <QVBoxLayout>
#include <QHeaderView>
#include <QTimer>
#include <QSortFilterProxyModel>
#include <QStandardItemModel>
#include <QFocusEvent>
#include <QMenu>
AZ_POP_DISABLE_WARNING
#include <AzCore/Component/EntityId.h>
#include <AzCore/Component/ComponentApplicationBus.h>
#include <AzCore/Component/Entity.h>
#include <AzCore/std/containers/vector.h>
#include <AzCore/Casting/numeric_cast.h>
#include <AzToolsFramework/API/ToolsApplicationAPI.h>
#include <AzQtComponents/Components/StyledDockWidget.h>
#include <GraphCanvas/Editor/AssetEditorBus.h>
#include <GraphCanvas/Components/GraphCanvasPropertyBus.h>
#include <GraphCanvas/Components/SceneBus.h>
#include <GraphCanvas/Components/Nodes/NodeBus.h>
#include <GraphCanvas/Components/Nodes/NodeTitleBus.h>
#include <GraphCanvas/Widgets/GraphCanvasTreeItem.h>
#include <GraphCanvas/Widgets/GraphCanvasTreeModel.h>
#include <ScriptCanvas/Bus/RequestBus.h>
#include <ScriptCanvas/Variable/VariableBus.h>
#include <ScriptCanvas/Variable/GraphVariable.h>
#include <Editor/View/Widgets/VariablePanel/VariablePaletteTableView.h>
#include <Editor/View/Widgets/VariablePanel/GraphVariablesTableView.h>
#endif
class QAction;
class QLineEdit;
class QPushButton;
namespace Ui
{
class VariableDockWidget;
}
namespace ScriptCanvasEditor
{
class VariablePropertiesComponent
: public GraphCanvas::GraphCanvasPropertyComponent
, protected ScriptCanvas::VariableNotificationBus::Handler
{
public:
AZ_COMPONENT(VariablePropertiesComponent, "{885F276B-9633-42F7-85BD-10869E606873}", GraphCanvasPropertyComponent);
static void Reflect(AZ::ReflectContext*);
static AZ::Entity* CreateVariablePropertiesEntity();
VariablePropertiesComponent();
~VariablePropertiesComponent() = default;
const char* GetTitle();
void SetVariable(ScriptCanvas::GraphVariable* variable);
private:
void OnNameChanged();
// VariableNotificationBus::Handler
void OnVariableRemoved() override;
void OnVariableRenamed(AZStd::string_view variableName) override;
void OnVariableScopeChanged() override;
void OnVariableValueChanged() override;
////
AZStd::string m_variableName;
ScriptCanvas::GraphVariable* m_variable;
ScriptCanvas::ScriptCanvasId m_scriptCanvasGraphId;
AZStd::string m_componentTitle;
};
class VariableDockWidget;
class VariablePanelContextMenu
: public QMenu
{
public:
VariablePanelContextMenu(VariableDockWidget* contextMenu, const ScriptCanvas::ScriptCanvasId& scriptCanvasExecutionId, ScriptCanvas::VariableId varId);
};
class VariableDockWidget
: public AzQtComponents::StyledDockWidget
, public GraphCanvas::AssetEditorNotificationBus::Handler
, public AzToolsFramework::EditorEvents::Bus::Handler
, public VariableAutomationRequestBus::Handler
{
Q_OBJECT
public:
AZ_CLASS_ALLOCATOR(VariableDockWidget, AZ::SystemAllocator, 0);
static AZStd::string ConstructDefaultVariableName(AZ::u32 variableCounter);
static AZStd::string FindDefaultVariableName(const ScriptCanvas::ScriptCanvasId& scriptCanvasGraphId);
VariableDockWidget(QWidget* parent = nullptr);
~VariableDockWidget();
void PopulateVariablePalette(const AZStd::unordered_set< AZ::Uuid >& objectTypes);
// GraphCanvas::AssetEditorNotificationBus::Handler
void OnActiveGraphChanged(const GraphCanvas::GraphId& graphCanvasGraphId) override;
////
// VariableAutomationRequestBus
AZStd::vector< ScriptCanvas::Data::Type > GetPrimitiveTypes() const override;
AZStd::vector< ScriptCanvas::Data::Type > GetBehaviorContextObjectTypes() const override;
AZStd::vector< ScriptCanvas::Data::Type > GetMapTypes() const override;
AZStd::vector< ScriptCanvas::Data::Type > GetArrayTypes() const override;
bool IsShowingVariablePalette() const override;
bool IsShowingGraphVariables() const override;
QPushButton* GetCreateVariableButton() const override;
QTableView* GetGraphPaletteTableView() const override;
QTableView* GetVariablePaletteTableView() const override;
QLineEdit* GetVariablePaletteFilter() const override;
QLineEdit* GetGraphVariablesFilter() const override;
////
// AzToolsFramework::EditorEvents::Bus
void OnEscape() override;
////
// QWidget
void focusOutEvent(QFocusEvent* focusEvent) override;
////
const ScriptCanvas::ScriptCanvasId& GetActiveScriptCanvasId() const;
bool IsValidVariableType(const ScriptCanvas::Data::Type& dataType) const;
public slots:
void OnCreateVariable(ScriptCanvas::Data::Type varType);
void OnCreateNamedVariable(const AZStd::string& variableName, ScriptCanvas::Data::Type varType);
void OnSelectionChanged(const AZStd::unordered_set< ScriptCanvas::VariableId>& variableIds);
void OnDuplicateVariable(const ScriptCanvas::VariableId& variableId);
void OnDeleteVariables(const AZStd::unordered_set< ScriptCanvas::VariableId>& variableIds);
void OnHighlightVariables(const AZStd::unordered_set< ScriptCanvas::VariableId>& variableIds);
void OnRemoveUnusedVariables();
Q_SIGNALS:
void OnVariableSelectionChanged(const AZStd::vector<AZ::EntityId>& variableIds);
private:
void ShowVariablePalette();
void ShowGraphVariables();
void FocusOnSearchFilter();
void ClearFilter();
void UpdateFilter();
void OnReturnPressed();
void OnQuickFilterChanged(const QString &text);
void RefreshModel();
void OnAddVariableButton();
void OnContextMenuRequested(const QPoint &pos);
bool CanDeleteVariable(const ScriptCanvas::VariableId& variableId);
VariablePropertiesComponent* AllocateComponent(const ScriptCanvas::VariableId& variableId);
void ReleaseComponent(const ScriptCanvas::VariableId& variableId);
void ResetPool();
bool m_manipulatingSelection;
AZStd::unordered_map< ScriptCanvas::VariableId, VariablePropertiesComponent* > m_usedElements;
AZStd::vector< VariablePropertiesComponent* > m_unusedPool;
AZStd::vector< AZStd::unique_ptr<AZ::Entity> > m_propertyHelpers;
ScriptCanvas::ScriptCanvasId m_scriptCanvasId;
AZ::EntityId m_graphCanvasGraphId;
AZStd::unique_ptr<Ui::VariableDockWidget> ui;
QTimer m_filterTimer;
};
}