Polyphase Game Engine
Loading...
Searching...
No Matches
EditorUIHookManager.h
Go to the documentation of this file.
1#pragma once
2
11#if EDITOR
12
15
16#include <string>
17#include <vector>
18#include <unordered_map>
19#include <functional>
20
24struct RegisteredMenuItem
25{
26 HookId mHookId;
27 std::string mMenuPath;
28 std::string mItemPath;
29 MenuCallback mCallback;
30 void* mUserData;
31 std::string mShortcut;
32 bool mIsSeparator = false;
33};
34
38struct RegisteredWindow
39{
40 HookId mHookId;
41 std::string mWindowName;
42 std::string mWindowId;
43 WindowDrawCallback mDrawFunc;
44 void* mUserData;
45 bool mIsOpen = false;
46};
47
51struct RegisteredInspector
52{
53 HookId mHookId;
54 std::string mNodeTypeName;
55 InspectorDrawCallback mDrawFunc;
56 void* mUserData;
57};
58
62struct RegisteredContextItem
63{
64 HookId mHookId;
65 std::string mItemPath;
66 std::string mAssetTypeFilter; // Empty for node context, or asset type for asset context
67 MenuCallback mCallback;
68 void* mUserData;
69 bool mIsNodeContext; // true for node context, false for asset context
70};
71
75struct RegisteredEventCallback
76{
77 HookId mHookId;
78 EventCallback mCallback;
79 void* mUserData;
80};
81
85struct RegisteredStringEventCallback
86{
87 HookId mHookId;
88 StringEventCallback mCallback;
89 void* mUserData;
90};
91
95struct RegisteredPlatformEventCallback
96{
97 HookId mHookId;
98 PlatformEventCallback mCallback;
99 void* mUserData;
100};
101
105struct RegisteredPackageFinishedCallback
106{
107 HookId mHookId;
108 PackageFinishedCallback mCallback;
109 void* mUserData;
110};
111
115struct RegisteredPlayModeCallback
116{
117 HookId mHookId;
118 PlayModeCallback mCallback;
119 void* mUserData;
120};
121
125struct RegisteredTopLevelMenu
126{
127 HookId mHookId;
128 std::string mMenuName;
129 TopLevelMenuDrawCallback mDrawFunc;
130 void* mUserData;
131 // Position of this menu in the main menu bar:
132 // -1 = append after all menus (legacy default)
133 // 0 = after File
134 // 1 = after Edit
135 // 2 = after View
136 // 3 = after World
137 // 4 = after Tools (formerly "Developer" — same integer for compatibility)
138 // 5 = legacy "after Addons" — top-level Addons menu was folded into
139 // Tools > Addons; addons registered against 5 now render between
140 // Tools and Help (the slot the Addons menu used to occupy).
141 // 6 = legacy "after Extra" — top-level Extra menu was removed; addons
142 // registered against 6 also render between Tools and Help.
143 int32_t mPosition = -1;
144};
145
149struct RegisteredToolbarItem
150{
151 HookId mHookId;
152 std::string mItemName;
153 ToolbarDrawCallback mDrawFunc;
154 void* mUserData;
155};
156
160struct RegisteredMenuItemEx
161{
162 HookId mHookId;
163 std::string mMenuPath;
164 std::string mItemPath;
165 MenuCallback mCallback;
166 void* mUserData;
167 std::string mShortcut;
168 MenuValidationCallback mValidateFunc;
169};
170
174struct RegisteredNodeMenuItems
175{
176 HookId mHookId;
177 std::string mCategory;
178 MenuSectionDrawCallback mDrawFunc;
179 void* mUserData;
180};
181
185struct RegisteredCreateAssetItems
186{
187 HookId mHookId;
188 MenuSectionDrawCallback mDrawFunc;
189 void* mUserData;
190};
191
200struct RegisteredCreateAssetItem
201{
202 HookId mHookId;
203 std::string mPath;
204 MenuCallback mCallback;
205 void* mUserData;
206};
207
211struct RegisteredSpawnItems
212{
213 HookId mHookId;
214 MenuSectionDrawCallback mDrawFunc;
215 void* mUserData;
216};
217
221struct RegisteredSceneType
222{
223 HookId mHookId;
224 std::string mTypeName;
225 SceneCreationCallback mCreateFunc;
226 void* mUserData;
227};
228
232struct RegisteredViewportContextItem
233{
234 HookId mHookId;
235 std::string mItemPath;
236 MenuCallback mCallback;
237 void* mUserData;
238};
239
243struct RegisteredViewportOverlay
244{
245 HookId mHookId;
246 std::string mOverlayName;
247 ViewportOverlayCallback mDrawFunc;
248 void* mUserData;
249};
250
260struct RegisteredFileDropHandler
261{
262 HookId mHookId;
263 EditorUIHooks::FileDropCallback mCallback;
264 void* mUserData;
265};
266
275struct RegisteredViewportMode
276{
277 HookId mHookId;
278 std::string mModeId; // stable id used for selection routing + replace-on-register
279 std::string mDisplayName; // dropdown label
280 int32_t mSortOrder = 0;
281 EditorUIHooks::ViewportModeCanActivateCallback mCanActivate = nullptr;
282 EditorUIHooks::ViewportModeActivateCallback mOnActivate = nullptr;
283 EditorUIHooks::ViewportModeDeactivateCallback mOnDeactivate = nullptr;
284 EditorUIHooks::ViewportModeTickCallback mTick = nullptr;
285 EditorUIHooks::ViewportModeDrawPanelCallback mDrawPanel = nullptr;
286 void* mUserData = nullptr;
287};
288
292struct RegisteredPreferencesPanel
293{
294 HookId mHookId;
295 std::string mPanelName;
296 std::string mPanelCategory;
297 PreferencesPanelDrawCallback mDrawFunc;
298 PreferencesLoadCallback mLoadFunc;
299 PreferencesSaveCallback mSaveFunc;
300 void* mUserData;
301};
302
306struct RegisteredShortcut
307{
308 HookId mHookId;
309 std::string mShortcutId;
310 std::string mDisplayName;
311 std::string mDefaultBinding;
312 ShortcutCallback mCallback;
313 void* mUserData;
314 // Parsed key info
315 bool mCtrl = false;
316 bool mShift = false;
317 bool mAlt = false;
318 int32_t mKeyCode = -1;
319};
320
324struct RegisteredPropertyDrawer
325{
326 HookId mHookId;
327 std::string mPropertyTypeName;
328 PropertyDrawCallback mDrawFunc;
329 void* mUserData;
330};
331
335struct RegisteredHierarchyItemGUI
336{
337 HookId mHookId;
338 HierarchyItemGUICallback mDrawFunc;
339 void* mUserData;
340};
341
345struct RegisteredAssetItemGUI
346{
347 HookId mHookId;
348 AssetItemGUICallback mDrawFunc;
349 void* mUserData;
350};
351
355struct RegisteredHierarchyChangedCallback
356{
357 HookId mHookId;
358 HierarchyChangedCallback mCallback;
359 void* mUserData;
360};
361
365struct RegisteredSimpleContextItem
366{
367 HookId mHookId;
368 std::string mItemPath;
369 MenuCallback mCallback;
370 void* mUserData;
371};
372
376struct RegisteredGamePreviewResolution
377{
378 HookId mHookId;
379 std::string mName;
380 uint32_t mWidth;
381 uint32_t mHeight;
382};
383
387struct RegisteredPlayTarget
388{
389 HookId mHookId;
390 std::string mTargetName;
391 std::string mIconText;
392 PlayTargetCallback mCallback;
393 void* mUserData;
394};
395
399struct RegisteredDragDropHandler
400{
401 HookId mHookId;
402 std::string mTargetArea;
403 DragDropHandlerCallback mHandler;
404 void* mUserData;
405};
406
410struct RegisteredAssetImporter
411{
412 HookId mHookId;
413 std::string mExtension;
414 AssetImportCallback mImportFunc;
415 void* mUserData;
416};
417
421struct RegisteredPreImportCallback
422{
423 HookId mHookId;
424 PreImportCallback mCallback;
425 void* mUserData;
426};
427
431struct RegisteredPreBuildCallback
432{
433 HookId mHookId;
434 PreBuildCallback mCallback;
435 void* mUserData;
436};
437
441struct RegisteredEditorModeCallback
442{
443 HookId mHookId;
444 EditorModeCallback mCallback;
445 void* mUserData;
446};
447
451struct RegisteredGizmoTool
452{
453 HookId mHookId;
454 std::string mToolName;
455 std::string mIconText;
456 std::string mTooltip;
457 GizmoToolDrawCallback mDrawFunc;
458 void* mUserData;
459 bool mIsActive = false;
460};
461
465struct RegisteredControllerRoute
466{
467 HookId mHookId;
468 std::string mMethod;
469 std::string mPath;
470 ControllerRouteCallback mCallback;
471 void* mUserData;
472};
473
477struct RegisteredControllerServerEvent
478{
479 HookId mHookId;
480 ControllerServerEventCallback mCallback;
481 void* mUserData;
482};
483
489class EditorUIHookManager
490{
491public:
492 static void Create();
493 static void Destroy();
494 static EditorUIHookManager* Get();
495
499 EditorUIHooks* GetHooks() { return &mHooks; }
500
501 // ===== Menu Items =====
502
506 const std::vector<RegisteredMenuItem>& GetMenuItems(const std::string& menuPath) const;
507
512 void DrawMenuItems(const std::string& menuPath);
513
514 // ===== Custom Windows =====
515
519 const std::vector<RegisteredWindow>& GetWindows() const { return mWindows; }
520
524 void DrawWindows();
525
529 void OpenWindow(const std::string& windowId);
530
534 void CloseWindow(const std::string& windowId);
535
539 bool IsWindowOpen(const std::string& windowId) const;
540
541 // ===== Inspectors =====
542
547 const RegisteredInspector* GetInspector(const std::string& nodeTypeName) const;
548
553 bool DrawInspector(const std::string& nodeTypeName, void* node);
554
555 // ===== Context Menus =====
556
560 void DrawNodeContextItems();
561
566 void DrawAssetContextItems(const std::string& assetType);
567
568 // ===== Top-Level Menus =====
569
573 void DrawTopLevelMenus();
574
580 void DrawTopLevelMenusAtPosition(int32_t builtinPosition);
581
582 // ===== Toolbar =====
583
584 void DrawToolbarItems();
585
586 // ===== Batch 2: Create/Spawn Menu Extensions =====
587
588 void DrawNodeMenuItems(const char* category, void* parentNode);
589 void DrawCustomNodeCategories(void* parentNode);
590 void DrawCreateAssetItems();
591 void DrawSpawnBasic3dItems(void* parentNode);
592 void DrawSpawnBasicWidgetItems(void* parentNode);
593
594 // ===== Scene Type Registration =====
595
596 const std::vector<RegisteredSceneType>& GetSceneTypes() const { return mSceneTypes; }
597 void FireSceneCreation(const std::string& typeName, const char* sceneName, void* rootNode);
598
599 // ===== Batch 3: Viewport Context Menu & Overlay Drawing =====
600
601 void DrawViewportContextItems();
602 void DrawViewportOverlays(float viewportX, float viewportY, float viewportW, float viewportH);
603 bool HasViewportContextItems() const;
604
605 // ===== Batch 4: Custom Preferences =====
606
607 const std::vector<RegisteredPreferencesPanel>& GetPreferencesPanels() const { return mPreferencesPanels; }
608 void LoadAddonPreferences();
609 void SaveAddonPreferences();
610
611 // ===== Batch 5: Keyboard Shortcuts =====
612
613 void ProcessShortcuts();
614
615 // ===== Batch 6: Property Drawers =====
616
617 bool DrawPropertyDrawer(const char* propertyTypeName, const char* propertyName, void* propertyOwner, int32_t propertyType);
618
619 // ===== Batch 7: Hierarchy & Asset Browser Extensions =====
620
621 void DrawHierarchyItemGUI(void* node, float rowX, float rowY, float rowW, float rowH);
622 void DrawAssetItemGUI(const char* assetName, const char* assetType, float rowX, float rowY, float rowW, float rowH);
623 void FireOnHierarchyChanged(int32_t changeType, void* node);
624
625 // ===== Batch 8: Additional Context Menus =====
626
627 void DrawSceneTabContextItems();
628 void DrawDebugLogContextItems();
629 void DrawImportMenuItems();
630 void DrawAddonsMenuItems();
631 void DrawPlayTargets();
632 bool HasPlayTargets() const;
633
634 // ===== Game Preview Resolution Presets =====
635
636 const std::vector<RegisteredGamePreviewResolution>& GetGamePreviewResolutions() const { return mGamePreviewResolutions; }
637
638 // ===== Batch 9: Drag-Drop & Asset Pipeline =====
639
640 bool HandleDragDrop(const char* targetArea, const char* payloadType, const void* payloadData, int32_t payloadSize);
641 bool HandleAssetImport(const char* filePath, const char* extension);
642 bool FireOnPreAssetImport(const char* filePath);
643 void FireOnPostAssetImport(const char* assetPath);
644
645 // ===== Batch 10: Build Pipeline & Editor State =====
646
647 bool FireOnPreBuild(int32_t platform);
648 void FireOnPostBuild(int32_t platform, bool success);
649 void FireOnEditorModeChanged(int32_t newMode);
650 void DrawGizmoTools(void* selectedNode);
651 const std::vector<RegisteredGizmoTool>& GetGizmoTools() const { return mGizmoTools; }
652
653 // ===== Event Dispatchers =====
654
655 void FireOnProjectOpen(const char* projectPath);
656 void FireOnProjectClose(const char* projectPath);
657 void FireOnProjectSave(const char* filePath);
658 void FireOnSceneOpen(const char* scenePath);
659 void FireOnSceneClose(const char* scenePath);
660 void FireOnPackageStarted(int32_t platform);
661 void FireOnPackageFinished(int32_t platform, bool success);
662 void FireOnSelectionChanged();
663 void FireOnPlayModeChanged(int32_t state);
664 void FireOnEditorShutdown();
665 void FireOnAssetImported(const char* assetPath);
666 void FireOnAssetDeleted(const char* assetPath);
667 void FireOnAssetSaved(const char* assetPath);
668 void FireOnAssetOpen(const char* assetName);
669 void FireOnAssetOpened(const char* assetName);
670 void FireOnUndoRedo();
671 void FireOnAssetDropHierarchy(const char* assetName);
672 void FireOnAssetDropViewport(const char* assetName);
673
674 // ===== Controller Server Extension =====
675
676 const std::vector<RegisteredControllerRoute>& GetControllerRoutes() const { return mControllerRoutes; }
677 void FireOnControllerServerStateChanged(int32_t state);
678
679 // ===== Batch 15: Viewport Mode dropdown =====
680
687 const std::vector<RegisteredViewportMode>& GetViewportModes() const { return mViewportModes; }
688
693 std::vector<const RegisteredViewportMode*> GetViewportModesSorted() const;
694
696 const RegisteredViewportMode* FindViewportMode(const std::string& modeId) const;
697
703 void FireViewportModeActivate(const std::string& modeId);
704
706 void FireViewportModeDeactivate(const std::string& modeId);
707
709 bool CanActivateViewportMode(const std::string& modeId);
710
712 void TickActiveViewportMode(float deltaTime);
713
715 void DrawActiveViewportModePanel();
716
717 // ===== Cleanup =====
718
722 void RemoveAllHooks(HookId hookId);
723
724 // ===== Batch 14: OS file-drop dispatch =====
725
733 bool DispatchFileDrop(const std::vector<std::string>& paths);
734
735private:
736 static EditorUIHookManager* sInstance;
737 EditorUIHookManager();
738 ~EditorUIHookManager();
739
740 void InitializeHooks();
741
742 // Hook storage
743 std::unordered_map<std::string, std::vector<RegisteredMenuItem>> mMenuItems;
744 std::vector<RegisteredWindow> mWindows;
745 std::vector<RegisteredInspector> mInspectors;
746 std::vector<RegisteredContextItem> mContextItems;
747
748 // New hook storage
749 std::vector<RegisteredTopLevelMenu> mTopLevelMenus;
750 std::vector<RegisteredToolbarItem> mToolbarItems;
751 std::vector<RegisteredStringEventCallback> mOnProjectOpen;
752 std::vector<RegisteredStringEventCallback> mOnProjectClose;
753 std::vector<RegisteredStringEventCallback> mOnProjectSave;
754 std::vector<RegisteredStringEventCallback> mOnSceneOpen;
755 std::vector<RegisteredStringEventCallback> mOnSceneClose;
756 std::vector<RegisteredPlatformEventCallback> mOnPackageStarted;
757 std::vector<RegisteredPackageFinishedCallback> mOnPackageFinished;
758 std::vector<RegisteredEventCallback> mOnSelectionChanged;
759 std::vector<RegisteredPlayModeCallback> mOnPlayModeChanged;
760 std::vector<RegisteredEventCallback> mOnEditorShutdown;
761 std::vector<RegisteredStringEventCallback> mOnAssetImported;
762 std::vector<RegisteredStringEventCallback> mOnAssetDeleted;
763 std::vector<RegisteredStringEventCallback> mOnAssetSaved;
764 std::vector<RegisteredStringEventCallback> mOnAssetOpen;
765 std::vector<RegisteredStringEventCallback> mOnAssetOpened;
766 std::vector<RegisteredEventCallback> mOnUndoRedo;
767 std::vector<RegisteredStringEventCallback> mOnAssetDropHierarchy;
768 std::vector<RegisteredStringEventCallback> mOnAssetDropViewport;
769
770 // Batch 1: Menu items with validation
771 std::vector<RegisteredMenuItemEx> mMenuItemsEx;
772
773 // Batch 2: Create/Spawn menu extensions
774 std::vector<RegisteredNodeMenuItems> mNodeMenuItems;
775 std::vector<RegisteredCreateAssetItems> mCreateAssetItems;
776 std::vector<RegisteredCreateAssetItem> mCreateAssetItemSingles;
777 std::vector<RegisteredSpawnItems> mSpawnBasic3dItems;
778 std::vector<RegisteredSpawnItems> mSpawnBasicWidgetItems;
779
780 // Scene type registration
781 std::vector<RegisteredSceneType> mSceneTypes;
782
783 // Batch 3: Viewport context + overlays
784 std::vector<RegisteredViewportContextItem> mViewportContextItems;
785 std::vector<RegisteredViewportOverlay> mViewportOverlays;
786
787 // Batch 4: Preferences panels
788 std::vector<RegisteredPreferencesPanel> mPreferencesPanels;
789
790 // Batch 5: Keyboard shortcuts
791 std::vector<RegisteredShortcut> mShortcuts;
792
793 // Batch 6: Property drawers
794 std::vector<RegisteredPropertyDrawer> mPropertyDrawers;
795
796 // Batch 7: Hierarchy & asset browser
797 std::vector<RegisteredHierarchyItemGUI> mHierarchyItemGUI;
798 std::vector<RegisteredAssetItemGUI> mAssetItemGUI;
799 std::vector<RegisteredHierarchyChangedCallback> mOnHierarchyChanged;
800
801 // Game Preview resolution presets
802 std::vector<RegisteredGamePreviewResolution> mGamePreviewResolutions;
803
804 // Batch 8: Additional context menus
805 std::vector<RegisteredSimpleContextItem> mSceneTabContextItems;
806 std::vector<RegisteredSimpleContextItem> mDebugLogContextItems;
807 std::vector<RegisteredSimpleContextItem> mImportMenuItems;
808 std::vector<RegisteredSimpleContextItem> mAddonsMenuItems;
809 std::vector<RegisteredPlayTarget> mPlayTargets;
810
811 // Batch 14: OS file-drop dispatch
812 std::vector<RegisteredFileDropHandler> mFileDropHandlers;
813
814 // Batch 15: Addon-contributed viewport modes (dropdown entries).
815 // Insertion order is preserved; GetViewportModesSorted() applies sortOrder
816 // at read time. The active mode id lives on EditorState, not here.
817 std::vector<RegisteredViewportMode> mViewportModes;
818
819 // Batch 9: Drag-drop & asset pipeline
820 std::vector<RegisteredDragDropHandler> mDragDropHandlers;
821 std::vector<RegisteredAssetImporter> mAssetImporters;
822 std::vector<RegisteredPreImportCallback> mOnPreAssetImport;
823 std::vector<RegisteredStringEventCallback> mOnPostAssetImport;
824
825 // Batch 10: Build pipeline & editor state
826 std::vector<RegisteredPreBuildCallback> mOnPreBuild;
827 std::vector<RegisteredPackageFinishedCallback> mOnPostBuild;
828 std::vector<RegisteredEditorModeCallback> mOnEditorModeChanged;
829 std::vector<RegisteredGizmoTool> mGizmoTools;
830
831 // Controller Server hooks
832 std::vector<RegisteredControllerRoute> mControllerRoutes;
833 std::vector<RegisteredControllerServerEvent> mOnControllerServerStateChanged;
834
835 // Batch 11: Build target registry (addon-provided + engine built-ins)
836 BuildTargetRegistry mBuildTargets;
837
838public:
840 BuildTargetRegistry& GetBuildTargets() { return mBuildTargets; }
841 const BuildTargetRegistry& GetBuildTargets() const { return mBuildTargets; }
842
843private:
844 // Empty vector for returning when menu not found
845 std::vector<RegisteredMenuItem> mEmptyMenuItems;
846
847 // Hooks struct passed to plugins
848 EditorUIHooks mHooks;
849
850 // Helper: Parse key binding string to shortcut fields
851 void ParseKeyBinding(RegisteredShortcut& shortcut);
852};
853
857HookId GenerateHookId(const char* identifier);
858
859#endif // EDITOR
Editor UI extension system for native addons.