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/ScriptCanvasNodePaletteDock...

231 lines
8.4 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/Component/EntityId.h>
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/RTTI/RTTI.h>
#include <AzCore/std/smart_ptr/unique_ptr.h>
#include <AzFramework/Asset/AssetCatalogBus.h>
#include <AzQtComponents/Components/StyledDockWidget.h>
#include <AzToolsFramework/UI/UICore/QTreeViewStateSaver.hxx>
#include <AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h>
#include <GraphCanvas/Components/SceneBus.h>
#include <GraphCanvas/Widgets/GraphCanvasTreeCategorizer.h>
#include <GraphCanvas/Widgets/NodePalette/NodePaletteWidget.h>
#include <GraphCanvas/Widgets/NodePalette/NodePaletteDockWidget.h>
#include <GraphCanvas/Widgets/NodePalette/TreeItems/NodePaletteTreeItem.h>
#include <GraphCanvas/Editor/AssetEditorBus.h>
#include <GraphCanvas/Utils/GraphUtils.h>
#include <ScriptCanvas/Bus/EditorScriptCanvasBus.h>
#include <ScriptCanvas/Components/EditorUtils.h>
#include <ScriptCanvas/Core/Core.h>
#endif
class QToolButton;
namespace ScriptCanvasEditor { class FunctionPaletteTreeItem; }
namespace Ui
{
class ScriptCanvasNodePaletteToolbar;
}
namespace ScriptCanvasEditor
{
class ScriptEventsPaletteTreeItem;
class NodePaletteModel;
namespace Widget
{
struct NodePaletteWidget
{
static GraphCanvas::NodePaletteTreeItem* ExternalCreateNodePaletteRoot(const NodePaletteModel& nodePaletteModel, AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* assetModel);
};
class ScriptCanvasRootPaletteTreeItem
: public GraphCanvas::NodePaletteTreeItem
, AzFramework::AssetCatalogEventBus::Handler
, AZ::Data::AssetBus::MultiHandler
, UpgradeNotifications::Bus::Handler
, AZ::SystemTickBus::Handler
{
public:
AZ_CLASS_ALLOCATOR(ScriptCanvasRootPaletteTreeItem, AZ::SystemAllocator, 0);
ScriptCanvasRootPaletteTreeItem(const NodePaletteModel& nodePaletteModel, AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* assetModel);
~ScriptCanvasRootPaletteTreeItem();
void RegisterCategoryNode(GraphCanvas::GraphCanvasTreeItem* treeItem, const char* subCategory, GraphCanvas::NodePaletteTreeItem* parentRoot = nullptr);
GraphCanvas::NodePaletteTreeItem* GetCategoryNode(const char* categoryPath, GraphCanvas::NodePaletteTreeItem* parentRoot = nullptr);
void PruneEmptyNodes();
void SetActiveScriptCanvasId(const ScriptCanvas::ScriptCanvasId& assetId);
private:
void OnRowsInserted(const QModelIndex& parentIndex, int first, int last);
void OnRowsAboutToBeRemoved(const QModelIndex& parentIndex, int first, int last);
void TraverseTree(QModelIndex index = QModelIndex());
void ProcessAsset(AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry);
// SystemTickBus
void OnSystemTick() override;
////
// AssetCatalogEventBus
void OnCatalogAssetChanged(const AZ::Data::AssetId&) override;
void OnCatalogAssetAdded(const AZ::Data::AssetId&) override;
void OnCatalogAssetRemoved(const AZ::Data::AssetId&, const AZ::Data::AssetInfo&) override;
////
// UpgradeNotifications::Bus
void OnUpgradeStart() override;
void OnUpgradeComplete() override;
void OnUpgradeCancelled() override;
////
void ConnectLambdas();
void DisconnectLambdas();
// Requests an async load of a given asset of a type
void RequestAssetLoad(AZ::Data::AssetId assetId, AZ::Data::AssetType assetType);
void OnAssetReady(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
void OnAssetReloaded(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
void OnAssetError(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
bool HasAssetTreeItem(AZ::Data::AssetId assetId) const;
void CreateFunctionPaletteItem(AZ::Data::Asset<AZ::Data::AssetData> asset, const AZ::Data::AssetInfo& assetInfo);
void RequestBuildChildrenFromSubgraphInterface(NodePaletteTreeItem* item, AZ::Data::Asset<AZ::Data::AssetData> asset);
const NodePaletteModel& m_nodePaletteModel;
AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* m_assetModel;
GraphCanvas::GraphCanvasTreeCategorizer m_categorizer;
AZ::Data::AssetId m_previousAssetId;
AZStd::unordered_map< AZ::Data::AssetId, ScriptEventsPaletteTreeItem* > m_scriptEventElementTreeItems;
AZStd::unordered_map< AZ::Data::AssetId, GraphCanvas::NodePaletteTreeItem*> m_globalFunctionTreeItems;
AZStd::queue<AZStd::pair<AZ::Data::AssetId, AZ::Data::AssetType>> m_requestQueue;
// RequestAssetLoad uses this set to track assets being asynchronously loaded
AZStd::unordered_map<AZ::Data::AssetId, AZ::Data::Asset<AZ::Data::AssetData>> m_pendingAssets;
AZStd::unordered_map< AZ::Data::AssetId, AZ::Data::Asset<AZ::Data::AssetData>> m_monitoredAssets;
AZStd::vector< QMetaObject::Connection > m_lambdaConnections;
};
class ScriptCanvasNodePaletteToolbar
: public QWidget
{
Q_OBJECT
public:
enum class FilterType
{
AllNodes
};
ScriptCanvasNodePaletteToolbar(QWidget* parent);
signals:
void OnFilterChanged(FilterType newFilter);
void CreateDynamicEBus();
private:
AZStd::unique_ptr< Ui::ScriptCanvasNodePaletteToolbar > m_ui;
};
class ScriptCanvasNodePaletteConfig
: public GraphCanvas::NodePaletteConfig
{
public:
ScriptCanvasNodePaletteConfig(const NodePaletteModel& nodePaletteModel, AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* assetModel, bool isInContextMenu);
~ScriptCanvasNodePaletteConfig();
const NodePaletteModel& m_nodePaletteModel;
AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* m_assetModel;
};
class NodePaletteDockWidget
: public GraphCanvas::NodePaletteDockWidget
, public GraphCanvas::AssetEditorNotificationBus::Handler
, public GraphCanvas::SceneNotificationBus::Handler
{
public:
AZ_CLASS_ALLOCATOR(NodePaletteDockWidget, AZ::SystemAllocator, 0);
static const char* GetMimeType() { return "scriptcanvas/node-palette-mime-event"; }
NodePaletteDockWidget(const QString& windowLabel, QWidget* parent, const ScriptCanvasNodePaletteConfig& paletteConfig);
~NodePaletteDockWidget();
void OnNewCustomEvent();
void OnNewFunctionEvent();
// GraphCanvas::AssetEditorNotificationBus::Handler
void OnActiveGraphChanged(const GraphCanvas::GraphId& graphCanvasGraphId) override;
////
// GraphCanvas::SceneNotificationBus
void OnSelectionChanged() override;
////
protected:
GraphCanvas::GraphCanvasTreeItem* CreatePaletteRoot() const override;
void OnTreeSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected);
void AddCycleTarget(ScriptCanvas::NodeTypeIdentifier cyclingIdentifier);
void ClearCycleTarget();
void CycleToNextNode();
void CycleToPreviousNode();
private:
void HandleTreeItemDoubleClicked(GraphCanvas::GraphCanvasTreeItem* treeItem);
void ConfigureHelper();
void ParseCycleTargets(GraphCanvas::GraphCanvasTreeItem* treeItem);
AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* m_assetModel;
const NodePaletteModel& m_nodePaletteModel;
QToolButton* m_newCustomEvent;
AZStd::unordered_set< ScriptCanvas::NodeTypeIdentifier > m_cyclingIdentifiers;
GraphCanvas::NodeFocusCyclingHelper m_cyclingHelper;
QAction* m_nextCycleAction;
QAction* m_previousCycleAction;
bool m_ignoreSelectionChanged;
};
}
}