/* * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if SCRIPTCANVAS_EDITOR #include #endif//#if SCRIPTCANVAS_EDITOR #endif//#if !defined(Q_MOC_RUN) namespace GraphCanvas { class AssetEditorToolbar; class GraphCanvasMimeEvent; class GraphCanvasEditorEmptyDockWidget; class MiniMapDockWidget; namespace Styling { class StyleSheet; } } namespace Ui { class MainWindow; } namespace AzQtComponents { class TabWidget; } class QDir; class QFile; class QProgressDialog; namespace ScriptCanvasEditor { class MainWindow; class ScriptCanvasAssetBrowserModel : public AzToolsFramework::AssetBrowser::AssetBrowserFilterModel , private UpgradeNotificationsBus::Handler { public: explicit ScriptCanvasAssetBrowserModel(QObject* parent = nullptr) : AzToolsFramework::AssetBrowser::AssetBrowserFilterModel(parent) { UpgradeNotificationsBus::Handler::BusConnect(); } ~ScriptCanvasAssetBrowserModel() override { UpgradeNotificationsBus::Handler::BusDisconnect(); } void OnUpgradeStart() override { AzToolsFramework::AssetBrowser::AssetBrowserComponentNotificationBus::Handler::BusDisconnect(); } }; class OnSaveToast { public: OnSaveToast(AZStd::string_view tabName, AZ::EntityId graphCanvasGraphId, bool saveSuccessful) { AzQtComponents::ToastType toastType = AzQtComponents::ToastType::Information; AZStd::string titleLabel = "Notification"; AZStd::string description; if (saveSuccessful) { description = AZStd::string::format("%s Saved", tabName.data()); } else { description = AZStd::string::format("Failed to save %s", tabName.data()); toastType = AzQtComponents::ToastType::Error; } AzQtComponents::ToastConfiguration toastConfiguration(toastType, titleLabel.c_str(), description.c_str()); AzToolsFramework::ToastId validationToastId; GraphCanvas::ViewId viewId; GraphCanvas::SceneRequestBus::EventResult(viewId, graphCanvasGraphId, &GraphCanvas::SceneRequests::GetViewId); if (viewId.IsValid()) { GraphCanvas::ViewRequestBus::EventResult(validationToastId, viewId, &GraphCanvas::ViewRequests::ShowToastNotification, toastConfiguration); } } }; //! Manages the Save/Restore operations of the user's last opened and focused graphs class Workspace { public: Workspace(MainWindow* mainWindow) : m_mainWindow(mainWindow) { auto userSettings = AZ::UserSettings::CreateFind(AZ_CRC("ScriptCanvasPreviewSettings", 0x1c5a2965), AZ::UserSettings::CT_LOCAL); m_rememberOpenCanvases = (userSettings && userSettings->m_rememberOpenCanvases); } //! Saves the current state of the workspace (which assets are open, which asset is in focus) void Save(); //! Restores the workspace to the previously saved state (opens all previously opened assets and sets focus on what was in focus) void Restore(); private: void SignalAssetComplete(const ScriptCanvasEditor::SourceHandle& fileAssetId); ScriptCanvasEditor::SourceHandle GetSourceAssetId(const ScriptCanvasEditor::SourceHandle& memoryAssetId) const; bool m_rememberOpenCanvases; MainWindow* m_mainWindow; //! Setting focus is problematic unless it is done until after all currently loading graphs have finished loading //! This vector is used to track the list of graphs being opened to restore the workspace and as assets are fully //! ready and activated they are removed from this list. AZStd::vector m_loadingAssets; //! During restore we queue the asset Id to focus in order to do it last ScriptCanvasEditor::SourceHandle m_queuedAssetFocus; }; enum class UnsavedChangesOptions; namespace Widget { class BusSenderTree; class CommandLine; class GraphTabBar; class NodePaletteDockWidget; class NodeProperties; class PropertyGrid; class LogPanelWidget; } class EBusHandlerActionMenu; class VariableDockWidget; class UnitTestDockWidget; class BatchOperatorTool; class ScriptCanvasBatchConverter; class LoggingWindow; class GraphValidationDockWidget; class MainWindowStatusWidget; class StatisticsDialog; class SlotTypeSelectorWidget; // Custom Context Menus class SceneContextMenu; class ConnectionContextMenu; class RenameFunctionDefinitionNodeAction; class MainWindow : public QMainWindow , private UIRequestBus::Handler , private GeneralRequestBus::Handler , private UndoNotificationBus::Handler , private GraphCanvas::SceneNotificationBus::MultiHandler , private GraphCanvas::AssetEditorSettingsRequestBus::Handler , private GraphCanvas::AssetEditorRequestBus::Handler , private VariablePaletteRequestBus::Handler , private ScriptCanvas::BatchOperationNotificationBus::Handler , private AssetGraphSceneBus::Handler #if SCRIPTCANVAS_EDITOR //, public IEditorNotifyListener #endif , private AutomationRequestBus::Handler , private GraphCanvas::AssetEditorAutomationRequestBus::Handler , private GraphCanvas::ViewNotificationBus::Handler , public AZ::SystemTickBus::Handler , private AzToolsFramework::ToolsApplicationNotificationBus::Handler , private AzToolsFramework::AssetSystemBus::Handler , private ScriptCanvas::ScriptCanvasSettingsRequestBus::Handler { Q_OBJECT private: friend class BatchOperatorTool; friend class ScriptCanvasBatchConverter; friend class Workspace; enum SystemTickActionFlag { RefreshPropertyGrid = 1, CloseWindow = 1 << 1, UpdateSaveMenuState = 1 << 2, CloseCurrentGraph = 1 << 3, CloseNextTabAction = 1 << 4 }; public: explicit MainWindow(QWidget* parent = nullptr); ~MainWindow() override; private: // UIRequestBus QMainWindow* GetMainWindow() override { return qobject_cast(this); } void OpenValidationPanel() override; // // Undo Handlers void PostUndoPoint(ScriptCanvas::ScriptCanvasId scriptCanvasId) override; void SignalSceneDirty(ScriptCanvasEditor::SourceHandle assetId) override; void PushPreventUndoStateUpdate() override; void PopPreventUndoStateUpdate() override; void ClearPreventUndoStateUpdate() override; void TriggerUndo() override; void TriggerRedo() override; // VariablePaletteRequestBus void RegisterVariableType(const ScriptCanvas::Data::Type& variableType) override; bool IsValidVariableType(const ScriptCanvas::Data::Type& dataType) const override; bool ShowSlotTypeSelector(ScriptCanvas::Slot* slot, const QPoint& scenePosition, VariablePaletteRequests::SlotSetup&) override; //// // GraphCanvas::AssetEditorRequestBus void OnSelectionManipulationBegin() override; void OnSelectionManipulationEnd() override; AZ::EntityId CreateNewGraph() override; bool ContainsGraph(const GraphCanvas::GraphId& graphId) const override; bool CloseGraph(const GraphCanvas::GraphId& graphId) override; void CustomizeConnectionEntity(AZ::Entity* connectionEntity) override; void ShowAssetPresetsMenu(GraphCanvas::ConstructType constructType) override; GraphCanvas::ContextMenuAction::SceneReaction ShowSceneContextMenuWithGroup(const QPoint& screenPoint, const QPointF& scenePoint, AZ::EntityId groupTarget) override; GraphCanvas::ContextMenuAction::SceneReaction ShowNodeContextMenu(const AZ::EntityId& nodeId, const QPoint& screenPoint, const QPointF& scenePoint) override; GraphCanvas::ContextMenuAction::SceneReaction ShowCommentContextMenu(const AZ::EntityId& nodeId, const QPoint& screenPoint, const QPointF& scenePoint) override; GraphCanvas::ContextMenuAction::SceneReaction ShowNodeGroupContextMenu(const AZ::EntityId& groupId, const QPoint& screenPoint, const QPointF& scenePoint) override; GraphCanvas::ContextMenuAction::SceneReaction ShowCollapsedNodeGroupContextMenu(const AZ::EntityId& nodeId, const QPoint& screenPoint, const QPointF& scenePoint) override; GraphCanvas::ContextMenuAction::SceneReaction ShowBookmarkContextMenu(const AZ::EntityId& bookmarkId, const QPoint& screenPoint, const QPointF& scenePoint) override; GraphCanvas::ContextMenuAction::SceneReaction ShowConnectionContextMenuWithGroup(const AZ::EntityId& connectionId, const QPoint& screenPoint, const QPointF& scenePoint, AZ::EntityId groupTarget) override; GraphCanvas::ContextMenuAction::SceneReaction ShowSlotContextMenu(const AZ::EntityId& slotId, const QPoint& screenPoint, const QPointF& scenePoint) override; GraphCanvas::Endpoint CreateNodeForProposalWithGroup(const AZ::EntityId& connectionId, const GraphCanvas::Endpoint& endpoint, const QPointF& scenePoint, const QPoint& screenPoint, AZ::EntityId groupTarget) override; void OnWrapperNodeActionWidgetClicked(const AZ::EntityId& wrapperNode, const QRect& actionWidgetBoundingRect, const QPointF& scenePoint, const QPoint& screenPoint) override; //// // SystemTickBus void OnSystemTick() override; //// //! ScriptCanvas::BatchOperationsNotificationBus void OnCommandStarted(AZ::Crc32 commandTag) override; void OnCommandFinished(AZ::Crc32 commandTag) override; // File menu void OnFileNew(); bool OnFileSave(); bool OnFileSaveAs(); bool OnFileSaveCaller(){return OnFileSave();}; bool OnFileSaveAsCaller(){return OnFileSaveAs();}; enum class Save { InPlace, As }; bool SaveAssetImpl(const ScriptCanvasEditor::SourceHandle& assetId, Save save); void OnFileOpen(); // Edit menu void SetupEditMenu(); void OnEditMenuShow(); void RefreshPasteAction(); void RefreshGraphPreferencesAction(); void OnEditCut(); void OnEditCopy(); void OnEditPaste(); void OnEditDuplicate(); void OnEditDelete(); void OnRemoveUnusedVariables(); void OnRemoveUnusedNodes(); void OnRemoveUnusedElements(); void OnScreenshot(); void OnSelectAll(); void OnSelectInputs(); void OnSelectOutputs(); void OnSelectConnected(); void OnClearSelection(); void OnEnableSelection(); void OnDisableSelection(); void OnAlignTop(); void OnAlignBottom(); void OnAlignLeft(); void OnAlignRight(); void AlignSelected(const GraphCanvas::AlignConfig& alignConfig); // View Menu void OnShowEntireGraph(); void OnZoomIn(); void OnZoomOut(); void OnZoomToSelection(); void OnGotoStartOfChain(); void OnGotoEndOfChain(); // Tools menu void OnViewNodePalette(); void OnViewProperties(); void OnViewDebugger(); void OnViewCommandLine(); void OnViewLog(); void OnBookmarks(); void OnVariableManager(); void OnViewMiniMap(); void OnViewLogWindow(); void OnViewGraphValidation(); void OnViewDebuggingWindow(); void OnViewUnitTestManager(); void OnViewStatisticsPanel(); void OnViewPresetsEditor(); void OnRestoreDefaultLayout(); void UpdateViewMenu(); ///////////////////////////////////////////////////////////////////////////////////////////// //SceneNotificationBus void OnNodeAdded(const AZ::EntityId& nodeId, bool isPaste) override; void OnSelectionChanged() override; ///////////////////////////////////////////////////////////////////////////////////////////// void OnVariableSelectionChanged(const AZStd::vector& variablePropertyIds); void QueuePropertyGridUpdate(); void DequeuePropertyGridUpdate(); void SetDefaultLayout(); void RefreshSelection(); void Clear(); void OnTabCloseRequest(int index); void OnTabCloseButtonPressed(int index); void SaveTab(int index); void CloseAllTabs(); void CloseAllTabsBut(int index); void CopyPathToClipboard(int index); void OnActiveFileStateChanged(); void CloseNextTab(); bool IsTabOpen(const SourceHandle& assetId, int& outTabIndex) const; QVariant GetTabData(const SourceHandle& assetId); //! GeneralRequestBus AZ::Outcome OpenScriptCanvasAssetId(const SourceHandle& assetId, Tracker::ScriptCanvasFileState fileState) override; AZ::Outcome OpenScriptCanvasAsset(SourceHandle scriptCanvasAssetId, Tracker::ScriptCanvasFileState fileState, int tabIndex = -1) override; AZ::Outcome OpenScriptCanvasAssetImplementation(const SourceHandle& sourceHandle, Tracker::ScriptCanvasFileState fileState, int tabIndex = -1); int CloseScriptCanvasAsset(const SourceHandle& assetId) override; bool CreateScriptCanvasAssetFor(const TypeDefs::EntityComponentId& requestingEntityId) override; bool IsScriptCanvasAssetOpen(const SourceHandle& assetId) const override; const CategoryInformation* FindNodePaletteCategoryInformation(AZStd::string_view categoryPath) const override; const NodePaletteModelInformation* FindNodePaletteModelInformation(const ScriptCanvas::NodeTypeIdentifier& nodeType) const override; //// AZ::Outcome CreateScriptCanvasAsset(AZStd::string_view assetPath, int tabIndex = -1); void RemoveScriptCanvasAsset(const ScriptCanvasEditor::SourceHandle& assetId); void OnChangeActiveGraphTab(ScriptCanvasEditor::SourceHandle) override; void CreateNewRuntimeAsset() override { OnFileNew(); } GraphCanvas::GraphId GetActiveGraphCanvasGraphId() const override; ScriptCanvas::ScriptCanvasId GetScriptCanvasId(const GraphCanvas::GraphId& graphCanvasGraphId) const override; ScriptCanvas::ScriptCanvasId GetActiveScriptCanvasId() const override; GraphCanvas::GraphId GetGraphCanvasGraphId(const ScriptCanvas::ScriptCanvasId& scriptCanvasId) const override; GraphCanvas::GraphId FindGraphCanvasGraphIdByAssetId(const ScriptCanvasEditor::SourceHandle& assetId) const override; ScriptCanvas::ScriptCanvasId FindScriptCanvasIdByAssetId(const ScriptCanvasEditor::SourceHandle& assetId) const override; bool IsInUndoRedo(const AZ::EntityId& graphCanvasGraphId) const override; bool IsScriptCanvasInUndoRedo(const ScriptCanvas::ScriptCanvasId& scriptCanvasId) const override; bool IsActiveGraphInUndoRedo() const override; //////////////////////////// // GraphCanvasSettingsRequestBus double GetSnapDistance() const override; bool IsGroupDoubleClickCollapseEnabled() const override; bool IsBookmarkViewportControlEnabled() const override; bool IsDragNodeCouplingEnabled() const override; AZStd::chrono::milliseconds GetDragCouplingTime() const override; bool IsDragConnectionSpliceEnabled() const override; AZStd::chrono::milliseconds GetDragConnectionSpliceTime() const override; bool IsDropConnectionSpliceEnabled() const override; AZStd::chrono::milliseconds GetDropConnectionSpliceTime() const override; bool IsNodeNudgingEnabled() const override; bool IsShakeToDespliceEnabled() const override; int GetShakesToDesplice() const override; float GetMinimumShakePercent() const override; float GetShakeDeadZonePercent() const override; float GetShakeStraightnessPercent() const override; AZStd::chrono::milliseconds GetMaximumShakeDuration() const override; AZStd::chrono::milliseconds GetAlignmentTime() const override; float GetMaxZoom() const override; float GetEdgePanningPercentage() const override; float GetEdgePanningScrollSpeed() const override; GraphCanvas::EditorConstructPresets* GetConstructPresets() const override; const GraphCanvas::ConstructTypePresetBucket* GetConstructTypePresetBucket(GraphCanvas::ConstructType constructType) const override; GraphCanvas::Styling::ConnectionCurveType GetConnectionCurveType() const override; GraphCanvas::Styling::ConnectionCurveType GetDataConnectionCurveType() const override; bool AllowNodeDisabling() const override; bool AllowDataReferenceSlots() const override; //// // AutomationRequestBus NodeIdPair ProcessCreateNodeMimeEvent(GraphCanvas::GraphCanvasMimeEvent* mimeEvent, const AZ::EntityId& graphCanvasGraphId, AZ::Vector2 nodeCreationPos) override; const GraphCanvas::GraphCanvasTreeItem* GetNodePaletteRoot() const override; void SignalAutomationBegin() override; void SignalAutomationEnd() override; void ForceCloseActiveAsset() override; //// // AssetEditorAutomationRequestBus bool RegisterObject(AZ::Crc32 elementId, QObject* object) override; bool UnregisterObject(AZ::Crc32 elementId) override; QObject* FindObject(AZ::Crc32 elementId) override; QObject* FindElementByName(QString elementName) override; //// AZ::EntityId FindEditorNodeIdByAssetNodeId(const ScriptCanvasEditor::SourceHandle& assetId, AZ::EntityId assetNodeId) const override; AZ::EntityId FindAssetNodeIdByEditorNodeId(const ScriptCanvasEditor::SourceHandle& assetId, AZ::EntityId editorNodeId) const override; private: void SourceFileChanged(AZStd::string relativePath, AZStd::string scanFolder, AZ::Uuid fileAssetId) override; void SourceFileRemoved(AZStd::string relativePath, AZStd::string scanFolder, AZ::Uuid fileAssetId) override; void DeleteNodes(const AZ::EntityId& sceneId, const AZStd::vector& nodes) override; void DeleteConnections(const AZ::EntityId& sceneId, const AZStd::vector& connections) override; void DisconnectEndpoints(const AZ::EntityId& sceneId, const AZStd::vector& endpoints) override; ///////////////////////////////////////////////////////////////////////////////////////////// GraphCanvas::Endpoint HandleProposedConnection(const GraphCanvas::GraphId& graphId, const GraphCanvas::ConnectionId& connectionId, const GraphCanvas::Endpoint& endpoint, const GraphCanvas::NodeId& proposedNode, const QPoint& screenPoint); //! UndoNotificationBus void OnCanUndoChanged(bool canUndo) override; void OnCanRedoChanged(bool canRedo) override; //// //! ScriptCanvasSettingsRequestBus bool CanShowNetworkSettings() override; //// GraphCanvas::ContextMenuAction::SceneReaction HandleContextMenu(GraphCanvas::EditorContextMenu& editorContextMenu, const AZ::EntityId& memberId, const QPoint& screenPoint, const QPointF& scenePoint) const; void OnAutoSave(); void UpdateFileState(const ScriptCanvasEditor::SourceHandle& assetId, Tracker::ScriptCanvasFileState fileState); // QMainWindow void closeEvent(QCloseEvent *event) override; UnsavedChangesOptions ShowSaveDialog(const QString& filename); bool ActivateAndSaveAsset(const ScriptCanvasEditor::SourceHandle& unsavedAssetId); void SaveAs(AZStd::string_view path, ScriptCanvasEditor::SourceHandle assetId); void OpenFile(const char* fullPath); void CreateMenus(); void SignalActiveSceneChanged(const ScriptCanvasEditor::SourceHandle assetId); void RunUpgradeTool(); void OnShowValidationErrors(); void OnShowValidationWarnings(); void OnValidateCurrentGraph(); void RunGraphValidation(bool displayToastNotification); // ViewNotificationBus void OnViewParamsChanged(const GraphCanvas::ViewParams& viewParams) override; void OnZoomChanged(qreal zoomLevel) override; //// // ToolsNotificationBus void AfterEntitySelectionChanged(const AzToolsFramework::EntityIdList& newlySelectedEntities, const AzToolsFramework::EntityIdList& newlyDeselectedEntities) override; //// public slots: void UpdateRecentMenu(); void OnViewVisibilityChanged(bool visibility); private: void UpdateMenuState(bool enabledState); void OnWorkspaceRestoreStart(); void OnWorkspaceRestoreEnd(ScriptCanvasEditor::SourceHandle lastFocusAsset); void UpdateAssignToSelectionState(); void UpdateUndoRedoState(); void UpdateSaveState(bool enabled); void CreateFunctionInput(); void CreateFunctionOutput(); void CreateFunctionDefinitionNode(int positionOffset); int CreateAssetTab(const ScriptCanvasEditor::SourceHandle& assetId, Tracker::ScriptCanvasFileState fileState, int tabIndex = -1); //! \param asset The AssetId of the ScriptCanvas Asset. void SetActiveAsset(const ScriptCanvasEditor::SourceHandle& assetId); void RefreshActiveAsset(); void ReconnectSceneBuses(ScriptCanvasEditor::SourceHandle previousAssetId, ScriptCanvasEditor::SourceHandle nextAssetId); void PrepareActiveAssetForSave(); void PrepareAssetForSave(const ScriptCanvasEditor::SourceHandle& asssetId); void RestartAutoTimerSave(bool forceTimer = false); // Assign to selected entities Menus void OnSelectedEntitiesAboutToShow(); void OnAssignToSelectedEntities(); void OnAssignToEntity(const AZ::EntityId& entityId); void AssignGraphToEntityImpl(const AZ::EntityId& entityId); //// Tracker::ScriptCanvasFileState GetAssetFileState(ScriptCanvasEditor::SourceHandle assetId) const; ScriptCanvasEditor::SourceHandle GetSourceAssetId(const ScriptCanvasEditor::SourceHandle& memoryAssetId) const { return memoryAssetId; } int InsertTabForAsset(AZStd::string_view assetPath, ScriptCanvasEditor::SourceHandle assetId, int tabIndex = -1); void UpdateUndoCache(ScriptCanvasEditor::SourceHandle assetId); bool HasSystemTickAction(SystemTickActionFlag action); void RemoveSystemTickAction(SystemTickActionFlag action); void AddSystemTickAction(SystemTickActionFlag action); void BlockCloseRequests(); void UnblockCloseRequests(); void OpenNextFile(); void DisableAssetView(const ScriptCanvasEditor::SourceHandle& memoryAssetId); void EnableAssetView(const ScriptCanvasEditor::SourceHandle& memoryAssetId); QWidget* m_host = nullptr; ScriptCanvasAssetBrowserModel* m_scriptEventsAssetModel; ScriptCanvasAssetBrowserModel* m_scriptCanvasAssetModel; AzQtComponents::TabWidget* m_tabWidget = nullptr; Widget::GraphTabBar* m_tabBar = nullptr; GraphCanvas::AssetEditorToolbar* m_editorToolbar = nullptr; QToolButton* m_validateGraphToolButton = nullptr; QToolButton* m_assignToSelectedEntity = nullptr; QToolButton* m_createFunctionInput = nullptr; QToolButton* m_createFunctionOutput = nullptr; QToolButton* m_takeScreenshot = nullptr; QToolButton* m_createScriptCanvas = nullptr; QMenu* m_selectedEntityMenu = nullptr; VariableDockWidget* m_variableDockWidget = nullptr; GraphValidationDockWidget* m_validationDockWidget = nullptr; UnitTestDockWidget* m_unitTestDockWidget = nullptr; StatisticsDialog* m_statisticsDialog = nullptr; Widget::NodePaletteDockWidget* m_nodePalette = nullptr; Widget::LogPanelWidget* m_logPanel = nullptr; Widget::PropertyGrid* m_propertyGrid = nullptr; Widget::CommandLine* m_commandLine = nullptr; GraphCanvas::BookmarkDockWidget* m_bookmarkDockWidget = nullptr; GraphCanvas::MiniMapDockWidget* m_minimap = nullptr; LoggingWindow* m_loggingWindow = nullptr; SlotTypeSelectorWidget* m_slotTypeSelector = nullptr; AzQtComponents::WindowDecorationWrapper* m_presetWrapper = nullptr; GraphCanvas::ConstructPresetDialog* m_presetEditor = nullptr; MainWindowStatusWidget* m_statusWidget = nullptr; NodePaletteModel m_nodePaletteModel; QStringList m_filesToOpen; void CreateUnitTestWidget(); // Reusable context menu for the context menu's that have a node palette. SceneContextMenu* m_sceneContextMenu; ConnectionContextMenu* m_connectionContextMenu; AZ::EntityId m_entityMimeDelegateId; // Reusable context menu for adding/removing ebus events from a wrapper node EBusHandlerActionMenu* m_ebusHandlerActionMenu; GraphCanvas::GraphCanvasEditorEmptyDockWidget* m_emptyCanvas; // Displayed when there is no open graph QVBoxLayout* m_layout; ScriptCanvasEditor::SourceHandle m_activeGraph; bool m_loadingNewlySavedFile; AZStd::string m_newlySavedFile; AZStd::string m_errorFilePath; bool m_isClosingTabs; ScriptCanvasEditor::SourceHandle m_skipTabOnClose; bool m_enterState; bool m_ignoreSelection; AZ::s32 m_preventUndoStateUpdateCount; bool m_isRestoringWorkspace; ScriptCanvasEditor::SourceHandle m_queuedFocusOverride; Ui::MainWindow* ui; AZStd::array, c_scriptCanvasEditorSettingsRecentFilesCountMax> m_recentActions; AZStd::intrusive_ptr m_userSettings; bool m_queueCloseRequest; bool m_hasQueuedClose; bool m_isInAutomation; bool m_allowAutoSave; bool m_showUpgradeTool; QTimer m_autoSaveTimer; QByteArray m_defaultLayout; QTranslator m_translator; AZStd::vector m_selectedVariableIds; AZ::u32 m_systemTickActions; AZStd::unordered_set< ScriptCanvasEditor::SourceHandle > m_processedClosedAssetIds; AZStd::unordered_set< ScriptCanvasEditor::SourceHandle > m_loadingWorkspaceAssets; AZStd::unordered_set< ScriptCanvasEditor::SourceHandle > m_loadingAssets; AZStd::unordered_set< AZ::Uuid > m_variablePaletteTypes; AZStd::unordered_map< AZ::Crc32, QObject* > m_automationLookUpMap; bool m_closeCurrentGraphAfterSave; AZStd::unordered_map< ScriptCanvasEditor::SourceHandle, TypeDefs::EntityComponentId > m_assetCreationRequests; ScriptCanvas::Debugger::ClientTransceiver m_clientTRX; GraphCanvas::StyleManager m_styleManager; //! The workspace stores in the user settings which assets were open and which asset was in focus //! this object manages the Save/Restore operations Workspace* m_workspace; AZStd::unique_ptr m_fileSaver; VersionExplorer::FileSaveResult m_fileSaveResult; void OnSaveCallBack(const VersionExplorer::FileSaveResult& result); void ClearStaleSaves(); bool IsRecentSave(const SourceHandle& handle) const; void MarkRecentSave(const SourceHandle& handle); AZStd::recursive_mutex m_mutex; AZStd::unordered_map m_saves; }; }