Polyphase Game Engine
Loading...
Searching...
No Matches
EditorUIHookManager.h
Go to the documentation of this file.
1#pragma once
2
11#if EDITOR
12
14
15#include <string>
16#include <vector>
17#include <unordered_map>
18#include <functional>
19
23struct RegisteredMenuItem
24{
25 HookId mHookId;
26 std::string mMenuPath;
27 std::string mItemPath;
28 MenuCallback mCallback;
29 void* mUserData;
30 std::string mShortcut;
31 bool mIsSeparator = false;
32};
33
37struct RegisteredWindow
38{
39 HookId mHookId;
40 std::string mWindowName;
41 std::string mWindowId;
42 WindowDrawCallback mDrawFunc;
43 void* mUserData;
44 bool mIsOpen = false;
45};
46
50struct RegisteredInspector
51{
52 HookId mHookId;
53 std::string mNodeTypeName;
54 InspectorDrawCallback mDrawFunc;
55 void* mUserData;
56};
57
61struct RegisteredContextItem
62{
63 HookId mHookId;
64 std::string mItemPath;
65 std::string mAssetTypeFilter; // Empty for node context, or asset type for asset context
66 MenuCallback mCallback;
67 void* mUserData;
68 bool mIsNodeContext; // true for node context, false for asset context
69};
70
74struct RegisteredEventCallback
75{
76 HookId mHookId;
77 EventCallback mCallback;
78 void* mUserData;
79};
80
84struct RegisteredStringEventCallback
85{
86 HookId mHookId;
87 StringEventCallback mCallback;
88 void* mUserData;
89};
90
94struct RegisteredPlatformEventCallback
95{
96 HookId mHookId;
97 PlatformEventCallback mCallback;
98 void* mUserData;
99};
100
104struct RegisteredPackageFinishedCallback
105{
106 HookId mHookId;
107 PackageFinishedCallback mCallback;
108 void* mUserData;
109};
110
114struct RegisteredPlayModeCallback
115{
116 HookId mHookId;
117 PlayModeCallback mCallback;
118 void* mUserData;
119};
120
124struct RegisteredTopLevelMenu
125{
126 HookId mHookId;
127 std::string mMenuName;
128 TopLevelMenuDrawCallback mDrawFunc;
129 void* mUserData;
130 // Position of this menu in the main menu bar:
131 // -1 = append after all menus (legacy default)
132 // 0 = after File
133 // 1 = after Edit
134 // 2 = after View
135 // 3 = after World
136 // 4 = after Tools (formerly "Developer" — same integer for compatibility)
137 // 5 = legacy "after Addons" — top-level Addons menu was folded into
138 // Tools > Addons; addons registered against 5 now render between
139 // Tools and Help (the slot the Addons menu used to occupy).
140 // 6 = legacy "after Extra" — top-level Extra menu was removed; addons
141 // registered against 6 also render between Tools and Help.
142 int32_t mPosition = -1;
143};
144
148struct RegisteredToolbarItem
149{
150 HookId mHookId;
151 std::string mItemName;
152 ToolbarDrawCallback mDrawFunc;
153 void* mUserData;
154};
155
159struct RegisteredMenuItemEx
160{
161 HookId mHookId;
162 std::string mMenuPath;
163 std::string mItemPath;
164 MenuCallback mCallback;
165 void* mUserData;
166 std::string mShortcut;
167 MenuValidationCallback mValidateFunc;
168};
169
173struct RegisteredNodeMenuItems
174{
175 HookId mHookId;
176 std::string mCategory;
177 MenuSectionDrawCallback mDrawFunc;
178 void* mUserData;
179};
180
184struct RegisteredCreateAssetItems
185{
186 HookId mHookId;
187 MenuSectionDrawCallback mDrawFunc;
188 void* mUserData;
189};
190
194struct RegisteredSpawnItems
195{
196 HookId mHookId;
197 MenuSectionDrawCallback mDrawFunc;
198 void* mUserData;
199};
200
204struct RegisteredSceneType
205{
206 HookId mHookId;
207 std::string mTypeName;
208 SceneCreationCallback mCreateFunc;
209 void* mUserData;
210};
211
215struct RegisteredViewportContextItem
216{
217 HookId mHookId;
218 std::string mItemPath;
219 MenuCallback mCallback;
220 void* mUserData;
221};
222
226struct RegisteredViewportOverlay
227{
228 HookId mHookId;
229 std::string mOverlayName;
230 ViewportOverlayCallback mDrawFunc;
231 void* mUserData;
232};
233
237struct RegisteredPreferencesPanel
238{
239 HookId mHookId;
240 std::string mPanelName;
241 std::string mPanelCategory;
242 PreferencesPanelDrawCallback mDrawFunc;
243 PreferencesLoadCallback mLoadFunc;
244 PreferencesSaveCallback mSaveFunc;
245 void* mUserData;
246};
247
251struct RegisteredShortcut
252{
253 HookId mHookId;
254 std::string mShortcutId;
255 std::string mDisplayName;
256 std::string mDefaultBinding;
257 ShortcutCallback mCallback;
258 void* mUserData;
259 // Parsed key info
260 bool mCtrl = false;
261 bool mShift = false;
262 bool mAlt = false;
263 int32_t mKeyCode = -1;
264};
265
269struct RegisteredPropertyDrawer
270{
271 HookId mHookId;
272 std::string mPropertyTypeName;
273 PropertyDrawCallback mDrawFunc;
274 void* mUserData;
275};
276
280struct RegisteredHierarchyItemGUI
281{
282 HookId mHookId;
283 HierarchyItemGUICallback mDrawFunc;
284 void* mUserData;
285};
286
290struct RegisteredAssetItemGUI
291{
292 HookId mHookId;
293 AssetItemGUICallback mDrawFunc;
294 void* mUserData;
295};
296
300struct RegisteredHierarchyChangedCallback
301{
302 HookId mHookId;
303 HierarchyChangedCallback mCallback;
304 void* mUserData;
305};
306
310struct RegisteredSimpleContextItem
311{
312 HookId mHookId;
313 std::string mItemPath;
314 MenuCallback mCallback;
315 void* mUserData;
316};
317
321struct RegisteredGamePreviewResolution
322{
323 HookId mHookId;
324 std::string mName;
325 uint32_t mWidth;
326 uint32_t mHeight;
327};
328
332struct RegisteredPlayTarget
333{
334 HookId mHookId;
335 std::string mTargetName;
336 std::string mIconText;
337 PlayTargetCallback mCallback;
338 void* mUserData;
339};
340
344struct RegisteredDragDropHandler
345{
346 HookId mHookId;
347 std::string mTargetArea;
348 DragDropHandlerCallback mHandler;
349 void* mUserData;
350};
351
355struct RegisteredAssetImporter
356{
357 HookId mHookId;
358 std::string mExtension;
359 AssetImportCallback mImportFunc;
360 void* mUserData;
361};
362
366struct RegisteredPreImportCallback
367{
368 HookId mHookId;
369 PreImportCallback mCallback;
370 void* mUserData;
371};
372
376struct RegisteredPreBuildCallback
377{
378 HookId mHookId;
379 PreBuildCallback mCallback;
380 void* mUserData;
381};
382
386struct RegisteredEditorModeCallback
387{
388 HookId mHookId;
389 EditorModeCallback mCallback;
390 void* mUserData;
391};
392
396struct RegisteredGizmoTool
397{
398 HookId mHookId;
399 std::string mToolName;
400 std::string mIconText;
401 std::string mTooltip;
402 GizmoToolDrawCallback mDrawFunc;
403 void* mUserData;
404 bool mIsActive = false;
405};
406
410struct RegisteredControllerRoute
411{
412 HookId mHookId;
413 std::string mMethod;
414 std::string mPath;
415 ControllerRouteCallback mCallback;
416 void* mUserData;
417};
418
422struct RegisteredControllerServerEvent
423{
424 HookId mHookId;
425 ControllerServerEventCallback mCallback;
426 void* mUserData;
427};
428
434class EditorUIHookManager
435{
436public:
437 static void Create();
438 static void Destroy();
439 static EditorUIHookManager* Get();
440
444 EditorUIHooks* GetHooks() { return &mHooks; }
445
446 // ===== Menu Items =====
447
451 const std::vector<RegisteredMenuItem>& GetMenuItems(const std::string& menuPath) const;
452
457 void DrawMenuItems(const std::string& menuPath);
458
459 // ===== Custom Windows =====
460
464 const std::vector<RegisteredWindow>& GetWindows() const { return mWindows; }
465
469 void DrawWindows();
470
474 void OpenWindow(const std::string& windowId);
475
479 void CloseWindow(const std::string& windowId);
480
484 bool IsWindowOpen(const std::string& windowId) const;
485
486 // ===== Inspectors =====
487
492 const RegisteredInspector* GetInspector(const std::string& nodeTypeName) const;
493
498 bool DrawInspector(const std::string& nodeTypeName, void* node);
499
500 // ===== Context Menus =====
501
505 void DrawNodeContextItems();
506
511 void DrawAssetContextItems(const std::string& assetType);
512
513 // ===== Top-Level Menus =====
514
518 void DrawTopLevelMenus();
519
525 void DrawTopLevelMenusAtPosition(int32_t builtinPosition);
526
527 // ===== Toolbar =====
528
529 void DrawToolbarItems();
530
531 // ===== Batch 2: Create/Spawn Menu Extensions =====
532
533 void DrawNodeMenuItems(const char* category, void* parentNode);
534 void DrawCustomNodeCategories(void* parentNode);
535 void DrawCreateAssetItems();
536 void DrawSpawnBasic3dItems(void* parentNode);
537 void DrawSpawnBasicWidgetItems(void* parentNode);
538
539 // ===== Scene Type Registration =====
540
541 const std::vector<RegisteredSceneType>& GetSceneTypes() const { return mSceneTypes; }
542 void FireSceneCreation(const std::string& typeName, const char* sceneName, void* rootNode);
543
544 // ===== Batch 3: Viewport Context Menu & Overlay Drawing =====
545
546 void DrawViewportContextItems();
547 void DrawViewportOverlays(float viewportX, float viewportY, float viewportW, float viewportH);
548 bool HasViewportContextItems() const;
549
550 // ===== Batch 4: Custom Preferences =====
551
552 const std::vector<RegisteredPreferencesPanel>& GetPreferencesPanels() const { return mPreferencesPanels; }
553 void LoadAddonPreferences();
554 void SaveAddonPreferences();
555
556 // ===== Batch 5: Keyboard Shortcuts =====
557
558 void ProcessShortcuts();
559
560 // ===== Batch 6: Property Drawers =====
561
562 bool DrawPropertyDrawer(const char* propertyTypeName, const char* propertyName, void* propertyOwner, int32_t propertyType);
563
564 // ===== Batch 7: Hierarchy & Asset Browser Extensions =====
565
566 void DrawHierarchyItemGUI(void* node, float rowX, float rowY, float rowW, float rowH);
567 void DrawAssetItemGUI(const char* assetName, const char* assetType, float rowX, float rowY, float rowW, float rowH);
568 void FireOnHierarchyChanged(int32_t changeType, void* node);
569
570 // ===== Batch 8: Additional Context Menus =====
571
572 void DrawSceneTabContextItems();
573 void DrawDebugLogContextItems();
574 void DrawImportMenuItems();
575 void DrawAddonsMenuItems();
576 void DrawPlayTargets();
577 bool HasPlayTargets() const;
578
579 // ===== Game Preview Resolution Presets =====
580
581 const std::vector<RegisteredGamePreviewResolution>& GetGamePreviewResolutions() const { return mGamePreviewResolutions; }
582
583 // ===== Batch 9: Drag-Drop & Asset Pipeline =====
584
585 bool HandleDragDrop(const char* targetArea, const char* payloadType, const void* payloadData, int32_t payloadSize);
586 bool HandleAssetImport(const char* filePath, const char* extension);
587 bool FireOnPreAssetImport(const char* filePath);
588 void FireOnPostAssetImport(const char* assetPath);
589
590 // ===== Batch 10: Build Pipeline & Editor State =====
591
592 bool FireOnPreBuild(int32_t platform);
593 void FireOnPostBuild(int32_t platform, bool success);
594 void FireOnEditorModeChanged(int32_t newMode);
595 void DrawGizmoTools(void* selectedNode);
596 const std::vector<RegisteredGizmoTool>& GetGizmoTools() const { return mGizmoTools; }
597
598 // ===== Event Dispatchers =====
599
600 void FireOnProjectOpen(const char* projectPath);
601 void FireOnProjectClose(const char* projectPath);
602 void FireOnProjectSave(const char* filePath);
603 void FireOnSceneOpen(const char* scenePath);
604 void FireOnSceneClose(const char* scenePath);
605 void FireOnPackageStarted(int32_t platform);
606 void FireOnPackageFinished(int32_t platform, bool success);
607 void FireOnSelectionChanged();
608 void FireOnPlayModeChanged(int32_t state);
609 void FireOnEditorShutdown();
610 void FireOnAssetImported(const char* assetPath);
611 void FireOnAssetDeleted(const char* assetPath);
612 void FireOnAssetSaved(const char* assetPath);
613 void FireOnAssetOpen(const char* assetName);
614 void FireOnAssetOpened(const char* assetName);
615 void FireOnUndoRedo();
616 void FireOnAssetDropHierarchy(const char* assetName);
617 void FireOnAssetDropViewport(const char* assetName);
618
619 // ===== Controller Server Extension =====
620
621 const std::vector<RegisteredControllerRoute>& GetControllerRoutes() const { return mControllerRoutes; }
622 void FireOnControllerServerStateChanged(int32_t state);
623
624 // ===== Cleanup =====
625
629 void RemoveAllHooks(HookId hookId);
630
631private:
632 static EditorUIHookManager* sInstance;
633 EditorUIHookManager();
634 ~EditorUIHookManager();
635
636 void InitializeHooks();
637
638 // Hook storage
639 std::unordered_map<std::string, std::vector<RegisteredMenuItem>> mMenuItems;
640 std::vector<RegisteredWindow> mWindows;
641 std::vector<RegisteredInspector> mInspectors;
642 std::vector<RegisteredContextItem> mContextItems;
643
644 // New hook storage
645 std::vector<RegisteredTopLevelMenu> mTopLevelMenus;
646 std::vector<RegisteredToolbarItem> mToolbarItems;
647 std::vector<RegisteredStringEventCallback> mOnProjectOpen;
648 std::vector<RegisteredStringEventCallback> mOnProjectClose;
649 std::vector<RegisteredStringEventCallback> mOnProjectSave;
650 std::vector<RegisteredStringEventCallback> mOnSceneOpen;
651 std::vector<RegisteredStringEventCallback> mOnSceneClose;
652 std::vector<RegisteredPlatformEventCallback> mOnPackageStarted;
653 std::vector<RegisteredPackageFinishedCallback> mOnPackageFinished;
654 std::vector<RegisteredEventCallback> mOnSelectionChanged;
655 std::vector<RegisteredPlayModeCallback> mOnPlayModeChanged;
656 std::vector<RegisteredEventCallback> mOnEditorShutdown;
657 std::vector<RegisteredStringEventCallback> mOnAssetImported;
658 std::vector<RegisteredStringEventCallback> mOnAssetDeleted;
659 std::vector<RegisteredStringEventCallback> mOnAssetSaved;
660 std::vector<RegisteredStringEventCallback> mOnAssetOpen;
661 std::vector<RegisteredStringEventCallback> mOnAssetOpened;
662 std::vector<RegisteredEventCallback> mOnUndoRedo;
663 std::vector<RegisteredStringEventCallback> mOnAssetDropHierarchy;
664 std::vector<RegisteredStringEventCallback> mOnAssetDropViewport;
665
666 // Batch 1: Menu items with validation
667 std::vector<RegisteredMenuItemEx> mMenuItemsEx;
668
669 // Batch 2: Create/Spawn menu extensions
670 std::vector<RegisteredNodeMenuItems> mNodeMenuItems;
671 std::vector<RegisteredCreateAssetItems> mCreateAssetItems;
672 std::vector<RegisteredSpawnItems> mSpawnBasic3dItems;
673 std::vector<RegisteredSpawnItems> mSpawnBasicWidgetItems;
674
675 // Scene type registration
676 std::vector<RegisteredSceneType> mSceneTypes;
677
678 // Batch 3: Viewport context + overlays
679 std::vector<RegisteredViewportContextItem> mViewportContextItems;
680 std::vector<RegisteredViewportOverlay> mViewportOverlays;
681
682 // Batch 4: Preferences panels
683 std::vector<RegisteredPreferencesPanel> mPreferencesPanels;
684
685 // Batch 5: Keyboard shortcuts
686 std::vector<RegisteredShortcut> mShortcuts;
687
688 // Batch 6: Property drawers
689 std::vector<RegisteredPropertyDrawer> mPropertyDrawers;
690
691 // Batch 7: Hierarchy & asset browser
692 std::vector<RegisteredHierarchyItemGUI> mHierarchyItemGUI;
693 std::vector<RegisteredAssetItemGUI> mAssetItemGUI;
694 std::vector<RegisteredHierarchyChangedCallback> mOnHierarchyChanged;
695
696 // Game Preview resolution presets
697 std::vector<RegisteredGamePreviewResolution> mGamePreviewResolutions;
698
699 // Batch 8: Additional context menus
700 std::vector<RegisteredSimpleContextItem> mSceneTabContextItems;
701 std::vector<RegisteredSimpleContextItem> mDebugLogContextItems;
702 std::vector<RegisteredSimpleContextItem> mImportMenuItems;
703 std::vector<RegisteredSimpleContextItem> mAddonsMenuItems;
704 std::vector<RegisteredPlayTarget> mPlayTargets;
705
706 // Batch 9: Drag-drop & asset pipeline
707 std::vector<RegisteredDragDropHandler> mDragDropHandlers;
708 std::vector<RegisteredAssetImporter> mAssetImporters;
709 std::vector<RegisteredPreImportCallback> mOnPreAssetImport;
710 std::vector<RegisteredStringEventCallback> mOnPostAssetImport;
711
712 // Batch 10: Build pipeline & editor state
713 std::vector<RegisteredPreBuildCallback> mOnPreBuild;
714 std::vector<RegisteredPackageFinishedCallback> mOnPostBuild;
715 std::vector<RegisteredEditorModeCallback> mOnEditorModeChanged;
716 std::vector<RegisteredGizmoTool> mGizmoTools;
717
718 // Controller Server hooks
719 std::vector<RegisteredControllerRoute> mControllerRoutes;
720 std::vector<RegisteredControllerServerEvent> mOnControllerServerStateChanged;
721
722 // Empty vector for returning when menu not found
723 std::vector<RegisteredMenuItem> mEmptyMenuItems;
724
725 // Hooks struct passed to plugins
726 EditorUIHooks mHooks;
727
728 // Helper: Parse key binding string to shortcut fields
729 void ParseKeyBinding(RegisteredShortcut& shortcut);
730};
731
735HookId GenerateHookId(const char* identifier);
736
737#endif // EDITOR
Editor UI extension system for native addons.