EditorActionsHandler.cpp 115 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675
  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. #include <Core/EditorActionsHandler.h>
  9. #include <AzToolsFramework/ActionManager/Action/ActionManagerInterface.h>
  10. #include <AzToolsFramework/ActionManager/Action/ActionManagerInternalInterface.h>
  11. #include <AzToolsFramework/ActionManager/HotKey/HotKeyManagerInterface.h>
  12. #include <AzToolsFramework/ActionManager/Menu/MenuManagerInterface.h>
  13. #include <AzToolsFramework/ActionManager/Menu/MenuManagerInternalInterface.h>
  14. #include <AzToolsFramework/ActionManager/ToolBar/ToolBarManagerInterface.h>
  15. #include <AzToolsFramework/Editor/ActionManagerIdentifiers/EditorActionUpdaterIdentifiers.h>
  16. #include <AzToolsFramework/Editor/EditorSettingsAPIBus.h>
  17. #include <AzToolsFramework/Editor/ActionManagerIdentifiers/EditorContextIdentifiers.h>
  18. #include <AzToolsFramework/Editor/ActionManagerIdentifiers/EditorMenuIdentifiers.h>
  19. #include <AzToolsFramework/Editor/ActionManagerIdentifiers/EditorToolBarIdentifiers.h>
  20. #include <AzToolsFramework/Entity/EditorEntityContextBus.h>
  21. #include <AzToolsFramework/UI/Outliner/EntityOutlinerRequestBus.h>
  22. #include <AzToolsFramework/Viewport/LocalViewBookmarkLoader.h>
  23. #include <AzToolsFramework/Viewport/ViewportSettings.h>
  24. #include <AzQtComponents/Components/SearchLineEdit.h>
  25. #include <AzQtComponents/Components/Style.h>
  26. #include <AtomLyIntegration/AtomViewportDisplayInfo/AtomViewportInfoDisplayBus.h>
  27. #include <Core/Widgets/PrefabEditVisualModeWidget.h>
  28. #include <Core/Widgets/ViewportSettingsWidgets.h>
  29. #include <CryEdit.h>
  30. #include <EditorCoreAPI.h>
  31. #include <Editor/EditorViewportCamera.h>
  32. #include <Editor/EditorViewportSettings.h>
  33. #include <Editor/Undo/Undo.h>
  34. #include <GameEngine.h>
  35. #include <LmbrCentral/Audio/AudioSystemComponentBus.h>
  36. #include <MainWindow.h>
  37. #include <QtViewPaneManager.h>
  38. #include <ToolBox.h>
  39. #include <ToolsConfigPage.h>
  40. #include <Util/PathUtil.h>
  41. #include <QDesktopServices>
  42. #include <QDir>
  43. #include <QHBoxLayout>
  44. #include <QLabel>
  45. #include <QMainWindow>
  46. #include <QMenu>
  47. #include <QTimer>
  48. #include <QUrl>
  49. #include <QUrlQuery>
  50. #include <QWidget>
  51. static const int maxRecentFiles = 10;
  52. class EditorViewportDisplayInfoHandler
  53. : private AZ::AtomBridge::AtomViewportInfoDisplayNotificationBus::Handler
  54. {
  55. public:
  56. EditorViewportDisplayInfoHandler()
  57. {
  58. m_actionManagerInterface = AZ::Interface<AzToolsFramework::ActionManagerInterface>::Get();
  59. AZ_Assert(
  60. m_actionManagerInterface, "EditorViewportDisplayInfoHandler - could not get ActionManagerInterface on EditorViewportDisplayInfoHandler construction.");
  61. if (m_actionManagerInterface)
  62. {
  63. AZ::AtomBridge::AtomViewportInfoDisplayNotificationBus::Handler::BusConnect();
  64. }
  65. }
  66. ~EditorViewportDisplayInfoHandler()
  67. {
  68. if (m_actionManagerInterface)
  69. {
  70. AZ::AtomBridge::AtomViewportInfoDisplayNotificationBus::Handler::BusDisconnect();
  71. }
  72. }
  73. void OnViewportInfoDisplayStateChanged([[maybe_unused]] AZ::AtomBridge::ViewportInfoDisplayState state) override
  74. {
  75. m_actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::ViewportDisplayInfoStateChangedUpdaterIdentifier);
  76. }
  77. private:
  78. AzToolsFramework::ActionManagerInterface* m_actionManagerInterface = nullptr;
  79. };
  80. bool IsLevelLoaded()
  81. {
  82. auto cryEdit = CCryEditApp::instance();
  83. return !cryEdit->IsExportingLegacyData() && GetIEditor()->IsLevelLoaded();
  84. }
  85. bool AreEntitiesSelected()
  86. {
  87. bool result = false;
  88. AzToolsFramework::ToolsApplicationRequestBus::BroadcastResult(
  89. result, &AzToolsFramework::ToolsApplicationRequestBus::Handler::AreAnyEntitiesSelected);
  90. return result;
  91. }
  92. static bool CompareLayoutNames(const QString& name1, const QString& name2)
  93. {
  94. return name1.compare(name2, Qt::CaseInsensitive) < 0;
  95. }
  96. void EditorActionsHandler::Initialize(MainWindow* mainWindow)
  97. {
  98. m_mainWindow = mainWindow;
  99. m_cryEditApp = CCryEditApp::instance();
  100. m_qtViewPaneManager = QtViewPaneManager::instance();
  101. m_levelExtension = EditorUtils::LevelFile::GetDefaultFileExtension();
  102. m_actionManagerInterface = AZ::Interface<AzToolsFramework::ActionManagerInterface>::Get();
  103. AZ_Assert(m_actionManagerInterface, "EditorActionsHandler - could not get ActionManagerInterface on EditorActionsHandler construction.");
  104. m_actionManagerInternalInterface = AZ::Interface<AzToolsFramework::ActionManagerInternalInterface>::Get();
  105. AZ_Assert(
  106. m_actionManagerInternalInterface,
  107. "EditorActionsHandler - could not get ActionManagerInternalInterface on EditorActionsHandler construction.");
  108. m_hotKeyManagerInterface = AZ::Interface<AzToolsFramework::HotKeyManagerInterface>::Get();
  109. AZ_Assert(m_hotKeyManagerInterface, "EditorActionsHandler - could not get HotKeyManagerInterface on EditorActionsHandler construction.");
  110. m_menuManagerInterface = AZ::Interface<AzToolsFramework::MenuManagerInterface>::Get();
  111. AZ_Assert(m_menuManagerInterface, "EditorActionsHandler - could not get MenuManagerInterface on EditorActionsHandler construction.");
  112. m_menuManagerInternalInterface = AZ::Interface<AzToolsFramework::MenuManagerInternalInterface>::Get();
  113. AZ_Assert(
  114. m_menuManagerInternalInterface, "EditorActionsHandler - could not get MenuManagerInternalInterface on EditorActionsHandler construction.");
  115. m_toolBarManagerInterface = AZ::Interface<AzToolsFramework::ToolBarManagerInterface>::Get();
  116. AZ_Assert(m_toolBarManagerInterface, "EditorActionsHandler - could not get ToolBarManagerInterface on EditorActionsHandler construction.");
  117. // Retrieve the bookmark count from the loader.
  118. m_defaultBookmarkCount = AzToolsFramework::LocalViewBookmarkLoader::DefaultViewBookmarkCount;
  119. const int DefaultViewportId = 0;
  120. // Get EditorEntityContextId
  121. AzFramework::EntityContextId editorEntityContextId = AzFramework::EntityContextId::CreateNull();
  122. AzToolsFramework::EditorEntityContextRequestBus::BroadcastResult(
  123. editorEntityContextId, &AzToolsFramework::EditorEntityContextRequests::GetEditorEntityContextId);
  124. AzToolsFramework::ActionManagerRegistrationNotificationBus::Handler::BusConnect();
  125. AzToolsFramework::EditorEventsBus::Handler::BusConnect();
  126. AzToolsFramework::EditorEntityContextNotificationBus::Handler::BusConnect();
  127. AzToolsFramework::ToolsApplicationNotificationBus::Handler::BusConnect();
  128. AzToolsFramework::ViewportInteraction::ViewportSettingsNotificationBus::Handler::BusConnect(DefaultViewportId);
  129. AzToolsFramework::EditorPickModeNotificationBus::Handler::BusConnect(editorEntityContextId);
  130. AzToolsFramework::ContainerEntityNotificationBus::Handler::BusConnect(editorEntityContextId);
  131. m_editorViewportDisplayInfoHandler = new EditorViewportDisplayInfoHandler();
  132. m_initialized = true;
  133. }
  134. EditorActionsHandler::~EditorActionsHandler()
  135. {
  136. if (m_initialized)
  137. {
  138. AzToolsFramework::ContainerEntityNotificationBus::Handler::BusDisconnect();
  139. AzToolsFramework::EditorPickModeNotificationBus::Handler::BusDisconnect();
  140. AzToolsFramework::ViewportInteraction::ViewportSettingsNotificationBus::Handler::BusDisconnect();
  141. AzToolsFramework::ToolsApplicationNotificationBus::Handler::BusDisconnect();
  142. AzToolsFramework::EditorEntityContextNotificationBus::Handler::BusDisconnect();
  143. AzToolsFramework::EditorEventsBus::Handler::BusDisconnect();
  144. AzToolsFramework::ActionManagerRegistrationNotificationBus::Handler::BusDisconnect();
  145. if (m_editorViewportDisplayInfoHandler)
  146. {
  147. delete m_editorViewportDisplayInfoHandler;
  148. }
  149. }
  150. }
  151. void EditorActionsHandler::OnActionContextRegistrationHook()
  152. {
  153. // Main Window
  154. {
  155. AzToolsFramework::ActionContextProperties contextProperties;
  156. contextProperties.m_name = "O3DE Editor";
  157. m_actionManagerInterface->RegisterActionContext(
  158. EditorIdentifiers::MainWindowActionContextIdentifier, contextProperties);
  159. m_hotKeyManagerInterface->AssignWidgetToActionContext(EditorIdentifiers::MainWindowActionContextIdentifier, m_mainWindow);
  160. }
  161. // Editor Asset Browser
  162. {
  163. AzToolsFramework::ActionContextProperties contextProperties;
  164. contextProperties.m_name = "O3DE Editor - Asset Browser";
  165. m_actionManagerInterface->RegisterActionContext(
  166. EditorIdentifiers::EditorAssetBrowserActionContextIdentifier, contextProperties);
  167. }
  168. // Editor Console
  169. {
  170. AzToolsFramework::ActionContextProperties contextProperties;
  171. contextProperties.m_name = "O3DE Editor - Console";
  172. m_actionManagerInterface->RegisterActionContext(
  173. EditorIdentifiers::EditorConsoleActionContextIdentifier, contextProperties);
  174. }
  175. // Editor Entity Property Editor (Entity Inspector)
  176. {
  177. AzToolsFramework::ActionContextProperties contextProperties;
  178. contextProperties.m_name = "O3DE Editor - Entity Inspector";
  179. m_actionManagerInterface->RegisterActionContext(
  180. EditorIdentifiers::EditorEntityPropertyEditorActionContextIdentifier, contextProperties);
  181. }
  182. }
  183. void EditorActionsHandler::OnActionUpdaterRegistrationHook()
  184. {
  185. m_actionManagerInterface->RegisterActionUpdater(EditorIdentifiers::AngleSnappingStateChangedUpdaterIdentifier);
  186. m_actionManagerInterface->RegisterActionUpdater(EditorIdentifiers::ContainerEntityStatesChangedUpdaterIdentifier);
  187. m_actionManagerInterface->RegisterActionUpdater(EditorIdentifiers::DrawHelpersStateChangedUpdaterIdentifier);
  188. m_actionManagerInterface->RegisterActionUpdater(EditorIdentifiers::EntityPickingModeChangedUpdaterIdentifier);
  189. m_actionManagerInterface->RegisterActionUpdater(EditorIdentifiers::EntitySelectionChangedUpdaterIdentifier);
  190. m_actionManagerInterface->RegisterActionUpdater(EditorIdentifiers::GameModeStateChangedUpdaterIdentifier);
  191. m_actionManagerInterface->RegisterActionUpdater(EditorIdentifiers::GridSnappingStateChangedUpdaterIdentifier);
  192. m_actionManagerInterface->RegisterActionUpdater(EditorIdentifiers::IconsStateChangedUpdaterIdentifier);
  193. m_actionManagerInterface->RegisterActionUpdater(EditorIdentifiers::RecentFilesChangedUpdaterIdentifier);
  194. m_actionManagerInterface->RegisterActionUpdater(EditorIdentifiers::UndoRedoUpdaterIdentifier);
  195. m_actionManagerInterface->RegisterActionUpdater(EditorIdentifiers::ViewportDisplayInfoStateChangedUpdaterIdentifier);
  196. }
  197. void EditorActionsHandler::OnActionRegistrationHook()
  198. {
  199. // --- File Actions
  200. // New Level
  201. {
  202. constexpr AZStd::string_view actionIdentifier = "o3de.action.file.new";
  203. AzToolsFramework::ActionProperties actionProperties;
  204. actionProperties.m_name = "New Level";
  205. actionProperties.m_description = "Create a new level";
  206. actionProperties.m_category = "Level";
  207. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  208. m_actionManagerInterface->RegisterAction(
  209. EditorIdentifiers::MainWindowActionContextIdentifier,
  210. actionIdentifier,
  211. actionProperties,
  212. [cryEdit = m_cryEditApp]
  213. {
  214. cryEdit->OnCreateLevel();
  215. }
  216. );
  217. // This action is only accessible outside of Component Modes
  218. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  219. m_hotKeyManagerInterface->SetActionHotKey("o3de.action.file.new", "Ctrl+N");
  220. }
  221. // Open Level
  222. {
  223. constexpr AZStd::string_view actionIdentifier = "o3de.action.file.open";
  224. AzToolsFramework::ActionProperties actionProperties;
  225. actionProperties.m_name = "Open Level...";
  226. actionProperties.m_description = "Open an existing level";
  227. actionProperties.m_category = "Level";
  228. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  229. m_actionManagerInterface->RegisterAction(
  230. EditorIdentifiers::MainWindowActionContextIdentifier,
  231. actionIdentifier,
  232. actionProperties,
  233. [cryEdit = m_cryEditApp]
  234. {
  235. cryEdit->OnOpenLevel();
  236. }
  237. );
  238. // This action is only accessible outside of Component Modes
  239. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  240. m_hotKeyManagerInterface->SetActionHotKey("o3de.action.file.open", "Ctrl+O");
  241. }
  242. // Recent Files
  243. {
  244. RecentFileList* recentFiles = m_cryEditApp->GetRecentFileList();
  245. const int recentFilesSize = recentFiles->GetSize();
  246. for (int index = 0; index < maxRecentFiles; ++index)
  247. {
  248. AzToolsFramework::ActionProperties actionProperties;
  249. if (index < recentFilesSize)
  250. {
  251. actionProperties.m_name = AZStd::string::format("%i | %s", index + 1, (*recentFiles)[index].toUtf8().data());
  252. }
  253. else
  254. {
  255. actionProperties.m_name = AZStd::string::format("Recent File #%i", index + 1);
  256. }
  257. actionProperties.m_category = "Level";
  258. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::HideWhenDisabled;
  259. AZStd::string actionIdentifier = AZStd::string::format("o3de.action.file.recent.file%i", index + 1);
  260. m_actionManagerInterface->RegisterAction(
  261. EditorIdentifiers::MainWindowActionContextIdentifier,
  262. actionIdentifier,
  263. actionProperties,
  264. [&, index]
  265. {
  266. OpenLevelByRecentFileEntryIndex(index);
  267. }
  268. );
  269. m_actionManagerInterface->InstallEnabledStateCallback(
  270. actionIdentifier,
  271. [&, index]() -> bool
  272. {
  273. return IsRecentFileActionActive(index);
  274. }
  275. );
  276. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::RecentFilesChangedUpdaterIdentifier, actionIdentifier);
  277. // This action is only accessible outside of Component Modes
  278. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  279. }
  280. }
  281. // Clear Recent Files
  282. {
  283. constexpr AZStd::string_view actionIdentifier = "o3de.action.file.recent.clearAll";
  284. AzToolsFramework::ActionProperties actionProperties;
  285. actionProperties.m_name = "Clear All";
  286. actionProperties.m_description = "Clear the recent files list.";
  287. actionProperties.m_category = "Level";
  288. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  289. m_actionManagerInterface->RegisterAction(
  290. EditorIdentifiers::MainWindowActionContextIdentifier,
  291. actionIdentifier,
  292. actionProperties,
  293. [&]
  294. {
  295. RecentFileList* mruList = CCryEditApp::instance()->GetRecentFileList();
  296. // remove everything from the mru list
  297. for (int i = mruList->GetSize(); i > 0; i--)
  298. {
  299. mruList->Remove(i - 1);
  300. }
  301. // save the settings immediately to the registry
  302. mruList->WriteList();
  303. // re-update the menus
  304. UpdateRecentFileActions();
  305. }
  306. );
  307. // This action is only accessible outside of Component Modes
  308. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  309. }
  310. // Save
  311. {
  312. AzToolsFramework::ActionProperties actionProperties;
  313. actionProperties.m_name = "Save";
  314. actionProperties.m_description = "Save the current level";
  315. actionProperties.m_category = "Level";
  316. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  317. m_actionManagerInterface->RegisterAction(
  318. EditorIdentifiers::MainWindowActionContextIdentifier, "o3de.action.file.save", actionProperties,
  319. [cryEdit = m_cryEditApp]
  320. {
  321. cryEdit->OnFileSave();
  322. }
  323. );
  324. m_actionManagerInterface->InstallEnabledStateCallback("o3de.action.file.save", IsLevelLoaded);
  325. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::LevelLoadedUpdaterIdentifier, "o3de.action.file.save");
  326. m_hotKeyManagerInterface->SetActionHotKey("o3de.action.file.save", "Ctrl+S");
  327. }
  328. // Save As...
  329. {
  330. AzToolsFramework::ActionProperties actionProperties;
  331. actionProperties.m_name = "Save As...";
  332. actionProperties.m_description = "Save the current level";
  333. actionProperties.m_category = "Level";
  334. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  335. m_actionManagerInterface->RegisterAction(
  336. EditorIdentifiers::MainWindowActionContextIdentifier, "o3de.action.file.saveAs", actionProperties,
  337. []
  338. {
  339. CCryEditDoc* pDoc = GetIEditor()->GetDocument();
  340. pDoc->OnFileSaveAs();
  341. }
  342. );
  343. m_actionManagerInterface->InstallEnabledStateCallback("o3de.action.file.saveAs", IsLevelLoaded);
  344. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::LevelLoadedUpdaterIdentifier, "o3de.action.file.saveAs");
  345. }
  346. // Save Level Statistics
  347. {
  348. constexpr AZStd::string_view actionIdentifier = "o3de.action.file.saveLevelStatistics";
  349. AzToolsFramework::ActionProperties actionProperties;
  350. actionProperties.m_name = "Save Level Statistics";
  351. actionProperties.m_description = "Logs Editor memory usage.";
  352. actionProperties.m_category = "Level";
  353. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  354. m_actionManagerInterface->RegisterAction(
  355. EditorIdentifiers::MainWindowActionContextIdentifier,
  356. actionIdentifier,
  357. actionProperties,
  358. [cryEdit = m_cryEditApp]
  359. {
  360. cryEdit->OnToolsLogMemoryUsage();
  361. }
  362. );
  363. // This action is required by python tests, but is always disabled.
  364. m_actionManagerInterface->InstallEnabledStateCallback(
  365. actionIdentifier,
  366. []() -> bool
  367. {
  368. return false;
  369. }
  370. );
  371. // This action is only accessible outside of Component Modes
  372. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  373. }
  374. // Edit Project Settings
  375. {
  376. constexpr AZStd::string_view actionIdentifier = "o3de.action.project.editSettings";
  377. AzToolsFramework::ActionProperties actionProperties;
  378. actionProperties.m_name = "Edit Project Settings...";
  379. actionProperties.m_description = "Open the Project Settings panel.";
  380. actionProperties.m_category = "Project";
  381. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  382. m_actionManagerInterface->RegisterAction(
  383. EditorIdentifiers::MainWindowActionContextIdentifier,
  384. actionIdentifier,
  385. actionProperties,
  386. [cryEdit = m_cryEditApp]
  387. {
  388. cryEdit->OnOpenProjectManagerSettings();
  389. }
  390. );
  391. // This action is only accessible outside of Component Modes
  392. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  393. }
  394. // Edit Platform Settings
  395. {
  396. constexpr AZStd::string_view actionIdentifier = "o3de.action.platform.editSettings";
  397. AzToolsFramework::ActionProperties actionProperties;
  398. actionProperties.m_name = "Edit Platform Settings...";
  399. actionProperties.m_description = "Open the Platform Settings panel.";
  400. actionProperties.m_category = "Platform";
  401. m_actionManagerInterface->RegisterAction(
  402. EditorIdentifiers::MainWindowActionContextIdentifier,
  403. actionIdentifier,
  404. actionProperties,
  405. [qtViewPaneManager = m_qtViewPaneManager]
  406. {
  407. qtViewPaneManager->OpenPane(LyViewPane::ProjectSettingsTool);
  408. }
  409. );
  410. }
  411. // New Project
  412. {
  413. constexpr AZStd::string_view actionIdentifier = "o3de.action.project.new";
  414. AzToolsFramework::ActionProperties actionProperties;
  415. actionProperties.m_name = "New Project...";
  416. actionProperties.m_description = "Create a new project in the Project Manager.";
  417. actionProperties.m_category = "Project";
  418. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  419. m_actionManagerInterface->RegisterAction(
  420. EditorIdentifiers::MainWindowActionContextIdentifier,
  421. actionIdentifier,
  422. actionProperties,
  423. [cryEdit = m_cryEditApp]
  424. {
  425. cryEdit->OnOpenProjectManagerNew();
  426. }
  427. );
  428. // This action is only accessible outside of Component Modes
  429. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  430. }
  431. // Open Project
  432. {
  433. constexpr AZStd::string_view actionIdentifier = "o3de.action.project.open";
  434. AzToolsFramework::ActionProperties actionProperties;
  435. actionProperties.m_name = "Open Project...";
  436. actionProperties.m_description = "Open a different project in the Project Manager.";
  437. actionProperties.m_category = "Project";
  438. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  439. m_actionManagerInterface->RegisterAction(
  440. EditorIdentifiers::MainWindowActionContextIdentifier,
  441. actionIdentifier,
  442. actionProperties,
  443. [cryEdit = m_cryEditApp]
  444. {
  445. cryEdit->OnOpenProjectManager();
  446. }
  447. );
  448. // This action is only accessible outside of Component Modes
  449. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  450. }
  451. // Show Log File
  452. {
  453. constexpr AZStd::string_view actionIdentifier = "o3de.action.file.showLog";
  454. AzToolsFramework::ActionProperties actionProperties;
  455. actionProperties.m_name = "Show Log File";
  456. actionProperties.m_category = "Project";
  457. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  458. m_actionManagerInterface->RegisterAction(
  459. EditorIdentifiers::MainWindowActionContextIdentifier,
  460. actionIdentifier,
  461. actionProperties,
  462. [cryEdit = m_cryEditApp]
  463. {
  464. cryEdit->OnFileEditLogFile();
  465. }
  466. );
  467. // This action is only accessible outside of Component Modes
  468. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  469. }
  470. // Editor Exit
  471. {
  472. AzToolsFramework::ActionProperties actionProperties;
  473. actionProperties.m_name = "Exit";
  474. actionProperties.m_description = "Exit the Editor";
  475. actionProperties.m_category = "Editor";
  476. m_actionManagerInterface->RegisterAction(
  477. EditorIdentifiers::MainWindowActionContextIdentifier,
  478. "o3de.action.editor.exit",
  479. actionProperties,
  480. [=]
  481. {
  482. m_mainWindow->window()->close();
  483. }
  484. );
  485. }
  486. // --- Edit Actions
  487. // Undo
  488. {
  489. AzToolsFramework::ActionProperties actionProperties;
  490. actionProperties.m_name = "&Undo";
  491. actionProperties.m_description = "Undo last operation";
  492. actionProperties.m_category = "Edit";
  493. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  494. m_actionManagerInterface->RegisterAction(
  495. EditorIdentifiers::MainWindowActionContextIdentifier,
  496. "o3de.action.edit.undo",
  497. actionProperties,
  498. [cryEdit = m_cryEditApp]
  499. {
  500. cryEdit->OnUndo();
  501. }
  502. );
  503. m_actionManagerInterface->InstallEnabledStateCallback(
  504. "o3de.action.edit.undo",
  505. []() -> bool
  506. {
  507. return GetIEditor()->GetUndoManager()->IsHaveUndo();
  508. }
  509. );
  510. // Trigger update after every undo or redo operation
  511. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::UndoRedoUpdaterIdentifier, "o3de.action.edit.undo");
  512. m_hotKeyManagerInterface->SetActionHotKey("o3de.action.edit.undo", "Ctrl+Z");
  513. }
  514. // Redo
  515. {
  516. AzToolsFramework::ActionProperties actionProperties;
  517. actionProperties.m_name = "&Redo";
  518. actionProperties.m_description = "Redo last undo operation";
  519. actionProperties.m_category = "Edit";
  520. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  521. m_actionManagerInterface->RegisterAction(
  522. EditorIdentifiers::MainWindowActionContextIdentifier,
  523. "o3de.action.edit.redo",
  524. actionProperties,
  525. [cryEdit = m_cryEditApp]
  526. {
  527. cryEdit->OnRedo();
  528. }
  529. );
  530. m_actionManagerInterface->InstallEnabledStateCallback(
  531. "o3de.action.edit.redo",
  532. []() -> bool
  533. {
  534. return GetIEditor()->GetUndoManager()->IsHaveRedo();
  535. }
  536. );
  537. // Trigger update after every undo or redo operation
  538. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::UndoRedoUpdaterIdentifier, "o3de.action.edit.redo");
  539. m_hotKeyManagerInterface->SetActionHotKey("o3de.action.edit.redo", "Ctrl+Shift+Z");
  540. }
  541. // Angle Snapping
  542. {
  543. constexpr AZStd::string_view actionIdentifier = "o3de.action.edit.snap.toggleAngleSnapping";
  544. AzToolsFramework::ActionProperties actionProperties;
  545. actionProperties.m_name = "Angle snapping";
  546. actionProperties.m_description = "Toggle angle snapping";
  547. actionProperties.m_category = "Edit";
  548. actionProperties.m_iconPath = ":/stylesheet/img/UI20/toolbar/Angle.svg";
  549. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  550. m_actionManagerInterface->RegisterCheckableAction(
  551. EditorIdentifiers::MainWindowActionContextIdentifier,
  552. actionIdentifier,
  553. actionProperties,
  554. []
  555. {
  556. SandboxEditor::SetAngleSnapping(!SandboxEditor::AngleSnappingEnabled());
  557. },
  558. []() -> bool
  559. {
  560. return SandboxEditor::AngleSnappingEnabled();
  561. }
  562. );
  563. // Trigger update when the angle snapping setting changes
  564. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::AngleSnappingStateChangedUpdaterIdentifier, actionIdentifier);
  565. // This action is only accessible outside of Component Modes
  566. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  567. }
  568. // Grid Snapping
  569. {
  570. constexpr AZStd::string_view actionIdentifier = "o3de.action.edit.snap.toggleGridSnapping";
  571. AzToolsFramework::ActionProperties actionProperties;
  572. actionProperties.m_name = "Grid snapping";
  573. actionProperties.m_description = "Toggle grid snapping";
  574. actionProperties.m_category = "Edit";
  575. actionProperties.m_iconPath = ":/stylesheet/img/UI20/toolbar/Grid.svg";
  576. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  577. m_actionManagerInterface->RegisterCheckableAction(
  578. EditorIdentifiers::MainWindowActionContextIdentifier,
  579. actionIdentifier,
  580. actionProperties,
  581. []
  582. {
  583. SandboxEditor::SetGridSnapping(!SandboxEditor::GridSnappingEnabled());
  584. },
  585. []() -> bool
  586. {
  587. return SandboxEditor::GridSnappingEnabled();
  588. }
  589. );
  590. // Trigger update when the grid snapping setting changes
  591. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::GridSnappingStateChangedUpdaterIdentifier, actionIdentifier);
  592. // This action is only accessible outside of Component Modes
  593. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  594. }
  595. // Show Grid
  596. {
  597. constexpr AZStd::string_view actionIdentifier = "o3de.action.edit.snap.toggleShowingGrid";
  598. AzToolsFramework::ActionProperties actionProperties;
  599. actionProperties.m_name = "Show Grid";
  600. actionProperties.m_description = "Show Grid for entity snapping.";
  601. actionProperties.m_category = "Edit";
  602. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  603. m_actionManagerInterface->RegisterCheckableAction(
  604. EditorIdentifiers::MainWindowActionContextIdentifier,
  605. actionIdentifier,
  606. actionProperties,
  607. []
  608. {
  609. SandboxEditor::SetShowingGrid(!SandboxEditor::ShowingGrid());
  610. },
  611. []()
  612. {
  613. return SandboxEditor::ShowingGrid();
  614. }
  615. );
  616. // Trigger update when the grid snapping setting changes
  617. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::GridShowingChangedUpdaterIdentifier, actionIdentifier);
  618. // This action is only accessible outside of Component Modes
  619. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  620. }
  621. // Global Preferences
  622. {
  623. constexpr AZStd::string_view actionIdentifier = "o3de.action.edit.globalPreferences";
  624. AzToolsFramework::ActionProperties actionProperties;
  625. actionProperties.m_name = "Global Preferences...";
  626. actionProperties.m_category = "Editor";
  627. m_actionManagerInterface->RegisterAction(
  628. EditorIdentifiers::MainWindowActionContextIdentifier,
  629. actionIdentifier,
  630. actionProperties,
  631. [cryEdit = m_cryEditApp]
  632. {
  633. cryEdit->OnToolsPreferences();
  634. }
  635. );
  636. // This action is only accessible outside of Component Modes
  637. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  638. }
  639. // Editor Settings Manager
  640. {
  641. constexpr AZStd::string_view actionIdentifier = "o3de.action.edit.editorSettingsManager";
  642. AzToolsFramework::ActionProperties actionProperties;
  643. actionProperties.m_name = "Editor Settings Manager";
  644. actionProperties.m_category = "Editor";
  645. m_actionManagerInterface->RegisterAction(
  646. EditorIdentifiers::MainWindowActionContextIdentifier,
  647. actionIdentifier,
  648. actionProperties,
  649. []
  650. {
  651. QtViewPaneManager::instance()->OpenPane(LyViewPane::EditorSettingsManager);
  652. }
  653. );
  654. // This action is only accessible outside of Component Modes
  655. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  656. }
  657. // Rename Entity (in the Entity Outliner)
  658. {
  659. const AZStd::string_view actionIdentifier = "o3de.action.entity.rename";
  660. AzToolsFramework::ActionProperties actionProperties;
  661. actionProperties.m_name = "Rename";
  662. actionProperties.m_description = "Rename the current selection.";
  663. actionProperties.m_category = "Entity";
  664. m_actionManagerInterface->RegisterAction(
  665. EditorIdentifiers::MainWindowActionContextIdentifier,
  666. actionIdentifier,
  667. actionProperties,
  668. []()
  669. {
  670. AzToolsFramework::EntityIdList selectedEntities;
  671. AzToolsFramework::ToolsApplicationRequests::Bus::BroadcastResult(
  672. selectedEntities, &AzToolsFramework::ToolsApplicationRequests::Bus::Events::GetSelectedEntities);
  673. // Can only rename one entity at a time
  674. if (selectedEntities.size() == 1)
  675. {
  676. AzToolsFramework::EntityOutlinerRequestBus::Broadcast(
  677. &AzToolsFramework::EntityOutlinerRequests::TriggerRenameEntityUi, selectedEntities.front());
  678. }
  679. }
  680. );
  681. m_actionManagerInterface->InstallEnabledStateCallback(
  682. actionIdentifier,
  683. []() -> bool
  684. {
  685. int selectedEntitiesCount;
  686. AzToolsFramework::ToolsApplicationRequests::Bus::BroadcastResult(
  687. selectedEntitiesCount, &AzToolsFramework::ToolsApplicationRequests::Bus::Events::GetSelectedEntitiesCount);
  688. // Can only rename one entity at a time
  689. return selectedEntitiesCount == 1;
  690. }
  691. );
  692. // Trigger update whenever entity selection changes.
  693. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::EntitySelectionChangedUpdaterIdentifier, actionIdentifier);
  694. m_hotKeyManagerInterface->SetActionHotKey(actionIdentifier, "F2");
  695. }
  696. // Find Entity (in the Entity Outliner)
  697. {
  698. const AZStd::string_view actionIdentifier = "o3de.action.entityOutliner.findEntity";
  699. AzToolsFramework::ActionProperties actionProperties;
  700. actionProperties.m_name = "Find in Entity Outliner";
  701. actionProperties.m_description = "Ensure the current entity is visible in the Entity Outliner.";
  702. actionProperties.m_category = "Entity";
  703. m_actionManagerInterface->RegisterAction(
  704. EditorIdentifiers::MainWindowActionContextIdentifier,
  705. actionIdentifier,
  706. actionProperties,
  707. []()
  708. {
  709. AzToolsFramework::EntityIdList selectedEntities;
  710. AzToolsFramework::ToolsApplicationRequests::Bus::BroadcastResult(
  711. selectedEntities, &AzToolsFramework::ToolsApplicationRequests::Bus::Events::GetSelectedEntities);
  712. if (!selectedEntities.empty())
  713. {
  714. AzToolsFramework::EditorEntityContextNotificationBus::Broadcast(
  715. &EditorEntityContextNotification::OnFocusInEntityOutliner, selectedEntities);
  716. }
  717. }
  718. );
  719. m_actionManagerInterface->InstallEnabledStateCallback(
  720. actionIdentifier,
  721. []() -> bool
  722. {
  723. AzToolsFramework::EntityIdList selectedEntities;
  724. AzToolsFramework::ToolsApplicationRequests::Bus::BroadcastResult(
  725. selectedEntities, &AzToolsFramework::ToolsApplicationRequests::Bus::Events::GetSelectedEntities);
  726. return !selectedEntities.empty();
  727. }
  728. );
  729. // Trigger update whenever entity selection changes.
  730. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::EntitySelectionChangedUpdaterIdentifier, actionIdentifier);
  731. // Trigger update whenever entity selection changes.
  732. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::EntitySelectionChangedUpdaterIdentifier, actionIdentifier);
  733. }
  734. // --- Game Actions
  735. // Play Game
  736. {
  737. constexpr AZStd::string_view actionIdentifier = "o3de.action.game.play";
  738. AzToolsFramework::ActionProperties actionProperties;
  739. actionProperties.m_name = "Play Game";
  740. actionProperties.m_description = "Activate the game input mode.";
  741. actionProperties.m_category = "Game";
  742. actionProperties.m_iconPath = ":/stylesheet/img/UI20/toolbar/Play.svg";
  743. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  744. m_actionManagerInterface->RegisterCheckableAction(
  745. EditorIdentifiers::MainWindowActionContextIdentifier,
  746. actionIdentifier,
  747. actionProperties,
  748. [cryEdit = m_cryEditApp]
  749. {
  750. cryEdit->OnViewSwitchToGame();
  751. },
  752. []
  753. {
  754. return GetIEditor()->IsInGameMode();
  755. }
  756. );
  757. m_actionManagerInterface->InstallEnabledStateCallback(actionIdentifier, IsLevelLoaded);
  758. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::LevelLoadedUpdaterIdentifier, actionIdentifier);
  759. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::GameModeStateChangedUpdaterIdentifier, actionIdentifier);
  760. // This action is only accessible outside of Component Modes
  761. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  762. m_hotKeyManagerInterface->SetActionHotKey(actionIdentifier, "Ctrl+G");
  763. }
  764. // Play Game (Maximized)
  765. {
  766. constexpr AZStd::string_view actionIdentifier = "o3de.action.game.playMaximized";
  767. AzToolsFramework::ActionProperties actionProperties;
  768. actionProperties.m_name = "Play Game (Maximized)";
  769. actionProperties.m_description = "Activate the game input mode (maximized).";
  770. actionProperties.m_category = "Game";
  771. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  772. m_actionManagerInterface->RegisterCheckableAction(
  773. EditorIdentifiers::MainWindowActionContextIdentifier,
  774. actionIdentifier,
  775. actionProperties,
  776. [cryEdit = m_cryEditApp]
  777. {
  778. cryEdit->OnViewSwitchToGameFullScreen();
  779. },
  780. []
  781. {
  782. return GetIEditor()->IsInGameMode();
  783. }
  784. );
  785. m_actionManagerInterface->InstallEnabledStateCallback(actionIdentifier, IsLevelLoaded);
  786. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::LevelLoadedUpdaterIdentifier, actionIdentifier);
  787. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::GameModeStateChangedUpdaterIdentifier, actionIdentifier);
  788. // This action is only accessible outside of Component Modes
  789. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  790. }
  791. // Simulate
  792. {
  793. constexpr AZStd::string_view actionIdentifier = "o3de.action.game.simulate";
  794. AzToolsFramework::ActionProperties actionProperties;
  795. actionProperties.m_name = "Simulate";
  796. actionProperties.m_description = "Enable processing of Physics and AI.";
  797. actionProperties.m_category = "Game";
  798. actionProperties.m_iconPath = ":/stylesheet/img/UI20/toolbar/Simulate_Physics.svg";
  799. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  800. m_actionManagerInterface->RegisterCheckableAction(
  801. EditorIdentifiers::MainWindowActionContextIdentifier,
  802. actionIdentifier,
  803. actionProperties,
  804. [cryEdit = m_cryEditApp]
  805. {
  806. cryEdit->OnSwitchPhysics();
  807. },
  808. [cryEdit = m_cryEditApp]
  809. {
  810. return !cryEdit->IsExportingLegacyData() && GetIEditor()->GetGameEngine()->GetSimulationMode();
  811. }
  812. );
  813. m_actionManagerInterface->InstallEnabledStateCallback(actionIdentifier, IsLevelLoaded);
  814. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::LevelLoadedUpdaterIdentifier, actionIdentifier);
  815. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::GameModeStateChangedUpdaterIdentifier, actionIdentifier);
  816. // This action is only accessible outside of Component Modes
  817. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  818. }
  819. // Move Player and Camera Separately
  820. {
  821. constexpr AZStd::string_view actionIdentifier = "o3de.action.game.movePlayerAndCameraSeparately";
  822. AzToolsFramework::ActionProperties actionProperties;
  823. actionProperties.m_name = "Move Player and Camera Separately";
  824. actionProperties.m_description = "Move Player and Camera Separately.";
  825. actionProperties.m_category = "Game";
  826. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  827. m_actionManagerInterface->RegisterCheckableAction(
  828. EditorIdentifiers::MainWindowActionContextIdentifier,
  829. actionIdentifier,
  830. actionProperties,
  831. []
  832. {
  833. GetIEditor()->GetGameEngine()->SyncPlayerPosition(!GetIEditor()->GetGameEngine()->IsSyncPlayerPosition());
  834. },
  835. []
  836. {
  837. return !GetIEditor()->GetGameEngine()->IsSyncPlayerPosition();
  838. }
  839. );
  840. // This action is only accessible outside of Component Modes
  841. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  842. }
  843. // Stop All Sounds
  844. {
  845. constexpr AZStd::string_view actionIdentifier = "o3de.action.game.audio.stopAllSounds";
  846. AzToolsFramework::ActionProperties actionProperties;
  847. actionProperties.m_name = "Stop All Sounds";
  848. actionProperties.m_description = "Stop All Sounds.";
  849. actionProperties.m_category = "Game";
  850. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  851. m_actionManagerInterface->RegisterAction(
  852. EditorIdentifiers::MainWindowActionContextIdentifier,
  853. actionIdentifier,
  854. actionProperties,
  855. []
  856. {
  857. LmbrCentral::AudioSystemComponentRequestBus::Broadcast(
  858. &LmbrCentral::AudioSystemComponentRequestBus::Events::GlobalStopAllSounds);
  859. }
  860. );
  861. // This action is only accessible outside of Component Modes
  862. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  863. }
  864. // Refresh Audio System
  865. {
  866. constexpr AZStd::string_view actionIdentifier = "o3de.action.game.audio.refresh";
  867. AzToolsFramework::ActionProperties actionProperties;
  868. actionProperties.m_name = "Refresh";
  869. actionProperties.m_description = "Refresh Audio System.";
  870. actionProperties.m_category = "Game";
  871. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  872. m_actionManagerInterface->RegisterAction(
  873. EditorIdentifiers::MainWindowActionContextIdentifier,
  874. actionIdentifier,
  875. actionProperties,
  876. []
  877. {
  878. AZStd::string levelName;
  879. AzToolsFramework::EditorRequestBus::BroadcastResult(levelName, &AzToolsFramework::EditorRequestBus::Events::GetLevelName);
  880. AZStd::to_lower(levelName.begin(), levelName.end());
  881. if (levelName == "untitled")
  882. {
  883. levelName.clear();
  884. }
  885. LmbrCentral::AudioSystemComponentRequestBus::Broadcast(
  886. &LmbrCentral::AudioSystemComponentRequestBus::Events::GlobalRefreshAudio, AZStd::string_view{ levelName });
  887. }
  888. );
  889. // This action is only accessible outside of Component Modes
  890. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  891. }
  892. // Error Report
  893. {
  894. constexpr AZStd::string_view actionIdentifier = "o3de.action.game.debugging.errorDialog";
  895. AzToolsFramework::ActionProperties actionProperties;
  896. actionProperties.m_name = "Error Report";
  897. actionProperties.m_description = "Open the Error Report dialog.";
  898. actionProperties.m_category = "Debugging";
  899. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  900. m_actionManagerInterface->RegisterAction(
  901. EditorIdentifiers::MainWindowActionContextIdentifier,
  902. actionIdentifier,
  903. actionProperties,
  904. [qtViewPaneManager = m_qtViewPaneManager]
  905. {
  906. qtViewPaneManager->OpenPane(LyViewPane::ErrorReport);
  907. }
  908. );
  909. // This action is only accessible outside of Component Modes
  910. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  911. }
  912. // Configure Toolbox Macros
  913. {
  914. constexpr AZStd::string_view actionIdentifier = "o3de.action.game.debugging.toolboxMacros";
  915. AzToolsFramework::ActionProperties actionProperties;
  916. actionProperties.m_name = "Configure Toolbox Macros...";
  917. actionProperties.m_description = "Open the Toolbox Macros dialog.";
  918. actionProperties.m_category = "Debugging";
  919. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  920. m_actionManagerInterface->RegisterAction(
  921. EditorIdentifiers::MainWindowActionContextIdentifier,
  922. actionIdentifier,
  923. actionProperties,
  924. [&]
  925. {
  926. ToolsConfigDialog dlg;
  927. if (dlg.exec() == QDialog::Accepted)
  928. {
  929. RefreshToolboxMacroActions();
  930. }
  931. }
  932. );
  933. // This action is only accessible outside of Component Modes
  934. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  935. }
  936. // -- Tools Actions
  937. // Lua Editor
  938. {
  939. constexpr AZStd::string_view actionIdentifier = "o3de.action.tools.luaEditor";
  940. AzToolsFramework::ActionProperties actionProperties;
  941. actionProperties.m_name = "Lua Editor";
  942. actionProperties.m_category = "Tools";
  943. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  944. m_actionManagerInterface->RegisterAction(
  945. EditorIdentifiers::MainWindowActionContextIdentifier,
  946. actionIdentifier,
  947. actionProperties,
  948. []
  949. {
  950. AzToolsFramework::EditorRequestBus::Broadcast(&AzToolsFramework::EditorRequests::LaunchLuaEditor, nullptr);
  951. }
  952. );
  953. // This action is only accessible outside of Component Modes
  954. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  955. }
  956. // --- View Actions
  957. // Component Entity Layout
  958. {
  959. constexpr AZStd::string_view actionIdentifier = "o3de.action.layout.componentEntityLayout";
  960. AzToolsFramework::ActionProperties actionProperties;
  961. actionProperties.m_name = "Component Entity Layout (Default)";
  962. actionProperties.m_category = "Layout";
  963. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  964. m_actionManagerInterface->RegisterAction(
  965. EditorIdentifiers::MainWindowActionContextIdentifier,
  966. actionIdentifier,
  967. actionProperties,
  968. [this]
  969. {
  970. m_mainWindow->m_viewPaneManager->RestoreDefaultLayout();
  971. }
  972. );
  973. // This action is only accessible outside of Component Modes
  974. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  975. }
  976. // Save Layout...
  977. {
  978. constexpr AZStd::string_view actionIdentifier = "o3de.action.layout.save";
  979. AzToolsFramework::ActionProperties actionProperties;
  980. actionProperties.m_name = "Save Layout...";
  981. actionProperties.m_description = "Save the current layout.";
  982. actionProperties.m_category = "Layout";
  983. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  984. m_actionManagerInterface->RegisterAction(
  985. EditorIdentifiers::MainWindowActionContextIdentifier,
  986. actionIdentifier,
  987. actionProperties,
  988. [this]
  989. {
  990. m_mainWindow->SaveLayout();
  991. }
  992. );
  993. // This action is only accessible outside of Component Modes
  994. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  995. }
  996. // Restore Default Layout
  997. {
  998. constexpr AZStd::string_view actionIdentifier = "o3de.action.layout.restoreDefault";
  999. AzToolsFramework::ActionProperties actionProperties;
  1000. actionProperties.m_name = "Restore Default Layout";
  1001. actionProperties.m_description = "Restored the default layout for the Editor.";
  1002. actionProperties.m_category = "Layout";
  1003. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  1004. m_actionManagerInterface->RegisterAction(
  1005. EditorIdentifiers::MainWindowActionContextIdentifier,
  1006. actionIdentifier,
  1007. actionProperties,
  1008. [this]
  1009. {
  1010. m_mainWindow->m_viewPaneManager->RestoreDefaultLayout(true);
  1011. }
  1012. );
  1013. // This action is only accessible outside of Component Modes
  1014. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  1015. }
  1016. // Go to Position...
  1017. {
  1018. constexpr AZStd::string_view actionIdentifier = "o3de.action.view.goToPosition";
  1019. AzToolsFramework::ActionProperties actionProperties;
  1020. actionProperties.m_name = "Go to Position...";
  1021. actionProperties.m_description = "Move the editor camera to the position and rotation provided.";
  1022. actionProperties.m_category = "View";
  1023. actionProperties.m_iconPath = ":/Menu/camera.svg";
  1024. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  1025. m_actionManagerInterface->RegisterAction(
  1026. EditorIdentifiers::MainWindowActionContextIdentifier,
  1027. actionIdentifier,
  1028. actionProperties,
  1029. [cryEdit = m_cryEditApp]
  1030. {
  1031. cryEdit->OnDisplayGotoPosition();
  1032. }
  1033. );
  1034. m_actionManagerInterface->InstallEnabledStateCallback(actionIdentifier, IsLevelLoaded);
  1035. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::LevelLoadedUpdaterIdentifier, actionIdentifier);
  1036. }
  1037. // Center on Selection
  1038. {
  1039. constexpr AZStd::string_view actionIdentifier = "o3de.action.view.centerOnSelection";
  1040. AzToolsFramework::ActionProperties actionProperties;
  1041. actionProperties.m_name = "Find Selected Entities in Viewport";
  1042. actionProperties.m_description = "Center the viewport to show selected entities.";
  1043. actionProperties.m_category = "View";
  1044. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  1045. m_actionManagerInterface->RegisterAction(
  1046. EditorIdentifiers::MainWindowActionContextIdentifier,
  1047. actionIdentifier,
  1048. actionProperties,
  1049. []
  1050. {
  1051. AzToolsFramework::EditorRequestBus::Broadcast(&AzToolsFramework::EditorRequestBus::Events::GoToSelectedEntitiesInViewports);
  1052. }
  1053. );
  1054. m_actionManagerInterface->InstallEnabledStateCallback(actionIdentifier, AreEntitiesSelected);
  1055. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::EntitySelectionChangedUpdaterIdentifier, actionIdentifier);
  1056. m_hotKeyManagerInterface->SetActionHotKey(actionIdentifier, "Z");
  1057. }
  1058. // View Bookmarks
  1059. InitializeViewBookmarkActions();
  1060. // Show Icons
  1061. {
  1062. constexpr AZStd::string_view actionIdentifier = "o3de.action.view.toggleIcons";
  1063. AzToolsFramework::ActionProperties actionProperties;
  1064. actionProperties.m_name = "Show Icons";
  1065. actionProperties.m_description = "Show/Hide Icons.";
  1066. actionProperties.m_category = "View";
  1067. m_actionManagerInterface->RegisterCheckableAction(
  1068. EditorIdentifiers::MainWindowActionContextIdentifier,
  1069. actionIdentifier,
  1070. actionProperties,
  1071. []
  1072. {
  1073. AzToolsFramework::SetIconsVisible(!AzToolsFramework::IconsVisible());
  1074. AzToolsFramework::EditorSettingsAPIBus::Broadcast(
  1075. &AzToolsFramework::EditorSettingsAPIBus::Events::SaveSettingsRegistryFile);
  1076. },
  1077. []
  1078. {
  1079. return AzToolsFramework::IconsVisible();
  1080. });
  1081. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::IconsStateChangedUpdaterIdentifier, actionIdentifier);
  1082. m_hotKeyManagerInterface->SetActionHotKey(actionIdentifier, "Ctrl+Space");
  1083. }
  1084. // Show Helpers
  1085. {
  1086. constexpr AZStd::string_view actionIdentifier = "o3de.action.view.showHelpers";
  1087. AzToolsFramework::ActionProperties actionProperties;
  1088. actionProperties.m_name = "Show Helpers for all entities";
  1089. actionProperties.m_description = "Show Helpers.";
  1090. actionProperties.m_category = "View";
  1091. actionProperties.m_iconPath = ":/Menu/helpers.svg";
  1092. m_actionManagerInterface->RegisterCheckableAction(
  1093. EditorIdentifiers::MainWindowActionContextIdentifier,
  1094. actionIdentifier,
  1095. actionProperties,
  1096. [this]
  1097. {
  1098. AzToolsFramework::SetHelpersVisible(true);
  1099. AzToolsFramework::SetOnlyShowHelpersForSelectedEntities(false);
  1100. m_actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::DrawHelpersStateChangedUpdaterIdentifier);
  1101. AzToolsFramework::EditorSettingsAPIBus::Broadcast(
  1102. &AzToolsFramework::EditorSettingsAPIBus::Events::SaveSettingsRegistryFile);
  1103. },
  1104. []
  1105. {
  1106. return AzToolsFramework::HelpersVisible();
  1107. }
  1108. );
  1109. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::DrawHelpersStateChangedUpdaterIdentifier, actionIdentifier);
  1110. m_hotKeyManagerInterface->SetActionHotKey(actionIdentifier, "Shift+Space");
  1111. }
  1112. // Only Show Helpers for Selected Entities
  1113. {
  1114. constexpr AZStd::string_view actionIdentifier = "o3de.action.view.showSelectedEntityHelpers";
  1115. AzToolsFramework::ActionProperties actionProperties;
  1116. actionProperties.m_name = "Show Helpers for selected entities";
  1117. actionProperties.m_description = "If enabled, shows Helpers for selected entities only.";
  1118. actionProperties.m_category = "View";
  1119. m_actionManagerInterface->RegisterCheckableAction(
  1120. EditorIdentifiers::MainWindowActionContextIdentifier,
  1121. actionIdentifier,
  1122. actionProperties,
  1123. [this]
  1124. {
  1125. AzToolsFramework::SetOnlyShowHelpersForSelectedEntities(true);
  1126. AzToolsFramework::SetHelpersVisible(false);
  1127. m_actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::DrawHelpersStateChangedUpdaterIdentifier);
  1128. AzToolsFramework::EditorSettingsAPIBus::Broadcast(
  1129. &AzToolsFramework::EditorSettingsAPIBus::Events::SaveSettingsRegistryFile);
  1130. },
  1131. []
  1132. {
  1133. return AzToolsFramework::OnlyShowHelpersForSelectedEntities();
  1134. });
  1135. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::DrawHelpersStateChangedUpdaterIdentifier, actionIdentifier);
  1136. }
  1137. // Hide Helpers
  1138. {
  1139. constexpr AZStd::string_view actionIdentifier = "o3de.action.view.hideHelpers";
  1140. AzToolsFramework::ActionProperties actionProperties;
  1141. actionProperties.m_name = "Hide Helpers";
  1142. actionProperties.m_description = "Hide all helpers";
  1143. actionProperties.m_category = "View";
  1144. m_actionManagerInterface->RegisterCheckableAction(
  1145. EditorIdentifiers::MainWindowActionContextIdentifier,
  1146. actionIdentifier,
  1147. actionProperties,
  1148. [this]
  1149. {
  1150. AzToolsFramework::SetOnlyShowHelpersForSelectedEntities(false);
  1151. AzToolsFramework::SetHelpersVisible(false);
  1152. m_actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::DrawHelpersStateChangedUpdaterIdentifier);
  1153. AzToolsFramework::EditorSettingsAPIBus::Broadcast(
  1154. &AzToolsFramework::EditorSettingsAPIBus::Events::SaveSettingsRegistryFile);
  1155. },
  1156. []
  1157. {
  1158. return !AzToolsFramework::HelpersVisible() && !AzToolsFramework::OnlyShowHelpersForSelectedEntities();
  1159. });
  1160. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::DrawHelpersStateChangedUpdaterIdentifier, actionIdentifier);
  1161. }
  1162. // Refresh Style
  1163. {
  1164. constexpr AZStd::string_view actionIdentifier = "o3de.action.view.refreshEditorStyle";
  1165. AzToolsFramework::ActionProperties actionProperties;
  1166. actionProperties.m_name = "Refresh Style";
  1167. actionProperties.m_description = "Refreshes the editor stylesheet.";
  1168. actionProperties.m_category = "View";
  1169. m_actionManagerInterface->RegisterAction(
  1170. EditorIdentifiers::MainWindowActionContextIdentifier,
  1171. actionIdentifier,
  1172. actionProperties,
  1173. []
  1174. {
  1175. GetIEditor()->Notify(eNotify_OnStyleChanged);
  1176. }
  1177. );
  1178. }
  1179. // --- Help Actions
  1180. // Tutorials
  1181. {
  1182. AzToolsFramework::ActionProperties actionProperties;
  1183. actionProperties.m_name = "Tutorials";
  1184. actionProperties.m_category = "Help";
  1185. m_actionManagerInterface->RegisterAction(
  1186. EditorIdentifiers::MainWindowActionContextIdentifier, "o3de.action.help.tutorials", actionProperties,
  1187. [cryEdit = m_cryEditApp]
  1188. {
  1189. cryEdit->OnDocumentationTutorials();
  1190. }
  1191. );
  1192. }
  1193. // Open 3D Engine Documentation
  1194. {
  1195. AzToolsFramework::ActionProperties actionProperties;
  1196. actionProperties.m_name = "Open 3D Engine Documentation";
  1197. actionProperties.m_category = "Help";
  1198. m_actionManagerInterface->RegisterAction(
  1199. EditorIdentifiers::MainWindowActionContextIdentifier, "o3de.action.help.documentation.o3de", actionProperties,
  1200. [cryEdit = m_cryEditApp]
  1201. {
  1202. cryEdit->OnDocumentationO3DE();
  1203. }
  1204. );
  1205. }
  1206. // Release Notes
  1207. {
  1208. AzToolsFramework::ActionProperties actionProperties;
  1209. actionProperties.m_name = "Release Notes";
  1210. actionProperties.m_category = "Help";
  1211. m_actionManagerInterface->RegisterAction(
  1212. EditorIdentifiers::MainWindowActionContextIdentifier, "o3de.action.help.documentation.releasenotes", actionProperties,
  1213. [cryEdit = m_cryEditApp]
  1214. {
  1215. cryEdit->OnDocumentationReleaseNotes();
  1216. }
  1217. );
  1218. }
  1219. // GameDev Blog
  1220. {
  1221. AzToolsFramework::ActionProperties actionProperties;
  1222. actionProperties.m_name = "GameDev Blog";
  1223. actionProperties.m_category = "Help";
  1224. m_actionManagerInterface->RegisterAction(
  1225. EditorIdentifiers::MainWindowActionContextIdentifier, "o3de.action.help.resources.gamedevblog", actionProperties,
  1226. [cryEdit = m_cryEditApp]
  1227. {
  1228. cryEdit->OnDocumentationGameDevBlog();
  1229. }
  1230. );
  1231. }
  1232. // Forums
  1233. {
  1234. AzToolsFramework::ActionProperties actionProperties;
  1235. actionProperties.m_name = "Forums";
  1236. actionProperties.m_category = "Help";
  1237. m_actionManagerInterface->RegisterAction(
  1238. EditorIdentifiers::MainWindowActionContextIdentifier, "o3de.action.help.resources.forums", actionProperties,
  1239. [cryEdit = m_cryEditApp]
  1240. {
  1241. cryEdit->OnDocumentationForums();
  1242. }
  1243. );
  1244. }
  1245. // About O3DE
  1246. {
  1247. AzToolsFramework::ActionProperties actionProperties;
  1248. actionProperties.m_name = "&About O3DE";
  1249. actionProperties.m_category = "Help";
  1250. m_actionManagerInterface->RegisterAction(
  1251. EditorIdentifiers::MainWindowActionContextIdentifier, "o3de.action.help.abouto3de", actionProperties,
  1252. [cryEdit = m_cryEditApp]
  1253. {
  1254. cryEdit->OnAppAbout();
  1255. }
  1256. );
  1257. }
  1258. // Welcome
  1259. {
  1260. constexpr AZStd::string_view actionIdentifier = "o3de.action.help.welcome";
  1261. AzToolsFramework::ActionProperties actionProperties;
  1262. actionProperties.m_name = "&Welcome";
  1263. actionProperties.m_category = "Help";
  1264. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  1265. m_actionManagerInterface->RegisterAction(
  1266. EditorIdentifiers::MainWindowActionContextIdentifier,
  1267. actionIdentifier,
  1268. actionProperties,
  1269. [cryEdit = m_cryEditApp]
  1270. {
  1271. cryEdit->OnAppShowWelcomeScreen();
  1272. }
  1273. );
  1274. // This action is only accessible outside of Component Modes
  1275. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  1276. }
  1277. }
  1278. void EditorActionsHandler::OnWidgetActionRegistrationHook()
  1279. {
  1280. // Help - Search Documentation Widget
  1281. {
  1282. AzToolsFramework::WidgetActionProperties widgetActionProperties;
  1283. widgetActionProperties.m_name = "Search Documentation";
  1284. widgetActionProperties.m_category = "Help";
  1285. auto outcome = m_actionManagerInterface->RegisterWidgetAction(
  1286. "o3de.widgetAction.help.searchDocumentation",
  1287. widgetActionProperties,
  1288. [&]
  1289. {
  1290. return CreateDocsSearchWidget();
  1291. }
  1292. );
  1293. }
  1294. // Expander
  1295. {
  1296. AzToolsFramework::WidgetActionProperties widgetActionProperties;
  1297. widgetActionProperties.m_name = "Expander";
  1298. widgetActionProperties.m_category = "Widgets";
  1299. m_actionManagerInterface->RegisterWidgetAction(
  1300. "o3de.widgetAction.expander",
  1301. widgetActionProperties,
  1302. [&]
  1303. {
  1304. return CreateExpander();
  1305. }
  1306. );
  1307. }
  1308. // Play Controls - Label
  1309. {
  1310. AzToolsFramework::WidgetActionProperties widgetActionProperties;
  1311. widgetActionProperties.m_name = "Play Controls Label";
  1312. widgetActionProperties.m_category = "Game";
  1313. m_actionManagerInterface->RegisterWidgetAction(
  1314. "o3de.widgetAction.game.playControlsLabel",
  1315. widgetActionProperties,
  1316. [&]
  1317. {
  1318. return CreatePlayControlsLabel();
  1319. }
  1320. );
  1321. }
  1322. // Prefab Edit Visual Mode Selection Widget
  1323. {
  1324. AzToolsFramework::WidgetActionProperties widgetActionProperties;
  1325. widgetActionProperties.m_name = "Prefab Edit Visual Mode Selection";
  1326. widgetActionProperties.m_category = "Prefabs";
  1327. auto outcome = m_actionManagerInterface->RegisterWidgetAction(
  1328. "o3de.widgetAction.prefab.editVisualMode",
  1329. widgetActionProperties,
  1330. []() -> QWidget*
  1331. {
  1332. return new PrefabEditVisualModeWidget();
  1333. }
  1334. );
  1335. }
  1336. // Viewport - Field of View Property Widget
  1337. {
  1338. AzToolsFramework::WidgetActionProperties widgetActionProperties;
  1339. widgetActionProperties.m_name = "Viewport Field of View";
  1340. widgetActionProperties.m_category = "Viewport";
  1341. auto outcome = m_actionManagerInterface->RegisterWidgetAction(
  1342. "o3de.widgetAction.viewport.fieldOfView",
  1343. widgetActionProperties,
  1344. []() -> QWidget*
  1345. {
  1346. return new ViewportFieldOfViewPropertyWidget();
  1347. }
  1348. );
  1349. }
  1350. // Viewport - Camera Speed Scale Property Widget
  1351. {
  1352. AzToolsFramework::WidgetActionProperties widgetActionProperties;
  1353. widgetActionProperties.m_name = "Viewport Camera Speed Scale";
  1354. widgetActionProperties.m_category = "Viewport";
  1355. auto outcome = m_actionManagerInterface->RegisterWidgetAction(
  1356. "o3de.widgetAction.viewport.cameraSpeedScale",
  1357. widgetActionProperties,
  1358. []() -> QWidget*
  1359. {
  1360. return new ViewportCameraSpeedScalePropertyWidget();
  1361. }
  1362. );
  1363. }
  1364. // Viewport - Grid Size Property Widget
  1365. {
  1366. AzToolsFramework::WidgetActionProperties widgetActionProperties;
  1367. widgetActionProperties.m_name = "Viewport Grid Snapping Size";
  1368. widgetActionProperties.m_category = "Viewport";
  1369. auto outcome = m_actionManagerInterface->RegisterWidgetAction(
  1370. "o3de.widgetAction.viewport.gridSnappingSize",
  1371. widgetActionProperties,
  1372. []() -> QWidget*
  1373. {
  1374. return new ViewportGridSnappingSizePropertyWidget();
  1375. }
  1376. );
  1377. }
  1378. // Viewport - Angle Size Property Widget
  1379. {
  1380. AzToolsFramework::WidgetActionProperties widgetActionProperties;
  1381. widgetActionProperties.m_name = "Viewport Angle Snapping Size";
  1382. widgetActionProperties.m_category = "Viewport";
  1383. auto outcome = m_actionManagerInterface->RegisterWidgetAction(
  1384. "o3de.widgetAction.viewport.angleSnappingSize",
  1385. widgetActionProperties,
  1386. []() -> QWidget*
  1387. {
  1388. return new ViewportAngleSnappingSizePropertyWidget();
  1389. }
  1390. );
  1391. }
  1392. }
  1393. void EditorActionsHandler::OnMenuBarRegistrationHook()
  1394. {
  1395. // Register MenuBar
  1396. m_menuManagerInterface->RegisterMenuBar(EditorIdentifiers::EditorMainWindowMenuBarIdentifier, m_mainWindow);
  1397. }
  1398. void EditorActionsHandler::OnMenuRegistrationHook()
  1399. {
  1400. // Initialize Menus
  1401. {
  1402. AzToolsFramework::MenuProperties menuProperties;
  1403. menuProperties.m_name = "&File";
  1404. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::FileMenuIdentifier, menuProperties);
  1405. }
  1406. {
  1407. AzToolsFramework::MenuProperties menuProperties;
  1408. menuProperties.m_name = "Open Recent";
  1409. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::RecentFilesMenuIdentifier, menuProperties);
  1410. // Legacy - the menu should update when the files list is changed.
  1411. QMenu* menu = m_menuManagerInternalInterface->GetMenu(EditorIdentifiers::FileMenuIdentifier);
  1412. QObject::connect(
  1413. menu,
  1414. &QMenu::aboutToShow,
  1415. m_mainWindow,
  1416. [&]
  1417. {
  1418. UpdateRecentFileActions();
  1419. }
  1420. );
  1421. }
  1422. {
  1423. AzToolsFramework::MenuProperties menuProperties;
  1424. menuProperties.m_name = "&Edit";
  1425. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::EditMenuIdentifier, menuProperties);
  1426. }
  1427. {
  1428. AzToolsFramework::MenuProperties menuProperties;
  1429. menuProperties.m_name = "Modify";
  1430. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::EditModifyMenuIdentifier, menuProperties);
  1431. }
  1432. {
  1433. AzToolsFramework::MenuProperties menuProperties;
  1434. menuProperties.m_name = "Snap";
  1435. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::EditModifySnapMenuIdentifier, menuProperties);
  1436. }
  1437. {
  1438. AzToolsFramework::MenuProperties menuProperties;
  1439. menuProperties.m_name = "Transform Mode";
  1440. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::EditModifyModesMenuIdentifier, menuProperties);
  1441. }
  1442. {
  1443. AzToolsFramework::MenuProperties menuProperties;
  1444. menuProperties.m_name = "Editor Settings";
  1445. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::EditSettingsMenuIdentifier, menuProperties);
  1446. }
  1447. {
  1448. AzToolsFramework::MenuProperties menuProperties;
  1449. menuProperties.m_name = "&Game";
  1450. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::GameMenuIdentifier, menuProperties);
  1451. }
  1452. {
  1453. AzToolsFramework::MenuProperties menuProperties;
  1454. menuProperties.m_name = "Play Game";
  1455. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::PlayGameMenuIdentifier, menuProperties);
  1456. }
  1457. {
  1458. AzToolsFramework::MenuProperties menuProperties;
  1459. menuProperties.m_name = "Audio";
  1460. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::GameAudioMenuIdentifier, menuProperties);
  1461. }
  1462. {
  1463. AzToolsFramework::MenuProperties menuProperties;
  1464. menuProperties.m_name = "Debugging";
  1465. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::GameDebuggingMenuIdentifier, menuProperties);
  1466. }
  1467. {
  1468. AzToolsFramework::MenuProperties menuProperties;
  1469. menuProperties.m_name = "ToolBox Macros";
  1470. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::ToolBoxMacrosMenuIdentifier, menuProperties);
  1471. }
  1472. {
  1473. AzToolsFramework::MenuProperties menuProperties;
  1474. menuProperties.m_name = "&Tools";
  1475. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::ToolsMenuIdentifier, menuProperties);
  1476. }
  1477. {
  1478. AzToolsFramework::MenuProperties menuProperties;
  1479. menuProperties.m_name = "&View";
  1480. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::ViewMenuIdentifier, menuProperties);
  1481. }
  1482. {
  1483. AzToolsFramework::MenuProperties menuProperties;
  1484. menuProperties.m_name = "Layouts";
  1485. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::LayoutsMenuIdentifier, menuProperties);
  1486. }
  1487. {
  1488. AzToolsFramework::MenuProperties menuProperties;
  1489. menuProperties.m_name = "Viewport";
  1490. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::ViewportMenuIdentifier, menuProperties);
  1491. }
  1492. {
  1493. AzToolsFramework::MenuProperties menuProperties;
  1494. menuProperties.m_name = "Go to Location";
  1495. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::GoToLocationMenuIdentifier, menuProperties);
  1496. }
  1497. {
  1498. AzToolsFramework::MenuProperties menuProperties;
  1499. menuProperties.m_name = "Save Location";
  1500. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::SaveLocationMenuIdentifier, menuProperties);
  1501. }
  1502. {
  1503. AzToolsFramework::MenuProperties menuProperties;
  1504. menuProperties.m_name = "&Help";
  1505. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::HelpMenuIdentifier, menuProperties);
  1506. }
  1507. {
  1508. AzToolsFramework::MenuProperties menuProperties;
  1509. menuProperties.m_name = "Documentation";
  1510. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::HelpDocumentationMenuIdentifier, menuProperties);
  1511. }
  1512. {
  1513. AzToolsFramework::MenuProperties menuProperties;
  1514. menuProperties.m_name = "GameDev Resources";
  1515. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::HelpGameDevResourcesMenuIdentifier, menuProperties);
  1516. }
  1517. // Editor Menus
  1518. {
  1519. AzToolsFramework::MenuProperties menuProperties;
  1520. menuProperties.m_name = "Entity Outliner Context Menu";
  1521. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::EntityOutlinerContextMenuIdentifier, menuProperties);
  1522. }
  1523. {
  1524. AzToolsFramework::MenuProperties menuProperties;
  1525. menuProperties.m_name = "Viewport Context Menu";
  1526. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::ViewportContextMenuIdentifier, menuProperties);
  1527. }
  1528. {
  1529. AzToolsFramework::MenuProperties menuProperties;
  1530. menuProperties.m_name = "Create";
  1531. m_menuManagerInterface->RegisterMenu(EditorIdentifiers::EntityCreationMenuIdentifier, menuProperties);
  1532. }
  1533. }
  1534. void EditorActionsHandler::OnMenuBindingHook()
  1535. {
  1536. // Add Menus to MenuBar
  1537. // We space the sortkeys by 100 to allow external systems to add menus in-between.
  1538. m_menuManagerInterface->AddMenuToMenuBar(EditorIdentifiers::EditorMainWindowMenuBarIdentifier, EditorIdentifiers::FileMenuIdentifier, 100);
  1539. m_menuManagerInterface->AddMenuToMenuBar(EditorIdentifiers::EditorMainWindowMenuBarIdentifier, EditorIdentifiers::EditMenuIdentifier, 200);
  1540. m_menuManagerInterface->AddMenuToMenuBar(EditorIdentifiers::EditorMainWindowMenuBarIdentifier, EditorIdentifiers::GameMenuIdentifier, 300);
  1541. m_menuManagerInterface->AddMenuToMenuBar(EditorIdentifiers::EditorMainWindowMenuBarIdentifier, EditorIdentifiers::ToolsMenuIdentifier, 400);
  1542. m_menuManagerInterface->AddMenuToMenuBar(EditorIdentifiers::EditorMainWindowMenuBarIdentifier, EditorIdentifiers::ViewMenuIdentifier, 500);
  1543. m_menuManagerInterface->AddMenuToMenuBar(EditorIdentifiers::EditorMainWindowMenuBarIdentifier, EditorIdentifiers::HelpMenuIdentifier, 600);
  1544. // Add actions to each menu
  1545. // File
  1546. {
  1547. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::FileMenuIdentifier, "o3de.action.file.new", 100);
  1548. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::FileMenuIdentifier, "o3de.action.file.open", 200);
  1549. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::FileMenuIdentifier, EditorIdentifiers::RecentFilesMenuIdentifier, 300);
  1550. {
  1551. for (int index = 0; index < maxRecentFiles; ++index)
  1552. {
  1553. AZStd::string actionIdentifier = AZStd::string::format("o3de.action.file.recent.file%i", index + 1);
  1554. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::RecentFilesMenuIdentifier, actionIdentifier, 100);
  1555. }
  1556. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::RecentFilesMenuIdentifier, 200);
  1557. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::RecentFilesMenuIdentifier, "o3de.action.file.recent.clearAll", 300);
  1558. }
  1559. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::FileMenuIdentifier, 400);
  1560. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::FileMenuIdentifier, "o3de.action.file.save", 500);
  1561. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::FileMenuIdentifier, "o3de.action.file.saveAs", 600);
  1562. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::FileMenuIdentifier, "o3de.action.file.saveLevelStatistics", 700);
  1563. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::FileMenuIdentifier, 800);
  1564. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::FileMenuIdentifier, "o3de.action.project.editSettings", 900);
  1565. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::FileMenuIdentifier, "o3de.action.platform.editSettings", 1000);
  1566. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::FileMenuIdentifier, 1100);
  1567. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::FileMenuIdentifier, "o3de.action.project.new", 1200);
  1568. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::FileMenuIdentifier, "o3de.action.project.open", 1300);
  1569. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::FileMenuIdentifier, 1400);
  1570. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::FileMenuIdentifier, "o3de.action.file.showLog", 1500);
  1571. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::FileMenuIdentifier, 1600);
  1572. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::FileMenuIdentifier, "o3de.action.editor.exit", 1700);
  1573. }
  1574. // Edit
  1575. {
  1576. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::EditMenuIdentifier, "o3de.action.edit.undo", 100);
  1577. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::EditMenuIdentifier, "o3de.action.edit.redo", 200);
  1578. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::EditMenuIdentifier, EditorIdentifiers::EditModifyMenuIdentifier, 1800);
  1579. {
  1580. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::EditModifyMenuIdentifier, EditorIdentifiers::EditModifySnapMenuIdentifier, 100);
  1581. {
  1582. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::EditModifySnapMenuIdentifier, "o3de.action.edit.snap.toggleGridSnapping", 100);
  1583. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::EditModifySnapMenuIdentifier, "o3de.action.edit.snap.toggleAngleSnapping", 200);
  1584. }
  1585. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::EditModifyMenuIdentifier, EditorIdentifiers::EditModifyModesMenuIdentifier, 200);
  1586. }
  1587. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::EditMenuIdentifier, 1900);
  1588. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::EditMenuIdentifier, EditorIdentifiers::EditSettingsMenuIdentifier, 2000);
  1589. {
  1590. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::EditSettingsMenuIdentifier, "o3de.action.edit.globalPreferences", 100);
  1591. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::EditSettingsMenuIdentifier, "o3de.action.edit.editorSettingsManager", 200);
  1592. }
  1593. }
  1594. // Game
  1595. {
  1596. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::GameMenuIdentifier, EditorIdentifiers::PlayGameMenuIdentifier, 100);
  1597. {
  1598. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::PlayGameMenuIdentifier, "o3de.action.game.play", 100);
  1599. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::PlayGameMenuIdentifier, "o3de.action.game.playMaximized", 200);
  1600. }
  1601. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::GameMenuIdentifier, "o3de.action.game.simulate", 200);
  1602. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::GameMenuIdentifier, 300);
  1603. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::GameMenuIdentifier, 600);
  1604. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::GameMenuIdentifier, "o3de.action.game.movePlayerAndCameraSeparately", 700);
  1605. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::GameMenuIdentifier, 800);
  1606. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::GameMenuIdentifier, EditorIdentifiers::GameAudioMenuIdentifier, 900);
  1607. {
  1608. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::GameAudioMenuIdentifier, "o3de.action.game.audio.stopAllSounds", 100);
  1609. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::GameAudioMenuIdentifier, "o3de.action.game.audio.refresh", 200);
  1610. }
  1611. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::GameMenuIdentifier, 1000);
  1612. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::GameMenuIdentifier, EditorIdentifiers::GameDebuggingMenuIdentifier, 1100);
  1613. {
  1614. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::GameDebuggingMenuIdentifier, "o3de.action.game.debugging.errorDialog", 100);
  1615. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::GameDebuggingMenuIdentifier, 200);
  1616. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::GameDebuggingMenuIdentifier, EditorIdentifiers::ToolBoxMacrosMenuIdentifier, 300);
  1617. {
  1618. // Some of the contents of the ToolBox Macros menu are initialized in RefreshToolboxMacrosActions.
  1619. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::ToolBoxMacrosMenuIdentifier, 200);
  1620. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::ToolBoxMacrosMenuIdentifier, "o3de.action.game.debugging.toolboxMacros", 300);
  1621. }
  1622. }
  1623. }
  1624. // Tools
  1625. {
  1626. m_menuManagerInterface->AddActionToMenu(
  1627. EditorIdentifiers::ToolsMenuIdentifier,
  1628. "o3de.action.tools.luaEditor",
  1629. m_actionManagerInterface->GenerateActionAlphabeticalSortKey("o3de.action.tools.luaEditor")
  1630. );
  1631. }
  1632. // View
  1633. {
  1634. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::ViewMenuIdentifier, EditorIdentifiers::LayoutsMenuIdentifier, 100);
  1635. {
  1636. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::LayoutsMenuIdentifier, "o3de.action.layout.componentEntityLayout", 100);
  1637. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::LayoutsMenuIdentifier, 200);
  1638. // Some of the contents of the Layouts menu are initialized in RefreshLayoutActions.
  1639. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::LayoutsMenuIdentifier, 400);
  1640. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::LayoutsMenuIdentifier, "o3de.action.layout.save", 500);
  1641. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::LayoutsMenuIdentifier, "o3de.action.layout.restoreDefault", 600);
  1642. }
  1643. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::ViewMenuIdentifier, EditorIdentifiers::ViewportMenuIdentifier, 200);
  1644. {
  1645. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::ViewportMenuIdentifier, "o3de.action.view.goToPosition", 100);
  1646. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::ViewportMenuIdentifier, "o3de.action.view.centerOnSelection", 200);
  1647. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::ViewportMenuIdentifier, EditorIdentifiers::GoToLocationMenuIdentifier, 300);
  1648. {
  1649. for (int index = 0; index < m_defaultBookmarkCount; ++index)
  1650. {
  1651. const AZStd::string actionIdentifier = AZStd::string::format("o3de.action.view.bookmark[%i].goTo", index);
  1652. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::GoToLocationMenuIdentifier, actionIdentifier, 0);
  1653. }
  1654. }
  1655. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::ViewportMenuIdentifier, EditorIdentifiers::SaveLocationMenuIdentifier, 400);
  1656. {
  1657. for (int index = 0; index < m_defaultBookmarkCount; ++index)
  1658. {
  1659. const AZStd::string actionIdentifier = AZStd::string::format("o3de.action.view.bookmark[%i].save", index);
  1660. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::SaveLocationMenuIdentifier, actionIdentifier, 0);
  1661. }
  1662. }
  1663. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::ViewportMenuIdentifier, 500);
  1664. m_menuManagerInterface->AddSubMenuToMenu(
  1665. EditorIdentifiers::ViewportMenuIdentifier, EditorIdentifiers::ViewportHelpersMenuIdentifier, 600);
  1666. }
  1667. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::ViewMenuIdentifier, "o3de.action.view.refreshEditorStyle", 300);
  1668. }
  1669. // Help
  1670. {
  1671. m_menuManagerInterface->AddWidgetToMenu(EditorIdentifiers::HelpMenuIdentifier, "o3de.widgetAction.help.searchDocumentation", 100);
  1672. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::HelpMenuIdentifier, "o3de.action.help.tutorials", 200);
  1673. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::HelpMenuIdentifier, EditorIdentifiers::HelpDocumentationMenuIdentifier, 300);
  1674. {
  1675. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::HelpDocumentationMenuIdentifier, "o3de.action.help.documentation.o3de", 100);
  1676. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::HelpDocumentationMenuIdentifier, "o3de.action.help.documentation.gamelift", 200);
  1677. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::HelpDocumentationMenuIdentifier, "o3de.action.help.documentation.releasenotes", 300);
  1678. }
  1679. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::HelpMenuIdentifier, EditorIdentifiers::HelpGameDevResourcesMenuIdentifier, 400);
  1680. {
  1681. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::HelpGameDevResourcesMenuIdentifier, "o3de.action.help.resources.gamedevblog", 100);
  1682. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::HelpGameDevResourcesMenuIdentifier, "o3de.action.help.resources.forums", 200);
  1683. }
  1684. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::HelpMenuIdentifier, 500);
  1685. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::HelpMenuIdentifier, "o3de.action.help.abouto3de", 600);
  1686. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::HelpMenuIdentifier, "o3de.action.help.welcome", 700);
  1687. }
  1688. // Entity Outliner Context Menu
  1689. m_menuManagerInterface->AddSubMenuToMenu(
  1690. EditorIdentifiers::EntityOutlinerContextMenuIdentifier, EditorIdentifiers::EntityCreationMenuIdentifier, 200);
  1691. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::EntityOutlinerContextMenuIdentifier, 10000);
  1692. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::EntityOutlinerContextMenuIdentifier, 20000);
  1693. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::EntityOutlinerContextMenuIdentifier, 30000);
  1694. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::EntityOutlinerContextMenuIdentifier, 40000);
  1695. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::EntityOutlinerContextMenuIdentifier, 50000);
  1696. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::EntityOutlinerContextMenuIdentifier, 60000);
  1697. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::EntityOutlinerContextMenuIdentifier, 70000);
  1698. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::EntityOutlinerContextMenuIdentifier, "o3de.action.entity.rename", 70100);
  1699. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::EntityOutlinerContextMenuIdentifier, 80000);
  1700. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::EntityOutlinerContextMenuIdentifier, "o3de.action.view.centerOnSelection", 80100);
  1701. // Viewport Context Menu
  1702. m_menuManagerInterface->AddSubMenuToMenu(
  1703. EditorIdentifiers::ViewportContextMenuIdentifier, EditorIdentifiers::EntityCreationMenuIdentifier, 200);
  1704. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::ViewportContextMenuIdentifier, 10000);
  1705. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::ViewportContextMenuIdentifier, 20000);
  1706. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::ViewportContextMenuIdentifier, 30000);
  1707. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::ViewportContextMenuIdentifier, 40000);
  1708. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::ViewportContextMenuIdentifier, 50000);
  1709. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::ViewportContextMenuIdentifier, 60000);
  1710. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::ViewportContextMenuIdentifier, 70000);
  1711. m_menuManagerInterface->AddSeparatorToMenu(EditorIdentifiers::ViewportContextMenuIdentifier, 80000);
  1712. m_menuManagerInterface->AddActionToMenu(
  1713. EditorIdentifiers::ViewportContextMenuIdentifier, "o3de.action.entityOutliner.findEntity", 80100);
  1714. }
  1715. void EditorActionsHandler::OnToolBarAreaRegistrationHook()
  1716. {
  1717. m_toolBarManagerInterface->RegisterToolBarArea(
  1718. EditorIdentifiers::MainWindowTopToolBarAreaIdentifier, m_mainWindow, Qt::ToolBarArea::TopToolBarArea);
  1719. }
  1720. void EditorActionsHandler::OnToolBarRegistrationHook()
  1721. {
  1722. // Initialize ToolBars
  1723. {
  1724. AzToolsFramework::ToolBarProperties toolBarProperties;
  1725. toolBarProperties.m_name = "Tools";
  1726. m_toolBarManagerInterface->RegisterToolBar(EditorIdentifiers::ToolsToolBarIdentifier, toolBarProperties);
  1727. }
  1728. {
  1729. AzToolsFramework::ToolBarProperties toolBarProperties;
  1730. toolBarProperties.m_name = "Play Controls";
  1731. m_toolBarManagerInterface->RegisterToolBar(EditorIdentifiers::PlayControlsToolBarIdentifier, toolBarProperties);
  1732. }
  1733. }
  1734. void EditorActionsHandler::OnToolBarBindingHook()
  1735. {
  1736. // Add ToolBars to ToolBar Areas
  1737. // We space the sortkeys by 100 to allow external systems to add toolbars in-between.
  1738. m_toolBarManagerInterface->AddToolBarToToolBarArea(
  1739. EditorIdentifiers::MainWindowTopToolBarAreaIdentifier, EditorIdentifiers::ToolsToolBarIdentifier, 100);
  1740. m_toolBarManagerInterface->AddToolBarToToolBarArea(
  1741. EditorIdentifiers::MainWindowTopToolBarAreaIdentifier, EditorIdentifiers::PlayControlsToolBarIdentifier, 200);
  1742. // Add actions to each toolbar
  1743. // Play Controls
  1744. {
  1745. m_toolBarManagerInterface->AddWidgetToToolBar(EditorIdentifiers::PlayControlsToolBarIdentifier, "o3de.widgetAction.expander", 100);
  1746. m_toolBarManagerInterface->AddSeparatorToToolBar(EditorIdentifiers::PlayControlsToolBarIdentifier, 200);
  1747. m_toolBarManagerInterface->AddWidgetToToolBar(EditorIdentifiers::PlayControlsToolBarIdentifier, "o3de.widgetAction.game.playControlsLabel", 300);
  1748. m_toolBarManagerInterface->AddActionWithSubMenuToToolBar(
  1749. EditorIdentifiers::PlayControlsToolBarIdentifier, "o3de.action.game.play", EditorIdentifiers::PlayGameMenuIdentifier, 400);
  1750. m_toolBarManagerInterface->AddSeparatorToToolBar(EditorIdentifiers::PlayControlsToolBarIdentifier, 500);
  1751. m_toolBarManagerInterface->AddActionToToolBar(EditorIdentifiers::PlayControlsToolBarIdentifier, "o3de.action.game.simulate", 600);
  1752. }
  1753. }
  1754. void EditorActionsHandler::OnPostActionManagerRegistrationHook()
  1755. {
  1756. // Ensure the layouts menu is refreshed when the layouts list changes.
  1757. QObject::connect(
  1758. m_mainWindow->m_viewPaneManager, &QtViewPaneManager::savedLayoutsChanged, m_mainWindow,
  1759. [&]
  1760. {
  1761. RefreshLayoutActions();
  1762. }
  1763. );
  1764. RefreshLayoutActions();
  1765. // Ensure the tools menu and toolbar are refreshed when the viewpanes change.
  1766. QObject::connect(
  1767. m_qtViewPaneManager, &QtViewPaneManager::registeredPanesChanged, m_mainWindow,
  1768. [&]
  1769. {
  1770. RefreshToolActions();
  1771. }
  1772. );
  1773. RefreshToolActions();
  1774. // Initialize the Toolbox Macro actions
  1775. RefreshToolboxMacroActions();
  1776. }
  1777. QWidget* EditorActionsHandler::CreateExpander()
  1778. {
  1779. QWidget* expander = new QWidget(m_mainWindow);
  1780. expander->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
  1781. expander->setVisible(true);
  1782. return expander;
  1783. }
  1784. QWidget* EditorActionsHandler::CreatePlayControlsLabel()
  1785. {
  1786. QLabel* label = new QLabel(m_mainWindow);
  1787. label->setText("Play Controls");
  1788. return label;
  1789. }
  1790. QWidget* EditorActionsHandler::CreateDocsSearchWidget()
  1791. {
  1792. QWidget* containerWidget = new QWidget(m_mainWindow);
  1793. auto lineEdit = new AzQtComponents::SearchLineEdit(m_mainWindow);
  1794. QHBoxLayout* layout = new QHBoxLayout;
  1795. layout->setContentsMargins(0, 0, 0, 0);
  1796. layout->addWidget(lineEdit);
  1797. containerWidget->setLayout(layout);
  1798. containerWidget->setContentsMargins(2, 0, 2, 0);
  1799. lineEdit->setPlaceholderText(QObject::tr("Search documentation..."));
  1800. auto searchAction = [lineEdit]
  1801. {
  1802. auto text = lineEdit->text();
  1803. if (text.isEmpty())
  1804. {
  1805. QDesktopServices::openUrl(QUrl("https://www.o3de.org/docs/"));
  1806. }
  1807. else
  1808. {
  1809. QUrl docSearchUrl("https://www.o3de.org/search/");
  1810. QUrlQuery docSearchQuery;
  1811. docSearchQuery.addQueryItem("query", text);
  1812. docSearchUrl.setQuery(docSearchQuery);
  1813. QDesktopServices::openUrl(docSearchUrl);
  1814. }
  1815. lineEdit->clear();
  1816. };
  1817. QObject::connect(lineEdit, &QLineEdit::returnPressed, m_mainWindow, searchAction);
  1818. QMenu* helpMenu = m_menuManagerInternalInterface->GetMenu(EditorIdentifiers::HelpMenuIdentifier);
  1819. QObject::connect(helpMenu, &QMenu::aboutToHide, lineEdit, &QLineEdit::clear);
  1820. QObject::connect(helpMenu, &QMenu::aboutToShow, lineEdit, &QLineEdit::clearFocus);
  1821. return containerWidget;
  1822. }
  1823. void EditorActionsHandler::OnViewPaneOpened(const char* viewPaneName)
  1824. {
  1825. AZStd::string toolActionIdentifier = AZStd::string::format("o3de.action.tool.%s", viewPaneName);
  1826. m_actionManagerInterface->UpdateAction(toolActionIdentifier);
  1827. }
  1828. void EditorActionsHandler::OnViewPaneClosed(const char* viewPaneName)
  1829. {
  1830. AZStd::string toolActionIdentifier = AZStd::string::format("o3de.action.tool.%s", viewPaneName);
  1831. m_actionManagerInterface->UpdateAction(toolActionIdentifier);
  1832. }
  1833. void EditorActionsHandler::OnStartPlayInEditor()
  1834. {
  1835. m_actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::GameModeStateChangedUpdaterIdentifier);
  1836. }
  1837. void EditorActionsHandler::OnStopPlayInEditor()
  1838. {
  1839. // Wait one frame for the game mode to actually be shut off.
  1840. QTimer::singleShot(
  1841. 0,
  1842. nullptr,
  1843. [actionManagerInterface = m_actionManagerInterface]
  1844. {
  1845. actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::GameModeStateChangedUpdaterIdentifier);
  1846. }
  1847. );
  1848. }
  1849. void EditorActionsHandler::AfterEntitySelectionChanged(
  1850. [[maybe_unused]] const AzToolsFramework::EntityIdList& newlySelectedEntities,
  1851. [[maybe_unused]] const AzToolsFramework::EntityIdList& newlyDeselectedEntities)
  1852. {
  1853. m_actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::EntitySelectionChangedUpdaterIdentifier);
  1854. }
  1855. void EditorActionsHandler::AfterUndoRedo()
  1856. {
  1857. // Wait one frame for the undo stack to actually be updated.
  1858. QTimer::singleShot(
  1859. 0,
  1860. nullptr,
  1861. [actionManagerInterface = m_actionManagerInterface]
  1862. {
  1863. actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::UndoRedoUpdaterIdentifier);
  1864. }
  1865. );
  1866. }
  1867. void EditorActionsHandler::OnEndUndo([[maybe_unused]] const char* label, [[maybe_unused]] bool changed)
  1868. {
  1869. // Wait one frame for the undo stack to actually be updated.
  1870. QTimer::singleShot(
  1871. 0,
  1872. nullptr,
  1873. [actionManagerInterface = m_actionManagerInterface]
  1874. {
  1875. actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::UndoRedoUpdaterIdentifier);
  1876. }
  1877. );
  1878. }
  1879. void EditorActionsHandler::OnAngleSnappingChanged([[maybe_unused]] bool enabled)
  1880. {
  1881. m_actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::AngleSnappingStateChangedUpdaterIdentifier);
  1882. }
  1883. void EditorActionsHandler::OnDrawHelpersChanged([[maybe_unused]] bool enabled)
  1884. {
  1885. m_actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::DrawHelpersStateChangedUpdaterIdentifier);
  1886. }
  1887. void EditorActionsHandler::OnGridShowingChanged([[maybe_unused]] bool showing)
  1888. {
  1889. m_actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::GridShowingChangedUpdaterIdentifier);
  1890. }
  1891. void EditorActionsHandler::OnGridSnappingChanged([[maybe_unused]] bool enabled)
  1892. {
  1893. m_actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::GridSnappingStateChangedUpdaterIdentifier);
  1894. }
  1895. void EditorActionsHandler::OnIconsVisibilityChanged([[maybe_unused]] bool enabled)
  1896. {
  1897. m_actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::IconsStateChangedUpdaterIdentifier);
  1898. }
  1899. void EditorActionsHandler::OnEntityPickModeStarted()
  1900. {
  1901. m_actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::EntityPickingModeChangedUpdaterIdentifier);
  1902. }
  1903. void EditorActionsHandler::OnEntityPickModeStopped()
  1904. {
  1905. m_actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::EntityPickingModeChangedUpdaterIdentifier);
  1906. }
  1907. void EditorActionsHandler::OnContainerEntityStatusChanged([[maybe_unused]] AZ::EntityId entityId, [[maybe_unused]] bool open)
  1908. {
  1909. m_actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::ContainerEntityStatesChangedUpdaterIdentifier);
  1910. }
  1911. bool EditorActionsHandler::IsRecentFileActionActive(int index)
  1912. {
  1913. return (index < m_recentFileActionsCount);
  1914. }
  1915. bool EditorActionsHandler::IsRecentFileEntryValid(const QString& entry, const QString& gameFolderPath)
  1916. {
  1917. if (entry.isEmpty())
  1918. {
  1919. return false;
  1920. }
  1921. QFileInfo info(entry);
  1922. if (!info.exists())
  1923. {
  1924. return false;
  1925. }
  1926. if (!entry.endsWith(m_levelExtension))
  1927. {
  1928. return false;
  1929. }
  1930. const QDir gameDir(gameFolderPath);
  1931. QDir dir(entry); // actually pointing at file, first cdUp() gets us the parent dir
  1932. while (dir.cdUp())
  1933. {
  1934. if (dir == gameDir)
  1935. {
  1936. return true;
  1937. }
  1938. }
  1939. return false;
  1940. }
  1941. void EditorActionsHandler::OpenLevelByRecentFileEntryIndex(int index)
  1942. {
  1943. // Out of bounds, do nothing
  1944. if (index >= m_recentFileActionsCount)
  1945. {
  1946. return;
  1947. }
  1948. RecentFileList* recentFiles = m_cryEditApp->GetRecentFileList();
  1949. const int recentFilesSize = recentFiles->GetSize();
  1950. QString sCurDir = QString(Path::GetEditingGameDataFolder().c_str()) + QDir::separator();
  1951. QFileInfo gameDir(sCurDir); // Pass it through QFileInfo so it comes out normalized
  1952. const QString gameDirPath = gameDir.absolutePath();
  1953. // Index is the index of the action in the menu, but in generating that list we skipped invalid files from other projects.
  1954. // As such, we need to actually go through the list again to find the correct index for the recentFiles array.
  1955. int counter = 0;
  1956. int fileIndex = 0;
  1957. for (; fileIndex < recentFilesSize; ++fileIndex)
  1958. {
  1959. if (!IsRecentFileEntryValid((*recentFiles)[fileIndex], gameDirPath))
  1960. {
  1961. continue;
  1962. }
  1963. if (counter == index)
  1964. {
  1965. break;
  1966. }
  1967. ++counter;
  1968. }
  1969. m_cryEditApp->OpenDocumentFile((*recentFiles)[fileIndex].toUtf8().data(), true, COpenSameLevelOptions::ReopenLevelIfSame);
  1970. }
  1971. void EditorActionsHandler::UpdateRecentFileActions()
  1972. {
  1973. RecentFileList* recentFiles = m_cryEditApp->GetRecentFileList();
  1974. const int recentFilesSize = recentFiles->GetSize();
  1975. QString sCurDir = QString(Path::GetEditingGameDataFolder().c_str()) + QDir::separator();
  1976. QFileInfo gameDir(sCurDir); // Pass it through QFileInfo so it comes out normalized
  1977. const QString gameDirPath = gameDir.absolutePath();
  1978. m_recentFileActionsCount = 0;
  1979. int index = 0;
  1980. // Update all names
  1981. for (int counter = 0; counter < maxRecentFiles; ++counter)
  1982. {
  1983. // Loop through all Recent Files Menu entries, even the hidden ones.
  1984. AZStd::string actionIdentifier = AZStd::string::format("o3de.action.file.recent.file%i", counter + 1);
  1985. // Check if the recent file at index is valid. If not, increment index until you find one, or the list ends.
  1986. while (index < recentFilesSize)
  1987. {
  1988. if (IsRecentFileEntryValid((*recentFiles)[index], gameDirPath))
  1989. {
  1990. break;
  1991. }
  1992. ++index;
  1993. }
  1994. if (index < recentFilesSize)
  1995. {
  1996. // If the index is valid, use it to populate the action's name and then increment for the next menu item.
  1997. QString displayName;
  1998. recentFiles->GetDisplayName(displayName, index, sCurDir);
  1999. m_actionManagerInterface->SetActionName(
  2000. actionIdentifier, AZStd::string::format("%i | %s", counter + 1, displayName.toUtf8().data()));
  2001. ++m_recentFileActionsCount;
  2002. ++index;
  2003. }
  2004. else
  2005. {
  2006. // If the index is invalid, give the default name for consistency.
  2007. // The menu item will not show as it will be disabled by its enabled state callback.
  2008. m_actionManagerInterface->SetActionName(actionIdentifier, AZStd::string::format("Recent File #%i", counter + 1));
  2009. }
  2010. }
  2011. // Trigger the updater
  2012. m_actionManagerInterface->TriggerActionUpdater(EditorIdentifiers::RecentFilesChangedUpdaterIdentifier);
  2013. }
  2014. void EditorActionsHandler::RefreshLayoutActions()
  2015. {
  2016. m_menuManagerInterface->RemoveSubMenusFromMenu(EditorIdentifiers::LayoutsMenuIdentifier, m_layoutMenuIdentifiers);
  2017. m_layoutMenuIdentifiers.clear();
  2018. // Place all sub-menus in the same sort index in the menu.
  2019. // This will display them in order of addition (alphabetical) and ensure no external tool can add items in-between
  2020. const int sortKey = 300;
  2021. QStringList layoutNames = m_mainWindow->m_viewPaneManager->LayoutNames();
  2022. std::sort(layoutNames.begin(), layoutNames.end(), CompareLayoutNames);
  2023. for (const auto& layoutName : layoutNames)
  2024. {
  2025. AZStd::string layoutMenuIdentifier = AZStd::string::format("o3de.menu.layout[%s]", layoutName.toUtf8().data());
  2026. // Create the menu and related actions for the layout if they do not already exist.
  2027. if (!m_menuManagerInterface->IsMenuRegistered(layoutMenuIdentifier))
  2028. {
  2029. AzToolsFramework::MenuProperties menuProperties;
  2030. menuProperties.m_name = layoutName.toUtf8().data();
  2031. m_menuManagerInterface->RegisterMenu(layoutMenuIdentifier, menuProperties);
  2032. {
  2033. AZStd::string actionIdentifier = AZStd::string::format("o3de.action.layout[%s].load", layoutName.toUtf8().data());
  2034. AzToolsFramework::ActionProperties actionProperties;
  2035. actionProperties.m_name = "Load";
  2036. actionProperties.m_description = AZStd::string::format("Load the \"%s\" layout.", layoutName.toUtf8().data());
  2037. actionProperties.m_category = "Layout";
  2038. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  2039. m_actionManagerInterface->RegisterAction(
  2040. EditorIdentifiers::MainWindowActionContextIdentifier,
  2041. actionIdentifier,
  2042. actionProperties,
  2043. [layout = layoutName, this]
  2044. {
  2045. m_mainWindow->ViewLoadPaneLayout(layout);
  2046. }
  2047. );
  2048. // This action is only accessible outside of Component Modes
  2049. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  2050. m_menuManagerInterface->AddActionToMenu(layoutMenuIdentifier, actionIdentifier, 0);
  2051. }
  2052. {
  2053. AZStd::string actionIdentifier = AZStd::string::format("o3de.action.layout[%s].save", layoutName.toUtf8().data());
  2054. AzToolsFramework::ActionProperties actionProperties;
  2055. actionProperties.m_name = "Save";
  2056. actionProperties.m_description = AZStd::string::format("Save the \"%s\" layout.", layoutName.toUtf8().data());
  2057. actionProperties.m_category = "Layout";
  2058. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  2059. m_actionManagerInterface->RegisterAction(
  2060. EditorIdentifiers::MainWindowActionContextIdentifier,
  2061. actionIdentifier,
  2062. actionProperties,
  2063. [layout = layoutName, this]
  2064. {
  2065. m_mainWindow->ViewSavePaneLayout(layout);
  2066. }
  2067. );
  2068. // This action is only accessible outside of Component Modes
  2069. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  2070. m_menuManagerInterface->AddActionToMenu(layoutMenuIdentifier, actionIdentifier, 100);
  2071. }
  2072. {
  2073. AZStd::string actionIdentifier = AZStd::string::format("o3de.action.layout[%s].rename", layoutName.toUtf8().data());
  2074. AzToolsFramework::ActionProperties actionProperties;
  2075. actionProperties.m_name = "Rename...";
  2076. actionProperties.m_description = AZStd::string::format("Rename the \"%s\" layout.", layoutName.toUtf8().data());
  2077. actionProperties.m_category = "Layout";
  2078. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  2079. m_actionManagerInterface->RegisterAction(
  2080. EditorIdentifiers::MainWindowActionContextIdentifier,
  2081. actionIdentifier,
  2082. actionProperties,
  2083. [layout = layoutName, this]
  2084. {
  2085. m_mainWindow->ViewRenamePaneLayout(layout);
  2086. }
  2087. );
  2088. // This action is only accessible outside of Component Modes
  2089. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  2090. m_menuManagerInterface->AddActionToMenu(layoutMenuIdentifier, actionIdentifier, 200);
  2091. }
  2092. {
  2093. AZStd::string actionIdentifier = AZStd::string::format("o3de.action.layout[%s].delete", layoutName.toUtf8().data());
  2094. AzToolsFramework::ActionProperties actionProperties;
  2095. actionProperties.m_name = "Delete";
  2096. actionProperties.m_description = AZStd::string::format("Delete the \"%s\" layout.", layoutName.toUtf8().data());
  2097. actionProperties.m_category = "Layout";
  2098. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  2099. m_actionManagerInterface->RegisterAction(
  2100. EditorIdentifiers::MainWindowActionContextIdentifier,
  2101. actionIdentifier,
  2102. actionProperties,
  2103. [layout = layoutName, this]
  2104. {
  2105. m_mainWindow->ViewDeletePaneLayout(layout);
  2106. }
  2107. );
  2108. // This action is only accessible outside of Component Modes
  2109. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, actionIdentifier);
  2110. m_menuManagerInterface->AddActionToMenu(layoutMenuIdentifier, actionIdentifier, 300);
  2111. }
  2112. }
  2113. m_layoutMenuIdentifiers.push_back(layoutMenuIdentifier);
  2114. m_menuManagerInterface->AddSubMenuToMenu(EditorIdentifiers::LayoutsMenuIdentifier, layoutMenuIdentifier, sortKey);
  2115. }
  2116. }
  2117. void EditorActionsHandler::RefreshToolboxMacroActions()
  2118. {
  2119. // If the toolbox macros are being displayed in the menu already, remove them.
  2120. m_menuManagerInterface->RemoveActionsFromMenu(EditorIdentifiers::ToolBoxMacrosMenuIdentifier, m_toolboxMacroActionIdentifiers);
  2121. m_toolboxMacroActionIdentifiers.clear();
  2122. // Place all actions in the same sort index in the menu .
  2123. // This will display them in order of addition (alphabetical).
  2124. const int sortKey = 0;
  2125. auto tools = GetIEditor()->GetToolBoxManager();
  2126. const int macroCount = tools->GetMacroCount(true);
  2127. for (int macroIndex = 0; macroIndex < macroCount; ++macroIndex)
  2128. {
  2129. auto macro = tools->GetMacro(macroIndex, true);
  2130. const int toolbarId = macro->GetToolbarId();
  2131. if (toolbarId == -1 || toolbarId == ID_TOOLS_TOOL1)
  2132. {
  2133. AZStd::string toolboxMacroActionIdentifier = AZStd::string::format("o3de.action.toolboxMacro[%s]", macro->GetTitle().toStdString().c_str());
  2134. // Create the action if it does not already exist.
  2135. if (!m_actionManagerInterface->IsActionRegistered(toolboxMacroActionIdentifier))
  2136. {
  2137. AzToolsFramework::ActionProperties actionProperties;
  2138. actionProperties.m_name = macro->GetTitle().toStdString().c_str();
  2139. actionProperties.m_category = "Toolbox Macro";
  2140. actionProperties.m_iconPath = macro->GetIconPath().toStdString().c_str();
  2141. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  2142. m_actionManagerInterface->RegisterAction(
  2143. EditorIdentifiers::MainWindowActionContextIdentifier,
  2144. toolboxMacroActionIdentifier,
  2145. actionProperties,
  2146. [macro]
  2147. {
  2148. macro->Execute();
  2149. }
  2150. );
  2151. // This action is only accessible outside of Component Modes
  2152. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, toolboxMacroActionIdentifier);
  2153. }
  2154. m_menuManagerInterface->AddActionToMenu(EditorIdentifiers::ToolBoxMacrosMenuIdentifier, toolboxMacroActionIdentifier, sortKey);
  2155. m_toolboxMacroActionIdentifiers.push_back(AZStd::move(toolboxMacroActionIdentifier));
  2156. }
  2157. }
  2158. }
  2159. void EditorActionsHandler::RefreshToolActions()
  2160. {
  2161. // If the tools are being displayed in the menu or toolbar already, remove them.
  2162. m_menuManagerInterface->RemoveActionsFromMenu(EditorIdentifiers::ToolsMenuIdentifier, m_toolActionIdentifiers);
  2163. m_toolBarManagerInterface->RemoveActionsFromToolBar(EditorIdentifiers::ToolsToolBarIdentifier, m_toolActionIdentifiers);
  2164. m_toolActionIdentifiers.clear();
  2165. AZStd::vector<AZStd::pair<AZStd::string, int>> toolsMenuItems;
  2166. AZStd::vector<AZStd::pair<AZStd::string, int>> toolsToolBarItems;
  2167. // Get the tools list and refresh the menu.
  2168. const QtViewPanes& viewpanes = m_qtViewPaneManager->GetRegisteredPanes();
  2169. for (const auto& viewpane : viewpanes)
  2170. {
  2171. if (viewpane.IsViewportPane())
  2172. {
  2173. continue;
  2174. }
  2175. AZStd::string toolActionIdentifier = AZStd::string::format("o3de.action.tool.%s", viewpane.m_name.toUtf8().data());
  2176. // Create the action if it does not already exist.
  2177. if (!m_actionManagerInterface->IsActionRegistered(toolActionIdentifier))
  2178. {
  2179. AzToolsFramework::ActionProperties actionProperties;
  2180. actionProperties.m_name = viewpane.m_options.optionalMenuText.length() > 0 ? viewpane.m_options.optionalMenuText.toUtf8().data()
  2181. : viewpane.m_name.toUtf8().data();
  2182. actionProperties.m_category = "Tool";
  2183. actionProperties.m_iconPath = viewpane.m_options.toolbarIcon;
  2184. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  2185. actionProperties.m_toolBarVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  2186. m_actionManagerInterface->RegisterCheckableAction(
  2187. EditorIdentifiers::MainWindowActionContextIdentifier,
  2188. toolActionIdentifier,
  2189. actionProperties,
  2190. [viewpaneManager = m_qtViewPaneManager, viewpaneName = viewpane.m_name]
  2191. {
  2192. viewpaneManager->TogglePane(viewpaneName);
  2193. },
  2194. [viewpaneManager = m_qtViewPaneManager, viewpaneName = viewpane.m_name]() -> bool
  2195. {
  2196. return viewpaneManager->IsEnumeratedInstanceVisible(viewpaneName);
  2197. }
  2198. );
  2199. // This action is only accessible outside of Component Modes
  2200. m_actionManagerInterface->AssignModeToAction(AzToolsFramework::DefaultActionContextModeIdentifier, toolActionIdentifier);
  2201. }
  2202. m_toolActionIdentifiers.push_back(toolActionIdentifier);
  2203. // Set the sortKey as the ASCII of the first character in the toolName.
  2204. // This will allow Tool actions to always be sorted alphabetically even if they are
  2205. // plugged in by Gems, as long as they use this same logic.
  2206. int sortKey = m_actionManagerInterface->GenerateActionAlphabeticalSortKey(toolActionIdentifier);
  2207. if (viewpane.m_options.showInMenu)
  2208. {
  2209. toolsMenuItems.push_back({ toolActionIdentifier, sortKey });
  2210. }
  2211. if (viewpane.m_options.showOnToolsToolbar)
  2212. {
  2213. toolsToolBarItems.push_back({ toolActionIdentifier, sortKey });
  2214. }
  2215. }
  2216. m_menuManagerInterface->AddActionsToMenu(EditorIdentifiers::ToolsMenuIdentifier, toolsMenuItems);
  2217. m_toolBarManagerInterface->AddActionsToToolBar(EditorIdentifiers::ToolsToolBarIdentifier, toolsToolBarItems);
  2218. }
  2219. void EditorActionsHandler::InitializeViewBookmarkActions()
  2220. {
  2221. // --- Go to Location
  2222. for (int index = 0; index < m_defaultBookmarkCount; ++index)
  2223. {
  2224. const AZStd::string actionIdentifier = AZStd::string::format("o3de.action.view.bookmark[%i].goTo", index);
  2225. AzToolsFramework::ActionProperties actionProperties;
  2226. actionProperties.m_name = AZStd::string::format("Go to Location %i", index+1);
  2227. actionProperties.m_description = AZStd::string::format("Go to Location %i.", index+1);
  2228. actionProperties.m_category = "View Bookmark";
  2229. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  2230. auto outcome = m_actionManagerInterface->RegisterAction(
  2231. EditorIdentifiers::MainWindowActionContextIdentifier,
  2232. actionIdentifier,
  2233. actionProperties,
  2234. [index]
  2235. {
  2236. AzToolsFramework::ViewBookmarkInterface* viewBookmarkInterface = AZ::Interface<AzToolsFramework::ViewBookmarkInterface>::Get();
  2237. if (!viewBookmarkInterface)
  2238. {
  2239. AZ_Warning("Main Window", false, "Couldn't find View Bookmark Loader");
  2240. return false;
  2241. }
  2242. const AZStd::optional<AzToolsFramework::ViewBookmark> bookmark = viewBookmarkInterface->LoadBookmarkAtIndex(index);
  2243. if (!bookmark.has_value())
  2244. {
  2245. return false;
  2246. }
  2247. // Check the bookmark we want to load is not exactly 0.
  2248. if (bookmark.value().IsZero())
  2249. {
  2250. QString tagConsoleText = QObject::tr("View Bookmark %1 has not been set yet").arg(index + 1);
  2251. AZ_Warning("Main Window", false, tagConsoleText.toUtf8().data());
  2252. return false;
  2253. }
  2254. SandboxEditor::HandleDefaultViewportCameraTransitionFromSetting(
  2255. bookmark->m_position, AZ::DegToRad(bookmark->m_rotation.GetX()), AZ::DegToRad(bookmark->m_rotation.GetZ()));
  2256. QString tagConsoleText = QObject::tr("View Bookmark %1 loaded position: x=%2, y=%3, z=%4")
  2257. .arg(index + 1)
  2258. .arg(bookmark->m_position.GetX(), 0, 'f', 2)
  2259. .arg(bookmark->m_position.GetY(), 0, 'f', 2)
  2260. .arg(bookmark->m_position.GetZ(), 0, 'f', 2);
  2261. AZ_Printf("MainWindow", tagConsoleText.toUtf8().data());
  2262. return true;
  2263. }
  2264. );
  2265. m_actionManagerInterface->InstallEnabledStateCallback(actionIdentifier, IsLevelLoaded);
  2266. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::LevelLoadedUpdaterIdentifier, actionIdentifier);
  2267. m_hotKeyManagerInterface->SetActionHotKey(actionIdentifier, AZStd::string::format("Shift+F%i", index+1));
  2268. }
  2269. // --- Save Location
  2270. for (int index = 0; index < m_defaultBookmarkCount; ++index)
  2271. {
  2272. const AZStd::string actionIdentifier = AZStd::string::format("o3de.action.view.bookmark[%i].save", index);
  2273. AzToolsFramework::ActionProperties actionProperties;
  2274. actionProperties.m_name = AZStd::string::format("Save Location %i", index+1);
  2275. actionProperties.m_description = AZStd::string::format("Save Location %i.", index+1);
  2276. actionProperties.m_category = "View Bookmark";
  2277. actionProperties.m_menuVisibility = AzToolsFramework::ActionVisibility::AlwaysShow;
  2278. m_actionManagerInterface->RegisterAction(
  2279. EditorIdentifiers::MainWindowActionContextIdentifier,
  2280. actionIdentifier,
  2281. actionProperties,
  2282. [index]
  2283. {
  2284. if (auto viewBookmark = AzToolsFramework::StoreViewBookmarkFromActiveCameraAtIndex(index); viewBookmark.has_value())
  2285. {
  2286. const QString tagConsoleText = QObject::tr("View Bookmark %1 set to the position: x=%2, y=%3, z=%4")
  2287. .arg(index + 1)
  2288. .arg(viewBookmark->m_position.GetX(), 0, 'f', 2)
  2289. .arg(viewBookmark->m_position.GetY(), 0, 'f', 2)
  2290. .arg(viewBookmark->m_position.GetZ(), 0, 'f', 2);
  2291. AZ_Printf("MainWindow", tagConsoleText.toUtf8().data());
  2292. }
  2293. }
  2294. );
  2295. m_actionManagerInterface->InstallEnabledStateCallback(actionIdentifier, IsLevelLoaded);
  2296. m_actionManagerInterface->AddActionToUpdater(EditorIdentifiers::LevelLoadedUpdaterIdentifier, actionIdentifier);
  2297. m_hotKeyManagerInterface->SetActionHotKey(actionIdentifier, AZStd::string::format("Ctrl+F%i", index+1));
  2298. }
  2299. }