3
0

MainWindow.h 30 KB

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