3
0

MainWindow.h 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #if !defined(Q_MOC_RUN)
  10. #include <QMainWindow>
  11. #include <QLabel>
  12. #include <QVBoxLayout>
  13. #include <QTimer>
  14. #include <QTranslator>
  15. #include <QMimeData>
  16. #include <QToolButton>
  17. #include <QWidget>
  18. #include <AzCore/Component/ComponentApplicationBus.h>
  19. #include <AzCore/Component/EntityId.h>
  20. #include <AzCore/Asset/AssetCommon.h>
  21. #include <AzCore/Asset/AssetManagerBus.h>
  22. #include <AzFramework/Asset/AssetCatalogBus.h>
  23. #include <AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h>
  24. #include <AzQtComponents/Components/WindowDecorationWrapper.h>
  25. #include <AzQtComponents/Components/ToastNotification.h>
  26. #include <GraphCanvas/Components/Connections/ConnectionBus.h>
  27. #include <GraphCanvas/Components/SceneBus.h>
  28. #include <GraphCanvas/Editor/AssetEditorBus.h>
  29. #include <GraphCanvas/Editor/EditorTypes.h>
  30. #include <GraphCanvas/Widgets/Bookmarks/BookmarkDockWidget.h>
  31. #include <GraphCanvas/Widgets/ConstructPresetDialog/ConstructPresetDialog.h>
  32. #include <GraphCanvas/Styling/StyleManager.h>
  33. #include <Core/Core.h>
  34. #include <ScriptCanvas/Bus/RequestBus.h>
  35. #include <ScriptCanvas/Bus/EditorScriptCanvasBus.h>
  36. #include <ScriptCanvas/Core/ScriptCanvasBus.h>
  37. #include <ScriptCanvas/Debugger/ClientTransceiver.h>
  38. #include <Editor/Undo/ScriptCanvasGraphCommand.h>
  39. #include <Editor/Utilities/RecentFiles.h>
  40. #include <Editor/View/Dialogs/SettingsDialog.h>
  41. #include <Editor/View/Widgets/NodePalette/NodePaletteModel.h>
  42. #include <AzToolsFramework/API/EditorAssetSystemAPI.h>
  43. #include <Editor/View/Widgets/AssetGraphSceneDataBus.h>
  44. #include <Editor/View/Windows/Tools/UpgradeTool/Controller.h>
  45. #include <Editor/View/Windows/Tools/UpgradeTool/FileSaver.h>
  46. #if SCRIPTCANVAS_EDITOR
  47. #include <Include/EditorCoreAPI.h>
  48. #endif//#if SCRIPTCANVAS_EDITOR
  49. #endif//#if !defined(Q_MOC_RUN)
  50. namespace GraphCanvas
  51. {
  52. class AssetEditorToolbar;
  53. class GraphCanvasMimeEvent;
  54. class GraphCanvasEditorEmptyDockWidget;
  55. class MiniMapDockWidget;
  56. namespace Styling
  57. {
  58. class StyleSheet;
  59. }
  60. }
  61. namespace Ui
  62. {
  63. class MainWindow;
  64. }
  65. namespace AzQtComponents
  66. {
  67. class TabWidget;
  68. }
  69. class QDir;
  70. class QFile;
  71. class QProgressDialog;
  72. namespace ScriptCanvasEditor
  73. {
  74. class MainWindow;
  75. class InterpreterWidget;
  76. class ScriptCanvasAssetBrowserModel
  77. : public AzToolsFramework::AssetBrowser::AssetBrowserFilterModel
  78. , private UpgradeNotificationsBus::Handler
  79. {
  80. public:
  81. AZ_CLASS_ALLOCATOR(ScriptCanvasAssetBrowserModel, AZ::SystemAllocator);
  82. explicit ScriptCanvasAssetBrowserModel(QObject* parent = nullptr)
  83. : AzToolsFramework::AssetBrowser::AssetBrowserFilterModel(parent)
  84. {
  85. UpgradeNotificationsBus::Handler::BusConnect();
  86. }
  87. ~ScriptCanvasAssetBrowserModel() override
  88. {
  89. UpgradeNotificationsBus::Handler::BusDisconnect();
  90. }
  91. void OnUpgradeStart() override
  92. {
  93. AzToolsFramework::AssetBrowser::AssetBrowserComponentNotificationBus::Handler::BusDisconnect();
  94. }
  95. };
  96. class OnSaveToast
  97. {
  98. public:
  99. OnSaveToast(AZStd::string_view tabName, AZ::EntityId graphCanvasGraphId, bool saveSuccessful, AZStd::optional<AZStd::string> descriptionOverride = AZStd::nullopt)
  100. {
  101. auto initDescription = [&]()->AZStd::string
  102. {
  103. if (descriptionOverride)
  104. {
  105. return *descriptionOverride;
  106. }
  107. else if (saveSuccessful)
  108. {
  109. return AZStd::string::format("%s Saved", tabName.data());
  110. }
  111. else
  112. {
  113. return AZStd::string::format("Failed to save %s", tabName.data());
  114. }
  115. };
  116. const AZStd::string titleLabel = "Notification";
  117. const AZStd::string description = initDescription();;
  118. const AzQtComponents::ToastType toastType = saveSuccessful ? AzQtComponents::ToastType::Information : AzQtComponents::ToastType::Error;
  119. const AzQtComponents::ToastConfiguration toastConfiguration(toastType, titleLabel.c_str(), description.c_str());
  120. AzToolsFramework::ToastId validationToastId;
  121. GraphCanvas::ViewId viewId;
  122. GraphCanvas::SceneRequestBus::EventResult(viewId, graphCanvasGraphId, &GraphCanvas::SceneRequests::GetViewId);
  123. if (viewId.IsValid())
  124. {
  125. GraphCanvas::ViewRequestBus::EventResult(validationToastId, viewId, &GraphCanvas::ViewRequests::ShowToastNotification, toastConfiguration);
  126. }
  127. }
  128. };
  129. //! Manages the Save/Restore operations of the user's last opened and focused graphs
  130. class Workspace
  131. {
  132. public:
  133. Workspace(MainWindow* mainWindow)
  134. : m_mainWindow(mainWindow)
  135. {
  136. auto userSettings = AZ::UserSettings::CreateFind<EditorSettings::ScriptCanvasEditorSettings>(AZ_CRC("ScriptCanvasPreviewSettings", 0x1c5a2965), AZ::UserSettings::CT_LOCAL);
  137. m_rememberOpenCanvases = (userSettings && userSettings->m_rememberOpenCanvases);
  138. }
  139. //! Saves the current state of the workspace (which assets are open, which asset is in focus)
  140. void Save();
  141. //! Restores the workspace to the previously saved state (opens all previously opened assets and sets focus on what was in focus)
  142. void Restore();
  143. private:
  144. void SignalAssetComplete(const SourceHandle& fileAssetId);
  145. SourceHandle GetSourceAssetId(const SourceHandle& memoryAssetId) const;
  146. bool m_rememberOpenCanvases;
  147. MainWindow* m_mainWindow;
  148. //! Setting focus is problematic unless it is done until after all currently loading graphs have finished loading
  149. //! This vector is used to track the list of graphs being opened to restore the workspace and as assets are fully
  150. //! ready and activated they are removed from this list.
  151. AZStd::vector<SourceHandle> m_loadingAssets;
  152. //! During restore we queue the asset Id to focus in order to do it last
  153. SourceHandle m_queuedAssetFocus;
  154. };
  155. enum class UnsavedChangesOptions;
  156. namespace Widget
  157. {
  158. class BusSenderTree;
  159. class CommandLine;
  160. class GraphTabBar;
  161. class NodePaletteDockWidget;
  162. class NodeProperties;
  163. class PropertyGrid;
  164. class LogPanelWidget;
  165. }
  166. class EBusHandlerActionMenu;
  167. class VariableDockWidget;
  168. class UnitTestDockWidget;
  169. class BatchOperatorTool;
  170. class ScriptCanvasBatchConverter;
  171. class LoggingWindow;
  172. class GraphValidationDockWidget;
  173. class MainWindowStatusWidget;
  174. class StatisticsDialog;
  175. class VariableConfigurationWidget;
  176. // Custom Context Menus
  177. class SceneContextMenu;
  178. class ConnectionContextMenu;
  179. class RenameFunctionDefinitionNodeAction;
  180. class MainWindow
  181. : public QMainWindow
  182. , private UIRequestBus::Handler
  183. , private GeneralRequestBus::Handler
  184. , private UndoNotificationBus::Handler
  185. , private GraphCanvas::SceneNotificationBus::MultiHandler
  186. , private GraphCanvas::AssetEditorSettingsRequestBus::Handler
  187. , private GraphCanvas::AssetEditorRequestBus::Handler
  188. , private VariablePaletteRequestBus::Handler
  189. , private ScriptCanvas::BatchOperationNotificationBus::Handler
  190. , private AssetGraphSceneBus::Handler
  191. #if SCRIPTCANVAS_EDITOR
  192. //, public IEditorNotifyListener
  193. #endif
  194. , private AutomationRequestBus::Handler
  195. , private GraphCanvas::AssetEditorAutomationRequestBus::Handler
  196. , private GraphCanvas::ViewNotificationBus::Handler
  197. , public AZ::SystemTickBus::Handler
  198. , private AzToolsFramework::ToolsApplicationNotificationBus::Handler
  199. , private AzToolsFramework::AssetSystemBus::Handler
  200. , private ScriptCanvas::ScriptCanvasSettingsRequestBus::Handler
  201. {
  202. Q_OBJECT
  203. private:
  204. friend class BatchOperatorTool;
  205. friend class ScriptCanvasBatchConverter;
  206. friend class Workspace;
  207. enum SystemTickActionFlag
  208. {
  209. RefreshPropertyGrid = 1,
  210. CloseWindow = 1 << 1,
  211. UpdateSaveMenuState = 1 << 2,
  212. CloseCurrentGraph = 1 << 3,
  213. CloseNextTabAction = 1 << 4
  214. };
  215. public:
  216. explicit MainWindow(QWidget* parent = nullptr);
  217. ~MainWindow() override;
  218. private:
  219. // UIRequestBus
  220. QMainWindow* GetMainWindow() override { return qobject_cast<QMainWindow*>(this); }
  221. void OpenValidationPanel() override;
  222. void RefreshSelection() override;
  223. //
  224. // Undo Handlers
  225. void PostUndoPoint(ScriptCanvas::ScriptCanvasId scriptCanvasId) override;
  226. void SignalSceneDirty(SourceHandle assetId) override;
  227. void PushPreventUndoStateUpdate() override;
  228. void PopPreventUndoStateUpdate() override;
  229. void ClearPreventUndoStateUpdate() override;
  230. void TriggerUndo() override;
  231. void TriggerRedo() override;
  232. // VariablePaletteRequestBus
  233. void RegisterVariableType(const ScriptCanvas::Data::Type& variableType) override;
  234. bool IsValidVariableType(const ScriptCanvas::Data::Type& dataType) const override;
  235. VariablePaletteRequests::VariableConfigurationOutput ShowVariableConfigurationWidget(
  236. const VariablePaletteRequests::VariableConfigurationInput& input, const QPoint& scenePosition) override;
  237. ////
  238. // GraphCanvas::AssetEditorRequestBus
  239. void OnSelectionManipulationBegin() override;
  240. void OnSelectionManipulationEnd() override;
  241. AZ::EntityId CreateNewGraph() override;
  242. bool ContainsGraph(const GraphCanvas::GraphId& graphId) const override;
  243. bool CloseGraph(const GraphCanvas::GraphId& graphId) override;
  244. void CustomizeConnectionEntity(AZ::Entity* connectionEntity) override;
  245. void ShowAssetPresetsMenu(GraphCanvas::ConstructType constructType) override;
  246. GraphCanvas::ContextMenuAction::SceneReaction ShowSceneContextMenuWithGroup(const QPoint& screenPoint, const QPointF& scenePoint, AZ::EntityId groupTarget) override;
  247. GraphCanvas::ContextMenuAction::SceneReaction ShowNodeContextMenu(const AZ::EntityId& nodeId, const QPoint& screenPoint, const QPointF& scenePoint) override;
  248. GraphCanvas::ContextMenuAction::SceneReaction ShowCommentContextMenu(const AZ::EntityId& nodeId, const QPoint& screenPoint, const QPointF& scenePoint) override;
  249. GraphCanvas::ContextMenuAction::SceneReaction ShowNodeGroupContextMenu(const AZ::EntityId& groupId, const QPoint& screenPoint, const QPointF& scenePoint) override;
  250. GraphCanvas::ContextMenuAction::SceneReaction ShowCollapsedNodeGroupContextMenu(const AZ::EntityId& nodeId, const QPoint& screenPoint, const QPointF& scenePoint) override;
  251. GraphCanvas::ContextMenuAction::SceneReaction ShowBookmarkContextMenu(const AZ::EntityId& bookmarkId, const QPoint& screenPoint, const QPointF& scenePoint) override;
  252. GraphCanvas::ContextMenuAction::SceneReaction ShowConnectionContextMenuWithGroup(const AZ::EntityId& connectionId, const QPoint& screenPoint, const QPointF& scenePoint, AZ::EntityId groupTarget) override;
  253. GraphCanvas::ContextMenuAction::SceneReaction ShowSlotContextMenu(const AZ::EntityId& slotId, const QPoint& screenPoint, const QPointF& scenePoint) override;
  254. GraphCanvas::Endpoint CreateNodeForProposalWithGroup(const AZ::EntityId& connectionId, const GraphCanvas::Endpoint& endpoint, const QPointF& scenePoint, const QPoint& screenPoint, AZ::EntityId groupTarget) override;
  255. void OnWrapperNodeActionWidgetClicked(const AZ::EntityId& wrapperNode, const QRect& actionWidgetBoundingRect, const QPointF& scenePoint, const QPoint& screenPoint) override;
  256. ////
  257. // SystemTickBus
  258. void OnSystemTick() override;
  259. ////
  260. //! ScriptCanvas::BatchOperationsNotificationBus
  261. void OnCommandStarted(AZ::Crc32 commandTag) override;
  262. void OnCommandFinished(AZ::Crc32 commandTag) override;
  263. // File menu
  264. void OnFileNew();
  265. bool OnFileSave();
  266. bool OnFileSaveAs();
  267. bool OnFileSaveCaller(){return OnFileSave();};
  268. bool OnFileSaveAsCaller(){return OnFileSaveAs();};
  269. enum class Save
  270. {
  271. InPlace,
  272. As
  273. };
  274. bool SaveAssetImpl(const SourceHandle& assetId, Save save);
  275. void OnFileOpen();
  276. // Edit menu
  277. void SetupEditMenu();
  278. void OnEditMenuShow();
  279. void RefreshPasteAction();
  280. void RefreshGraphPreferencesAction();
  281. void OnEditCut();
  282. void OnEditCopy();
  283. void OnEditPaste();
  284. void OnEditDuplicate();
  285. void OnEditDelete();
  286. void OnRemoveUnusedVariables();
  287. void OnRemoveUnusedNodes();
  288. void OnRemoveUnusedElements();
  289. void OnScreenshot();
  290. void OnSelectAll();
  291. void OnSelectInputs();
  292. void OnSelectOutputs();
  293. void OnSelectConnected();
  294. void OnClearSelection();
  295. void OnEnableSelection();
  296. void OnDisableSelection();
  297. void OnAlignTop();
  298. void OnAlignBottom();
  299. void OnAlignLeft();
  300. void OnAlignRight();
  301. void AlignSelected(const GraphCanvas::AlignConfig& alignConfig);
  302. // View Menu
  303. void OnShowEntireGraph();
  304. void OnZoomIn();
  305. void OnZoomOut();
  306. void OnZoomToSelection();
  307. void OnGotoStartOfChain();
  308. void OnGotoEndOfChain();
  309. // Tools menu
  310. void OnViewNodePalette();
  311. void OnViewProperties();
  312. void OnViewDebugger();
  313. void OnViewCommandLine();
  314. void OnViewLog();
  315. void OnBookmarks();
  316. void OnVariableManager();
  317. void OnViewMiniMap();
  318. void OnViewLogWindow();
  319. void OnViewGraphValidation();
  320. void OnViewDebuggingWindow();
  321. void OnViewUnitTestManager();
  322. void OnViewStatisticsPanel();
  323. void OnViewPresetsEditor();
  324. void OnRestoreDefaultLayout();
  325. void UpdateViewMenu();
  326. /////////////////////////////////////////////////////////////////////////////////////////////
  327. //SceneNotificationBus
  328. void OnNodeAdded(const AZ::EntityId& nodeId, bool isPaste) override;
  329. void OnSelectionChanged() override;
  330. /////////////////////////////////////////////////////////////////////////////////////////////
  331. void OnVariableSelectionChanged(const AZStd::vector<AZ::EntityId>& variablePropertyIds);
  332. void QueuePropertyGridUpdate();
  333. void DequeuePropertyGridUpdate();
  334. void SetDefaultLayout();
  335. void Clear();
  336. void OnTabCloseRequest(int index);
  337. void OnTabCloseButtonPressed(int index);
  338. void SaveTab(int index);
  339. void CloseAllTabs();
  340. void CloseAllTabsBut(int index);
  341. void CopyPathToClipboard(int index);
  342. void OnActiveFileStateChanged();
  343. void CloseNextTab();
  344. bool IsTabOpen(const SourceHandle& assetId, int& outTabIndex) const;
  345. QVariant GetTabData(const SourceHandle& assetId);
  346. //! GeneralRequestBus
  347. AZ::Outcome<int, AZStd::string> OpenScriptCanvasAssetId(const SourceHandle& assetId, Tracker::ScriptCanvasFileState fileState) override;
  348. AZ::Outcome<int, AZStd::string> OpenScriptCanvasAsset(SourceHandle scriptCanvasAssetId, Tracker::ScriptCanvasFileState fileState, int tabIndex = -1) override;
  349. AZ::Outcome<int, AZStd::string> OpenScriptCanvasAssetImplementation(const SourceHandle& sourceHandle, Tracker::ScriptCanvasFileState fileState, int tabIndex = -1);
  350. int CloseScriptCanvasAsset(const SourceHandle& assetId) override;
  351. bool CreateScriptCanvasAssetFor(const TypeDefs::EntityComponentId& requestingEntityId) override;
  352. bool IsScriptCanvasAssetOpen(const SourceHandle& assetId) const override;
  353. const CategoryInformation* FindNodePaletteCategoryInformation(AZStd::string_view categoryPath) const override;
  354. const NodePaletteModelInformation* FindNodePaletteModelInformation(const ScriptCanvas::NodeTypeIdentifier& nodeType) const override;
  355. ////
  356. AZ::Outcome<int, AZStd::string> CreateScriptCanvasAsset(AZStd::string_view assetPath, int tabIndex = -1);
  357. void RemoveScriptCanvasAsset(const SourceHandle& assetId);
  358. void OnChangeActiveGraphTab(SourceHandle) override;
  359. void CreateNewRuntimeAsset() override { OnFileNew(); }
  360. GraphCanvas::GraphId GetActiveGraphCanvasGraphId() const override;
  361. ScriptCanvas::ScriptCanvasId GetScriptCanvasId(const GraphCanvas::GraphId& graphCanvasGraphId) const override;
  362. ScriptCanvas::ScriptCanvasId GetActiveScriptCanvasId() const override;
  363. GraphCanvas::GraphId GetGraphCanvasGraphId(const ScriptCanvas::ScriptCanvasId& scriptCanvasId) const override;
  364. GraphCanvas::GraphId FindGraphCanvasGraphIdByAssetId(const SourceHandle& assetId) const override;
  365. ScriptCanvas::ScriptCanvasId FindScriptCanvasIdByAssetId(const SourceHandle& assetId) const override;
  366. bool IsInUndoRedo(const AZ::EntityId& graphCanvasGraphId) const override;
  367. bool IsScriptCanvasInUndoRedo(const ScriptCanvas::ScriptCanvasId& scriptCanvasId) const override;
  368. bool IsActiveGraphInUndoRedo() const override;
  369. ////////////////////////////
  370. // GraphCanvasSettingsRequestBus
  371. double GetSnapDistance() const override;
  372. bool IsGroupDoubleClickCollapseEnabled() const override;
  373. bool IsBookmarkViewportControlEnabled() const override;
  374. bool IsDragNodeCouplingEnabled() const override;
  375. AZStd::chrono::milliseconds GetDragCouplingTime() const override;
  376. bool IsDragConnectionSpliceEnabled() const override;
  377. AZStd::chrono::milliseconds GetDragConnectionSpliceTime() const override;
  378. bool IsDropConnectionSpliceEnabled() const override;
  379. AZStd::chrono::milliseconds GetDropConnectionSpliceTime() const override;
  380. bool IsNodeNudgingEnabled() const override;
  381. bool IsShakeToDespliceEnabled() const override;
  382. int GetShakesToDesplice() const override;
  383. float GetMinimumShakePercent() const override;
  384. float GetShakeDeadZonePercent() const override;
  385. float GetShakeStraightnessPercent() const override;
  386. AZStd::chrono::milliseconds GetMaximumShakeDuration() const override;
  387. AZStd::chrono::milliseconds GetAlignmentTime() const override;
  388. float GetMaxZoom() const override;
  389. float GetEdgePanningPercentage() const override;
  390. float GetEdgePanningScrollSpeed() const override;
  391. GraphCanvas::EditorConstructPresets* GetConstructPresets() const override;
  392. const GraphCanvas::ConstructTypePresetBucket* GetConstructTypePresetBucket(GraphCanvas::ConstructType constructType) const override;
  393. GraphCanvas::Styling::ConnectionCurveType GetConnectionCurveType() const override;
  394. GraphCanvas::Styling::ConnectionCurveType GetDataConnectionCurveType() const override;
  395. bool AllowNodeDisabling() const override;
  396. bool AllowDataReferenceSlots() const override;
  397. ////
  398. // AutomationRequestBus
  399. NodeIdPair ProcessCreateNodeMimeEvent(GraphCanvas::GraphCanvasMimeEvent* mimeEvent, const AZ::EntityId& graphCanvasGraphId, AZ::Vector2 nodeCreationPos) override;
  400. const GraphCanvas::GraphCanvasTreeItem* GetNodePaletteRoot() const override;
  401. void SignalAutomationBegin() override;
  402. void SignalAutomationEnd() override;
  403. void ForceCloseActiveAsset() override;
  404. ////
  405. // AssetEditorAutomationRequestBus
  406. bool RegisterObject(AZ::Crc32 elementId, QObject* object) override;
  407. bool UnregisterObject(AZ::Crc32 elementId) override;
  408. QObject* FindObject(AZ::Crc32 elementId) override;
  409. QObject* FindElementByName(QString elementName) override;
  410. ////
  411. AZ::EntityId FindEditorNodeIdByAssetNodeId(const SourceHandle& assetId, AZ::EntityId assetNodeId) const override;
  412. AZ::EntityId FindAssetNodeIdByEditorNodeId(const SourceHandle& assetId, AZ::EntityId editorNodeId) const override;
  413. private:
  414. void SourceFileChanged(AZStd::string relativePath, AZStd::string scanFolder, AZ::Uuid fileAssetId) override;
  415. void SourceFileRemoved(AZStd::string relativePath, AZStd::string scanFolder, AZ::Uuid fileAssetId) override;
  416. void DeleteNodes(const AZ::EntityId& sceneId, const AZStd::vector<AZ::EntityId>& nodes) override;
  417. void DeleteConnections(const AZ::EntityId& sceneId, const AZStd::vector<AZ::EntityId>& connections) override;
  418. void DisconnectEndpoints(const AZ::EntityId& sceneId, const AZStd::vector<GraphCanvas::Endpoint>& endpoints) override;
  419. /////////////////////////////////////////////////////////////////////////////////////////////
  420. GraphCanvas::Endpoint HandleProposedConnection(const GraphCanvas::GraphId& graphId, const GraphCanvas::ConnectionId& connectionId, const GraphCanvas::Endpoint& endpoint, const GraphCanvas::NodeId& proposedNode, const QPoint& screenPoint);
  421. //! UndoNotificationBus
  422. void OnCanUndoChanged(bool canUndo) override;
  423. void OnCanRedoChanged(bool canRedo) override;
  424. ////
  425. //! ScriptCanvasSettingsRequestBus
  426. bool CanShowNetworkSettings() override;
  427. ////
  428. GraphCanvas::ContextMenuAction::SceneReaction HandleContextMenu(GraphCanvas::EditorContextMenu& editorContextMenu, const AZ::EntityId& memberId, const QPoint& screenPoint, const QPointF& scenePoint) const;
  429. void OnAutoSave();
  430. void UpdateFileState(const SourceHandle& assetId, Tracker::ScriptCanvasFileState fileState);
  431. // QMainWindow
  432. void closeEvent(QCloseEvent *event) override;
  433. UnsavedChangesOptions ShowSaveDialog(const QString& filename);
  434. bool ActivateAndSaveAsset(const SourceHandle& unsavedAssetId);
  435. void SaveAs(AZStd::string_view path, SourceHandle assetId);
  436. void OpenFile(const char* fullPath);
  437. void CreateMenus();
  438. void SignalActiveSceneChanged(const SourceHandle assetId);
  439. void RunUpgradeTool();
  440. void ShowInterpreter();
  441. void OnShowValidationErrors();
  442. void OnShowValidationWarnings();
  443. void OnValidateCurrentGraph();
  444. void RunGraphValidation(bool displayToastNotification);
  445. // ViewNotificationBus
  446. void OnViewParamsChanged(const GraphCanvas::ViewParams& viewParams) override;
  447. void OnZoomChanged(qreal zoomLevel) override;
  448. ////
  449. // ToolsNotificationBus
  450. void AfterEntitySelectionChanged(const AzToolsFramework::EntityIdList& newlySelectedEntities, const AzToolsFramework::EntityIdList& newlyDeselectedEntities) override;
  451. ////
  452. public slots:
  453. void UpdateRecentMenu();
  454. void OnViewVisibilityChanged(bool visibility);
  455. private:
  456. void UpdateMenuState(bool enabledState);
  457. void OnWorkspaceRestoreStart();
  458. void OnWorkspaceRestoreEnd(SourceHandle lastFocusAsset);
  459. void UpdateAssignToSelectionState();
  460. void UpdateUndoRedoState();
  461. void UpdateSaveState(bool enabled);
  462. void CreateFunctionInput();
  463. void CreateFunctionOutput();
  464. void CreateFunctionDefinitionNode(int positionOffset);
  465. int CreateAssetTab(const SourceHandle& assetId, Tracker::ScriptCanvasFileState fileState, int tabIndex = -1);
  466. //! \param asset The AssetId of the ScriptCanvas Asset.
  467. void SetActiveAsset(const SourceHandle& assetId);
  468. void RefreshActiveAsset();
  469. void ReconnectSceneBuses(SourceHandle previousAssetId, SourceHandle nextAssetId);
  470. void PrepareActiveAssetForSave();
  471. void PrepareAssetForSave(const SourceHandle& asssetId);
  472. void RestartAutoTimerSave(bool forceTimer = false);
  473. // Assign to selected entities Menus
  474. void OnSelectedEntitiesAboutToShow();
  475. void OnAssignToSelectedEntities();
  476. void OnAssignToEntity(const AZ::EntityId& entityId);
  477. void AssignGraphToEntityImpl(const AZ::EntityId& entityId);
  478. ////
  479. Tracker::ScriptCanvasFileState GetAssetFileState(SourceHandle assetId) const;
  480. SourceHandle GetSourceAssetId(const SourceHandle& memoryAssetId) const
  481. {
  482. return memoryAssetId;
  483. }
  484. int InsertTabForAsset(AZStd::string_view assetPath, SourceHandle assetId, int tabIndex = -1);
  485. void UpdateUndoCache(SourceHandle assetId);
  486. bool HasSystemTickAction(SystemTickActionFlag action);
  487. void RemoveSystemTickAction(SystemTickActionFlag action);
  488. void AddSystemTickAction(SystemTickActionFlag action);
  489. void BlockCloseRequests();
  490. void UnblockCloseRequests();
  491. void OpenNextFile();
  492. void DisableAssetView(const SourceHandle& memoryAssetId);
  493. void EnableAssetView(const SourceHandle& memoryAssetId);
  494. QWidget* m_host = nullptr;
  495. ScriptCanvasAssetBrowserModel* m_scriptEventsAssetModel;
  496. ScriptCanvasAssetBrowserModel* m_scriptCanvasAssetModel;
  497. AzQtComponents::TabWidget* m_tabWidget = nullptr;
  498. Widget::GraphTabBar* m_tabBar = nullptr;
  499. GraphCanvas::AssetEditorToolbar* m_editorToolbar = nullptr;
  500. QToolButton* m_validateGraphToolButton = nullptr;
  501. QToolButton* m_assignToSelectedEntity = nullptr;
  502. QToolButton* m_createFunctionInput = nullptr;
  503. QToolButton* m_createFunctionOutput = nullptr;
  504. QToolButton* m_takeScreenshot = nullptr;
  505. QToolButton* m_createScriptCanvas = nullptr;
  506. QMenu* m_selectedEntityMenu = nullptr;
  507. VariableDockWidget* m_variableDockWidget = nullptr;
  508. GraphValidationDockWidget* m_validationDockWidget = nullptr;
  509. UnitTestDockWidget* m_unitTestDockWidget = nullptr;
  510. StatisticsDialog* m_statisticsDialog = nullptr;
  511. Widget::NodePaletteDockWidget* m_nodePalette = nullptr;
  512. Widget::LogPanelWidget* m_logPanel = nullptr;
  513. Widget::PropertyGrid* m_propertyGrid = nullptr;
  514. Widget::CommandLine* m_commandLine = nullptr;
  515. GraphCanvas::BookmarkDockWidget* m_bookmarkDockWidget = nullptr;
  516. GraphCanvas::MiniMapDockWidget* m_minimap = nullptr;
  517. LoggingWindow* m_loggingWindow = nullptr;
  518. VariableConfigurationWidget* m_slotTypeSelector = nullptr;
  519. AZStd::unique_ptr<InterpreterWidget> m_interpreterWidget;
  520. AzQtComponents::WindowDecorationWrapper* m_presetWrapper = nullptr;
  521. GraphCanvas::ConstructPresetDialog* m_presetEditor = nullptr;
  522. MainWindowStatusWidget* m_statusWidget = nullptr;
  523. NodePaletteModel m_nodePaletteModel;
  524. QStringList m_filesToOpen;
  525. void CreateUnitTestWidget();
  526. // Reusable context menu for the context menu's that have a node palette.
  527. SceneContextMenu* m_sceneContextMenu;
  528. ConnectionContextMenu* m_connectionContextMenu;
  529. AZ::EntityId m_entityMimeDelegateId;
  530. // Reusable context menu for adding/removing ebus events from a wrapper node
  531. EBusHandlerActionMenu* m_ebusHandlerActionMenu;
  532. GraphCanvas::GraphCanvasEditorEmptyDockWidget* m_emptyCanvas; // Displayed when there is no open graph
  533. QVBoxLayout* m_layout;
  534. SourceHandle m_activeGraph;
  535. bool m_loadingNewlySavedFile;
  536. AZStd::string m_newlySavedFile;
  537. AZStd::string m_errorFilePath;
  538. bool m_isClosingTabs;
  539. SourceHandle m_skipTabOnClose;
  540. bool m_enterState;
  541. bool m_ignoreSelection;
  542. AZ::s32 m_preventUndoStateUpdateCount;
  543. bool m_isRestoringWorkspace;
  544. SourceHandle m_queuedFocusOverride;
  545. Ui::MainWindow* ui;
  546. AZStd::array<AZStd::pair<QAction*, QMetaObject::Connection>, c_scriptCanvasEditorSettingsRecentFilesCountMax> m_recentActions;
  547. AZStd::intrusive_ptr<EditorSettings::ScriptCanvasEditorSettings> m_userSettings;
  548. bool m_queueCloseRequest;
  549. bool m_hasQueuedClose;
  550. bool m_isInAutomation;
  551. bool m_allowAutoSave;
  552. bool m_showUpgradeTool;
  553. QTimer m_autoSaveTimer;
  554. QByteArray m_defaultLayout;
  555. QTranslator m_translator;
  556. AZStd::vector<AZ::EntityId> m_selectedVariableIds;
  557. AZ::u32 m_systemTickActions;
  558. AZStd::unordered_set< SourceHandle > m_processedClosedAssetIds;
  559. AZStd::unordered_set< SourceHandle > m_loadingWorkspaceAssets;
  560. AZStd::unordered_set< SourceHandle > m_loadingAssets;
  561. AZStd::unordered_set< AZ::Uuid > m_variablePaletteTypes;
  562. AZStd::unordered_map< AZ::Crc32, QObject* > m_automationLookUpMap;
  563. bool m_closeCurrentGraphAfterSave;
  564. AZStd::unordered_map< SourceHandle, TypeDefs::EntityComponentId > m_assetCreationRequests;
  565. ScriptCanvas::Debugger::ClientTransceiver m_clientTRX;
  566. GraphCanvas::StyleManager m_styleManager;
  567. //! The workspace stores in the user settings which assets were open and which asset was in focus
  568. //! this object manages the Save/Restore operations
  569. Workspace* m_workspace;
  570. AZStd::unique_ptr<VersionExplorer::FileSaver> m_fileSaver;
  571. VersionExplorer::FileSaveResult m_fileSaveResult;
  572. void OnSaveCallBack(const VersionExplorer::FileSaveResult& result);
  573. SourceHandle OnSaveComplete(const SourceHandle& sourceHandle, const VersionExplorer::FileSaveResult& result);
  574. void ClearStaleSaves();
  575. bool IsRecentSave(const SourceHandle& handle) const;
  576. void MarkRecentSave(const SourceHandle& handle);
  577. AZStd::recursive_mutex m_mutex;
  578. AZStd::unordered_map <AZStd::string, AZStd::chrono::steady_clock::time_point> m_saves;
  579. };
  580. }