├── .gitignore ├── Config └── FilterPlugin.ini ├── Doc ├── EST_Assets.png ├── EST_Common.png ├── EST_Editor_UI_Utils.png └── EST_Plugin.png ├── EditorScriptingTools.uplugin ├── LICENSE ├── README.md ├── Resources ├── Icon128.png └── Icons │ ├── AssetDropTargetWidget_32x.png │ ├── AssetPickerWidget_16x.png │ ├── WidgetBlueprint_16x.png │ ├── icon_Apply_40x.png │ ├── icon_ArrowDown.png │ ├── icon_ArrowUp.png │ ├── icon_BluEdMode_64x.PNG │ ├── icon_Class_ComponentVisualizer_64x.PNG │ ├── icon_Class_DetailCustomization_64x.PNG │ ├── icon_Class_EditorModeTool_64x.PNG │ ├── icon_Class_EditorUserDefinedActions_64x.PNG │ ├── icon_Class_EditorUserDefinedSettings_64x.PNG │ ├── icon_Class_EditorUserWidget_64x.PNG │ ├── icon_Clear.png │ ├── icon_Commands_MapActions_40x.png │ ├── icon_Commands_RefreshMappings_40x.png │ ├── icon_Commands_UnmapActions_40x.png │ ├── icon_RefreshUtility_20px.png │ ├── icon_RegisterUtility_16px.png │ ├── icon_SelectionDetails_16x.png │ ├── icon_SettingsTab_ComponentVisualizer_40x.png │ ├── icon_SettingsTab_DetailCustomization_64x.PNG │ ├── icon_SettingsTab_EditorModeTool_64x.PNG │ ├── icon_SettingsTab_EditorUserDefinedActions_64x.PNG │ ├── icon_SettingsTab_EditorUserDefinedSettings_64x.PNG │ ├── icon_SettingsTab_OtherUtils_40x.png │ ├── icon_SettingsTab_PlacementCategories_40x.png │ ├── icon_SettingsTab_ToolsSettingsTab_40x.png │ ├── icon_ToolsMenu_40x.PNG │ ├── icon_UnregisterUtility_16px.png │ ├── icon_Viewports_40x.PNG │ └── icon_tab_Tools_40x.png └── Source └── EditorScriptingTools ├── EditorScriptingTools.Build.cs ├── Private ├── BlueprintLibrary │ ├── BluEdModeBlueprintLibrary.cpp │ ├── BluEdModeBlueprintLibrary.h │ ├── ComponentVisualizerUtilityBlueprintLibrary.cpp │ ├── ComponentVisualizerUtilityBlueprintLibrary.h │ ├── EditorMeshBlueprintLibrary.cpp │ ├── EditorMeshBlueprintLibrary.h │ ├── EditorMiscBlueprintLibrary.cpp │ ├── EditorMiscBlueprintLibrary.h │ ├── EditorUserDefinedActionsBlueprintLibrary.cpp │ ├── EditorUserDefinedActionsBlueprintLibrary.h │ ├── HitProxiesBlueprintLibrary.cpp │ ├── HitProxiesBlueprintLibrary.h │ ├── LevelEditingViewportBlueprintLibrary.cpp │ ├── LevelEditingViewportBlueprintLibrary.h │ ├── LevelEditorBlueprintLibrary.cpp │ ├── LevelEditorBlueprintLibrary.h │ ├── MathEditorBlueprintLibrary.cpp │ └── MathEditorBlueprintLibrary.h ├── ComponentVisualizer │ ├── AssetTypeActions_ComponentVisualizerUtilityBlueprint.cpp │ ├── AssetTypeActions_ComponentVisualizerUtilityBlueprint.h │ ├── ComponentVisualizerInstance.cpp │ ├── ComponentVisualizerInstance.h │ ├── ComponentVisualizerTypes.cpp │ ├── ComponentVisualizerTypes.h │ ├── ComponentVisualizerUtilityBlueprint.cpp │ ├── ComponentVisualizerUtilityBlueprint.h │ ├── ComponentVisualizerUtilityBlueprintFactory.cpp │ ├── ComponentVisualizerUtilityBlueprintFactory.h │ ├── ComponentVisualizerUtils.cpp │ ├── ComponentVisualizerUtils.h │ ├── NativeComponentVisualizerInstance.cpp │ └── NativeComponentVisualizerInstance.h ├── DetailCustomization │ ├── AssetTypeActions_DetailCustomizationUtilityBlueprint.cpp │ ├── AssetTypeActions_DetailCustomizationUtilityBlueprint.h │ ├── DetailCategoryBuilderHandle.cpp │ ├── DetailCategoryBuilderHandle.h │ ├── DetailCustomizationHelpers.cpp │ ├── DetailCustomizationHelpers.h │ ├── DetailCustomizationInstance.cpp │ ├── DetailCustomizationInstance.h │ ├── DetailCustomizationTypes.cpp │ ├── DetailCustomizationTypes.h │ ├── DetailCustomizationUtilityBlueprint.cpp │ ├── DetailCustomizationUtilityBlueprint.h │ ├── DetailCustomizationUtilityBlueprintFactory.cpp │ ├── DetailCustomizationUtilityBlueprintFactory.h │ ├── DetailGroupHandle.cpp │ ├── DetailGroupHandle.h │ ├── NativeDetailCustomizationInstance.cpp │ ├── NativeDetailCustomizationInstance.h │ ├── NativeDetailCustomizationInstancesManager.cpp │ └── NativeDetailCustomizationInstancesManager.h ├── EditorContextMenu │ ├── EditorContextMenuLibrary.cpp │ └── EditorContextMenuLibrary.h ├── EditorEventsSubsystem │ ├── EditorEventsSubsystem.cpp │ └── EditorEventsSubsystem.h ├── EditorMode │ ├── BluEdMode.cpp │ ├── BluEdMode.h │ ├── BluEdModeToolkit.cpp │ ├── BluEdModeToolkit.h │ ├── BluEdModeTypes.cpp │ ├── BluEdModeTypes.h │ ├── SBluEdModeToolClassDropTarget.cpp │ ├── SBluEdModeToolClassDropTarget.h │ ├── SBluEdModeWidget.cpp │ └── SBluEdModeWidget.h ├── EditorModeTool │ ├── AssetTypeActions_EditorModeToolUtilityBlueprint.cpp │ ├── AssetTypeActions_EditorModeToolUtilityBlueprint.h │ ├── EditorModeToolInstance.cpp │ ├── EditorModeToolInstance.h │ ├── EditorModeToolUtilityBlueprint.cpp │ ├── EditorModeToolUtilityBlueprint.h │ ├── EditorModeToolUtilityBlueprintFactory.cpp │ └── EditorModeToolUtilityBlueprintFactory.h ├── EditorScriptingToolsCommon │ ├── AssetTypeActions │ │ ├── EditorScriptingAssetTypeActions_Base.cpp │ │ └── EditorScriptingAssetTypeActions_Base.h │ ├── DetailCustomizations │ │ ├── EditorScriptingUtilityBlueprintDetails.cpp │ │ └── EditorScriptingUtilityBlueprintDetails.h │ ├── EditorScriptingToolsTypes.cpp │ ├── EditorScriptingToolsTypes.h │ ├── EditorScriptingUtilityBlueprint.cpp │ ├── EditorScriptingUtilityBlueprint.h │ ├── EditorTypesWrapperTypes.cpp │ ├── EditorTypesWrapperTypes.h │ ├── HitProxiesTypes.cpp │ ├── HitProxiesTypes.h │ ├── ILevelEditingContext.h │ ├── LevelEditorToolBase.cpp │ └── LevelEditorToolBase.h ├── EditorScriptingToolsModule │ ├── EditorScriptingToolsModule.cpp │ ├── EditorScriptingToolsModule.h │ ├── EditorScriptingToolsModule_AssetTypesActions.cpp │ ├── EditorScriptingToolsModule_ComponentVisualizers.cpp │ ├── EditorScriptingToolsModule_CustomClassLayouts.cpp │ ├── EditorScriptingToolsModule_EditorActions.cpp │ ├── EditorScriptingToolsModule_EditorModes.cpp │ ├── EditorScriptingToolsModule_EditorSettings.cpp │ └── EditorScriptingToolsModule_PlacementMode.cpp ├── EditorScriptingToolsStyle.cpp ├── EditorScriptingToolsStyle.h ├── EditorScriptingToolsSubsystem │ ├── EditorScriptingToolsSubsystem.cpp │ ├── EditorScriptingToolsSubsystem.h │ ├── EditorScriptingToolsSubsystemDetails.cpp │ ├── EditorScriptingToolsSubsystemDetails.h │ ├── SEditorScriptingToolsTab.cpp │ ├── SEditorScriptingToolsTab.h │ ├── SEditorScriptingUtilityAssetSlot.cpp │ ├── SEditorScriptingUtilityAssetSlot.h │ ├── SPropertiesBrowser.cpp │ └── SPropertiesBrowser.h ├── EditorUserDefinedActions │ ├── AssetTypeActions_EditorUserDefinedActions.cpp │ ├── AssetTypeActions_EditorUserDefinedActions.h │ ├── ChordEditor │ │ ├── SEditorAction_ChordEditBox.cpp │ │ ├── SEditorAction_ChordEditBox.h │ │ ├── SEditorAction_ChordEditor.cpp │ │ └── SEditorAction_ChordEditor.h │ ├── EditorUserDefinedActions.cpp │ ├── EditorUserDefinedActions.h │ ├── EditorUserDefinedActionsEditor.cpp │ ├── EditorUserDefinedActionsEditor.h │ ├── EditorUserDefinedActionsEditorCommands.cpp │ ├── EditorUserDefinedActionsEditorCommands.h │ ├── EditorUserDefinedActionsFactory.cpp │ ├── EditorUserDefinedActionsFactory.h │ ├── EditorUserDefinedActionsUtils.cpp │ ├── EditorUserDefinedActionsUtils.h │ ├── EditorUserDefinedCommands.cpp │ └── EditorUserDefinedCommands.h ├── EditorUserDefinedPlacementCategories │ ├── UserDefinedPlacementCategoriesTypes.h │ ├── UserDefinedPlacementCategoryInfoCustomization.cpp │ └── UserDefinedPlacementCategoryInfoCustomization.h ├── EditorUserDefinedSettings │ ├── AssetTypeActions_EditorUserDefinedSettingsUtilityBlueprint.cpp │ ├── AssetTypeActions_EditorUserDefinedSettingsUtilityBlueprint.h │ ├── EditorUserDefinedSettings.cpp │ ├── EditorUserDefinedSettings.h │ ├── EditorUserDefinedSettingsUtilityBlueprint.cpp │ ├── EditorUserDefinedSettingsUtilityBlueprint.h │ ├── EditorUserDefinedSettingsUtilityBlueprintFactory.cpp │ └── EditorUserDefinedSettingsUtilityBlueprintFactory.h ├── EditorUserWidget │ ├── AssetTypeActions_EditorUserWidgetBlueprint.cpp │ ├── AssetTypeActions_EditorUserWidgetBlueprint.h │ ├── EditorUserWidget.cpp │ ├── EditorUserWidget.h │ ├── EditorUserWidgetBlueprint.cpp │ ├── EditorUserWidgetBlueprint.h │ ├── EditorUserWidgetBlueprintFactory.cpp │ └── EditorUserWidgetBlueprintFactory.h ├── Utils │ ├── EditorBlueprintUtils.cpp │ ├── EditorBlueprintUtils.h │ ├── EditorMeshUtils.cpp │ ├── EditorMeshUtils.h │ ├── EditorScriptingToolsUtils.cpp │ ├── EditorScriptingToolsUtils.h │ ├── HitProxiesUtils.cpp │ ├── HitProxiesUtils.h │ ├── LevelEditingViewportUtils.cpp │ ├── LevelEditingViewportUtils.h │ ├── LevelEditorUtils.cpp │ ├── LevelEditorUtils.h │ ├── LevelViewportCanvasDrawingUtils.cpp │ ├── LevelViewportCanvasDrawingUtils.h │ ├── LevelViewportPrimitiveDrawingUtils.cpp │ └── LevelViewportPrimitiveDrawingUtils.h └── Widgets │ ├── AssetDropTargetWidget │ ├── AssetDropTargetWidget.cpp │ ├── AssetDropTargetWidget.h │ ├── SAssetDropTargetWidget.cpp │ └── SAssetDropTargetWidget.h │ ├── AssetPickerWidget │ ├── AssetPickerWidget.cpp │ └── AssetPickerWidget.h │ ├── EditorWidgetBase.cpp │ └── EditorWidgetBase.h └── Public ├── IEditorScriptingToolsModule.h └── IEditorScriptingUtilityAssetInterface.h /.gitignore: -------------------------------------------------------------------------------- 1 | # # a comment - this is ignored 2 | # *.a # no .a files 3 | # !lib.a # but do track lib.a, even though you're ignoring .a files above 4 | # /TODO # only ignore the root TODO file, not subdir/TODO 5 | # build/ # ignore all files in the build/ directory 6 | # doc/*.txt # ignore doc/notes.txt, but not doc/server/arch.txt 7 | 8 | !* 9 | *.obj 10 | *.dll 11 | *.pdb 12 | *.generated.h 13 | Intermediate/ 14 | Saved/ 15 | Binaries/ 16 | .vs/ -------------------------------------------------------------------------------- /Config/FilterPlugin.ini: -------------------------------------------------------------------------------- 1 | [FilterPlugin] 2 | ; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and 3 | ; may include "...", "*", and "?" wildcards to match directories, files, and individual characters respectively. 4 | ; 5 | ; Examples: 6 | ; /README.txt 7 | ; /Extras/... 8 | ; /Binaries/ThirdParty/*.dll 9 | -------------------------------------------------------------------------------- /Doc/EST_Assets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Doc/EST_Assets.png -------------------------------------------------------------------------------- /Doc/EST_Common.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Doc/EST_Common.png -------------------------------------------------------------------------------- /Doc/EST_Editor_UI_Utils.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Doc/EST_Editor_UI_Utils.png -------------------------------------------------------------------------------- /Doc/EST_Plugin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Doc/EST_Plugin.png -------------------------------------------------------------------------------- /EditorScriptingTools.uplugin: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion": 3, 3 | "Version": 1, 4 | "VersionName": "1.0", 5 | "FriendlyName": "Editor Scripting Tools", 6 | "Description": "", 7 | "Category": "Scripting", 8 | "CreatedBy": "Elhoussine Mehnik", 9 | "CreatedByURL": "https://twitter.com/HoussineMehnik", 10 | "DocsURL": "https://unrealengineresources.com/documentation", 11 | "MarketplaceURL": "https://unrealengineresources.com/plugins", 12 | "SupportURL": "mailto:ue4resources@gmail.com", 13 | "CanContainContent": true, 14 | "IsBetaVersion": false, 15 | "IsExperimentalVersion": false, 16 | "Installed": false, 17 | "EnabledByDefault": false, 18 | "Modules": [ 19 | { 20 | "Name": "EditorScriptingTools", 21 | "Type": "Editor", 22 | "LoadingPhase": "Default" 23 | } 24 | ], 25 | "Plugins": [ 26 | { 27 | "Name": "EditorScriptingUtilities", 28 | "Enabled": true 29 | }, 30 | { 31 | "Name": "ProceduralMeshComponent", 32 | "Enabled": true 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | //====================== Editor Scripting Tools ===========================// 4 | // Copyright 2020 Elhoussine Mehnik (Mhousse1247). All Rights Reserved. 5 | // It's free of charge and can be used for any project and any purpose as long as it is not violating the EULA. 6 | //====================== http://ue4resources.com/ ========================// 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in all 16 | copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24 | SOFTWARE. 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # To Download Examples project or Compiled plugin version 2 | Visit https://unrealengineresources.com/plugins 3 | 4 | 5 | # Editor Scripting Tools 6 | 7 | ## What is Editor Scripting Tools Plugin ? 8 | 9 | Editor Scripting Tools is an ue4 editor plugin providing a set of tools and utilities allowing to extend and customize some parts the unreal editor using Blueprints. 10 | 11 | ## What are the current available Utilities and Features ? 12 | 13 | - Editor Mode Tool Utility 14 | - Component Visualizer Utility 15 | - Detail Customization Utility 16 | - User Defined Settings Utility 17 | - User Defined Actions 18 | - Editor User Widget 19 | - User Defined Placement Categories 20 | 21 | ![Utilities](Doc/EST_Plugin.png) 22 | 23 | ## Utilities Blueprints & Assets 24 | 25 | ![Assets Category](Doc/EST_Assets.png) 26 | 27 | ## Utilities Common : 28 | 29 | ![Utilities Common](Doc/EST_Common.png) 30 | 31 | -------------------------------------------------------------------------------- /Resources/Icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icon128.png -------------------------------------------------------------------------------- /Resources/Icons/AssetDropTargetWidget_32x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/AssetDropTargetWidget_32x.png -------------------------------------------------------------------------------- /Resources/Icons/AssetPickerWidget_16x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/AssetPickerWidget_16x.png -------------------------------------------------------------------------------- /Resources/Icons/WidgetBlueprint_16x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/WidgetBlueprint_16x.png -------------------------------------------------------------------------------- /Resources/Icons/icon_Apply_40x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_Apply_40x.png -------------------------------------------------------------------------------- /Resources/Icons/icon_ArrowDown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_ArrowDown.png -------------------------------------------------------------------------------- /Resources/Icons/icon_ArrowUp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_ArrowUp.png -------------------------------------------------------------------------------- /Resources/Icons/icon_BluEdMode_64x.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_BluEdMode_64x.PNG -------------------------------------------------------------------------------- /Resources/Icons/icon_Class_ComponentVisualizer_64x.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_Class_ComponentVisualizer_64x.PNG -------------------------------------------------------------------------------- /Resources/Icons/icon_Class_DetailCustomization_64x.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_Class_DetailCustomization_64x.PNG -------------------------------------------------------------------------------- /Resources/Icons/icon_Class_EditorModeTool_64x.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_Class_EditorModeTool_64x.PNG -------------------------------------------------------------------------------- /Resources/Icons/icon_Class_EditorUserDefinedActions_64x.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_Class_EditorUserDefinedActions_64x.PNG -------------------------------------------------------------------------------- /Resources/Icons/icon_Class_EditorUserDefinedSettings_64x.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_Class_EditorUserDefinedSettings_64x.PNG -------------------------------------------------------------------------------- /Resources/Icons/icon_Class_EditorUserWidget_64x.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_Class_EditorUserWidget_64x.PNG -------------------------------------------------------------------------------- /Resources/Icons/icon_Clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_Clear.png -------------------------------------------------------------------------------- /Resources/Icons/icon_Commands_MapActions_40x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_Commands_MapActions_40x.png -------------------------------------------------------------------------------- /Resources/Icons/icon_Commands_RefreshMappings_40x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_Commands_RefreshMappings_40x.png -------------------------------------------------------------------------------- /Resources/Icons/icon_Commands_UnmapActions_40x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_Commands_UnmapActions_40x.png -------------------------------------------------------------------------------- /Resources/Icons/icon_RefreshUtility_20px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_RefreshUtility_20px.png -------------------------------------------------------------------------------- /Resources/Icons/icon_RegisterUtility_16px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_RegisterUtility_16px.png -------------------------------------------------------------------------------- /Resources/Icons/icon_SelectionDetails_16x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_SelectionDetails_16x.png -------------------------------------------------------------------------------- /Resources/Icons/icon_SettingsTab_ComponentVisualizer_40x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_SettingsTab_ComponentVisualizer_40x.png -------------------------------------------------------------------------------- /Resources/Icons/icon_SettingsTab_DetailCustomization_64x.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_SettingsTab_DetailCustomization_64x.PNG -------------------------------------------------------------------------------- /Resources/Icons/icon_SettingsTab_EditorModeTool_64x.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_SettingsTab_EditorModeTool_64x.PNG -------------------------------------------------------------------------------- /Resources/Icons/icon_SettingsTab_EditorUserDefinedActions_64x.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_SettingsTab_EditorUserDefinedActions_64x.PNG -------------------------------------------------------------------------------- /Resources/Icons/icon_SettingsTab_EditorUserDefinedSettings_64x.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_SettingsTab_EditorUserDefinedSettings_64x.PNG -------------------------------------------------------------------------------- /Resources/Icons/icon_SettingsTab_OtherUtils_40x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_SettingsTab_OtherUtils_40x.png -------------------------------------------------------------------------------- /Resources/Icons/icon_SettingsTab_PlacementCategories_40x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_SettingsTab_PlacementCategories_40x.png -------------------------------------------------------------------------------- /Resources/Icons/icon_SettingsTab_ToolsSettingsTab_40x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_SettingsTab_ToolsSettingsTab_40x.png -------------------------------------------------------------------------------- /Resources/Icons/icon_ToolsMenu_40x.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_ToolsMenu_40x.PNG -------------------------------------------------------------------------------- /Resources/Icons/icon_UnregisterUtility_16px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_UnregisterUtility_16px.png -------------------------------------------------------------------------------- /Resources/Icons/icon_Viewports_40x.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_Viewports_40x.PNG -------------------------------------------------------------------------------- /Resources/Icons/icon_tab_Tools_40x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HoussineMehnik/UE4-EditorScriptingToolsPlugin/673105bbe1e980d5344fa975bac2c963e4b417c6/Resources/Icons/icon_tab_Tools_40x.png -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/BluEdModeBlueprintLibrary.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "BluEdModeBlueprintLibrary.h" 6 | #include "BluEdMode.h" 7 | #include "EditorScriptingToolsUtils.h" 8 | #include "EditorModeToolInstance.h" 9 | 10 | 11 | bool UBluEdModeBlueprintLibrary::RunEditorModeToolInstance(TSoftObjectPtr ToolBlueprint) 12 | { 13 | if (UEditorModeToolUtilityBlueprint* EditorModeToolUtilityBlueprint = ToolBlueprint.LoadSynchronous()) 14 | { 15 | if (FBluEdMode* BluEdMode = FBluEdMode::GetActivated()) 16 | { 17 | BluEdMode->SetCurrentToolBlueprint(EditorModeToolUtilityBlueprint, true /*bAutoLoadTool*/); 18 | return true; 19 | } 20 | } 21 | 22 | return false; 23 | } 24 | 25 | bool UBluEdModeBlueprintLibrary::StopActiveEditorModeToolInstance() 26 | { 27 | if (FBluEdMode* BluEdMode = FBluEdMode::GetPtr()) 28 | { 29 | if (!BluEdMode->IsRunningSingleTool()) 30 | { 31 | if (BluEdMode->HasValidToolInstance()) 32 | { 33 | BluEdMode->UnloadTool(); 34 | return true; 35 | } 36 | } 37 | } 38 | 39 | return false; 40 | } 41 | 42 | 43 | bool UBluEdModeBlueprintLibrary::IsAnyEditorModeToolInstanceRunning() 44 | { 45 | if (FBluEdMode* BluEdMode = FBluEdMode::GetPtr()) 46 | { 47 | return BluEdMode->HasValidToolInstance(); 48 | } 49 | return false; 50 | } 51 | 52 | 53 | bool UBluEdModeBlueprintLibrary::IsEditorModeToolInstanceRunning(TSoftObjectPtr ToolBlueprint) 54 | { 55 | if (UEditorModeToolUtilityBlueprint* EditorModeToolUtilityBlueprint = ToolBlueprint.LoadSynchronous()) 56 | { 57 | if (FBluEdMode* BluEdMode = FBluEdMode::GetPtr()) 58 | { 59 | if (BluEdMode->HasValidToolInstance()) 60 | { 61 | return (EditorModeToolUtilityBlueprint == BluEdMode->GetModeToolBlueprint()); 62 | } 63 | } 64 | } 65 | 66 | return false; 67 | } 68 | 69 | UEditorModeToolInstance* UBluEdModeBlueprintLibrary::GetActiveEditorModeToolInstanceInstance(TSubclassOf ToolClass) 70 | { 71 | if (FBluEdMode* BluEdMode = FBluEdMode::GetPtr()) 72 | { 73 | if (UEditorModeToolInstance* ActiveTool = BluEdMode->GetActiveToolInstance()) 74 | { 75 | if (BluEdMode->GetModeToolClass() == ToolClass) 76 | { 77 | return ActiveTool; 78 | } 79 | } 80 | } 81 | return nullptr; 82 | } 83 | 84 | TSoftObjectPtr UBluEdModeBlueprintLibrary::GetActiveEditorModeToolUtilityBlueprint() 85 | { 86 | if (FBluEdMode* BluEdMode = FBluEdMode::GetPtr()) 87 | { 88 | return TSoftObjectPtr(BluEdMode->GetModeToolBlueprint()); 89 | } 90 | return nullptr; 91 | } 92 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/BluEdModeBlueprintLibrary.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "UObject/ObjectMacros.h" 9 | #include "Kismet/BlueprintFunctionLibrary.h" 10 | #include "Templates/SubclassOf.h" 11 | #include "UObject/SoftObjectPtr.h" 12 | #include "EditorModeToolUtilityBlueprint.h" 13 | #include "EditorModeToolInstance.h" 14 | #include "BluEdModeBlueprintLibrary.generated.h" 15 | 16 | 17 | UCLASS() 18 | class UBluEdModeBlueprintLibrary : public UBlueprintFunctionLibrary 19 | { 20 | GENERATED_BODY() 21 | 22 | public: 23 | 24 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Editor Mode") 25 | static bool RunEditorModeToolInstance(TSoftObjectPtr ToolBlueprint); 26 | 27 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Editor Mode") 28 | static bool StopActiveEditorModeToolInstance(); 29 | 30 | UFUNCTION(BlueprintPure, Category = "Editor Scripting | Editor Mode") 31 | static bool IsAnyEditorModeToolInstanceRunning(); 32 | 33 | UFUNCTION(BlueprintPure, Category = "Editor Scripting | Editor Mode") 34 | static bool IsEditorModeToolInstanceRunning(TSoftObjectPtr ToolBlueprint); 35 | 36 | UFUNCTION(BlueprintPure, Category = "Editor Scripting | Editor Mode", meta = (DeterminesOutputType = "ToolClass")) 37 | static UEditorModeToolInstance* GetActiveEditorModeToolInstanceInstance(TSubclassOf ToolClass); 38 | 39 | UFUNCTION(BlueprintPure, Category = "Editor Scripting | Editor Mode") 40 | static TSoftObjectPtr GetActiveEditorModeToolUtilityBlueprint(); 41 | 42 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/ComponentVisualizerUtilityBlueprintLibrary.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "ComponentVisualizerUtilityBlueprintLibrary.h" 6 | 7 | 8 | 9 | #define LOCTEXT_NAMESPACE "ComponentVisualizerUtilityBlueprintLibrary" 10 | 11 | bool UComponentVisualizerUtilityBlueprintLibrary::IsValidPropertyPathHandle(UPARAM(ref) FComponentPropertyPathHandle& Handle) 12 | { 13 | return Handle.PropertyPath.IsValid(); 14 | } 15 | 16 | FComponentPropertyPathHandle UComponentVisualizerUtilityBlueprintLibrary::CreateComponentPropertyPathHandle(UActorComponent* Component) 17 | { 18 | return FComponentPropertyPathHandle(Component); 19 | } 20 | 21 | void UComponentVisualizerUtilityBlueprintLibrary::ResetPropertyPathHandle(UPARAM(ref) FComponentPropertyPathHandle& Handle) 22 | { 23 | Handle.PropertyPath.Reset(); 24 | } 25 | 26 | AActor* UComponentVisualizerUtilityBlueprintLibrary::GetParentOwningActorByPropertyPathHandle(UPARAM(ref) FComponentPropertyPathHandle& Handle) 27 | { 28 | return Handle.PropertyPath.GetParentOwningActor(); 29 | } 30 | 31 | UActorComponent* UComponentVisualizerUtilityBlueprintLibrary::GetComponentByPropertyPathHandle(UPARAM(ref) FComponentPropertyPathHandle& Handle) 32 | { 33 | return Handle.PropertyPath.GetComponent(); 34 | } 35 | 36 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/ComponentVisualizerUtilityBlueprintLibrary.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "Kismet/BlueprintFunctionLibrary.h" 8 | #include "EditorTypesWrapperTypes.h" 9 | #include "Components/ActorComponent.h" 10 | #include "ComponentVisualizerUtilityBlueprintLibrary.generated.h" 11 | 12 | 13 | UCLASS() 14 | class UComponentVisualizerUtilityBlueprintLibrary : public UBlueprintFunctionLibrary 15 | { 16 | GENERATED_BODY() 17 | 18 | public: 19 | 20 | /** Determines whether the property path is valid or not. */ 21 | UFUNCTION(BlueprintPure, Category = "ComponentVisualizer|ComponentPropertyPathHandle") 22 | static bool IsValidPropertyPathHandle(UPARAM(ref) FComponentPropertyPathHandle& Handle); 23 | 24 | /** creates a new component property handle from a given component pointer. */ 25 | UFUNCTION(BlueprintCallable, Category = "ComponentVisualizer|ComponentPropertyPathHandle") 26 | static FComponentPropertyPathHandle CreateComponentPropertyPathHandle(UActorComponent* Component); 27 | 28 | /** Resets the property path. */ 29 | UFUNCTION(BlueprintCallable, Category = "ComponentVisualizer|ComponentPropertyPathHandle") 30 | static void ResetPropertyPathHandle(UPARAM(ref) FComponentPropertyPathHandle& Handle); 31 | 32 | /** Gets the parent owning actor for the component, or nullptr if it is not valid. */ 33 | UFUNCTION(BlueprintPure, Category = "ComponentVisualizer|ComponentPropertyPathHandle") 34 | static AActor* GetParentOwningActorByPropertyPathHandle(UPARAM(ref) FComponentPropertyPathHandle& Handle); 35 | 36 | /** Gets a pointer to the component, or nullptr if it is not valid. */ 37 | UFUNCTION(BlueprintPure, Category = "ComponentVisualizer|ComponentPropertyPathHandle") 38 | static UActorComponent* GetComponentByPropertyPathHandle(UPARAM(ref) FComponentPropertyPathHandle& Handle); 39 | 40 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/EditorMeshBlueprintLibrary.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorMeshBlueprintLibrary.h" 6 | #include "EditorMeshUtils.h" 7 | 8 | #define LOCTEXT_NAMESPACE "FBluEdMode" 9 | 10 | bool UEditorMeshBlueprintLibrary::ConvertProceduralMeshToStaticMesh(UProceduralMeshComponent* ProceduralMeshComponent, UStaticMesh*& OutStaticMesh) 11 | { 12 | return EditorMeshUtils::CreateStaticMeshAssetFromProceduralMesh(ProceduralMeshComponent, OutStaticMesh); 13 | } 14 | 15 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/EditorMeshBlueprintLibrary.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | 6 | #pragma once 7 | 8 | #include "CoreMinimal.h" 9 | #include "UObject/ObjectMacros.h" 10 | #include "Kismet/BlueprintFunctionLibrary.h" 11 | #include "EditorMeshBlueprintLibrary.generated.h" 12 | 13 | 14 | UCLASS(MinimalAPI, meta = (ScriptName = "EditorProceduralMeshLibrary")) 15 | class UEditorMeshBlueprintLibrary : public UBlueprintFunctionLibrary 16 | { 17 | GENERATED_BODY() 18 | 19 | public: 20 | 21 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Procedural Mesh") 22 | static bool ConvertProceduralMeshToStaticMesh(class UProceduralMeshComponent* ProceduralMeshComponent, class UStaticMesh*& OutStaticMesh); 23 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/EditorMiscBlueprintLibrary.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | 6 | #include "EditorMiscBlueprintLibrary.h" 7 | #include "Widgets/Notifications/SNotificationList.h" 8 | #include "Framework/Notifications/NotificationManager.h" 9 | #include "Editor.h" 10 | #include "EditorScriptingToolsUtils.h" 11 | #include "EditorModeToolInstance.h" 12 | #include "BluEdMode.h" 13 | #include "CanvasTypes.h" 14 | #include "DragAndDrop/ClassDragDropOp.h" 15 | #include "UObject/WeakObjectPtrTemplates.h" 16 | #include "DragAndDrop/AssetDragDropOp.h" 17 | #include "EditorUserDefinedCommands.h" 18 | #include "BluEdModeTypes.h" 19 | 20 | 21 | 22 | 23 | FSlateBrush UEditorMiscBlueprintLibrary::FindIconBrushForClass(TSubclassOf Class) 24 | { 25 | if (Class) 26 | { 27 | const FSlateIcon ClassIcon = FSlateIconFinder::FindIconForClass(*Class); 28 | if (const FSlateBrush* IconBrush = ClassIcon.GetIcon()) 29 | { 30 | return *IconBrush; 31 | } 32 | } 33 | 34 | return FSlateNoResource(); 35 | } 36 | 37 | FEventReply UEditorMiscBlueprintLibrary::BeginClassDragDrop(TSubclassOf InClass) 38 | { 39 | FEventReply UMGEventReply{}; 40 | UMGEventReply.NativeReply = FReply::Handled().BeginDragDrop(FClassDragDropOp::New(MakeWeakObjectPtr(*InClass))); 41 | return UMGEventReply; 42 | } 43 | 44 | FEventReply UEditorMiscBlueprintLibrary::BeginAssetsDragDrop(TArray DraggedAssets) 45 | { 46 | FEventReply UMGEventReply{}; 47 | if (DraggedAssets.Num() == 0) 48 | { 49 | UMGEventReply.NativeReply = FReply::Unhandled(); 50 | } 51 | else 52 | { 53 | TArray AssetData; 54 | AssetData.Reset(DraggedAssets.Num()); 55 | for (const UObject* Asset : DraggedAssets) 56 | { 57 | if (IsValid(Asset)) 58 | { 59 | AssetData.Add(FAssetData(Asset, true)); 60 | } 61 | } 62 | 63 | if (AssetData.Num() > 0) 64 | { 65 | UMGEventReply.NativeReply = FReply::Handled().BeginDragDrop(FAssetDragDropOp::New(AssetData)); 66 | } 67 | } 68 | return UMGEventReply; 69 | } 70 | 71 | FEventReply UEditorMiscBlueprintLibrary::BeginAssetDragDrop(UObject* DraggedAsset) 72 | { 73 | TArray DraggedAssets; 74 | if (IsValid(DraggedAsset)) 75 | { 76 | DraggedAssets.Add(DraggedAsset); 77 | } 78 | return BeginAssetsDragDrop(DraggedAssets); 79 | } 80 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/EditorMiscBlueprintLibrary.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "Kismet/BlueprintFunctionLibrary.h" 9 | #include "EditorTypesWrapperTypes.h" 10 | #include "Components/SlateWrapperTypes.h" 11 | #include "EditorMiscBlueprintLibrary.generated.h" 12 | 13 | 14 | 15 | /** 16 | * 17 | */ 18 | UCLASS() 19 | class UEditorMiscBlueprintLibrary : public UBlueprintFunctionLibrary 20 | { 21 | GENERATED_BODY() 22 | 23 | public: 24 | UFUNCTION(BlueprintPure, Category = "Editor Scripting | UI") 25 | static FSlateBrush FindIconBrushForClass(TSubclassOf Class); 26 | 27 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | UI") 28 | static FEventReply BeginClassDragDrop(TSubclassOf DraggedClass); 29 | 30 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | UI") 31 | static FEventReply BeginAssetsDragDrop(TArray DraggedAssets); 32 | 33 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | UI") 34 | static FEventReply BeginAssetDragDrop(UObject* DraggedAsset); 35 | }; 36 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/EditorUserDefinedActionsBlueprintLibrary.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorUserDefinedActionsBlueprintLibrary.h" 6 | 7 | #include "EditorUserDefinedCommands.h" 8 | #include "EditorUserDefinedActions.h" 9 | 10 | 11 | 12 | bool UEditorUserDefinedActionsBlueprintLibrary::RegisterEditorActions(UEditorUserDefinedActions* ActionsAsset) 13 | { 14 | return FEditorUserDefinedCommands::RegisterActions(ActionsAsset); 15 | } 16 | 17 | bool UEditorUserDefinedActionsBlueprintLibrary::UnregisterEditorActions() 18 | { 19 | return FEditorUserDefinedCommands::UnregisterActions(true); 20 | } 21 | 22 | UEditorUserDefinedActions* UEditorUserDefinedActionsBlueprintLibrary::GetActiveEditorActionsAsset() 23 | { 24 | return FEditorUserDefinedCommands::GetCurrentActionsAsset(); 25 | } -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/EditorUserDefinedActionsBlueprintLibrary.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "UObject/ObjectMacros.h" 9 | #include "Kismet/BlueprintFunctionLibrary.h" 10 | #include "EditorUserDefinedActionsBlueprintLibrary.generated.h" 11 | 12 | UCLASS() 13 | class UEditorUserDefinedActionsBlueprintLibrary : public UBlueprintFunctionLibrary 14 | { 15 | GENERATED_BODY() 16 | 17 | public: 18 | 19 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Editor User Defined Actions") 20 | static bool RegisterEditorActions(class UEditorUserDefinedActions* ActionsAsset); 21 | 22 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Editor User Defined Actions") 23 | static bool UnregisterEditorActions(); 24 | 25 | UFUNCTION(BlueprintPure, Category = "Editor Scripting | Editor User Defined Actions") 26 | static class UEditorUserDefinedActions* GetActiveEditorActionsAsset(); 27 | 28 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/HitProxiesBlueprintLibrary.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "HitProxiesBlueprintLibrary.h" 6 | #include "EngineUtils.h" 7 | #include "ComponentVisualizer.h" 8 | 9 | 10 | #define LOCTEXT_NAMESPACE "HitProxiesBlueprintLibrary" 11 | 12 | UHitProxiesBlueprintLibrary::UHitProxiesBlueprintLibrary() 13 | { 14 | 15 | } 16 | 17 | 18 | bool UHitProxiesBlueprintLibrary::IsValid(UPARAM(ref) FHitProxyHandle& Handle) 19 | { 20 | return Handle.IsValid(); 21 | } 22 | 23 | EHitProxyType UHitProxiesBlueprintLibrary::GetHitProxyType(UPARAM(ref) FHitProxyHandle& Handle) 24 | { 25 | return Handle.GetHitProxyType(); 26 | } 27 | 28 | bool UHitProxiesBlueprintLibrary::GetIndexedHitProxyInfo(UPARAM(ref) FHitProxyHandle& Handle, int32& OutIndex) 29 | { 30 | if (Handle.GetHitProxyType()== EHitProxyType::CustomIndex) 31 | { 32 | HIndexedHitProxy* IndexedHitProxy = static_cast(Handle.Get()->HitProxy); 33 | OutIndex = IndexedHitProxy->Index; 34 | return true; 35 | } 36 | OutIndex = INDEX_NONE; 37 | return false; 38 | } 39 | 40 | bool UHitProxiesBlueprintLibrary::GetActorHitProxyInfo(UPARAM(ref) FHitProxyHandle& Handle, FActorHitProxyInfo& OutActorHitProxyInfo) 41 | { 42 | if (Handle.GetHitProxyType() == EHitProxyType::Actor) 43 | { 44 | if (HActor* ActorHitProxy = static_cast(Handle.Get()->HitProxy)) 45 | { 46 | OutActorHitProxyInfo.Set(ActorHitProxy->Actor, ActorHitProxy->PrimComponent, ActorHitProxy->SectionIndex, ActorHitProxy->MaterialIndex); 47 | return true; 48 | } 49 | } 50 | 51 | OutActorHitProxyInfo.Clear(); 52 | return false; 53 | } 54 | 55 | bool UHitProxiesBlueprintLibrary::GetComponentVisualizerHitProxyInfo(UPARAM(ref) FHitProxyHandle& Handle, FActorComponentWrapper& OutComponentInfo) 56 | { 57 | if (Handle.GetHitProxyType() == EHitProxyType::ComponentVisualizer) 58 | { 59 | HComponentVisProxy* ComponentVisProxy = static_cast(Handle.Get()->HitProxy); 60 | OutComponentInfo.SetComponent(ComponentVisProxy->Component.Get()); 61 | return ComponentVisProxy->Component.IsValid(); 62 | } 63 | 64 | OutComponentInfo.ClearComponent(); 65 | return false; 66 | } 67 | 68 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/HitProxiesBlueprintLibrary.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "Kismet/BlueprintFunctionLibrary.h" 8 | #include "HitProxiesTypes.h" 9 | #include "HitProxiesBlueprintLibrary.generated.h" 10 | 11 | 12 | UCLASS() 13 | class UHitProxiesBlueprintLibrary : public UBlueprintFunctionLibrary 14 | { 15 | GENERATED_BODY() 16 | 17 | public: 18 | UHitProxiesBlueprintLibrary(); 19 | 20 | UFUNCTION(BlueprintPure, Category = "EditorScripting | HitProxies") 21 | static bool IsValid(UPARAM(ref) FHitProxyHandle& Handle); 22 | 23 | UFUNCTION(BlueprintPure, Category = "EditorScripting | HitProxies") 24 | static EHitProxyType GetHitProxyType(UPARAM(ref) FHitProxyHandle& Handle); 25 | 26 | UFUNCTION(BlueprintCallable, Category = "EditorScripting | HitProxies") 27 | static bool GetIndexedHitProxyInfo(UPARAM(ref) FHitProxyHandle& Handle , int32& OutIndex); 28 | 29 | UFUNCTION(BlueprintCallable, Category = "EditorScripting | HitProxies") 30 | static bool GetActorHitProxyInfo(UPARAM(ref) FHitProxyHandle& Handle, FActorHitProxyInfo& OutActorHitProxyInfo); 31 | 32 | UFUNCTION(BlueprintCallable, Category = "EditorScripting | HitProxies") 33 | static bool GetComponentVisualizerHitProxyInfo(UPARAM(ref) FHitProxyHandle& Handle, FActorComponentWrapper& OutComponentInfo); 34 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/LevelEditorBlueprintLibrary.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "LevelEditorBlueprintLibrary.h" 6 | #include "LevelEditorUtils.h" 7 | #include "Editor.h" 8 | #include "EditorModes.h" 9 | #include "Components/SceneComponent.h" 10 | #include "GameFramework/Actor.h" 11 | 12 | 13 | 14 | void ULevelEditorBlueprintLibrary::PostEditChangeObject(UObject* Object) 15 | { 16 | if (IsValid(Object)) 17 | { 18 | Object->PostEditChange(); 19 | } 20 | } 21 | 22 | void ULevelEditorBlueprintLibrary::SelectComponent(class UActorComponent* Component, bool bInSelected, bool bNotify, bool bSelectEvenIfHidden /*= false*/) 23 | { 24 | { 25 | LevelEditorUtils::SelectComponent(Component, bInSelected, bNotify, bSelectEvenIfHidden); 26 | } 27 | } 28 | 29 | void ULevelEditorBlueprintLibrary::SelectActor(AActor* Actor, bool bInSelected, bool bNotify, bool bSelectEvenIfHidden /*= false*/, bool bForceRefresh /*= false*/) 30 | { 31 | { 32 | LevelEditorUtils::SelectActor(Actor, bInSelected, bNotify, bSelectEvenIfHidden, bForceRefresh); 33 | } 34 | } 35 | 36 | void ULevelEditorBlueprintLibrary::SelectNone(bool bNoteSelectionChange, bool bDeselectBSPSurfs, bool WarnAboutManyActors /*= true*/) 37 | { 38 | { 39 | LevelEditorUtils::SelectNone(bNoteSelectionChange, bDeselectBSPSurfs, WarnAboutManyActors); 40 | } 41 | } 42 | 43 | void ULevelEditorBlueprintLibrary::MarkActorComponentsRenderStateDirty(AActor* Actor) 44 | { 45 | { 46 | LevelEditorUtils::MarkActorComponentsRenderStateDirty(Actor); 47 | } 48 | } 49 | 50 | void ULevelEditorBlueprintLibrary::RerunActorConstructionScripts(AActor* Actor) 51 | { 52 | { 53 | LevelEditorUtils::RerunActorConstructionScripts(Actor); 54 | } 55 | } 56 | 57 | void ULevelEditorBlueprintLibrary::NotifyActorMoved(AActor* Actor) 58 | { 59 | if (GEditor != nullptr) 60 | { 61 | GEditor->BroadcastOnActorMoved(Actor); 62 | } 63 | } 64 | 65 | void ULevelEditorBlueprintLibrary::NotifyComponentTransformChanged(USceneComponent* Component) 66 | { 67 | if (GEditor != nullptr) 68 | { 69 | GEditor->BroadcastOnComponentTransformChanged(Component, ETeleportType::None); 70 | } 71 | } 72 | 73 | EEditorState ULevelEditorBlueprintLibrary::GetEditorState() 74 | { 75 | return LevelEditorUtils::GetEditorState(); 76 | } 77 | 78 | FName ULevelEditorBlueprintLibrary::GetEditorModeID(EBuiltinEditorModes EdMode) 79 | { 80 | switch (EdMode) 81 | { 82 | case EBuiltinEditorModes::None: return FBuiltinEditorModes::EM_None; 83 | case EBuiltinEditorModes::Default: return FBuiltinEditorModes::EM_Default; 84 | case EBuiltinEditorModes::Placement: return FBuiltinEditorModes::EM_Placement; 85 | case EBuiltinEditorModes::InterpEdit: return TEXT("InterpEdit"); 86 | case EBuiltinEditorModes::MeshPaint: return FBuiltinEditorModes::EM_MeshPaint; 87 | case EBuiltinEditorModes::Landscape: return FBuiltinEditorModes::EM_Landscape; 88 | case EBuiltinEditorModes::Foliage: return FBuiltinEditorModes::EM_Foliage; 89 | case EBuiltinEditorModes::Level: return FBuiltinEditorModes::EM_Level; 90 | case EBuiltinEditorModes::StreamingLevel: return FBuiltinEditorModes::EM_StreamingLevel; 91 | case EBuiltinEditorModes::Physics: return FBuiltinEditorModes::EM_Physics; 92 | case EBuiltinEditorModes::ActorPicker: return FBuiltinEditorModes::EM_ActorPicker; 93 | case EBuiltinEditorModes::SceneDepthPicker: return FBuiltinEditorModes::EM_SceneDepthPicker; 94 | default: return TEXT("Unknown Editor Mode"); 95 | } 96 | } 97 | 98 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/LevelEditorBlueprintLibrary.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "Kismet/BlueprintFunctionLibrary.h" 9 | #include "EditorScriptingToolsTypes.h" 10 | #include "EditorTypesWrapperTypes.h" 11 | #include "LevelEditorBlueprintLibrary.generated.h" 12 | 13 | 14 | /** 15 | * 16 | */ 17 | UCLASS() 18 | class ULevelEditorBlueprintLibrary : public UBlueprintFunctionLibrary 19 | { 20 | GENERATED_BODY() 21 | 22 | public: 23 | 24 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Level Editor", meta = (DisplayName = "Post Edit Change Object", Keywords = "post edit change")) 25 | static void PostEditChangeObject(UObject* Object); 26 | 27 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Level Editor", meta = (DisplayName = "Select Component", Keywords = "select component")) 28 | static void SelectComponent(class UActorComponent* Component, bool bInSelected, bool bNotify, bool bSelectEvenIfHidden = false); 29 | 30 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Level Editor", meta = (DisplayName = "Select Actor", Keywords = "select actor")) 31 | static void SelectActor(class AActor* Actor, bool bInSelected, bool bNotify, bool bSelectEvenIfHidden = false, bool bForceRefresh = false); 32 | 33 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Level Editor", meta = (DisplayName = "Select None", Keywords = "select unselect deselect actor selection")) 34 | static void SelectNone(bool bNoteSelectionChange, bool bDeselectBSPSurfs, bool WarnAboutManyActors = true); 35 | 36 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Level Editor", meta = (DisplayName = "Refresh Components Render State", Keywords = "refresh component render")) 37 | static void MarkActorComponentsRenderStateDirty(class AActor* Actor); 38 | 39 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Level Editor", meta = (DisplayName = "Rerun Actor Construction Scripts", Keywords = "run actor construction script")) 40 | static void RerunActorConstructionScripts(class AActor* Actor); 41 | 42 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Level Editor", meta = (DisplayName = "Notify Actor Moved", Keywords = "notify actor editor move change transform scale rotation")) 43 | static void NotifyActorMoved(class AActor* Actor); 44 | 45 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Level Editor", meta = (DisplayName = "NotifyComponentTransformChanged", Keywords = "notify component editor move transform scale rotation")) 46 | static void NotifyComponentTransformChanged(class USceneComponent* Component); 47 | 48 | UFUNCTION(BlueprintPure, Category = "Editor Scripting | Level Editor", meta = (DisplayName = "Get Editor State", Keywords = "editor state status play simulat idle playing simulating PIE")) 49 | static EEditorState GetEditorState(); 50 | 51 | UFUNCTION(BlueprintPure, Category = "Editor Scripting | Level Editor", meta = (CompactNodeTitle = "Get Editor Mode ID", Keywords = "editor mode edmode name id")) 52 | static FName GetEditorModeID(EBuiltinEditorModes EdMode); 53 | }; 54 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/MathEditorBlueprintLibrary.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "MathEditorBlueprintLibrary.h" 6 | 7 | bool UMathEditorBlueprintLibrary::IntersectBox(const FSelectionFrustumVolume& SelectionFrustum, const FVector& Origin, const FVector& Extent, bool& bOutFullyContained) 8 | { 9 | const FConvexVolume& ConvexVolume = SelectionFrustum.GetConvexVolume(); 10 | return ConvexVolume.IntersectBox(Origin, Extent, bOutFullyContained); 11 | } 12 | 13 | bool UMathEditorBlueprintLibrary::IntersectSphere(const FSelectionFrustumVolume& SelectionFrustum, const FVector& Origin, const float& Radius, bool& bOutFullyContained) 14 | { 15 | const FConvexVolume& ConvexVolume = SelectionFrustum.GetConvexVolume(); 16 | return ConvexVolume.IntersectSphere(Origin, Radius, bOutFullyContained); 17 | } 18 | 19 | bool UMathEditorBlueprintLibrary::IntersectLineSegment(const FSelectionFrustumVolume& SelectionFrustum, const FVector& Start, const FVector& End) 20 | { 21 | const FConvexVolume& ConvexVolume = SelectionFrustum.GetConvexVolume(); 22 | return ConvexVolume.IntersectLineSegment(Start, End); 23 | } 24 | 25 | bool UMathEditorBlueprintLibrary::IntersectPoint(const FSelectionFrustumVolume& SelectionFrustum, const FVector& Point) 26 | { 27 | const FConvexVolume& ConvexVolume = SelectionFrustum.GetConvexVolume(); 28 | return ConvexVolume.IntersectPoint(Point); 29 | } 30 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/BlueprintLibrary/MathEditorBlueprintLibrary.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "Kismet/BlueprintFunctionLibrary.h" 9 | #include "EditorTypesWrapperTypes.h" 10 | #include "MathEditorBlueprintLibrary.generated.h" 11 | 12 | 13 | UCLASS() 14 | class UMathEditorBlueprintLibrary : public UBlueprintFunctionLibrary 15 | { 16 | GENERATED_BODY() 17 | 18 | public: 19 | 20 | /** 21 | * Intersection test with an axis-aligned box. 22 | * @param Volume - 23 | * @param Origin - Origin of the box. 24 | * @param Extent - Extent of the box along each axis. 25 | * @param bOutFullyContained - The box is definitely inside frustums and fully contained. 26 | * @returns true if this convex volume intersects the given translated box. 27 | */ 28 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Selection Frustum Volume", meta = (DisplayName = "Intersect Box", Keywords = "intersect")) 29 | static bool IntersectBox(const FSelectionFrustumVolume& SelectionFrustum, const FVector& Origin, const FVector& Extent, bool& bOutFullyContained); 30 | 31 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Selection Frustum Volume", meta = (DisplayName = "Intersect Sphere", Keywords = "intersect")) 32 | static bool IntersectSphere(const FSelectionFrustumVolume& SelectionFrustum, const FVector& Origin, const float& Radius, bool& bOutFullyContained); 33 | 34 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Selection Frustum Volume", meta = (DisplayName = "Intersect Line", Keywords = "intersect")) 35 | static bool IntersectLineSegment(const FSelectionFrustumVolume& SelectionFrustum, const FVector& Start, const FVector& End); 36 | 37 | /** Determines whether the given point lies inside the convex volume */ 38 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Selection Frustum Volume", meta = (DisplayName = "Intersect Point", Keywords = "intersect")) 39 | static bool IntersectPoint(const FSelectionFrustumVolume& SelectionFrustum, const FVector& Point); 40 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/ComponentVisualizer/AssetTypeActions_ComponentVisualizerUtilityBlueprint.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "AssetTypeActions_ComponentVisualizerUtilityBlueprint.h" 6 | #include "Framework/MultiBox/MultiBoxBuilder.h" 7 | #include "Misc/PackageName.h" 8 | #include "ComponentVisualizerUtilityBlueprintFactory.h" 9 | #include "Kismet2/KismetEditorUtilities.h" 10 | #include "BlueprintEditorModule.h" 11 | #include "EditorScriptingToolsModule.h" 12 | #include "ComponentVisualizerUtilityBlueprint.h" 13 | #include "EditorScriptingToolsStyle.h" 14 | 15 | 16 | 17 | 18 | #define LOCTEXT_NAMESPACE "FAssetTypeActions_ComponentVisualizerUtilityBlueprint" 19 | 20 | FText FAssetTypeActions_ComponentVisualizerUtilityBlueprint::GetName() const 21 | { 22 | return LOCTEXT("AssetTypeActions_ComponentVisualizer", "Component Visualizer Blueprint"); 23 | } 24 | 25 | FColor FAssetTypeActions_ComponentVisualizerUtilityBlueprint::GetTypeColor() const 26 | { 27 | return FEditorScriptingUtilityAssetColorsHelper::ComponentVisualizerUtilityBlueprintColor; 28 | } 29 | 30 | UClass* FAssetTypeActions_ComponentVisualizerUtilityBlueprint::GetSupportedClass() const 31 | { 32 | return UComponentVisualizerUtilityBlueprint::StaticClass(); 33 | } 34 | 35 | void FAssetTypeActions_ComponentVisualizerUtilityBlueprint::GetAdditionalActions(TWeakObjectPtr ObjectWeakPtr, FMenuBuilder& MenuBuilder) 36 | { 37 | 38 | } 39 | 40 | #undef LOCTEXT_NAMESPACE 41 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/ComponentVisualizer/AssetTypeActions_ComponentVisualizerUtilityBlueprint.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "ComponentVisualizerUtilityBlueprint.h" 9 | #include "Toolkits/IToolkitHost.h" 10 | #include "EditorScriptingAssetTypeActions_Base.h" 11 | 12 | class FMenuBuilder; 13 | class UComponentVisualizerUtilityBlueprint; 14 | 15 | class FAssetTypeActions_ComponentVisualizerUtilityBlueprint : public FEditorScriptingAssetTypeActions_Base 16 | { 17 | public: 18 | // IAssetTypeActions interface 19 | virtual FText GetName() const override; 20 | virtual FColor GetTypeColor() const override; 21 | virtual UClass* GetSupportedClass() const override; 22 | // End of IAssetTypeActions interface 23 | 24 | 25 | protected: 26 | // FEditorScriptingAssetTypeActions_Base interface 27 | virtual void GetAdditionalActions(TWeakObjectPtr ObjectWeakPtr, FMenuBuilder& MenuBuilder) override; 28 | // End of IAssetTypeActions interface 29 | 30 | 31 | }; 32 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/ComponentVisualizer/ComponentVisualizerTypes.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "ComponentVisualizerTypes.h" -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/ComponentVisualizer/ComponentVisualizerTypes.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/ComponentVisualizer/ComponentVisualizerUtilityBlueprint.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "ComponentVisualizerUtilityBlueprint.h" 6 | #include "ComponentVisualizerInstance.h" 7 | #include "EditorScriptingToolsSubsystem.h" 8 | #include "IEditorScriptingToolsModule.h" 9 | 10 | 11 | #define LOCTEXT_NAMESPACE "ComponentVisualizerUtilityBlueprint" 12 | 13 | UComponentVisualizerUtilityBlueprint::UComponentVisualizerUtilityBlueprint(const FObjectInitializer& ObjectInitializer) 14 | : Super(ObjectInitializer) 15 | , ComponentClass(nullptr) 16 | { 17 | 18 | } 19 | 20 | bool UComponentVisualizerUtilityBlueprint::IsValid() const 21 | { 22 | return ComponentClass.Get() != nullptr; 23 | } 24 | 25 | bool UComponentVisualizerUtilityBlueprint::PreRenameBlueprint() 26 | { 27 | UEditorScriptingToolsSubsystem* ScriptingToolsSubsystem = UEditorScriptingToolsSubsystem::GetSubsystem(); 28 | if (ScriptingToolsSubsystem->ComponentVisualizerUtilityBlueprints.Contains(this)) 29 | { 30 | ScriptingToolsSubsystem->ComponentVisualizerUtilityBlueprints.Remove(this); 31 | return true; 32 | } 33 | return false; 34 | } 35 | 36 | void UComponentVisualizerUtilityBlueprint::PostRenameBlueprint(bool bPreRenameSuccessful, bool bRenameSuccessful) 37 | { 38 | if (bPreRenameSuccessful) 39 | { 40 | UEditorScriptingToolsSubsystem* ScriptingToolsSubsystem = UEditorScriptingToolsSubsystem::GetSubsystem(); 41 | ScriptingToolsSubsystem->ComponentVisualizerUtilityBlueprints.Add(this); 42 | UEditorScriptingToolsSubsystem::GetSubsystem()->NotifySettingsModified(); 43 | } 44 | } 45 | 46 | 47 | FName UComponentVisualizerUtilityBlueprint::GetUtilitySettingsCategoryName() const 48 | { 49 | return FName("VisualizerSettings"); 50 | } 51 | 52 | void UComponentVisualizerUtilityBlueprint::GetUneditablePropertiesWhenRegistered(TArray& OutProperties) const 53 | { 54 | OutProperties.Empty(); 55 | { 56 | OutProperties.Add(GET_MEMBER_NAME_CHECKED(UComponentVisualizerUtilityBlueprint, ComponentClass)); 57 | } 58 | } 59 | 60 | #if WITH_EDITOR 61 | void UComponentVisualizerUtilityBlueprint::GetReparentingRules(TSet< const UClass* >& AllowedChildrenOfClasses, TSet< const UClass* >& DisallowedChildrenOfClasses) const 62 | { 63 | AllowedChildrenOfClasses.Empty(); 64 | AllowedChildrenOfClasses.Add(UComponentVisualizerInstance::StaticClass()); 65 | } 66 | #endif //WITH_EDITOR 67 | 68 | 69 | #undef LOCTEXT_NAMESPACE //"ComponentVisualizerUtilityBlueprint" -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/ComponentVisualizer/ComponentVisualizerUtilityBlueprint.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "EditorScriptingUtilityBlueprint.h" 8 | #include "ComponentVisualizerUtilityBlueprint.generated.h" 9 | 10 | class UActorComponent; 11 | 12 | UCLASS(config = Editor) 13 | class UComponentVisualizerUtilityBlueprint final : public UEditorScriptingUtilityBlueprint 14 | { 15 | GENERATED_UCLASS_BODY() 16 | 17 | public: 18 | UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = VisualizerSettings) 19 | TSubclassOf ComponentClass; 20 | 21 | 22 | public: 23 | virtual bool IsValid() const override; 24 | protected: 25 | virtual bool PreRenameBlueprint() override; 26 | virtual void PostRenameBlueprint(bool bPreRenameSuccessful, bool bRenameSuccessful) override; 27 | 28 | public: 29 | /** Begin IEditorToolAssetInterface interface */ 30 | virtual EEditorScriptingUtilityType GetUtilityType() const override { return EEditorScriptingUtilityType::ComponentVisulizer; } 31 | virtual FName GetUtilitySettingsCategoryName() const override; 32 | virtual void GetUneditablePropertiesWhenRegistered(TArray& OutProperties) const override; 33 | /** End IEditorToolAssetInterface interface */ 34 | 35 | #if WITH_EDITOR 36 | //~ UBlueprint interface 37 | virtual bool SupportedByDefaultBlueprintFactory() const override { return false; } 38 | void GetReparentingRules(TSet< const UClass* >& AllowedChildrenOfClasses, TSet< const UClass* >& DisallowedChildrenOfClasses) const override; 39 | //~ End of UBlueprint interface 40 | #endif 41 | 42 | }; 43 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/ComponentVisualizer/ComponentVisualizerUtilityBlueprintFactory.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "ComponentVisualizerUtilityBlueprintFactory.h" 6 | #include "Misc/MessageDialog.h" 7 | #include "Modules/ModuleManager.h" 8 | #include "Widgets/SWindow.h" 9 | #include "Engine/Blueprint.h" 10 | #include "Settings/EditorExperimentalSettings.h" 11 | #include "Engine/BlueprintGeneratedClass.h" 12 | #include "ComponentVisualizerUtilityBlueprint.h" 13 | #include "ClassViewerModule.h" 14 | #include "ClassViewerFilter.h" 15 | #include "Kismet2/KismetEditorUtilities.h" 16 | #include "Kismet2/SClassPickerDialog.h" 17 | #include "ComponentVisualizerInstance.h" 18 | 19 | 20 | UComponentVisualizerUtilityBlueprintFactory::UComponentVisualizerUtilityBlueprintFactory(const FObjectInitializer& ObjectInitializer) 21 | : Super(ObjectInitializer) 22 | { 23 | 24 | bCreateNew = true; 25 | bEditAfterNew = true; 26 | SupportedClass = UComponentVisualizerUtilityBlueprint::StaticClass(); 27 | ParentClass = UComponentVisualizerInstance::StaticClass(); 28 | } 29 | 30 | bool UComponentVisualizerUtilityBlueprintFactory::ConfigureProperties() 31 | { 32 | // TODO Make config dialog like the anim blueprints. 33 | return true; 34 | } 35 | 36 | UObject* UComponentVisualizerUtilityBlueprintFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) 37 | { 38 | // Make sure we are trying to factory a blueprint, then create and init one 39 | check(Class->IsChildOf(UComponentVisualizerUtilityBlueprint::StaticClass())); 40 | 41 | if ((ParentClass == NULL) || !FKismetEditorUtilities::CanCreateBlueprintOfClass(ParentClass)) 42 | { 43 | FFormatNamedArguments Args; 44 | Args.Add( TEXT("ClassName"), (ParentClass != NULL) ? FText::FromString( ParentClass->GetName() ) : NSLOCTEXT("UnrealEd", "Null", "(null)") ); 45 | FMessageDialog::Open( EAppMsgType::Ok, FText::Format( NSLOCTEXT("UnrealEd", "CannotCreateBlueprintFromClass", "Cannot create a blueprint based on the class '{0}'."), Args ) ); 46 | return NULL; 47 | } 48 | else 49 | { 50 | return FKismetEditorUtilities::CreateBlueprint(ParentClass, InParent, Name, BPTYPE_Normal, UComponentVisualizerUtilityBlueprint::StaticClass(), UBlueprintGeneratedClass::StaticClass()); 51 | } 52 | } 53 | 54 | bool UComponentVisualizerUtilityBlueprintFactory::CanCreateNew() const 55 | { 56 | return true; 57 | } 58 | 59 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/ComponentVisualizer/ComponentVisualizerUtilityBlueprintFactory.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | 8 | #include "CoreMinimal.h" 9 | #include "UObject/ObjectMacros.h" 10 | #include "Templates/SubclassOf.h" 11 | #include "Factories/Factory.h" 12 | #include "ComponentVisualizerUtilityBlueprintFactory.generated.h" 13 | 14 | 15 | UCLASS() 16 | class UComponentVisualizerUtilityBlueprintFactory : public UFactory 17 | { 18 | GENERATED_UCLASS_BODY() 19 | 20 | // The parent class of the created blueprint 21 | UPROPERTY(EditAnywhere, Category=BlueprintFactory, meta=(AllowAbstract = "", BlueprintBaseOnly = "")) 22 | TSubclassOf ParentClass; 23 | 24 | // UFactory interface 25 | virtual bool ConfigureProperties() override; 26 | virtual UObject* FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override; 27 | virtual bool CanCreateNew() const override; 28 | // End of UFactory interface 29 | 30 | }; 31 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/ComponentVisualizer/ComponentVisualizerUtils.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "ComponentVisualizerUtils.h" -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/ComponentVisualizer/ComponentVisualizerUtils.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/DetailCustomization/AssetTypeActions_DetailCustomizationUtilityBlueprint.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "AssetTypeActions_DetailCustomizationUtilityBlueprint.h" 6 | #include "Framework/MultiBox/MultiBoxBuilder.h" 7 | #include "Misc/PackageName.h" 8 | #include "ComponentVisualizerUtilityBlueprintFactory.h" 9 | #include "Kismet2/KismetEditorUtilities.h" 10 | #include "BlueprintEditorModule.h" 11 | #include "EditorScriptingToolsModule.h" 12 | #include "EditorScriptingToolsStyle.h" 13 | #include "DetailCustomizationUtilityBlueprint.h" 14 | 15 | 16 | 17 | 18 | #define LOCTEXT_NAMESPACE "AssetTypeActions_DetailCustomizationUtilityBlueprint" 19 | 20 | FText FAssetTypeActions_DetailCustomizationUtilityBlueprint::GetName() const 21 | { 22 | return LOCTEXT("AssetTypeActions_DetailCustomizationInstance", "Detail Customizations Blueprint"); 23 | } 24 | 25 | FColor FAssetTypeActions_DetailCustomizationUtilityBlueprint::GetTypeColor() const 26 | { 27 | return FEditorScriptingUtilityAssetColorsHelper::DetailCustomizationInstanceColor; 28 | } 29 | 30 | UClass* FAssetTypeActions_DetailCustomizationUtilityBlueprint::GetSupportedClass() const 31 | { 32 | return UDetailCustomizationUtilityBlueprint::StaticClass(); 33 | } 34 | 35 | void FAssetTypeActions_DetailCustomizationUtilityBlueprint::GetAdditionalActions(TWeakObjectPtr ObjectWeakPtr, FMenuBuilder& MenuBuilder) 36 | { 37 | 38 | } 39 | 40 | #undef LOCTEXT_NAMESPACE 41 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/DetailCustomization/AssetTypeActions_DetailCustomizationUtilityBlueprint.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "ComponentVisualizerUtilityBlueprint.h" 9 | #include "Toolkits/IToolkitHost.h" 10 | #include "EditorScriptingAssetTypeActions_Base.h" 11 | 12 | class FMenuBuilder; 13 | class UComponentVisualizerUtilityBlueprint; 14 | 15 | class FAssetTypeActions_DetailCustomizationUtilityBlueprint : public FEditorScriptingAssetTypeActions_Base 16 | { 17 | public: 18 | // IAssetTypeActions interface 19 | virtual FText GetName() const override; 20 | virtual FColor GetTypeColor() const override; 21 | virtual UClass* GetSupportedClass() const override; 22 | // End of IAssetTypeActions interface 23 | 24 | 25 | protected: 26 | // FEditorScriptingAssetTypeActions_Base interface 27 | virtual void GetAdditionalActions(TWeakObjectPtr ObjectWeakPtr, FMenuBuilder& MenuBuilder) override; 28 | // End of IAssetTypeActions interface 29 | 30 | 31 | }; 32 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/DetailCustomization/DetailCustomizationHelpers.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | 6 | #include "DetailCustomizationHelpers.h" 7 | #include "EditorScriptingToolsUtils.h" 8 | #include "DetailWidgetRow.h" 9 | #include "DetailCustomizationInstance.h" 10 | #include "EditorUserWidget.h" 11 | #include "NativeDetailCustomizationInstance.h" 12 | 13 | 14 | UEditorUserWidget* FDetailCustomizationHelpers::AddDetailWidgetRow(FDetailWidgetRow& DetailWidgetRow, FNativeDetailCustomizationInstance* CustomizationInstance, TSubclassOf WidgetClass) 15 | { 16 | if (EditorScriptingToolsUtils::CanInstantiateClass(WidgetClass)) 17 | { 18 | UEditorUserWidget* NewRowWidget = EditorScriptingToolsUtils::CreateTransientEditorWidget(CustomizationInstance->GetInstance(), WidgetClass); 19 | if (NewRowWidget != nullptr) 20 | { 21 | CustomizationInstance->GetInstance()->ReferencedObjects.Add(NewRowWidget); 22 | 23 | DetailWidgetRow.WholeRowContent() 24 | [ 25 | NewRowWidget->TakeWidget() 26 | ]; 27 | 28 | return NewRowWidget; 29 | } 30 | } 31 | 32 | return nullptr; 33 | } 34 | 35 | void FDetailCustomizationHelpers::AddDetailWidgetRowSplitted(FDetailWidgetRow& DetailWidgetRow, FNativeDetailCustomizationInstance* CustomizationInstance, UEditorUserWidget*& OutNameColumnWidget, UEditorUserWidget*& OutValueColumnWidget, TSubclassOf NameColumnWidgetClass, TSubclassOf ValueColumnWidgetClass) 36 | { 37 | if (EditorScriptingToolsUtils::CanInstantiateClass(NameColumnWidgetClass)) 38 | { 39 | OutNameColumnWidget = EditorScriptingToolsUtils::CreateTransientEditorWidget(CustomizationInstance->GetInstance(), NameColumnWidgetClass); 40 | CustomizationInstance->GetInstance()->ReferencedObjects.Add(OutNameColumnWidget); 41 | } 42 | 43 | if (EditorScriptingToolsUtils::CanInstantiateClass(ValueColumnWidgetClass)) 44 | { 45 | OutValueColumnWidget = EditorScriptingToolsUtils::CreateTransientEditorWidget(CustomizationInstance->GetInstance(), ValueColumnWidgetClass); 46 | CustomizationInstance->GetInstance()->ReferencedObjects.Add(OutValueColumnWidget); 47 | } 48 | 49 | TSharedRef NameContentWidget{ (OutNameColumnWidget == nullptr) ? SNullWidget::NullWidget : OutNameColumnWidget->TakeWidget() }; 50 | TSharedRef ValueContentWidget{ (OutValueColumnWidget == nullptr) ? SNullWidget::NullWidget : OutValueColumnWidget->TakeWidget() }; 51 | 52 | DetailWidgetRow.NameContent() 53 | [ 54 | NameContentWidget 55 | ] 56 | .ValueContent() 57 | [ 58 | ValueContentWidget 59 | ]; 60 | } 61 | 62 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/DetailCustomization/DetailCustomizationHelpers.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "Templates/SubclassOf.h" 9 | 10 | class UEditorUserWidget; 11 | class UDetailCustomizationInstance; 12 | class FNativeDetailCustomizationInstance; 13 | 14 | class FDetailWidgetRow; 15 | 16 | class FDetailCustomizationHelpers 17 | { 18 | 19 | private: 20 | 21 | 22 | public: 23 | static UEditorUserWidget* AddDetailWidgetRow(FDetailWidgetRow& DetailWidgetRow, FNativeDetailCustomizationInstance* CustomizationInstance, TSubclassOf WidgetClass); 24 | static void AddDetailWidgetRowSplitted(FDetailWidgetRow& DetailWidgetRow, FNativeDetailCustomizationInstance* CustomizationInstance, UEditorUserWidget*& OutNameColumnWidget, UEditorUserWidget*& OutValueColumnWidget, TSubclassOf NameColumnWidgetClass, TSubclassOf ValueColumnWidgetClass); 25 | 26 | }; 27 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/DetailCustomization/DetailCustomizationTypes.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "DetailCustomizationTypes.h" 6 | #include "Widgets/Layout/SBorder.h" 7 | #include "EditorStyleSet.h" 8 | #include "Widgets/Text/STextBlock.h" 9 | #include "Widgets/Layout/SBorder.h" 10 | #include "Widgets/DeclarativeSyntaxSupport.h" 11 | 12 | #define LOCTEXT_NAMESPACE "DetailCustomizationTypes" 13 | 14 | TSharedRef FPropertyWidgetHelpers::UnknownPropertyWidget = SNew(SBorder) 15 | .Padding(0.0f) 16 | .HAlign(HAlign_Fill) 17 | .VAlign(VAlign_Fill) 18 | .BorderImage(FAppStyle::GetBrush("NoBorder")) 19 | [ 20 | SNew(STextBlock) 21 | .Text(LOCTEXT("UnknownPropertyText", "Unknown Property")) 22 | ]; 23 | 24 | 25 | #undef LOCTEXT_NAMESPACE 26 | 27 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/DetailCustomization/DetailCustomizationTypes.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "DetailCustomizationUtilityBlueprint.h" 9 | #include "DetailCustomizationTypes.generated.h" 10 | 11 | 12 | class FPropertyWidgetHelpers 13 | { 14 | public: 15 | static TSharedRef UnknownPropertyWidget; 16 | }; 17 | 18 | 19 | USTRUCT(BlueprintType) 20 | struct FEditablePropertyInfo 21 | { 22 | GENERATED_USTRUCT_BODY() 23 | 24 | public: 25 | 26 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Editable Property Info") 27 | FName PropertyName; 28 | 29 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Editable Property Info") 30 | FString PropertyPath; 31 | 32 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Editable Property Info") 33 | TSubclassOf PropertyOwnerClass; 34 | 35 | FEditablePropertyInfo() 36 | :PropertyName(NAME_None) 37 | , PropertyPath(TEXT("")) 38 | , PropertyOwnerClass(nullptr) 39 | { 40 | 41 | } 42 | 43 | }; 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/DetailCustomization/DetailCustomizationUtilityBlueprint.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "DetailCustomizationUtilityBlueprint.h" 6 | #include "DetailCustomizationInstance.h" 7 | #include "EditorScriptingToolsSubsystem.h" 8 | 9 | #define LOCTEXT_NAMESPACE "DetailCustomizationUtilityBlueprint" 10 | 11 | UDetailCustomizationUtilityBlueprint::UDetailCustomizationUtilityBlueprint(const FObjectInitializer& ObjectInitializer) 12 | : Super(ObjectInitializer) 13 | , CustomizedClass(nullptr) 14 | { 15 | 16 | } 17 | 18 | bool UDetailCustomizationUtilityBlueprint::IsValid() const 19 | { 20 | return CustomizedClass.Get() != nullptr; 21 | } 22 | 23 | bool UDetailCustomizationUtilityBlueprint::PreRenameBlueprint() 24 | { 25 | UEditorScriptingToolsSubsystem* ScriptingToolsSubsystem = UEditorScriptingToolsSubsystem::GetSubsystem(); 26 | if (ScriptingToolsSubsystem->DetailCustomizationUtilityBlueprints.Contains(this)) 27 | { 28 | ScriptingToolsSubsystem->DetailCustomizationUtilityBlueprints.Remove(this); 29 | return true; 30 | } 31 | return false; 32 | } 33 | 34 | void UDetailCustomizationUtilityBlueprint::PostRenameBlueprint(bool bPreRenameSuccessful, bool bRenameSuccessful) 35 | { 36 | if (bPreRenameSuccessful) 37 | { 38 | UEditorScriptingToolsSubsystem* ScriptingToolsSubsystem = UEditorScriptingToolsSubsystem::GetSubsystem(); 39 | ScriptingToolsSubsystem->DetailCustomizationUtilityBlueprints.Add(this); 40 | UEditorScriptingToolsSubsystem::GetSubsystem()->NotifySettingsModified(); 41 | } 42 | } 43 | 44 | 45 | FName UDetailCustomizationUtilityBlueprint::GetUtilitySettingsCategoryName() const 46 | { 47 | return FName("DetailCustomizationSettings"); 48 | } 49 | 50 | void UDetailCustomizationUtilityBlueprint::GetUneditablePropertiesWhenRegistered(TArray& OutProperties) const 51 | { 52 | OutProperties.Empty(); 53 | { 54 | OutProperties.Add(GET_MEMBER_NAME_CHECKED(UDetailCustomizationUtilityBlueprint, CustomizedClass)); 55 | OutProperties.Add(GET_MEMBER_NAME_CHECKED(UDetailCustomizationUtilityBlueprint, bAllowDefaultObjectCustomization)); 56 | } 57 | } 58 | 59 | #if WITH_EDITOR 60 | void UDetailCustomizationUtilityBlueprint::GetReparentingRules(TSet< const UClass* >& AllowedChildrenOfClasses, TSet< const UClass* >& DisallowedChildrenOfClasses) const 61 | { 62 | AllowedChildrenOfClasses.Empty(); 63 | AllowedChildrenOfClasses.Add(UDetailCustomizationInstance::StaticClass()); 64 | } 65 | #endif //WITH_EDITOR 66 | 67 | 68 | #undef LOCTEXT_NAMESPACE //"DetailCustomizationUtilityBlueprint" -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/DetailCustomization/DetailCustomizationUtilityBlueprint.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "EditorScriptingUtilityBlueprint.h" 8 | #include "Templates/SubclassOf.h" 9 | #include "DetailCustomizationUtilityBlueprint.generated.h" 10 | 11 | 12 | UCLASS(config = Editor) 13 | class UDetailCustomizationUtilityBlueprint final : public UEditorScriptingUtilityBlueprint 14 | { 15 | GENERATED_UCLASS_BODY() 16 | 17 | public: 18 | UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DetailCustomizationSettings) 19 | TSubclassOf CustomizedClass; 20 | 21 | UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = DetailCustomizationSettings) 22 | bool bAllowDefaultObjectCustomization; 23 | 24 | public: 25 | virtual bool IsValid() const override; 26 | protected: 27 | virtual bool PreRenameBlueprint() override; 28 | virtual void PostRenameBlueprint(bool bPreRenameSuccessful, bool bRenameSuccessful) override; 29 | 30 | public: 31 | /** Begin IEditorToolAssetInterface interface */ 32 | virtual EEditorScriptingUtilityType GetUtilityType() const override { return EEditorScriptingUtilityType::DetailCustomization; } 33 | virtual FName GetUtilitySettingsCategoryName() const override; 34 | virtual void GetUneditablePropertiesWhenRegistered(TArray& OutProperties) const override; 35 | /** End IEditorToolAssetInterface interface */ 36 | 37 | #if WITH_EDITOR 38 | //~ UBlueprint interface 39 | virtual bool SupportedByDefaultBlueprintFactory() const override { return false; } 40 | void GetReparentingRules(TSet< const UClass* >& AllowedChildrenOfClasses, TSet< const UClass* >& DisallowedChildrenOfClasses) const override; 41 | //~ End of UBlueprint interface 42 | #endif 43 | 44 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/DetailCustomization/DetailCustomizationUtilityBlueprintFactory.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "DetailCustomizationUtilityBlueprintFactory.h" 6 | #include "DetailCustomizationUtilityBlueprint.h" 7 | #include "DetailCustomizationInstance.h" 8 | #include "Engine/Blueprint.h" 9 | #include "Engine/BlueprintGeneratedClass.h" 10 | #include "Kismet2/KismetEditorUtilities.h" 11 | #include "Misc/MessageDialog.h" 12 | 13 | 14 | #define LOCTEXT_NAMESPACE "UDetailCustomizationUtilityBlueprintFactory" 15 | 16 | UDetailCustomizationUtilityBlueprintFactory::UDetailCustomizationUtilityBlueprintFactory(const FObjectInitializer& ObjectInitializer) 17 | : Super(ObjectInitializer) 18 | { 19 | 20 | bCreateNew = true; 21 | bEditAfterNew = true; 22 | SupportedClass = UDetailCustomizationUtilityBlueprint::StaticClass(); 23 | ParentClass = UDetailCustomizationInstance::StaticClass(); 24 | } 25 | 26 | bool UDetailCustomizationUtilityBlueprintFactory::ConfigureProperties() 27 | { 28 | return true; 29 | } 30 | 31 | UObject* UDetailCustomizationUtilityBlueprintFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) 32 | { 33 | check(Class->IsChildOf(UDetailCustomizationUtilityBlueprint::StaticClass())); 34 | 35 | if ((ParentClass == NULL) || !FKismetEditorUtilities::CanCreateBlueprintOfClass(ParentClass)) 36 | { 37 | FFormatNamedArguments Args; 38 | Args.Add(TEXT("ClassName"), (ParentClass != NULL) ? FText::FromString(ParentClass->GetName()) : LOCTEXT("Null", "(null)")); 39 | FMessageDialog::Open(EAppMsgType::Ok, FText::Format(LOCTEXT("CannotCreateBlueprintFromClass", "Cannot create a blueprint based on the class '{0}'."), Args)); 40 | return NULL; 41 | } 42 | else 43 | { 44 | return FKismetEditorUtilities::CreateBlueprint(ParentClass, InParent, Name, BPTYPE_Normal, UDetailCustomizationUtilityBlueprint::StaticClass(), UBlueprintGeneratedClass::StaticClass()); 45 | } 46 | } 47 | 48 | bool UDetailCustomizationUtilityBlueprintFactory::CanCreateNew() const 49 | { 50 | return true; 51 | } 52 | 53 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/DetailCustomization/DetailCustomizationUtilityBlueprintFactory.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "Factories/Factory.h" 8 | #include "DetailCustomizationUtilityBlueprintFactory.generated.h" 9 | 10 | UCLASS() 11 | class UDetailCustomizationUtilityBlueprintFactory : public UFactory 12 | { 13 | GENERATED_UCLASS_BODY() 14 | 15 | // The parent class of the created blueprint 16 | UPROPERTY(EditAnywhere, Category = BlueprintFactory, meta = (AllowAbstract = "", BlueprintBaseOnly = "")) 17 | TSubclassOf ParentClass; 18 | 19 | // UFactory interface 20 | virtual bool ConfigureProperties() override; 21 | virtual UObject* FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override; 22 | virtual bool CanCreateNew() const override; 23 | // End of UFactory interface 24 | 25 | }; 26 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/DetailCustomization/DetailGroupHandle.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "UObject/ObjectMacros.h" 9 | #include "Kismet/BlueprintFunctionLibrary.h" 10 | #include "DetailCategoryBuilderHandle.h" 11 | #include "DetailGroupHandle.generated.h" 12 | 13 | 14 | class UEditorUserWidget; 15 | class IDetailCategoryBuilder; 16 | class IDetailGroup; 17 | class FNativeDetailCustomizationInstance; 18 | 19 | 20 | USTRUCT(BlueprintType) 21 | struct FDetailGroupHandle 22 | { 23 | GENERATED_USTRUCT_BODY() 24 | 25 | 26 | public: 27 | FDetailGroupHandle() {} 28 | 29 | void Init(const FDetailCategoryBuilderHandle& InCategoryBuilderHandle, IDetailGroup& InDetailGroup); 30 | bool IsValid() const; 31 | void Invalidate(); 32 | 33 | FDetailCategoryBuilderHandle& GetCategoryBuilderHandle(); 34 | IDetailGroup* GetNativDetailGroup(); 35 | 36 | void operator=(const FDetailGroupHandle& Other); 37 | 38 | private: 39 | FDetailCategoryBuilderHandle DetailCategoryBuilderHandle{}; 40 | IDetailGroup* NativeDetailGroupPtr{ nullptr }; 41 | }; 42 | 43 | UCLASS() 44 | class UDetailGroupBlueprintLibrary : public UBlueprintFunctionLibrary 45 | { 46 | GENERATED_BODY() 47 | 48 | public: 49 | 50 | UFUNCTION(BlueprintPure, Category = "Detail Customization | Detail Group") 51 | static bool IsValid(UPARAM(ref) FDetailGroupHandle& DetailGroupHandle); 52 | 53 | /** 54 | * Adds a group to the category 55 | * 56 | * @param OutDetailGroupHandle The name of the group 57 | * @param GroupName The name of the group 58 | * @param DisplayName The display name of the group 59 | * @param bIsAdvanced true if the group should appear in the advanced section of the category 60 | * @param bStartExpanded true if the group should start expanded 61 | */ 62 | UFUNCTION(BlueprintCallable, Category = "Detail Customization | Category Builder", meta = (DisplayName = "Add Group", Keywords = "add new detail group category")) 63 | static void AddGroup(UPARAM(ref) FDetailCategoryBuilderHandle& CategoryBuilderHandle, FDetailGroupHandle& OutDetailGroupHandle, FName InGroupName, FText InDisplayName, bool bIsAdvanced = false, bool bStartExpanded = false); 64 | 65 | /** 66 | * Makes a custom row for the groups header 67 | * 68 | * @return a new row for customizing the header 69 | */ 70 | UFUNCTION(BlueprintCallable, Category = "Detail Customization | Detail Group", meta = (DeterminesOutputType = "WidgetClass", DisplayName = "Add Header Row Widget", Keywords = "add create header row widget")) 71 | static UEditorUserWidget* HeaderRow(UPARAM(ref) FDetailGroupHandle& DetailGroupHandle, TSubclassOf WidgetClass); 72 | 73 | /** 74 | * Adds a new row for custom widgets * 75 | * 76 | * @return a new row for adding widgets 77 | */ 78 | UFUNCTION(BlueprintCallable, Category = "Detail Customization | Detail Group", meta = (DeterminesOutputType = "WidgetClass", DisplayName = "Add Group Row Widget", Keywords = "add create category group row widget")) 79 | static UEditorUserWidget* AddWidgetRow(UPARAM(ref) FDetailGroupHandle& DetailGroupHandle, TSubclassOf WidgetClass); 80 | }; 81 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/DetailCustomization/NativeDetailCustomizationInstancesManager.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "NativeDetailCustomizationInstancesManager.h" 6 | #include "Misc/ScopeLock.h" 7 | #include "NativeDetailCustomizationInstance.h" 8 | 9 | 10 | FNativeDetailCustomizationInstancesManager::FNativeDetailCustomizationInstancesManager() 11 | { 12 | 13 | } 14 | 15 | FNativeDetailCustomizationInstancesManager::~FNativeDetailCustomizationInstancesManager() 16 | { 17 | 18 | } 19 | 20 | TSharedRef FNativeDetailCustomizationInstancesManager::Get() 21 | { 22 | static TSharedRef Manager = MakeShareable( new FNativeDetailCustomizationInstancesManager() ); 23 | return Manager; 24 | } 25 | 26 | void FNativeDetailCustomizationInstancesManager::OnPostEditorTick(float DeltaSeconds) 27 | { 28 | if (Mutex.TryLock()) 29 | { 30 | ForceRefreshPendingLayouts(); 31 | Mutex.Unlock(); 32 | } 33 | } 34 | 35 | void FNativeDetailCustomizationInstancesManager::AddToLayoutsToRefresh(const TSharedPtr& LayoutToRefresh) 36 | { 37 | FScopeLock Lock(&Mutex); 38 | PendingDetailsToRefreshWeakPtrs.Add(LayoutToRefresh); 39 | } 40 | 41 | void FNativeDetailCustomizationInstancesManager::ForceRefreshPendingLayouts() 42 | { 43 | if (PendingDetailsToRefreshWeakPtrs.Num() > 0) 44 | { 45 | for (TWeakPtr& CustomizationInstancePtr : PendingDetailsToRefreshWeakPtrs) 46 | { 47 | if (CustomizationInstancePtr.IsValid()) 48 | { 49 | CustomizationInstancePtr.Pin()->ForceRefreshDetails(); 50 | } 51 | } 52 | PendingDetailsToRefreshWeakPtrs.Empty(); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/DetailCustomization/NativeDetailCustomizationInstancesManager.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | 9 | class FNativeDetailCustomizationInstance; 10 | 11 | class FNativeDetailCustomizationInstancesManager 12 | { 13 | public: 14 | FNativeDetailCustomizationInstancesManager(); 15 | ~FNativeDetailCustomizationInstancesManager(); 16 | 17 | static TSharedRef Get(); 18 | 19 | void OnPostEditorTick(float DeltaSeconds); 20 | void AddToLayoutsToRefresh(const TSharedPtr& LayoutToRefresh); 21 | 22 | private: 23 | void ForceRefreshPendingLayouts(); 24 | 25 | private: 26 | FCriticalSection Mutex; 27 | TSet> PendingDetailsToRefreshWeakPtrs; 28 | }; 29 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorContextMenu/EditorContextMenuLibrary.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorContextMenuLibrary.h" 6 | 7 | #include "EditorUserWidget.h" 8 | #include "EditorScriptingToolsUtils.h" 9 | 10 | #include "Modules/ModuleManager.h" 11 | #include "LevelEditor.h" 12 | #include "Editor.h" 13 | 14 | #include "Framework/Application/SlateApplication.h" 15 | #include "Widgets/Layout/SBox.h" 16 | 17 | 18 | TWeakObjectPtr UEditorContextMenuLibrary::ActiveContextMenuWidgetPtr = nullptr; 19 | 20 | UEditorUserWidget* UEditorContextMenuLibrary::CreateContextMenu(TSubclassOf MenuWidgetClass, bool& bIsValid) 21 | { 22 | ActiveContextMenuWidgetPtr = nullptr; 23 | 24 | if (EditorScriptingToolsUtils::CanInstantiateClass(*MenuWidgetClass)) 25 | { 26 | if (UWorld* World = GEditor->GetEditorWorldContext().World()) 27 | { 28 | FLevelEditorModule& LevelEditorModule = FModuleManager::GetModuleChecked(TEXT("LevelEditor")); 29 | TWeakPtr LevelEditorInstanceWeakPtr = LevelEditorModule.GetLevelEditorInstance(); 30 | if (LevelEditorInstanceWeakPtr.IsValid()) 31 | { 32 | ActiveContextMenuWidgetPtr = EditorScriptingToolsUtils::CreateTransientEditorWidget(World, MenuWidgetClass); 33 | if (ActiveContextMenuWidgetPtr != nullptr) 34 | { 35 | TSharedRef MenuSlateWidget = SNew(SBox) 36 | .HAlign(HAlign_Fill) 37 | [ 38 | ActiveContextMenuWidgetPtr->TakeWidget() 39 | ]; 40 | 41 | TSharedPtr Menu = FSlateApplication::Get().PushMenu( 42 | LevelEditorInstanceWeakPtr.Pin().ToSharedRef(), 43 | FWidgetPath(), 44 | MenuSlateWidget, 45 | FSlateApplication::Get().GetCursorPos(), 46 | FPopupTransitionEffect(FPopupTransitionEffect::ContextMenu) 47 | ); 48 | 49 | Menu->GetOnMenuDismissed().AddStatic(&UEditorContextMenuLibrary::HandleMenuDismissed); 50 | } 51 | } 52 | } 53 | } 54 | 55 | bIsValid = ActiveContextMenuWidgetPtr.IsValid(); 56 | return ActiveContextMenuWidgetPtr.Get(); 57 | } 58 | 59 | void UEditorContextMenuLibrary::DismissContextMenus() 60 | { 61 | FSlateApplication::Get().DismissAllMenus(); 62 | } 63 | 64 | void UEditorContextMenuLibrary::HandleMenuDismissed(TSharedRef Menu) 65 | { 66 | ActiveContextMenuWidgetPtr = nullptr; 67 | } 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorContextMenu/EditorContextMenuLibrary.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "Kismet/BlueprintFunctionLibrary.h" 9 | #include "Templates/SubclassOf.h" 10 | #include "EditorUserWidget.h" 11 | #include "EditorContextMenuLibrary.generated.h" 12 | 13 | class IMenu; 14 | 15 | /** 16 | * 17 | */ 18 | UCLASS() 19 | class UEditorContextMenuLibrary : public UBlueprintFunctionLibrary 20 | { 21 | GENERATED_BODY() 22 | 23 | private: 24 | static TWeakObjectPtr ActiveContextMenuWidgetPtr; 25 | 26 | public: 27 | 28 | /** Creates a new Editor Context Menu at cursor location. */ 29 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Context Menu", meta = (DeterminesOutputType = "MenuWidgetClass", DisplayName = "Push Context Menu", Keywords = "push create add context menu")) 30 | static UEditorUserWidget* CreateContextMenu(TSubclassOf MenuWidgetClass, bool& bIsValid); 31 | 32 | /** Dismisses all open menus */ 33 | UFUNCTION(BlueprintCallable, Category = "Editor Scripting | Context Menu", meta = (DisplayName = "Dismiss Context Menus", Keywords = "dismiss remove destroy context menu")) 34 | static void DismissContextMenus(); 35 | 36 | private: 37 | static void HandleMenuDismissed(TSharedRef Menu); 38 | 39 | }; 40 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorMode/BluEdModeToolkit.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "BluEdModeToolkit.h" 6 | #include "BluEdMode.h" 7 | #include "Engine/Selection.h" 8 | #include "Widgets/Input/SButton.h" 9 | #include "Widgets/Text/STextBlock.h" 10 | #include "EditorModeManager.h" 11 | #include "SBluEdModeWidget.h" 12 | #include "EditorTypesWrapperTypes.h" 13 | #include "BluEdModeTypes.h" 14 | 15 | 16 | #define LOCTEXT_NAMESPACE "FBluEdModeToolkit" 17 | 18 | FBluEdModeToolkit::FBluEdModeToolkit() 19 | { 20 | } 21 | 22 | void FBluEdModeToolkit::Init(const TSharedPtr& InitToolkitHost) 23 | { 24 | ToolKitInitName = GetEditorMode()->GetID(); 25 | SAssignNew(ToolkitWidget, SBluEdModeWidget); 26 | FModeToolkit::Init(InitToolkitHost); 27 | } 28 | 29 | FName FBluEdModeToolkit::GetToolkitFName() const 30 | { 31 | return ToolKitInitName; 32 | } 33 | 34 | FText FBluEdModeToolkit::GetBaseToolkitName() const 35 | { 36 | return LOCTEXT("BluEdModeToolkit_DisplayName", "Blueprint Editor Mode Tool"); 37 | } 38 | 39 | class FEdMode* FBluEdModeToolkit::GetEditorMode() const 40 | { 41 | return FBluEdMode::GetPtr(); 42 | } 43 | 44 | TSharedPtr FBluEdModeToolkit::GetInlineContent() const 45 | { 46 | return ToolkitWidget; 47 | } 48 | 49 | 50 | #undef LOCTEXT_NAMESPACE 51 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorMode/BluEdModeToolkit.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "Toolkits/BaseToolkit.h" 9 | 10 | class SBluEdModeWidget; 11 | 12 | class FBluEdModeToolkit : public FModeToolkit 13 | { 14 | public: 15 | 16 | FBluEdModeToolkit(); 17 | 18 | /** FModeToolkit interface */ 19 | virtual void Init(const TSharedPtr& InitToolkitHost) override; 20 | 21 | /** IToolkit interface */ 22 | virtual FName GetToolkitFName() const override; 23 | virtual FText GetBaseToolkitName() const override; 24 | virtual class FEdMode* GetEditorMode() const override; 25 | virtual TSharedPtr GetInlineContent() const override; 26 | 27 | private: 28 | 29 | TSharedPtr ToolkitWidget; 30 | FName ToolKitInitName; 31 | }; 32 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorMode/BluEdModeTypes.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "BluEdModeTypes.h" 6 | 7 | FBluEdModeEditorDelegates::FOnBluEdModeEnter FBluEdModeEditorDelegates::OnBluEdModeChangedDelegate; 8 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorMode/BluEdModeTypes.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | 9 | class FPrimitiveDrawInterface; 10 | class FEditorViewportClient; 11 | class FViewport; 12 | class FSceneView; 13 | class FCanvas; 14 | 15 | enum class EBluEdModeChangeMode : uint8 16 | { 17 | EnterMode = 0, 18 | RefreshWidget, 19 | ExitMode 20 | }; 21 | 22 | struct FBluEdModeEditorDelegates 23 | { 24 | DECLARE_MULTICAST_DELEGATE_OneParam(FOnBluEdModeEnter, EBluEdModeChangeMode /*InChangeMode*/); 25 | static FOnBluEdModeEnter OnBluEdModeChangedDelegate; 26 | }; 27 | 28 | 29 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorMode/SBluEdModeToolClassDropTarget.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | 6 | #pragma once 7 | 8 | #include "CoreMinimal.h" 9 | #include "Styling/SlateColor.h" 10 | #include "Input/Reply.h" 11 | #include "Layout/Visibility.h" 12 | #include "Widgets/DeclarativeSyntaxSupport.h" 13 | #include "Widgets/SCompoundWidget.h" 14 | #include "EditorStyleSet.h" 15 | 16 | class FPaintArgs; 17 | class FSlateWindowElementList; 18 | 19 | /** 20 | * A widget that displays a hover cue and handles dropping assets of allowed types onto this widget 21 | */ 22 | class SBluEdModeToolClassDropTarget : public SCompoundWidget 23 | { 24 | public: 25 | /** Called when a valid asset is dropped */ 26 | DECLARE_DELEGATE_RetVal_OneParam(FReply, FOnDrop, TSharedPtr); 27 | DECLARE_DELEGATE_RetVal_OneParam(bool, FVerifyDrag, TSharedPtr); 28 | DECLARE_DELEGATE(FOnDoubleClick); 29 | 30 | SLATE_BEGIN_ARGS(SBluEdModeToolClassDropTarget) 31 | { 32 | } 33 | SLATE_DEFAULT_SLOT(FArguments, Content) 34 | SLATE_EVENT(FOnDrop, OnDrop) 35 | SLATE_EVENT(FVerifyDrag, OnAllowDrop) 36 | SLATE_EVENT(FOnDoubleClick, OnDoubleClicked) 37 | 38 | SLATE_END_ARGS() 39 | 40 | void Construct(const FArguments& InArgs); 41 | 42 | protected: 43 | virtual bool OnAllowDrop(TSharedPtr DragDropOperation) const; 44 | 45 | protected: 46 | // SWidget interface 47 | virtual FReply OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override; 48 | virtual void OnMouseEnter(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; 49 | virtual void OnMouseLeave(const FPointerEvent& MouseEvent) override; 50 | virtual FReply OnMouseButtonDoubleClick(const FGeometry& InMyGeometry, const FPointerEvent& InMouseEvent) override; 51 | virtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) override; 52 | // End of SWidget interface 53 | 54 | 55 | EVisibility GetDragOverlayVisibility() const; 56 | FSlateColor GetBackgroundBrightness() const; 57 | FSlateColor GetForegroundImageColor() const; 58 | 59 | private: 60 | 61 | FOnDrop DroppedEvent; 62 | FVerifyDrag AllowDropEvent; 63 | FSimpleDelegate OnDoubleClickEvent; 64 | 65 | 66 | FLinearColor ValidColor; 67 | FLinearColor InvalidColor; 68 | FLinearColor HoveredColor; 69 | FLinearColor BackgroundColor; 70 | FLinearColor BackgroundHoverColor; 71 | 72 | const FSlateBrush* BackgroundImage; 73 | 74 | bool bAllowDrop; 75 | bool bIsHovered; 76 | bool bDragOperationStarted; 77 | }; 78 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorModeTool/AssetTypeActions_EditorModeToolUtilityBlueprint.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "AssetTypeActions_EditorModeToolUtilityBlueprint.h" 6 | #include "BlueprintEditorModule.h" 7 | #include "EditorScriptingToolsTypes.h" 8 | 9 | #define LOCTEXT_NAMESPACE "AssetTypeActions_EditorModeToolUtilityBlueprint" 10 | 11 | FText FAssetTypeActions_EditorModeToolUtilityBlueprint::GetName() const 12 | { 13 | return LOCTEXT("AssetTypeActions_EditorModeToolInstance", "Editor Mode Tool Blueprint"); 14 | } 15 | 16 | FColor FAssetTypeActions_EditorModeToolUtilityBlueprint::GetTypeColor() const 17 | { 18 | return FEditorScriptingUtilityAssetColorsHelper::ModeToolBlueprintColor; 19 | } 20 | 21 | UClass* FAssetTypeActions_EditorModeToolUtilityBlueprint::GetSupportedClass() const 22 | { 23 | return UEditorModeToolUtilityBlueprint::StaticClass(); 24 | } 25 | 26 | void FAssetTypeActions_EditorModeToolUtilityBlueprint::GetAdditionalActions(TWeakObjectPtr ObjectWeakPtr, FMenuBuilder& MenuBuilder) 27 | { 28 | 29 | } 30 | 31 | #undef LOCTEXT_NAMESPACE //"AssetTypeActions_EditorModeToolUtilityBlueprint" 32 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorModeTool/AssetTypeActions_EditorModeToolUtilityBlueprint.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "EditorModeToolUtilityBlueprint.h" 9 | #include "Toolkits/IToolkitHost.h" 10 | #include "EditorScriptingAssetTypeActions_Base.h" 11 | 12 | class FMenuBuilder; 13 | 14 | class FAssetTypeActions_EditorModeToolUtilityBlueprint : public FEditorScriptingAssetTypeActions_Base 15 | { 16 | public: 17 | // IAssetTypeActions interface 18 | virtual FText GetName() const override; 19 | virtual FColor GetTypeColor() const override; 20 | virtual UClass* GetSupportedClass() const override; 21 | // End of IAssetTypeActions interface 22 | 23 | protected: 24 | // FEditorScriptingAssetTypeActions_Base interface 25 | virtual void GetAdditionalActions(TWeakObjectPtr ObjectWeakPtr, FMenuBuilder& MenuBuilder) override; 26 | // End of IAssetTypeActions interface 27 | }; 28 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorModeTool/EditorModeToolUtilityBlueprint.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorModeToolUtilityBlueprint.h" 6 | #include "EditorModeToolInstance.h" 7 | #include "BluEdMode.h" 8 | #include "EditorScriptingToolsSubsystem.h" 9 | 10 | 11 | #define LOCTEXT_NAMESPACE "EditorModeToolUtilityBlueprint" 12 | 13 | UEditorModeToolUtilityBlueprint::UEditorModeToolUtilityBlueprint(const FObjectInitializer& ObjectInitializer) 14 | : Super(ObjectInitializer) 15 | , ToolkitWidgetClass(nullptr) 16 | , ViewportOverlayWidgetClass(nullptr) 17 | , bShowToolDetailsPanel(true) 18 | { 19 | 20 | } 21 | 22 | bool UEditorModeToolUtilityBlueprint::PreRenameBlueprint() 23 | { 24 | UEditorScriptingToolsSubsystem* ScriptingToolsSubsystem = UEditorScriptingToolsSubsystem::GetSubsystem(); 25 | if (ScriptingToolsSubsystem->LastLoadedEdModeToolBlueprint.LoadSynchronous() == this) 26 | { 27 | return true; 28 | } 29 | return false; 30 | } 31 | 32 | void UEditorModeToolUtilityBlueprint::PostRenameBlueprint(bool bPreRenameSuccessful, bool bRenameSuccessful) 33 | { 34 | if (bPreRenameSuccessful) 35 | { 36 | UEditorScriptingToolsSubsystem* ScriptingToolsSubsystem = UEditorScriptingToolsSubsystem::GetSubsystem(); 37 | ScriptingToolsSubsystem->LastLoadedEdModeToolBlueprint = this; 38 | ScriptingToolsSubsystem->NotifySettingsModified(); 39 | } 40 | } 41 | 42 | FName UEditorModeToolUtilityBlueprint::GetUtilitySettingsCategoryName() const 43 | { 44 | return FName("ToolSettings"); 45 | } 46 | 47 | void UEditorModeToolUtilityBlueprint::GetUneditablePropertiesWhenRegistered(TArray& OutProperties) const 48 | { 49 | OutProperties.Empty(); 50 | { 51 | OutProperties.Add(GET_MEMBER_NAME_CHECKED(UEditorModeToolUtilityBlueprint, ToolkitWidgetClass)); 52 | OutProperties.Add(GET_MEMBER_NAME_CHECKED(UEditorModeToolUtilityBlueprint, ViewportOverlayWidgetClass)); 53 | OutProperties.Add(GET_MEMBER_NAME_CHECKED(UEditorModeToolUtilityBlueprint, bShowToolDetailsPanel)); 54 | } 55 | } 56 | 57 | 58 | #if WITH_EDITOR 59 | void UEditorModeToolUtilityBlueprint::GetReparentingRules(TSet< const UClass* >& AllowedChildrenOfClasses, TSet< const UClass* >& DisallowedChildrenOfClasses) const 60 | { 61 | AllowedChildrenOfClasses.Empty(); 62 | AllowedChildrenOfClasses.Add(UEditorModeToolInstance::StaticClass()); 63 | } 64 | #endif //WITH_EDITOR 65 | 66 | 67 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorModeTool/EditorModeToolUtilityBlueprint.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "EditorScriptingUtilityBlueprint.h" 8 | #include "EditorModeToolUtilityBlueprint.generated.h" 9 | 10 | class UEditorModeToolInstance; 11 | class UEditorUserWidget; 12 | 13 | UCLASS() 14 | class UEditorModeToolUtilityBlueprint : public UEditorScriptingUtilityBlueprint 15 | { 16 | GENERATED_UCLASS_BODY() 17 | 18 | 19 | public: 20 | UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = ToolSettings) 21 | TSubclassOf ToolkitWidgetClass; 22 | 23 | UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = ToolSettings) 24 | TSubclassOf ViewportOverlayWidgetClass; 25 | 26 | UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = ToolSettings) 27 | bool bShowToolDetailsPanel; 28 | 29 | protected: 30 | 31 | /** Begin UEditorScriptingUtilityBlueprint interface */ 32 | virtual bool PreRenameBlueprint() override; 33 | virtual void PostRenameBlueprint(bool bPreRenameSuccessful, bool bRenameSuccessful) override; 34 | /** End UEditorScriptingUtilityBlueprint interface */ 35 | 36 | public: 37 | /** Begin IEditorToolAssetInterface interface */ 38 | virtual EEditorScriptingUtilityType GetUtilityType() const override { return EEditorScriptingUtilityType::EditorMode; } 39 | virtual FName GetUtilitySettingsCategoryName() const override; 40 | virtual void GetUneditablePropertiesWhenRegistered(TArray& OutProperties) const override; 41 | /** End IEditorToolAssetInterface interface */ 42 | 43 | public: 44 | 45 | #if WITH_EDITOR 46 | //~ UBlueprint interface 47 | void GetReparentingRules(TSet< const UClass* >& AllowedChildrenOfClasses, TSet< const UClass* >& DisallowedChildrenOfClasses) const override; 48 | //~ End of UBlueprint interface 49 | #endif //#if WITH_EDITOR 50 | 51 | }; 52 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorModeTool/EditorModeToolUtilityBlueprintFactory.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorModeToolUtilityBlueprintFactory.h" 6 | #include "Misc/MessageDialog.h" 7 | #include "Modules/ModuleManager.h" 8 | #include "Widgets/SWindow.h" 9 | #include "Engine/Blueprint.h" 10 | #include "Settings/EditorExperimentalSettings.h" 11 | #include "Engine/BlueprintGeneratedClass.h" 12 | #include "EditorModeToolUtilityBlueprint.h" 13 | #include "ClassViewerModule.h" 14 | #include "ClassViewerFilter.h" 15 | #include "Kismet2/KismetEditorUtilities.h" 16 | #include "Kismet2/SClassPickerDialog.h" 17 | #include "EditorModeToolInstance.h" 18 | 19 | 20 | ///////////////////////////////////////////////////// 21 | // UEditorModeToolUtilityBlueprintFactory 22 | 23 | UEditorModeToolUtilityBlueprintFactory::UEditorModeToolUtilityBlueprintFactory(const FObjectInitializer& ObjectInitializer) 24 | : Super(ObjectInitializer) 25 | { 26 | 27 | bCreateNew = true; 28 | bEditAfterNew = true; 29 | SupportedClass = UEditorModeToolUtilityBlueprint::StaticClass(); 30 | ParentClass = UEditorModeToolInstance::StaticClass(); 31 | } 32 | 33 | bool UEditorModeToolUtilityBlueprintFactory::ConfigureProperties() 34 | { 35 | // TODO Make config dialog like the anim blueprints. 36 | return true; 37 | } 38 | 39 | UObject* UEditorModeToolUtilityBlueprintFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) 40 | { 41 | // Make sure we are trying to factory a blueprint, then create and init one 42 | check(Class->IsChildOf(UEditorModeToolUtilityBlueprint::StaticClass())); 43 | 44 | if ((ParentClass == NULL) || !FKismetEditorUtilities::CanCreateBlueprintOfClass(ParentClass)) 45 | { 46 | FFormatNamedArguments Args; 47 | Args.Add( TEXT("ClassName"), (ParentClass != NULL) ? FText::FromString( ParentClass->GetName() ) : NSLOCTEXT("UnrealEd", "Null", "(null)") ); 48 | FMessageDialog::Open( EAppMsgType::Ok, FText::Format( NSLOCTEXT("UnrealEd", "CannotCreateBlueprintFromClass", "Cannot create a blueprint based on the class '{0}'."), Args ) ); 49 | return NULL; 50 | } 51 | else 52 | { 53 | return FKismetEditorUtilities::CreateBlueprint(ParentClass, InParent, Name, BPTYPE_Normal, UEditorModeToolUtilityBlueprint::StaticClass(), UBlueprintGeneratedClass::StaticClass()); 54 | } 55 | } 56 | 57 | bool UEditorModeToolUtilityBlueprintFactory::CanCreateNew() const 58 | { 59 | return true; 60 | } 61 | 62 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorModeTool/EditorModeToolUtilityBlueprintFactory.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | /** 8 | * Factory for utility blueprints 9 | */ 10 | 11 | #include "CoreMinimal.h" 12 | #include "UObject/ObjectMacros.h" 13 | #include "Templates/SubclassOf.h" 14 | #include "Factories/Factory.h" 15 | #include "EditorModeToolUtilityBlueprintFactory.generated.h" 16 | 17 | 18 | UCLASS() 19 | class UEditorModeToolUtilityBlueprintFactory : public UFactory 20 | { 21 | GENERATED_UCLASS_BODY() 22 | 23 | // The parent class of the created blueprint 24 | UPROPERTY(EditAnywhere, Category=BlueprintFactory, meta=(AllowAbstract = "", BlueprintBaseOnly = "")) 25 | TSubclassOf ParentClass; 26 | 27 | // UFactory interface 28 | virtual bool ConfigureProperties() override; 29 | virtual UObject* FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override; 30 | virtual bool CanCreateNew() const override; 31 | // End of UFactory interface 32 | 33 | }; 34 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsCommon/AssetTypeActions/EditorScriptingAssetTypeActions_Base.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | #include "AssetTypeActions_Base.h" 7 | #include "Layout/Visibility.h" 8 | 9 | class IEditorScriptingUtilityAssetInterface; 10 | 11 | 12 | 13 | class FEditorScriptingAssetTypeActions_Base : public FAssetTypeActions_Base 14 | { 15 | public: 16 | 17 | // IAssetTypeActions interface 18 | virtual uint32 GetCategories() final; 19 | virtual bool CanLocalize() const final; 20 | virtual bool HasActions(const TArray& InObjects) const final; 21 | virtual TSharedPtr GetThumbnailOverlay(const FAssetData& AssetData) const final; 22 | virtual void GetActions(const TArray& InObjects, FMenuBuilder& MenuBuilder) final; 23 | virtual void OpenAssetEditor(const TArray& InObjects, TSharedPtr EditWithinLevelEditor) override; 24 | // End of IAssetTypeActions interface 25 | 26 | protected: 27 | // FEditorScriptingAssetTypeActions_Base interface 28 | virtual void GetAdditionalActions(TWeakObjectPtr ObjectWeakPtr, FMenuBuilder& MenuBuilder) = 0; 29 | // End of IAssetTypeActions interface 30 | 31 | private: 32 | void RegisterUtility(TWeakObjectPtr ObjectWeakPtr); 33 | bool CanRegisterUtility(TWeakObjectPtr ObjectWeakPtr) const; 34 | void UnregisterUtility(TWeakObjectPtr ObjectWeakPtr); 35 | bool CanUnregisterUtility(TWeakObjectPtr ObjectWeakPtr) const; 36 | EVisibility GetThumbnailOverlayVisibility(TWeakObjectPtr ObjectWeakPtr) const; 37 | }; 38 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsCommon/DetailCustomizations/EditorScriptingUtilityBlueprintDetails.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "IDetailCustomization.h" 8 | #include "Input/Reply.h" 9 | #include "Layout/Visibility.h" 10 | 11 | class UEditorScriptingUtilityBlueprint; 12 | 13 | class FEditorScriptingUtilityBlueprintDetails : public IDetailCustomization 14 | { 15 | 16 | public: 17 | /** Makes a new instance of this detail layout class for a specific detail view requesting it */ 18 | static TSharedRef MakeInstance(); 19 | 20 | FEditorScriptingUtilityBlueprintDetails(); 21 | virtual ~FEditorScriptingUtilityBlueprintDetails(); 22 | 23 | // IDetailCustomization interface 24 | virtual void CustomizeDetails(IDetailLayoutBuilder& DetailBuilder); 25 | // End of IDetailCustomization interface 26 | 27 | private: 28 | void OnEditorScriptingUtilityRegistered(bool bRegister); 29 | FReply OnRegisterButton_Clicked(bool bRegister); 30 | bool IsRegisterButton_Enabled(bool bRegister) const; 31 | EVisibility GetRegisterButton_Visibility(bool bRegister) const; 32 | 33 | protected: 34 | IDetailLayoutBuilder* CachedDetailBuilder; 35 | TWeakObjectPtr EditedScriptingUtilityBlueprintWeakPtr; 36 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsCommon/EditorScriptingToolsTypes.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorScriptingToolsTypes.h" 6 | #include "EditorUserDefinedSettingsUtilityBlueprint.h" 7 | 8 | #include "CanvasTypes.h" 9 | #include "SceneManagement.h" 10 | /* 11 | #include "CanvasTypes.h" 12 | #include "SceneManagement.h" 13 | */ 14 | 15 | DEFINE_LOG_CATEGORY(LogEditorScriptingTools); 16 | 17 | 18 | FSimpleMulticastDelegate FEditorScriptingToolsDelegates::RefreshEditorScriptingToolsTabDelegate{}; 19 | const FDrawPrimitivesContext FDrawPrimitivesContext::InvalidContext{}; 20 | const FDrawHUDContext FDrawHUDContext::InvalidContext{}; 21 | 22 | 23 | const FColor FEditorScriptingUtilityAssetColorsHelper::ModeToolBlueprintColor(175, 0, 0); 24 | const FColor FEditorScriptingUtilityAssetColorsHelper::ComponentVisualizerUtilityBlueprintColor(152, 57, 255); 25 | const FColor FEditorScriptingUtilityAssetColorsHelper::DetailCustomizationInstanceColor(255, 168, 111); 26 | const FColor FEditorScriptingUtilityAssetColorsHelper::EditorUserDefinedActionsAssetColor(128, 255, 128); 27 | const FColor FEditorScriptingUtilityAssetColorsHelper::EditorUserDefinedSettingsUtilityBlueprintColor(255, 255, 0); 28 | const FColor FEditorScriptingUtilityAssetColorsHelper::EditorUserWidgetBlueprintColor(175, 81, 128); 29 | 30 | 31 | 32 | FDrawPrimitivesContext::FDrawPrimitivesContext() : PDI(nullptr) 33 | , View(nullptr) 34 | { 35 | 36 | } 37 | 38 | void FDrawPrimitivesContext::Set(const FSceneView* InView, FPrimitiveDrawInterface* InPDI) 39 | { 40 | PDI = InPDI; 41 | View = InView; 42 | } 43 | 44 | void FDrawPrimitivesContext::Invalidate() 45 | { 46 | if (PDI != nullptr) 47 | { 48 | PDI->SetHitProxy(nullptr); 49 | } 50 | 51 | PDI = nullptr; 52 | View = nullptr; 53 | } 54 | 55 | bool FDrawPrimitivesContext::IsValid() const 56 | { 57 | return PDI != nullptr && View != nullptr; 58 | } 59 | 60 | 61 | 62 | 63 | FDrawHUDContext::FDrawHUDContext() : Viewport(nullptr) 64 | , View(nullptr) 65 | , Canvas(nullptr) 66 | { 67 | 68 | } 69 | 70 | void FDrawHUDContext::Set(const FViewport* InViewport, const FSceneView* InView, FCanvas* InCanvas) 71 | { 72 | Viewport = InViewport; 73 | View = InView; 74 | Canvas = InCanvas; 75 | } 76 | 77 | void FDrawHUDContext::Invalidate() 78 | { 79 | if (Canvas != nullptr) 80 | { 81 | Canvas->SetHitProxy(nullptr); 82 | } 83 | 84 | Viewport = nullptr; 85 | View = nullptr; 86 | Canvas = nullptr; 87 | } 88 | 89 | bool FDrawHUDContext::IsValid() const 90 | { 91 | return Viewport != nullptr && View != nullptr && Canvas != nullptr; 92 | } 93 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsCommon/EditorScriptingToolsTypes.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "Stats/Stats.h" 9 | #include "Framework/Commands/Commands.h" 10 | #include "Templates/SubclassOf.h" 11 | #include "EditorScriptingToolsTypes.generated.h" 12 | 13 | class UEditorUserDefinedSettingsUtilityBlueprint; 14 | class FPrimitiveDrawInterface; 15 | class FViewport; 16 | class FSceneView; 17 | class FCanvas; 18 | 19 | 20 | struct FEditorScriptingToolsDelegates 21 | { 22 | static FSimpleMulticastDelegate RefreshEditorScriptingToolsTabDelegate; 23 | }; 24 | 25 | // 26 | DECLARE_LOG_CATEGORY_EXTERN(LogEditorScriptingTools, Log, All); 27 | 28 | // 29 | DECLARE_STATS_GROUP(TEXT("EditorScriptingTools"), STATGROUP_EditorScriptingTools, STATCAT_Advanced); 30 | 31 | // 32 | #define UI_USER_DEFINED_COMMAND( CommandPtr,CommandId, FriendlyName, InDescription, CommandType, InDefaultChord, ... ) \ 33 | MakeUICommand_InternalUseOnly( this, CommandPtr, TEXT(LOCTEXT_NAMESPACE), *CommandId, *(CommandId + FString("_ToolTip")), TCHAR_TO_ANSI(*(FString(".") + CommandId)), FriendlyName, TEXT(InDescription), CommandType, InDefaultChord, ## __VA_ARGS__ ); 34 | 35 | // 36 | #define EDITOR_SCRIPT_EXECUTION_GUARD FEditorScriptExecutionGuard ScriptGuard; 37 | 38 | // 39 | #define CAST_TO_UINT8(Val) static_cast(Val) 40 | 41 | enum class ELevelEditingContextType : uint8 42 | { 43 | EditorMode = 0, 44 | ComponentVisulizer, 45 | 46 | 47 | Invalid = 255, 48 | }; 49 | 50 | UENUM(BlueprintType) 51 | enum class EEditorState : uint8 52 | { 53 | Editor, 54 | SimulatingInEditor, 55 | PlayingInEditor, 56 | Unknown, 57 | }; 58 | 59 | USTRUCT(BlueprintInternalUseOnly) struct FDummyStruct { GENERATED_USTRUCT_BODY() }; 60 | USTRUCT(BlueprintInternalUseOnly) struct FEventDummyReturn { GENERATED_USTRUCT_BODY() }; 61 | #define DUMMY_RETURN return FEventDummyReturn(); 62 | 63 | 64 | 65 | class FEditorScriptingUtilityAssetColorsHelper 66 | { 67 | 68 | public: 69 | 70 | static const FColor ModeToolBlueprintColor; 71 | static const FColor ComponentVisualizerUtilityBlueprintColor; 72 | static const FColor DetailCustomizationInstanceColor; 73 | static const FColor EditorUserDefinedActionsAssetColor; 74 | static const FColor EditorUserDefinedSettingsUtilityBlueprintColor; 75 | static const FColor EditorUserWidgetBlueprintColor; 76 | }; 77 | 78 | struct FDrawPrimitivesContext 79 | { 80 | FDrawPrimitivesContext(); 81 | void Set(const FSceneView* InView, FPrimitiveDrawInterface* InPDI); 82 | void Invalidate(); 83 | bool IsValid() const; 84 | 85 | FPrimitiveDrawInterface* PDI; 86 | const FSceneView* View; 87 | static const FDrawPrimitivesContext InvalidContext; 88 | }; 89 | 90 | 91 | struct FDrawHUDContext 92 | { 93 | 94 | FDrawHUDContext(); 95 | 96 | void Set(const FViewport* InViewport, const FSceneView* InView, FCanvas* InCanvas); 97 | 98 | void Invalidate(); 99 | 100 | bool IsValid() const; 101 | 102 | const FViewport* Viewport; 103 | const FSceneView* View; 104 | FCanvas* Canvas; 105 | 106 | static const FDrawHUDContext InvalidContext; 107 | }; 108 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsCommon/EditorScriptingUtilityBlueprint.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorScriptingUtilityBlueprint.h" 6 | #include "IEditorScriptingToolsModule.h" 7 | 8 | 9 | UEditorScriptingUtilityBlueprint::UEditorScriptingUtilityBlueprint(const FObjectInitializer& ObjectInitializer) 10 | : Super(ObjectInitializer) 11 | { 12 | OnCompiled().AddUObject(this, &UEditorScriptingUtilityBlueprint::OnUtilityBlueprintCompiled); 13 | } 14 | 15 | void UEditorScriptingUtilityBlueprint::BeginDestroy() 16 | { 17 | if (!IsEngineExitRequested()) 18 | { 19 | OnBlueprintDeleted(); 20 | } 21 | Super::BeginDestroy(); 22 | } 23 | 24 | bool UEditorScriptingUtilityBlueprint::Rename(const TCHAR* NewName /*= nullptr*/, UObject* NewOuter /*= nullptr*/, ERenameFlags Flags /*= REN_None*/) 25 | { 26 | const bool bPreRenameSuccessful = PreRenameBlueprint(); 27 | const bool bRenameSuccessful = Super::Rename(NewName, NewOuter, Flags); 28 | PostRenameBlueprint(bPreRenameSuccessful, bRenameSuccessful); 29 | return bRenameSuccessful; 30 | } 31 | 32 | void UEditorScriptingUtilityBlueprint::OnRegisterDone() 33 | { 34 | OnEditorScriptingUtilityRegiteredDelegate.Broadcast(true); 35 | } 36 | 37 | 38 | void UEditorScriptingUtilityBlueprint::OnUnregisterDone() 39 | { 40 | OnEditorScriptingUtilityRegiteredDelegate.Broadcast(false); 41 | } 42 | 43 | void UEditorScriptingUtilityBlueprint::OnBlueprintDeleted() 44 | { 45 | IEditorScriptingToolsModule* ScriptingToolsModule = IEditorScriptingToolsModule::GetPtr(); 46 | ScriptingToolsModule->UnregisterEditorScriptingUtility(this); 47 | } 48 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsCommon/EditorScriptingUtilityBlueprint.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "UObject/ObjectMacros.h" 9 | #include "EditorUtilityBlueprint.h" 10 | #include "IEditorScriptingUtilityAssetInterface.h" 11 | #include "EditorScriptingUtilityBlueprint.generated.h" 12 | 13 | 14 | 15 | UCLASS(Abstract) 16 | class UEditorScriptingUtilityBlueprint : public UEditorUtilityBlueprint, public IEditorScriptingUtilityAssetInterface 17 | { 18 | GENERATED_UCLASS_BODY() 19 | 20 | 21 | 22 | public: 23 | 24 | /** Begin UObject interface */ 25 | virtual void BeginDestroy() final; 26 | virtual bool Rename(const TCHAR* NewName = nullptr, UObject* NewOuter = nullptr, ERenameFlags Flags = REN_None) final; 27 | /** End UObject interface */ 28 | 29 | /** Begin IEditorToolAssetInterface interface */ 30 | virtual EEditorScriptingUtilityType GetUtilityType() const override { return EEditorScriptingUtilityType::None; } 31 | virtual void OnRegisterDone() override; 32 | virtual void OnUnregisterDone() override; 33 | virtual FName GetUtilitySettingsCategoryName() const override { return NAME_None; } 34 | virtual void GetUneditablePropertiesWhenRegistered(TArray& OutProperties) const override {} 35 | virtual FEditorScriptingUtilityRegistered& OnEditorScriptingUtilityRegistered() const final { return OnEditorScriptingUtilityRegiteredDelegate; } 36 | /** End IEditorToolAssetInterface interface */ 37 | 38 | private: 39 | void OnBlueprintDeleted(); 40 | 41 | public: 42 | virtual bool IsValid() const { return true; } 43 | protected: 44 | virtual void OnUtilityBlueprintCompiled(UBlueprint* RecompiledBlueprint){} 45 | virtual bool PreRenameBlueprint() { return false; } 46 | virtual void PostRenameBlueprint(bool bPreRenameSuccessful, bool bRenameSuccessful) {} 47 | 48 | private: 49 | mutable FEditorScriptingUtilityRegistered OnEditorScriptingUtilityRegiteredDelegate; 50 | }; 51 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsCommon/EditorTypesWrapperTypes.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorTypesWrapperTypes.h" 6 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsCommon/HitProxiesTypes.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "HitProxiesTypes.h" 6 | #include "EngineUtils.h" 7 | #include "ComponentVisualizer.h" 8 | 9 | 10 | IMPLEMENT_HIT_PROXY(HIndexedHitProxy, HHitProxy); 11 | IMPLEMENT_HIT_PROXY(HIndexedComponentVisProxy, HComponentVisProxy); 12 | 13 | 14 | EHitProxyType FHitProxyWrapper::GetType() const 15 | { 16 | if (HasValidProxy()) 17 | { 18 | if (HitProxy->IsA(HIndexedHitProxy::StaticGetType())) return EHitProxyType::CustomIndex; 19 | else if (HitProxy->IsA(HActor::StaticGetType())) return EHitProxyType::Actor; 20 | else if (HitProxy->IsA(HComponentVisProxy::StaticGetType())) return EHitProxyType::ComponentVisualizer; 21 | 22 | else return EHitProxyType::Undefined; 23 | } 24 | 25 | return EHitProxyType::Invalid; 26 | } 27 | 28 | 29 | 30 | bool FHitProxyHandle::IsValid() const 31 | { 32 | return ProxyWrapperWeakPtr.IsValid() && ProxyWrapperWeakPtr.Pin()->HasValidProxy(); 33 | } 34 | 35 | void FHitProxyHandle::Invalidate() 36 | { 37 | ProxyWrapperWeakPtr = nullptr; 38 | } 39 | 40 | EHitProxyType FHitProxyHandle::GetHitProxyType() const 41 | { 42 | const FHitProxyWrapper* ProxyWrapper = Get(); 43 | return ProxyWrapper != nullptr ? ProxyWrapper->GetType() : EHitProxyType::Invalid; 44 | } 45 | 46 | FHitProxyWrapper* FHitProxyHandle::Get() const 47 | { 48 | return IsValid() ? ProxyWrapperWeakPtr.Pin().Get() : nullptr; 49 | } 50 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsCommon/HitProxiesTypes.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "HitProxies.h" 9 | #include "ComponentVisualizer.h" 10 | #include "EditorTypesWrapperTypes.h" 11 | #include "HitProxiesTypes.generated.h" 12 | 13 | 14 | struct HActor; 15 | 16 | struct HIndexedHitProxy : public HHitProxy 17 | { 18 | DECLARE_HIT_PROXY(); 19 | 20 | int32 Index; 21 | EMouseCursor::Type CursorType; 22 | bool bAllowsTranslucentPrimitives; 23 | 24 | HIndexedHitProxy(int32 InIndex, EHitProxyPriorityType InPriority = EHitProxyPriorityType::World, EMouseCursor::Type InCursorType = EMouseCursor::Default, bool bTranslucentPrimitives = false) 25 | : HHitProxy((EHitProxyPriority)InPriority) 26 | , Index(InIndex) 27 | , CursorType(InCursorType) 28 | , bAllowsTranslucentPrimitives(bTranslucentPrimitives) 29 | { 30 | 31 | } 32 | 33 | virtual EMouseCursor::Type GetMouseCursor() 34 | { 35 | return CursorType; 36 | } 37 | 38 | virtual bool AlwaysAllowsTranslucentPrimitives() const override 39 | { 40 | return bAllowsTranslucentPrimitives; 41 | } 42 | }; 43 | 44 | 45 | struct HIndexedComponentVisProxy : public HComponentVisProxy 46 | { 47 | DECLARE_HIT_PROXY(); 48 | 49 | int32 Index; 50 | EMouseCursor::Type CursorType; 51 | bool bAllowsTranslucentPrimitives; 52 | 53 | HIndexedComponentVisProxy(const UActorComponent* InComponent, int32 InIndex, EHitProxyPriorityType InPriority = EHitProxyPriorityType::World, EMouseCursor::Type InCursorType = EMouseCursor::Default, bool bTranslucentPrimitives = false) 54 | : HComponentVisProxy(InComponent, static_cast(InPriority)) 55 | , Index(InIndex) 56 | , CursorType(InCursorType) 57 | , bAllowsTranslucentPrimitives(bTranslucentPrimitives) 58 | { 59 | } 60 | 61 | virtual EMouseCursor::Type GetMouseCursor() 62 | { 63 | return CursorType; 64 | } 65 | 66 | virtual bool AlwaysAllowsTranslucentPrimitives() const override 67 | { 68 | return bAllowsTranslucentPrimitives; 69 | } 70 | }; 71 | 72 | 73 | UENUM(BlueprintType) 74 | enum class EHitProxyType : uint8 75 | { 76 | // 77 | Undefined = 0, 78 | 79 | // 80 | CustomIndex = 1, 81 | Actor, 82 | ComponentVisualizer, 83 | 84 | 85 | 86 | // 87 | Invalid = 255 88 | }; 89 | 90 | 91 | struct FHitProxyWrapper 92 | { 93 | FHitProxyWrapper() = delete; 94 | FHitProxyWrapper(HHitProxy* InHitProxy) : HitProxy(InHitProxy) {} 95 | bool HasValidProxy() const { return HitProxy != nullptr; } 96 | EHitProxyType GetType() const; 97 | 98 | HHitProxy* HitProxy{ nullptr }; 99 | }; 100 | 101 | 102 | USTRUCT(BlueprintType, BlueprintInternalUseOnly) 103 | struct FHitProxyHandle 104 | { 105 | GENERATED_USTRUCT_BODY() 106 | 107 | public: 108 | 109 | FHitProxyHandle() : ProxyWrapperWeakPtr(nullptr) {} 110 | FHitProxyHandle(const TSharedPtr& InProxyWrapper) : ProxyWrapperWeakPtr(InProxyWrapper) {} 111 | void operator =(const FHitProxyHandle& Other) { this->ProxyWrapperWeakPtr = Other.ProxyWrapperWeakPtr; } 112 | 113 | bool IsValid() const; 114 | void Invalidate(); 115 | EHitProxyType GetHitProxyType() const; 116 | FHitProxyWrapper* Get() const; 117 | 118 | 119 | private: 120 | TWeakPtr ProxyWrapperWeakPtr; 121 | }; 122 | 123 | 124 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsCommon/ILevelEditingContext.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | 8 | enum class ELevelEditingContextType : uint8; 9 | struct FDrawPrimitivesContext; 10 | struct FDrawHUDContext; 11 | 12 | 13 | class ILevelEditingContext 14 | { 15 | 16 | public: 17 | virtual ELevelEditingContextType GetLevelEditingContext() = 0; 18 | virtual const FDrawPrimitivesContext& GetDrawPrimitivesContext() = 0; 19 | virtual const FDrawHUDContext& GetDrawHUDContext() = 0; 20 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsModule/EditorScriptingToolsModule_AssetTypesActions.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorScriptingToolsModule.h" 6 | 7 | #include "EditorScriptingToolsSubsystem.h" 8 | #include "AssetTypeActions_EditorUserWidgetBlueprint.h" 9 | #include "AssetTypeActions_EditorUserDefinedActions.h" 10 | #include "AssetTypeActions_EditorModeToolUtilityBlueprint.h" 11 | #include "AssetTypeActions_EditorUserDefinedSettingsUtilityBlueprint.h" 12 | #include "AssetTypeActions_ComponentVisualizerUtilityBlueprint.h" 13 | #include "AssetTypeActions_DetailCustomizationUtilityBlueprint.h" 14 | 15 | #include "WidgetBlueprint.h" 16 | #include "AssetToolsModule.h" 17 | #include "IAssetTypeActions.h" 18 | 19 | 20 | 21 | #define LOCTEXT_NAMESPACE "EditorScriptingToolsModule_AssetTypesActions" 22 | 23 | 24 | void FEditorScriptingToolsModule::RegisterAssetTypesActions() 25 | { 26 | IAssetTools& AssetTools = FModuleManager::LoadModuleChecked("AssetTools").Get(); 27 | EditorScriptingToolsAssetCategory = AssetTools.RegisterAdvancedAssetCategory(FName(TEXT("Editor Scripting Tools")), LOCTEXT("EditorScriptingAssetCategory", "Editor Scripting Tools")); 28 | RegisterAssetTypeAction(AssetTools, MakeShareable(new FAssetTypeActions_EditorUserWidgetBlueprint)); 29 | RegisterAssetTypeAction(AssetTools, MakeShareable(new FAssetTypeActions_EditorModeToolUtilityBlueprint)); 30 | RegisterAssetTypeAction(AssetTools, MakeShareable(new FAssetTypeActions_ComponentVisualizerUtilityBlueprint)); 31 | RegisterAssetTypeAction(AssetTools, MakeShareable(new FAssetTypeActions_DetailCustomizationUtilityBlueprint)); 32 | RegisterAssetTypeAction(AssetTools, MakeShareable(new FAssetTypeActions_EditorUserDefinedActions)); 33 | RegisterAssetTypeAction(AssetTools, MakeShareable(new FAssetTypeActions_EditorUserDefinedSettingsUtilityBlueprint)); 34 | 35 | } 36 | 37 | 38 | void FEditorScriptingToolsModule::RegisterAssetTypeAction(IAssetTools& AssetTools, TSharedRef Action) 39 | { 40 | AssetTools.RegisterAssetTypeActions(Action); 41 | CreatedAssetTypeActions.Add(Action); 42 | } 43 | 44 | 45 | void FEditorScriptingToolsModule::UnregisterCreatedAssetTypes() 46 | { 47 | if (FModuleManager::Get().IsModuleLoaded("AssetTools")) 48 | { 49 | IAssetTools& AssetTools = FModuleManager::GetModuleChecked("AssetTools").Get(); 50 | for (int32 Index = 0; Index < CreatedAssetTypeActions.Num(); ++Index) 51 | { 52 | AssetTools.UnregisterAssetTypeActions(CreatedAssetTypeActions[Index].ToSharedRef()); 53 | } 54 | } 55 | CreatedAssetTypeActions.Empty(); 56 | } 57 | 58 | 59 | 60 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsModule/EditorScriptingToolsModule_EditorActions.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorScriptingToolsModule.h" 6 | 7 | #include "EditorUserDefinedActions.h" 8 | #include "EditorUserDefinedCommands.h" 9 | 10 | 11 | #define LOCTEXT_NAMESPACE "EditorScriptingToolsModule_EditorActions" 12 | 13 | 14 | void FEditorScriptingToolsModule::RegisterEditorUserDefinedActions(UEditorUserDefinedActions* UserDefinedActionsAsset) 15 | { 16 | check(!FEditorUserDefinedCommands::IsEditorUserDefinedActionsRegistered(UserDefinedActionsAsset)); 17 | FEditorUserDefinedCommands::RegisterActions(UserDefinedActionsAsset); 18 | } 19 | 20 | void FEditorScriptingToolsModule::RefreshEditorUserDefinedActions(UEditorUserDefinedActions* UserDefinedActionsAsset) 21 | { 22 | check(FEditorUserDefinedCommands::IsEditorUserDefinedActionsRegistered(UserDefinedActionsAsset)); 23 | FEditorUserDefinedCommands::RefreshCurrentMappings(); 24 | } 25 | 26 | void FEditorScriptingToolsModule::UnregisterEditorUserDefinedActions(UEditorUserDefinedActions* UserDefinedActionsAsset) 27 | { 28 | check(FEditorUserDefinedCommands::IsEditorUserDefinedActionsRegistered(UserDefinedActionsAsset)); 29 | FEditorUserDefinedCommands::UnregisterActions(true); 30 | } 31 | 32 | bool FEditorScriptingToolsModule::CanRegisterEditorUserDefinedActions(const UEditorUserDefinedActions* UserDefinedActionsAsset) const 33 | { 34 | return !FEditorUserDefinedCommands::IsEditorUserDefinedActionsRegistered(UserDefinedActionsAsset) && UserDefinedActionsAsset->GetActionsNum() > 0; 35 | } 36 | 37 | bool FEditorScriptingToolsModule::IsEditorUserDefinedActionsRegistered(const UEditorUserDefinedActions* UserDefinedActionsAsset) const 38 | { 39 | return FEditorUserDefinedCommands::IsEditorUserDefinedActionsRegistered(UserDefinedActionsAsset); 40 | } 41 | 42 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsStyle.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | 9 | class ISlateStyle; 10 | class FSlateStyleSet; 11 | 12 | class FEditorScriptingToolsStyle 13 | { 14 | public: 15 | static void Initialize(); 16 | static void Shutdown(); 17 | static TSharedPtr Get(); 18 | static FName GetAppStyleSetName(); 19 | static void ReloadTextures(); 20 | 21 | private: 22 | static FString InContent(const FString& RelativePath, const ANSICHAR* Extension); 23 | 24 | private: 25 | static TSharedPtr StyleSet; 26 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsSubsystem/EditorScriptingToolsSubsystem.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorScriptingToolsSubsystem.h" 6 | 7 | #include "ISettingsEditorModule.h" 8 | #include "ComponentVisualizerUtilityBlueprint.h" 9 | #include "DetailCustomizationUtilityBlueprint.h" 10 | #include "EditorModeToolUtilityBlueprint.h" 11 | #include "EditorUserDefinedActions.h" 12 | #include "EditorUserDefinedSettingsUtilityBlueprint.h" 13 | #include "EditorUserWidgetBlueprint.h" 14 | #include "Editor/EditorEngine.h" 15 | #include "Editor.h" 16 | #include "EditorScriptingToolsTypes.h" 17 | 18 | #define CHECK_UTILITY_LIST_VALIDITY(BlueprintsList) \ 19 | { \ 20 | int32 RemovedEntries = BlueprintsList.RemoveAll([](const auto& UtilityBlueprintPtr) \ 21 | { \ 22 | if (auto* UtilityBlueprint = UtilityBlueprintPtr.LoadSynchronous()) \ 23 | { \ 24 | return !UtilityBlueprint->IsValid(); \ 25 | } \ 26 | return true; \ 27 | }); \ 28 | \ 29 | if (RemovedEntries > 0) \ 30 | { \ 31 | bModified = true; \ 32 | UE_LOG(LogEditorScriptingTools, Warning, TEXT("%d invalid entries removed from %s."),RemovedEntries, TEXT(#BlueprintsList));\ 33 | } \ 34 | } \ 35 | 36 | #define LOCTEXT_NAMESPACE "EditorScriptingToolsSubsystem" 37 | 38 | 39 | 40 | UEditorScriptingToolsSubsystem::UEditorScriptingToolsSubsystem() 41 | : LastLoadedEdModeToolBlueprint(nullptr) 42 | , bEnableThumbnailOverlayOnRegisteredUtilities(true) 43 | , bEnableEditingWhileSimulating(false) 44 | { 45 | 46 | } 47 | 48 | void UEditorScriptingToolsSubsystem::Initialize(FSubsystemCollectionBase& Collection) 49 | { 50 | 51 | } 52 | 53 | void UEditorScriptingToolsSubsystem::Deinitialize() 54 | { 55 | 56 | } 57 | 58 | void UEditorScriptingToolsSubsystem::CheckValidity() 59 | { 60 | bool bModified = false; 61 | { 62 | CHECK_UTILITY_LIST_VALIDITY(DetailCustomizationUtilityBlueprints); 63 | CHECK_UTILITY_LIST_VALIDITY(ComponentVisualizerUtilityBlueprints); 64 | CHECK_UTILITY_LIST_VALIDITY(EditorUserDefinedSettingsUtilityBlueprints); 65 | } 66 | 67 | if (bModified) 68 | { 69 | NotifySettingsModified(); 70 | } 71 | } 72 | 73 | void UEditorScriptingToolsSubsystem::NotifySettingsModified(bool bSaveConfig /*= true*/) 74 | { 75 | if (bSaveConfig) 76 | { 77 | SaveConfig(); 78 | } 79 | 80 | FEditorScriptingToolsDelegates::RefreshEditorScriptingToolsTabDelegate.Broadcast(); 81 | } 82 | 83 | UEditorScriptingToolsSubsystem* UEditorScriptingToolsSubsystem::GetSubsystem() 84 | { 85 | return GEditor->GetEditorSubsystem(); 86 | } 87 | 88 | 89 | #undef LOCTEXT_NAMESPACE 90 | 91 | #undef CHECK_UTILITY_LIST_VALIDITY -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsSubsystem/EditorScriptingToolsSubsystem.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "EditorSubsystem.h" 8 | #include "UObject/ObjectMacros.h" 9 | #include "UObject/UObjectGlobals.h" 10 | #include "UObject/SoftObjectPtr.h" 11 | #include "UserDefinedPlacementCategoriesTypes.h" 12 | #include "EditorScriptingToolsSubsystem.generated.h" 13 | 14 | 15 | UCLASS(config = EditorPerProjectUserSettings) 16 | class UEditorScriptingToolsSubsystem : public UEditorSubsystem 17 | { 18 | GENERATED_BODY() 19 | 20 | public: 21 | UEditorScriptingToolsSubsystem(); 22 | 23 | //~ USubsystem interface begin 24 | virtual void Initialize(FSubsystemCollectionBase& Collection) override; 25 | virtual void Deinitialize() override; 26 | //~ USubsystem interface end 27 | 28 | void CheckValidity(); 29 | void NotifySettingsModified(bool bSaveConfig = true); 30 | static UEditorScriptingToolsSubsystem* GetSubsystem(); 31 | 32 | public: 33 | UPROPERTY(config) 34 | TSoftObjectPtr LastLoadedEdModeToolBlueprint; 35 | 36 | UPROPERTY(config, EditAnywhere, BlueprintReadOnly, Category = General) 37 | bool bEnableThumbnailOverlayOnRegisteredUtilities; 38 | 39 | UPROPERTY(config, EditAnywhere, BlueprintReadOnly, Category = EditorMode) 40 | bool bEnableEditingWhileSimulating; 41 | 42 | UPROPERTY(config) 43 | TArray> CustomEdModeUtilityBlueprints; 44 | 45 | UPROPERTY(config) 46 | TArray> ComponentVisualizerUtilityBlueprints; 47 | 48 | UPROPERTY(config) 49 | TArray> DetailCustomizationUtilityBlueprints; 50 | 51 | UPROPERTY(config) 52 | TArray> EditorUserDefinedSettingsUtilityBlueprints; 53 | 54 | UPROPERTY(config, EditAnywhere, Category = UserDefinedPlacementCategories) 55 | TSet PlacementCategoriesInfo; 56 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsSubsystem/EditorScriptingToolsSubsystemDetails.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "IDetailCustomization.h" 8 | 9 | class IDetailLayoutBuilder; 10 | class SWidget; 11 | class SEditorScriptingToolsTab; 12 | 13 | class FEditorScriptingToolsSubsystemDetails : public IDetailCustomization 14 | { 15 | 16 | public: 17 | static TSharedRef MakeDefaultInstance(); 18 | static TSharedRef MakeInstanceForSettingsTab(TWeakPtr ToolsSettingsTab); 19 | 20 | FEditorScriptingToolsSubsystemDetails(); 21 | virtual ~FEditorScriptingToolsSubsystemDetails(); 22 | 23 | // IDetailCustomization interface 24 | virtual void CustomizeDetails(IDetailLayoutBuilder& DetailBuilder); 25 | // End of IDetailCustomization interface 26 | 27 | private: 28 | void CustomizeDetailsForSettingsTab(); 29 | 30 | void OnRefresh(); 31 | private: 32 | IDetailLayoutBuilder* CachedDetailBuilder; 33 | TWeakPtr ToolsSettingsTabWeakPtr; 34 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsSubsystem/SEditorScriptingToolsTab.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "Widgets/Docking/SDockTab.h" 9 | 10 | class SWidget; 11 | class SBox; 12 | class SEditorScriptingToolsSubsystemDetailsPanel; 13 | 14 | namespace EEditorScriptingToolsTabRefreshMode 15 | { 16 | enum Type 17 | { 18 | ToolBar = 1 << 0, 19 | SettingsSection = 1 << 1, 20 | 21 | All = ToolBar | SettingsSection 22 | }; 23 | } 24 | 25 | 26 | enum class EEditorScriptingToolsSectionType : uint8 27 | { 28 | BluEdMode = 0, 29 | ComponentVisualizers, 30 | DetailCustomizations, 31 | UserDefinedSettings, 32 | UserDefinedActions, 33 | UserDefinedPlacementCategories, 34 | OtherUtils, 35 | OtherSettings, 36 | 37 | 38 | Num 39 | }; 40 | 41 | class SEditorScriptingToolsTab : public SDockTab 42 | { 43 | 44 | public: 45 | 46 | SLATE_BEGIN_ARGS(SEditorScriptingToolsTab) {} 47 | SLATE_END_ARGS(); 48 | 49 | void Construct(const FArguments& InArgs); 50 | virtual ~SEditorScriptingToolsTab(); 51 | 52 | private: 53 | int32 GetActiveSectionIndex() const; 54 | int32 GetSectionNum() const; 55 | int32 GetSectionIndex(EEditorScriptingToolsSectionType InSection) const; 56 | EEditorScriptingToolsSectionType GetSectionTypeByIndex(int32 InIndex) const; 57 | FText GetSectionNameText(EEditorScriptingToolsSectionType InSection) const; 58 | FText GetActiveSectionSettingsText() const; 59 | FName GetSectionIconName(EEditorScriptingToolsSectionType InSection) const; 60 | 61 | void RefreshContent(EEditorScriptingToolsTabRefreshMode::Type RefreshMode); 62 | void ClearContent(); 63 | void CreateSettingsDetailsView(); 64 | void OnSettingChanged(const FPropertyChangedEvent& InPropertyChangedEvent); 65 | void OnRefreshEditorScriptingToolsTab(); 66 | 67 | TSharedRef CreateToolBarWidget(); 68 | void OnSectionButton_Clicked(EEditorScriptingToolsSectionType InSection); 69 | bool IsSectionButton_Selected(EEditorScriptingToolsSectionType InSection) const; 70 | 71 | TSharedRef CreateSettingsSectionWidget(); 72 | TSharedRef CreateSettingsSectionWidget_BluEdMode(); 73 | TSharedRef CreateSettingsSectionWidget_ComponentVisualizers(); 74 | TSharedRef CreateSettingsSectionWidget_DetailCustomizations(); 75 | TSharedRef CreateSettingsSectionWidget_UserDefinedSettings(); 76 | TSharedRef CreateSettingsSectionWidget_UserDefinedActions(); 77 | TSharedRef CreateSettingsSectionWidget_UserDefinedPlacementCategories(); 78 | TSharedRef CreateSettingsSectionWidget_OtherUtils(); 79 | TSharedRef CreateSettingsSectionWidget_OtherSettings(); 80 | 81 | 82 | TSharedRef CreateSectionHeader(FText InText); 83 | TSharedRef CreateWarningMessageWidegt(FText InText); 84 | 85 | 86 | private: 87 | FSimpleMulticastDelegate SectionChanged{}; 88 | TSharedPtr ToolBarWidget; 89 | TSharedPtr SettingsSectionWidget; 90 | TSharedPtr ScriptingToolsDetailsView; 91 | EEditorScriptingToolsSectionType ActiveSection = EEditorScriptingToolsSectionType::BluEdMode; 92 | 93 | friend class FEditorScriptingToolsSubsystemDetails; 94 | friend class SEditorScriptingToolsSubsystemDetailsPanel; 95 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsSubsystem/SEditorScriptingUtilityAssetSlot.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | 6 | #pragma once 7 | 8 | #include "CoreMinimal.h" 9 | #include "Widgets/SCompoundWidget.h" 10 | #include "Widgets/DeclarativeSyntaxSupport.h" 11 | #include "Input/Reply.h" 12 | 13 | 14 | class UObject; 15 | 16 | class SEditorScriptingUtilityAssetSlot : public SCompoundWidget 17 | { 18 | public: 19 | SLATE_BEGIN_ARGS(SEditorScriptingUtilityAssetSlot) {} 20 | SLATE_END_ARGS(); 21 | 22 | /** Slate widget construction */ 23 | void Construct(const FArguments& InArgs, UObject* InToolAsset, int32 InIndex); 24 | 25 | virtual ~SEditorScriptingUtilityAssetSlot(); 26 | protected: 27 | UObject* GetToolAsset(); 28 | const UObject* GetToolAsset() const; 29 | 30 | private: 31 | FReply OnShowToolAssetInContentBrowser_Clicked(); 32 | FReply OnRefresh_Clicked(); 33 | FReply OnClear_Clicked(); 34 | FReply OnEdit_Clicked(); 35 | 36 | 37 | FText GetDisplayName() const; 38 | FText GetRefreshToolTipText() const; 39 | FText GetClearToolTipText() const; 40 | 41 | FLinearColor GetBrowseToAssetButtonColor() const; 42 | private: 43 | TWeakObjectPtr ToolAssetWeakPtr{}; 44 | int32 SlotIndex{ INDEX_NONE }; 45 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorScriptingToolsSubsystem/SPropertiesBrowser.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "Widgets/SCompoundWidget.h" 8 | #include "Widgets/DeclarativeSyntaxSupport.h" 9 | #include "Templates/SubclassOf.h" 10 | #include "Input/Reply.h" 11 | 12 | 13 | class SPropertiesBrowser : public SCompoundWidget 14 | { 15 | public: 16 | SLATE_BEGIN_ARGS(SPropertiesBrowser) {} 17 | SLATE_END_ARGS() 18 | 19 | /** Slate widget construction */ 20 | void Construct(const FArguments& InArgs); 21 | 22 | private: 23 | FText GetClassName() const; 24 | FReply OpenClassPickerDialog(); 25 | FReply ClipboardCopy(); 26 | TSharedRef OnGenerateComboWidget(TSharedPtr InName); 27 | void OnComboSelectionChanged(TSharedPtr InSelectedItem, ESelectInfo::Type SelectInfo); 28 | FText GetPropertyName() const; 29 | 30 | void FillPropertiesNamesList(); 31 | 32 | 33 | private: 34 | TSharedPtr PropertyListContainer; 35 | TSubclassOf ObjectClass; 36 | TArray> PropertiesNames; 37 | TWeakPtr SelectedPropertyName; 38 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedActions/AssetTypeActions_EditorUserDefinedActions.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | 6 | #include "AssetTypeActions_EditorUserDefinedActions.h" 7 | 8 | #include "BlueprintEditorModule.h" 9 | #include "AssetRegistry/AssetData.h" 10 | #include "Framework/MultiBox/MultiBoxBuilder.h" 11 | 12 | #include "EditorTypesWrapperTypes.h" 13 | #include "EditorUserDefinedActionsEditor.h" 14 | #include "EditorUserDefinedActions.h" 15 | #include "EditorUserDefinedCommands.h" 16 | #include "EditorScriptingToolsStyle.h" 17 | #include "EditorScriptingToolsTypes.h" 18 | 19 | #define LOCTEXT_NAMESPACE "AssetTypeActions_EditorUserDefinedActions" 20 | 21 | FText FAssetTypeActions_EditorUserDefinedActions::GetName() const 22 | { 23 | return LOCTEXT("AssetTypeActions_EditorUserDefinedActions", "Editor User Defined Actions"); 24 | } 25 | 26 | FText FAssetTypeActions_EditorUserDefinedActions::GetAssetDescription(const FAssetData& AssetData) const 27 | { 28 | return AssetData.GetTagValueRef(GET_MEMBER_NAME_CHECKED(UEditorUserDefinedActions, EnumDescription)); 29 | } 30 | 31 | FColor FAssetTypeActions_EditorUserDefinedActions::GetTypeColor() const 32 | { 33 | return FEditorScriptingUtilityAssetColorsHelper::EditorUserDefinedActionsAssetColor; 34 | } 35 | 36 | UClass* FAssetTypeActions_EditorUserDefinedActions::GetSupportedClass() const 37 | { 38 | return UEditorUserDefinedActions::StaticClass(); 39 | } 40 | 41 | void FAssetTypeActions_EditorUserDefinedActions::OpenAssetEditor(const TArray& InObjects, TSharedPtr EditWithinLevelEditor) 42 | { 43 | const EToolkitMode::Type Mode = EditWithinLevelEditor.IsValid() ? EToolkitMode::WorldCentric : EToolkitMode::Standalone; 44 | 45 | FBlueprintEditorModule& BlueprintEditorModule = FModuleManager::LoadModuleChecked("Kismet"); 46 | 47 | for (auto ObjIt = InObjects.CreateConstIterator(); ObjIt; ++ObjIt) 48 | { 49 | if (UEditorUserDefinedActions* EditorUserDefinedActions = Cast(*ObjIt)) 50 | { 51 | TSharedRef EditorUserDefinedActionsEditor(new FEditorUserDefinedActionsEditor()); 52 | EditorUserDefinedActionsEditor->InitEditor(Mode, EditWithinLevelEditor, EditorUserDefinedActions); 53 | } 54 | } 55 | } 56 | 57 | void FAssetTypeActions_EditorUserDefinedActions::GetAdditionalActions(TWeakObjectPtr ObjectWeakPtr, FMenuBuilder& MenuBuilder) 58 | { 59 | 60 | } 61 | 62 | #undef LOCTEXT_NAMESPACE 63 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedActions/AssetTypeActions_EditorUserDefinedActions.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | 6 | #pragma once 7 | 8 | #include "CoreMinimal.h" 9 | #include "Toolkits/IToolkitHost.h" 10 | #include "AssetTypeActions_Base.h" 11 | #include "EditorScriptingAssetTypeActions_Base.h" 12 | 13 | class UEditorUserDefinedActions; 14 | 15 | class FAssetTypeActions_EditorUserDefinedActions : public FEditorScriptingAssetTypeActions_Base 16 | { 17 | public: 18 | // IAssetTypeActions Implementation 19 | virtual FText GetName() const override; 20 | virtual FText GetAssetDescription(const FAssetData& AssetData) const override; 21 | virtual FColor GetTypeColor() const override; 22 | virtual UClass* GetSupportedClass() const override; 23 | virtual void OpenAssetEditor(const TArray& InObjects, TSharedPtr EditWithinLevelEditor) override; 24 | // End of IAssetTypeActions interface 25 | 26 | protected: 27 | // FEditorScriptingAssetTypeActions_Base interface 28 | virtual void GetAdditionalActions(TWeakObjectPtr ObjectWeakPtr, FMenuBuilder& MenuBuilder) override; 29 | // End of IAssetTypeActions interface 30 | 31 | 32 | }; 33 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedActions/ChordEditor/SEditorAction_ChordEditBox.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | 6 | #pragma once 7 | 8 | #include "CoreMinimal.h" 9 | #include "Input/Reply.h" 10 | #include "Layout/Visibility.h" 11 | #include "Widgets/DeclarativeSyntaxSupport.h" 12 | #include "Widgets/SWidget.h" 13 | #include "Widgets/SCompoundWidget.h" 14 | #include "Framework/Commands/UICommandInfo.h" 15 | 16 | class SButton; 17 | class SEditorAction_ChordEditor; 18 | class SMenuAnchor; 19 | struct FSlateBrush; 20 | class UEditorUserDefinedActions; 21 | 22 | /** 23 | * A widget that adds visuals to an SEditorAction_ChordEditor 24 | */ 25 | class SEditorAction_ChordEditBox 26 | : public SCompoundWidget 27 | { 28 | public: 29 | 30 | SLATE_BEGIN_ARGS( SEditorAction_ChordEditBox ){} 31 | SLATE_END_ARGS() 32 | public: 33 | 34 | /** 35 | * Constructs the widget. 36 | * 37 | * @param InArgs The Slate argument list. 38 | */ 39 | void Construct( const FArguments& InArgs,UEditorUserDefinedActions* ActionsEnum,int32 CommandIndex, EMultipleKeyBindingIndex ChordIndex ); 40 | private: 41 | 42 | /** @return Border image for the text box based on the hovered and focused state */ 43 | const FSlateBrush* GetBorderImage() const; 44 | 45 | FText GetNotificationMessage() const; 46 | 47 | /** Called when the chord editor loses focus */ 48 | void OnChordEditorLostFocus(); 49 | 50 | /** Called when editing starts in the chord editor */ 51 | void OnChordEditingStarted(); 52 | 53 | /** Called when editing stops in the chord editor */ 54 | void OnChordEditingStopped(); 55 | 56 | /** Called when the edited chord changes */ 57 | void OnChordChanged(); 58 | 59 | /** @return the visibility of the chord edit button */ 60 | EVisibility GetChordRemoveButtonVisibility() const; 61 | 62 | /** Called when the chord edit button is clicked */ 63 | FReply OnChordRemoveButtonClicked(); 64 | 65 | /** Called when the accept button is clicked. */ 66 | FReply OnAcceptNewChordButtonClicked(); 67 | 68 | /** @return content to be shown in the key binding conflict pop-up */ 69 | TSharedRef OnGetContentForConflictPopup(); 70 | 71 | /** Called when conflict popup opens or closes */ 72 | void OnConflictPopupOpenChanged(bool bIsOpen); 73 | 74 | /** @return The visibility of the duplicate binding notification area */ 75 | EVisibility GetNotificationVisibility() const; 76 | virtual FReply OnMouseButtonDown( const FGeometry& MyGeometry, const FPointerEvent& InMouseEvent ); 77 | 78 | private: 79 | 80 | /** The chord editor for this box */ 81 | TSharedPtr ChordEditor; 82 | 83 | /** Menu anchor where the conflict pop-up is shown */ 84 | TSharedPtr ConflictPopup; 85 | 86 | /** The button for committing chord */ 87 | mutable TSharedPtr ChordAcceptButton; 88 | 89 | /** Styling: border image to draw when not hovered or focused */ 90 | const FSlateBrush* BorderImageNormal; 91 | 92 | /** Styling: border image to draw when hovered */ 93 | const FSlateBrush* BorderImageHovered; 94 | 95 | /** Styling: border image to draw when focused */ 96 | const FSlateBrush* BorderImageFocused; 97 | }; 98 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedActions/EditorUserDefinedActionsEditorCommands.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorUserDefinedActionsEditorCommands.h" 6 | 7 | 8 | 9 | #define LOCTEXT_NAMESPACE "EditorUserDefinedActionsEditorCommands" 10 | 11 | void FEditorUserDefinedActionsEditorCommands::RegisterCommands() 12 | { 13 | UI_COMMAND(MapActions, "Map Actions", "", EUserInterfaceActionType::Button, FInputChord()); 14 | UI_COMMAND(UnmapActions, "Unmap Actions", "", EUserInterfaceActionType::Button, FInputChord()); 15 | } 16 | 17 | #undef LOCTEXT_NAMESPACE //"EditorUserDefinedActionsEditorCommands" -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedActions/EditorUserDefinedActionsEditorCommands.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | 6 | #pragma once 7 | 8 | #include "CoreMinimal.h" 9 | #include "EditorStyleSet.h" 10 | #include "Framework/Commands/Commands.h" 11 | #include "EditorScriptingToolsStyle.h" 12 | 13 | 14 | class FEditorUserDefinedActionsEditorCommands : public TCommands 15 | { 16 | public: 17 | FEditorUserDefinedActionsEditorCommands() 18 | : TCommands( 19 | "EditorUserDefinedActionsEditor", // Context name for fast lookup 20 | NSLOCTEXT("Contexts", "EditorUserDefinedActionsEditor", "Editor User Defined Actions Editor"), // Localized context name for displaying 21 | NAME_None, // Parent 22 | FEditorScriptingToolsStyle::GetAppStyleSetName() // Icon Style Set 23 | ) 24 | { 25 | 26 | } 27 | // TCommand<> interface 28 | virtual void RegisterCommands() override; 29 | // End of TCommand<> interface 30 | 31 | public: 32 | TSharedPtr MapActions; 33 | TSharedPtr UnmapActions; 34 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedActions/EditorUserDefinedActionsFactory.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | 6 | #include "EditorUserDefinedActionsFactory.h" 7 | #include "EditorUserDefinedActions.h" 8 | #include "Kismet2/EnumEditorUtils.h" 9 | #include "Misc/MessageDialog.h" 10 | #include "Misc/FeedbackContext.h" 11 | 12 | #define LOCTEXT_NAMESPACE "EditorUserDefinedActionsFactory" 13 | 14 | 15 | UEditorUserDefinedActionsFactory::UEditorUserDefinedActionsFactory(const FObjectInitializer& ObjectInitializer) 16 | : Super(ObjectInitializer) 17 | { 18 | SupportedClass = UEditorUserDefinedActions::StaticClass(); 19 | bCreateNew = true; 20 | bEditAfterNew = true; 21 | } 22 | 23 | UObject* UEditorUserDefinedActionsFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) 24 | { 25 | ensure(UEditorUserDefinedActions::StaticClass() == Class); 26 | 27 | if (!FEnumEditorUtils::IsNameAvailebleForUserDefinedEnum(Name)) 28 | { 29 | const FText Message = FText::Format(LOCTEXT("ActionsWithNameAlreadyExists", "Actions Asset '{0}' already exists. The name must be unique."), FText::FromName(Name)); 30 | if (Warn) 31 | { 32 | Warn->Log(Message); 33 | } 34 | FMessageDialog::Open(EAppMsgType::Ok, Message); 35 | return nullptr; 36 | } 37 | 38 | UEnum* Enum = NewObject(InParent, Name, Flags); 39 | 40 | if (NULL != Enum) 41 | { 42 | TArray> EmptyNames; 43 | Enum->SetEnums(EmptyNames, UEnum::ECppForm::Namespaced); 44 | Enum->SetMetaData(TEXT("BlueprintType"), TEXT("true")); 45 | } 46 | 47 | return Enum; 48 | } 49 | 50 | #undef LOCTEXT_NAMESPACE //"EditorUserDefinedActionsFactory" 51 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedActions/EditorUserDefinedActionsFactory.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "UObject/ObjectMacros.h" 9 | #include "Factories/Factory.h" 10 | #include "EditorUserDefinedActionsFactory.generated.h" 11 | 12 | UCLASS(hidecategories=Object) 13 | class UEditorUserDefinedActionsFactory : public UFactory 14 | { 15 | GENERATED_UCLASS_BODY() 16 | 17 | //~ Begin UFactory Interface 18 | virtual UObject* FactoryCreateNew(UClass* Class,UObject* InParent,FName Name,EObjectFlags Flags,UObject* Context,FFeedbackContext* Warn) override; 19 | //~ Begin UFactory Interface 20 | 21 | }; 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedActions/EditorUserDefinedActionsUtils.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | 9 | 10 | class UEditorUserDefinedActions; 11 | 12 | class FEditorUserDefinedActionsUtils 13 | { 14 | 15 | private: 16 | static void CopyEnumeratorsWithoutMax(const UEditorUserDefinedActions* Enum, TArray>& OutEnumNames); 17 | static void BroadcastChanges(const UEditorUserDefinedActions* Enum, const TArray>& OldNames, bool bResolveData = true); 18 | static void PrepareForChange(UEditorUserDefinedActions* Enum); 19 | static FString GenerateNewActionEnumeratorName(UEditorUserDefinedActions* Enum); 20 | static const TCHAR* DisplayName() { return TEXT("DisplayName"); } 21 | static const TCHAR* InvalidName() { return TEXT("(INVALID)"); } 22 | 23 | public: 24 | static void AddNewActionEnumerator(UEditorUserDefinedActions* Enum); 25 | static void RemoveActionEnumerator(UEditorUserDefinedActions* Enum, int32 EnumeratorIndex); 26 | static void ClearActionEnumerators(UEditorUserDefinedActions* Enum); 27 | static void MoveActionEnumerator(UEditorUserDefinedActions* Enum, int32 EnumeratorIndex, bool bDirectionUp); 28 | 29 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedActions/EditorUserDefinedCommands.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "EditorStyleSet.h" 9 | #include "Framework/Commands/Commands.h" 10 | #include "EditorTypesWrapperTypes.h" 11 | #include "Styling/AppStyle.h" 12 | 13 | class UEditorUserDefinedActions; 14 | 15 | class FEditorUserDefinedCommands : public TCommands 16 | { 17 | 18 | public: 19 | FEditorUserDefinedCommands() : TCommands( 20 | "EditorUserDefinedCommands", // Context name for fast lookup 21 | NSLOCTEXT("Contexts", "EditorUserDefinedCommands", "Editor User Defined Actions"), // Localized context name for displaying 22 | NAME_None, // Parent 23 | FAppStyle::GetAppStyleSetName()) // Icon Style Set 24 | {} 25 | 26 | virtual void RegisterCommands() override; 27 | 28 | 29 | static bool RegisterActions(UEditorUserDefinedActions* InActionsAsset); 30 | static bool UnregisterActions(bool bClearCachedAsset); 31 | static void RefreshCurrentMappings(); 32 | 33 | 34 | static TSharedPtr& GetActionList() { return ActionList; } 35 | static TArray>& GetUICommandInfoLIst() { return Commands; } 36 | static UEditorUserDefinedActions* GetCurrentActionsAsset() { return CurrentActionsAsset.Get(); } 37 | static bool IsEditorUserDefinedActionsRegistered(const UEditorUserDefinedActions* ActionsAsset) { return ActionsAsset == CurrentActionsAsset.Get(); } 38 | public: 39 | DECLARE_MULTICAST_DELEGATE_ThreeParams(FOnExecuteActionSignature, UEditorUserDefinedActions*/* ActionsAsset*/, int32/* ActionIndex*/,bool/* bIsRepeated*/); 40 | static FOnExecuteActionSignature OnExecuteActionDelegate; 41 | 42 | 43 | private: 44 | static void ExecuteAction(int32 ActionIndex); 45 | static bool CanExecuteAction(int32 ActionIndex); 46 | 47 | private: 48 | 49 | static TSharedPtr< FUICommandList> ActionList; 50 | static TArray> Commands; 51 | static TWeakObjectPtr CurrentActionsAsset; 52 | 53 | }; 54 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedPlacementCategories/UserDefinedPlacementCategoriesTypes.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "GameFramework/Actor.h" 9 | #include "UserDefinedPlacementCategoriesTypes.generated.h" 10 | 11 | 12 | USTRUCT(BlueprintType) 13 | struct FUserDefinedPlacementCategoryInfo 14 | { 15 | GENERATED_BODY() 16 | 17 | FUserDefinedPlacementCategoryInfo() 18 | : Name("MyCategory") 19 | , SortOrder(0) 20 | , bSortable(false) 21 | { 22 | 23 | } 24 | 25 | static FName GetFName() 26 | { 27 | return { "UserDefinedPlacementCategoryInfo" }; 28 | } 29 | 30 | /** A unique name used to register this category. */ 31 | UPROPERTY(config, EditAnywhere, Category = "PlacementCategory") 32 | FName Name; 33 | 34 | /** Sort order for the category tab (lowest first). */ 35 | UPROPERTY(config, EditAnywhere, Category = "PlacementCategory", meta = (EditCondition = "bSortable")) 36 | uint32 SortOrder; 37 | 38 | /** Whether the items in this category are automatically sortable by name. False if the items are already sorted. */ 39 | UPROPERTY(config, EditAnywhere, Category = "PlacementCategory", meta = (InlineEditConditionToggle)) 40 | bool bSortable; 41 | 42 | /** The placeable items to register. */ 43 | UPROPERTY(config, EditAnywhere, Category = "PlacementCategory") 44 | TSet> ActorClasses; 45 | 46 | FORCEINLINE bool operator ==(const FUserDefinedPlacementCategoryInfo& Other) const 47 | { 48 | return this->Name == Other.Name; 49 | } 50 | 51 | friend FORCEINLINE uint32 GetTypeHash(const FUserDefinedPlacementCategoryInfo& Other) 52 | { 53 | return GetTypeHash(Other.Name); 54 | } 55 | }; 56 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedPlacementCategories/UserDefinedPlacementCategoryInfoCustomization.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | 6 | #include "UserDefinedPlacementCategoryInfoCustomization.h" 7 | #include "Widgets/DeclarativeSyntaxSupport.h" 8 | #include "Engine/GameViewportClient.h" 9 | #include "AssetRegistry/AssetData.h" 10 | #include "PropertyHandle.h" 11 | #include "PropertyCustomizationHelpers.h" 12 | #include "IDetailChildrenBuilder.h" 13 | #include "Widgets/Input/SButton.h" 14 | 15 | void FUserDefinedPlacementCategoryInfoCustomization::CustomizeHeader( TSharedRef InStructPropertyHandle, FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils ) 16 | { 17 | StructPropertyHandle = InStructPropertyHandle; 18 | 19 | HeaderRow 20 | .NameContent() 21 | [ 22 | InStructPropertyHandle->CreatePropertyNameWidget() 23 | ] 24 | .ValueContent() 25 | [ 26 | SNew(SButton) 27 | ]; 28 | } 29 | 30 | void FUserDefinedPlacementCategoryInfoCustomization::CustomizeChildren(TSharedRef InStructPropertyHandle, IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) 31 | { 32 | uint32 ChildCount; 33 | StructPropertyHandle->GetNumChildren(ChildCount); 34 | 35 | for (uint32 i = 0; i < ChildCount; ++i) 36 | { 37 | const TSharedPtr ChildPropertyHandle = StructPropertyHandle->GetChildHandle(i); 38 | if (!ChildPropertyHandle->IsCustomized()) 39 | { 40 | StructBuilder.AddProperty(ChildPropertyHandle.ToSharedRef()); 41 | } 42 | } 43 | } 44 | 45 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedPlacementCategories/UserDefinedPlacementCategoryInfoCustomization.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "IPropertyTypeCustomization.h" 9 | 10 | class IPropertyHandle; 11 | 12 | /** 13 | * Customizes a soft object path to look like a UObject property 14 | */ 15 | class FUserDefinedPlacementCategoryInfoCustomization : public IPropertyTypeCustomization 16 | { 17 | public: 18 | static TSharedRef MakeInstance() 19 | { 20 | return MakeShareable( new FUserDefinedPlacementCategoryInfoCustomization ); 21 | } 22 | 23 | /** IPropertyTypeCustomization interface */ 24 | virtual void CustomizeHeader( TSharedRef InStructPropertyHandle, class FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils ) override; 25 | virtual void CustomizeChildren( TSharedRef InStructPropertyHandle, class IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils ) override; 26 | 27 | private: 28 | /** Handle to the struct property being customized */ 29 | TSharedPtr StructPropertyHandle; 30 | }; 31 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedSettings/AssetTypeActions_EditorUserDefinedSettingsUtilityBlueprint.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "AssetTypeActions_EditorUserDefinedSettingsUtilityBlueprint.h" 6 | #include "BlueprintEditorModule.h" 7 | #include "EditorUserDefinedSettingsUtilityBlueprint.h" 8 | #include "EditorScriptingToolsStyle.h" 9 | #include "EditorScriptingToolsModule.h" 10 | 11 | 12 | #define LOCTEXT_NAMESPACE "AssetTypeActions_EditorUserDefinedSettingsUtilityBlueprint" 13 | 14 | FText FAssetTypeActions_EditorUserDefinedSettingsUtilityBlueprint::GetName() const 15 | { 16 | return LOCTEXT("EditorUserDefinedSettings", "Editor User Defined Settings Blueprint"); 17 | } 18 | 19 | FColor FAssetTypeActions_EditorUserDefinedSettingsUtilityBlueprint::GetTypeColor() const 20 | { 21 | return FEditorScriptingUtilityAssetColorsHelper::EditorUserDefinedSettingsUtilityBlueprintColor; 22 | } 23 | 24 | UClass* FAssetTypeActions_EditorUserDefinedSettingsUtilityBlueprint::GetSupportedClass() const 25 | { 26 | return UEditorUserDefinedSettingsUtilityBlueprint::StaticClass(); 27 | } 28 | 29 | void FAssetTypeActions_EditorUserDefinedSettingsUtilityBlueprint::GetAdditionalActions(TWeakObjectPtr ObjectWeakPtr, FMenuBuilder& MenuBuilder) 30 | { 31 | 32 | } 33 | 34 | #undef LOCTEXT_NAMESPACE 35 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedSettings/AssetTypeActions_EditorUserDefinedSettingsUtilityBlueprint.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "EditorModeToolUtilityBlueprint.h" 9 | #include "Toolkits/IToolkitHost.h" 10 | #include "EditorScriptingAssetTypeActions_Base.h" 11 | 12 | class FMenuBuilder; 13 | class UEditorModeToolUtilityBlueprint; 14 | class UEditorUserDefinedSettingsUtilityBlueprint; 15 | 16 | class FAssetTypeActions_EditorUserDefinedSettingsUtilityBlueprint : public FEditorScriptingAssetTypeActions_Base 17 | { 18 | public: 19 | // IAssetTypeActions interface 20 | virtual FText GetName() const override; 21 | virtual FColor GetTypeColor() const override; 22 | virtual UClass* GetSupportedClass() const override; 23 | // End of IAssetTypeActions interface 24 | 25 | protected: 26 | // FEditorScriptingAssetTypeActions_Base interface 27 | virtual void GetAdditionalActions(TWeakObjectPtr ObjectWeakPtr, FMenuBuilder& MenuBuilder) override; 28 | // End of IAssetTypeActions interface 29 | 30 | }; 31 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedSettings/EditorUserDefinedSettings.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorUserDefinedSettings.h" 6 | #include "EditorUserDefinedSettingsUtilityBlueprint.h" 7 | #include "IEditorScriptingToolsModule.h" 8 | #include "Engine/World.h" 9 | #include "Editor/EditorEngine.h" 10 | #include "Editor.h" 11 | 12 | 13 | 14 | bool UEditorUserDefinedSettings::OnCanEdit_Implementation() 15 | { 16 | return true; 17 | } 18 | 19 | bool UEditorUserDefinedSettings::OnExport_Implementation(const FString& Path) 20 | { 21 | return true; 22 | } 23 | 24 | bool UEditorUserDefinedSettings::OnImport_Implementation(const FString& Path) 25 | { 26 | return true; 27 | } 28 | 29 | bool UEditorUserDefinedSettings::OnModified_Implementation() 30 | { 31 | return true; 32 | } 33 | 34 | bool UEditorUserDefinedSettings::OnResetDefaults_Implementation() 35 | { 36 | return true; 37 | } 38 | 39 | bool UEditorUserDefinedSettings::OnSave_Implementation() 40 | { 41 | return true; 42 | } 43 | 44 | bool UEditorUserDefinedSettings::OnSaveDefaults_Implementation() 45 | { 46 | return true; 47 | } 48 | 49 | FText UEditorUserDefinedSettings::OnStatus_Implementation() 50 | { 51 | return FText::GetEmpty(); 52 | } 53 | 54 | UEditorUserDefinedSettings* UEditorUserDefinedSettings::GetEditorUserDefinedSettingsObject(TSoftObjectPtr SettingsBlueprint, bool& bIsRegistered) 55 | { 56 | bIsRegistered = false; 57 | UEditorUserDefinedSettings* OutSettingsObj = nullptr; 58 | 59 | if (UEditorUserDefinedSettingsUtilityBlueprint* Blueprint = SettingsBlueprint.LoadSynchronous()) 60 | { 61 | if (UClass* Class = Blueprint->GeneratedClass) 62 | { 63 | OutSettingsObj = GetMutableDefault(Class); 64 | bIsRegistered = OutSettingsObj != nullptr && IEditorScriptingToolsModule::GetPtr()->IsEditorScriptingUtilityRegistered(Blueprint); 65 | } 66 | } 67 | 68 | return OutSettingsObj; 69 | } 70 | 71 | bool UEditorUserDefinedSettings::SaveSettings() 72 | { 73 | if (this->HasAnyFlags(RF_ClassDefaultObject)) 74 | { 75 | SaveConfig(); 76 | return true; 77 | } 78 | return false; 79 | } 80 | 81 | 82 | class UWorld* UEditorUserDefinedSettings::GetWorld() const 83 | { 84 | if (GWorld) 85 | { 86 | // When in 'Simulate' mode, the editor mode tools will actually interact with the PIE world 87 | if (GEditor->bIsSimulatingInEditor) 88 | { 89 | return GEditor->GetPIEWorldContext()->World(); 90 | } 91 | else 92 | { 93 | return GEditor->GetEditorWorldContext().World(); 94 | } 95 | } 96 | 97 | return Super::GetWorld(); 98 | } -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedSettings/EditorUserDefinedSettingsUtilityBlueprint.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "EditorScriptingUtilityBlueprint.h" 8 | #include "EditorUserDefinedSettingsUtilityBlueprint.generated.h" 9 | 10 | class UClass; 11 | 12 | UCLASS() 13 | class UEditorUserDefinedSettingsUtilityBlueprint final : public UEditorScriptingUtilityBlueprint 14 | { 15 | GENERATED_UCLASS_BODY() 16 | 17 | public: 18 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = SectionSettings) 19 | FName CategoryName; 20 | 21 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = SectionSettings) 22 | FName SectionName; 23 | 24 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = SectionSettings) 25 | FText DisplayName; 26 | 27 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = SectionSettings) 28 | FText Description; 29 | 30 | protected: 31 | virtual void OnUtilityBlueprintCompiled(UBlueprint* RecompiledBlueprint) override; 32 | virtual bool PreRenameBlueprint() override; 33 | virtual void PostRenameBlueprint(bool bPreRenameSuccessful, bool bRenameSuccessful) override; 34 | 35 | public: 36 | /** Begin IEditorToolAssetInterface interface */ 37 | virtual EEditorScriptingUtilityType GetUtilityType() const override { return EEditorScriptingUtilityType::UserDefinedSettings; } 38 | virtual FName GetUtilitySettingsCategoryName() const override; 39 | virtual void GetUneditablePropertiesWhenRegistered(TArray& OutProperties) const override; 40 | /** End IEditorToolAssetInterface interface */ 41 | 42 | public: 43 | 44 | #if WITH_EDITOR 45 | // UBlueprint interface 46 | void GetReparentingRules(TSet& AllowedChildrenOfClasses, TSet& DisallowedChildrenOfClasses) const override; 47 | // End of UBlueprint interface 48 | #endif 49 | }; 50 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedSettings/EditorUserDefinedSettingsUtilityBlueprintFactory.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorUserDefinedSettingsUtilityBlueprintFactory.h" 6 | 7 | #include "EditorUserDefinedSettingsUtilityBlueprint.h" 8 | #include "EditorUserDefinedSettings.h" 9 | 10 | #include "Engine/Blueprint.h" 11 | #include "Engine/BlueprintGeneratedClass.h" 12 | #include "Kismet2/KismetEditorUtilities.h" 13 | #include "Misc/MessageDialog.h" 14 | 15 | #define LOCTEXT_NAMESPACE "EditorUserDefinedSettingsUtilityBlueprintFactory" 16 | 17 | UEditorUserDefinedSettingsUtilityBlueprintFactory::UEditorUserDefinedSettingsUtilityBlueprintFactory(const FObjectInitializer& ObjectInitializer) 18 | : Super(ObjectInitializer) 19 | { 20 | bCreateNew = true; 21 | bEditAfterNew = true; 22 | SupportedClass = UEditorUserDefinedSettingsUtilityBlueprint::StaticClass(); 23 | ParentClass = UEditorUserDefinedSettings::StaticClass(); 24 | } 25 | 26 | bool UEditorUserDefinedSettingsUtilityBlueprintFactory::ConfigureProperties() 27 | { 28 | return true; 29 | } 30 | 31 | UObject* UEditorUserDefinedSettingsUtilityBlueprintFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) 32 | { 33 | // Make sure we are trying to factory a blueprint, then create and init one 34 | check(Class->IsChildOf(UEditorUserDefinedSettingsUtilityBlueprint::StaticClass())); 35 | 36 | if ((ParentClass == NULL) || !FKismetEditorUtilities::CanCreateBlueprintOfClass(ParentClass)) 37 | { 38 | FFormatNamedArguments Args; 39 | Args.Add( TEXT("ClassName"), (ParentClass != NULL) ? FText::FromString( ParentClass->GetName() ) : LOCTEXT("Null", "(null)") ); 40 | FMessageDialog::Open( EAppMsgType::Ok, FText::Format(LOCTEXT("CannotCreateBlueprintFromClass", "Cannot create a blueprint based on the class '{0}'."), Args ) ); 41 | return NULL; 42 | } 43 | else 44 | { 45 | return FKismetEditorUtilities::CreateBlueprint(ParentClass, InParent, Name, BPTYPE_Normal, UEditorUserDefinedSettingsUtilityBlueprint::StaticClass(), UBlueprintGeneratedClass::StaticClass()); 46 | } 47 | } 48 | 49 | #undef LOCTEXT_NAMESPACE //"EditorUserDefinedSettingsUtilityBlueprintFactory" 50 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserDefinedSettings/EditorUserDefinedSettingsUtilityBlueprintFactory.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "UObject/ObjectMacros.h" 9 | #include "Templates/SubclassOf.h" 10 | #include "Factories/Factory.h" 11 | #include "EditorUserDefinedSettingsUtilityBlueprintFactory.generated.h" 12 | 13 | class UObject; 14 | 15 | UCLASS(hidecategories = Object) 16 | class UEditorUserDefinedSettingsUtilityBlueprintFactory : public UFactory 17 | { 18 | GENERATED_UCLASS_BODY() 19 | 20 | // The parent class of the created blueprint 21 | UPROPERTY(EditAnywhere, Category=BlueprintFactory, meta=(AllowAbstract = "", BlueprintBaseOnly = "")) 22 | TSubclassOf ParentClass; 23 | 24 | public: 25 | 26 | // UFactory interface 27 | virtual bool ConfigureProperties() override; 28 | virtual UObject* FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override; 29 | // End of UFactory interface 30 | }; 31 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserWidget/AssetTypeActions_EditorUserWidgetBlueprint.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | 6 | #pragma once 7 | 8 | #include "CoreMinimal.h" 9 | #include "Toolkits/IToolkitHost.h" 10 | #include "AssetTypeActions_Base.h" 11 | 12 | 13 | class FAssetTypeActions_EditorUserWidgetBlueprint : public FAssetTypeActions_Base 14 | { 15 | public: 16 | // IAssetTypeActions Implementation 17 | virtual FText GetName() const override; 18 | virtual FColor GetTypeColor() const override; 19 | virtual uint32 GetCategories() override; 20 | virtual UClass* GetSupportedClass() const override; 21 | virtual void OpenAssetEditor(const TArray& InObjects, TSharedPtr EditWithinLevelEditor = TSharedPtr()) override; 22 | virtual bool CanLocalize() const override { return false; } 23 | virtual void PerformAssetDiff(UObject* Asset1, UObject* Asset2, const struct FRevisionInfo& OldRevision, const struct FRevisionInfo& NewRevision) const override; 24 | virtual FText GetAssetDescription(const FAssetData& AssetData) const override; 25 | // End IAssetTypeActions Implementation 26 | }; 27 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserWidget/EditorUserWidget.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorUserWidget.h" 6 | 7 | UEditorUserWidget::UEditorUserWidget(const FObjectInitializer& ObjectInitializer) 8 | : Super(ObjectInitializer) 9 | { 10 | 11 | } 12 | 13 | void UEditorUserWidget::BeginDestroy() 14 | { 15 | Super::BeginDestroy(); 16 | } 17 | 18 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserWidget/EditorUserWidget.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "Blueprint/UserWidget.h" 9 | #include "EditorUserWidget.generated.h" 10 | 11 | UCLASS(Abstract) 12 | class UEditorUserWidget : public UUserWidget 13 | { 14 | GENERATED_UCLASS_BODY() 15 | 16 | public: 17 | virtual void BeginDestroy() override; 18 | 19 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserWidget/EditorUserWidgetBlueprint.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorUserWidgetBlueprint.h" 6 | #include "EditorUserWidget.h" 7 | 8 | 9 | 10 | UEditorUserWidgetBlueprint::UEditorUserWidgetBlueprint(const FObjectInitializer& ObjectInitializer) 11 | : Super(ObjectInitializer) 12 | { 13 | 14 | } 15 | 16 | 17 | void UEditorUserWidgetBlueprint::GetReparentingRules(TSet< const UClass* >& AllowedChildrenOfClasses, TSet< const UClass* >& DisallowedChildrenOfClasses) const 18 | { 19 | AllowedChildrenOfClasses.Empty(); 20 | AllowedChildrenOfClasses.Add(UEditorUserWidget::StaticClass()); 21 | } 22 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserWidget/EditorUserWidgetBlueprint.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "UObject/ObjectMacros.h" 9 | #include "WidgetBlueprint.h" 10 | #include "EditorUserWidgetBlueprint.generated.h" 11 | 12 | 13 | UCLASS() 14 | class UEditorUserWidgetBlueprint : public UWidgetBlueprint 15 | { 16 | GENERATED_UCLASS_BODY() 17 | 18 | public: 19 | void GetReparentingRules(TSet< const UClass* >& AllowedChildrenOfClasses, TSet< const UClass* >& DisallowedChildrenOfClasses) const override; 20 | }; 21 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/EditorUserWidget/EditorUserWidgetBlueprintFactory.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "UObject/ObjectMacros.h" 9 | #include "Templates/SubclassOf.h" 10 | #include "Factories/Factory.h" 11 | #include "Engine/Blueprint.h" 12 | #include "EditorUserWidgetBlueprintFactory.generated.h" 13 | 14 | UCLASS(HideCategories = Object, MinimalAPI) 15 | class UEditorUserWidgetBlueprintFactory : public UFactory 16 | { 17 | GENERATED_UCLASS_BODY() 18 | 19 | // The type of blueprint that will be created 20 | UPROPERTY(EditAnywhere, Category = EditorUserWidgetBlueprintFactory) 21 | TEnumAsByte BlueprintType; 22 | 23 | // The parent class of the created blueprint 24 | UPROPERTY(EditAnywhere, Category = EditorUserWidgetBlueprintFactory, meta = (AllowAbstract = "")) 25 | TSubclassOf ParentClass; 26 | 27 | //~ Begin UFactory Interface 28 | virtual bool ConfigureProperties() override; 29 | virtual bool ShouldShowInNewMenu() const override; 30 | virtual UObject* FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override; 31 | //~ Begin UFactory Interface 32 | 33 | UClass* RootWidgetClass; 34 | }; 35 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Utils/EditorBlueprintUtils.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | 9 | class UObject; 10 | class FProperty; 11 | 12 | namespace EditorBlueprintUtils 13 | { 14 | 15 | /** Options for CopyPropertiesToCDO */ 16 | enum EObjectPropertiesCopyOptions : int32 17 | { 18 | /** Default copy options */ 19 | Default = 0, 20 | 21 | /** Set this option to preview the changes and not actually copy anything. This will count the number of properties that would be copied. */ 22 | PreviewOnly = 1 << 0, 23 | 24 | /** Call PostEditChangeProperty for each modified property */ 25 | CallPostEditChangeProperty = 1 << 1, 26 | 27 | /** Copy only Edit and Interp properties. Otherwise we copy all properties by default */ 28 | OnlyCopyEditOrInterpProperties = 1 << 2, 29 | 30 | /** Filters out Blueprint Read-only properties */ 31 | FilterBlueprintReadOnly = 1 << 3, 32 | }; 33 | 34 | /** Copy options structure for CopyPropertiesToCDO */ 35 | struct FObjectPropertiesCopyOptions 36 | { 37 | /** Implicit construction for an options enumeration */ 38 | FObjectPropertiesCopyOptions(const EObjectPropertiesCopyOptions InFlags) : Flags(InFlags) {} 39 | 40 | /** Check whether we can copy the specified property */ 41 | bool CanCopyProperty(FProperty& Property, UObject& Object) const 42 | { 43 | return !PropertyFilter || PropertyFilter(Property, Object); 44 | } 45 | 46 | /** User-specified flags for the copy */ 47 | EObjectPropertiesCopyOptions Flags; 48 | 49 | /** User-specified custom property filter predicate */ 50 | TFunction PropertyFilter; 51 | }; 52 | 53 | /** Copy modified properties from the specified object instance back to its CDO */ 54 | int32 CopyPropertiesToCDO(UObject* InInstance, const FObjectPropertiesCopyOptions& Options = FObjectPropertiesCopyOptions(EObjectPropertiesCopyOptions::Default), bool bAutoCompile = true); 55 | 56 | bool CompileBlueprint(UObject* InObject); 57 | 58 | bool IsBlueprintDirty(UObject* InObject); 59 | 60 | } -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Utils/EditorMeshUtils.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | 9 | class UProceduralMeshComponent; 10 | class UStaticMesh; 11 | 12 | namespace EditorMeshUtils 13 | { 14 | bool CreateStaticMeshAssetFromProceduralMesh(UProceduralMeshComponent* InProcMeshComp, UStaticMesh*& OutStaticMesh); 15 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Utils/EditorScriptingToolsUtils.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorScriptingToolsUtils.h" 6 | #include "DetailLayoutBuilder.h" 7 | 8 | 9 | 10 | #define LOCTEXT_NAMESPACE "EditorScriptingToolsUtils" 11 | 12 | namespace EditorScriptingToolsUtils 13 | { 14 | 15 | bool IsValidInstance(UObject* InInstance) 16 | { 17 | return IsValid(InInstance) && !InInstance->IsUnreachable(); 18 | } 19 | 20 | bool CanInstantiateClass(const UClass* InClass) 21 | { 22 | return InClass != nullptr && !InClass->HasAnyClassFlags(CLASS_Abstract); 23 | } 24 | 25 | void HideBlueprintDefaultCategories(IDetailLayoutBuilder& DetailBuilder) 26 | { 27 | DetailBuilder.HideCategory("ClassOptions"); 28 | DetailBuilder.HideCategory("Packaging"); 29 | } 30 | 31 | } 32 | 33 | 34 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Utils/EditorScriptingToolsUtils.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | #include "CoreMinimal.h" 7 | #include "UObject/ObjectMacros.h" 8 | #include "UObject/UObjectGlobals.h" 9 | #include "UObject/Object.h" 10 | 11 | class IDetailLayoutBuilder; 12 | 13 | namespace EditorScriptingToolsUtils 14 | { 15 | 16 | bool IsValidInstance(UObject* InInstance); 17 | bool CanInstantiateClass(const UClass* InClass); 18 | void HideBlueprintDefaultCategories(IDetailLayoutBuilder& DetailBuilder); 19 | 20 | 21 | 22 | //----------------------------- Templates ------------------------------------- 23 | template 24 | ObjectT* CreateTransientEditorObject(UObject* Outer, const UClass* ObjectClass) 25 | { 26 | return NewObject(Outer, ObjectClass, NAME_None, RF_Transient); 27 | } 28 | 29 | template 30 | WidgetT* CreateTransientEditorWidget(UObject* Outer, const UClass* WidgetClass) 31 | { 32 | WidgetT* NewWidgetInstance = CreateTransientEditorObject(Outer, WidgetClass); 33 | NewWidgetInstance->ClearFlags(RF_Transactional); 34 | NewWidgetInstance->Initialize(); 35 | return NewWidgetInstance; 36 | } 37 | 38 | template 39 | BlueprintType* GetObjectBlueprint(UObject* Object) 40 | { 41 | return Cast(Object->GetClass()->ClassGeneratedBy); 42 | } 43 | //-------------------------------------------------------------------------------- 44 | 45 | } 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Utils/HitProxiesUtils.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "HitProxiesUtils.h" 6 | #include "HitProxiesTypes.h" 7 | #include "EngineUtils.h" 8 | 9 | #define LOCTEXT_NAMESPACE "HitProxiesUtils" 10 | 11 | namespace HitProxiesUtils 12 | { 13 | TSharedPtr CreateProxyWrapperFromHitProxy(HHitProxy* HitProxy) 14 | { 15 | if (HitProxy) 16 | { 17 | return MakeShared(HitProxy); 18 | } 19 | 20 | return nullptr; 21 | } 22 | } 23 | 24 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Utils/HitProxiesUtils.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | 9 | class HHitProxy; 10 | struct FHitProxyWrapper; 11 | 12 | namespace HitProxiesUtils 13 | { 14 | TSharedPtr CreateProxyWrapperFromHitProxy(HHitProxy* HitProxy); 15 | }; -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Utils/LevelEditingViewportUtils.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "EditorTypesWrapperTypes.h" 9 | #include "EditorScriptingToolsTypes.h" 10 | 11 | 12 | class UPrimitiveComponent; 13 | 14 | 15 | class FViewport; 16 | class FEditorViewportClient; 17 | class FLevelEditorViewportClient; 18 | class FCanvas; 19 | class HHitProxy; 20 | 21 | 22 | 23 | namespace LevelEditingViewportUtils 24 | { 25 | FViewport* GetCurrentLevelEditingViewport(); 26 | FEditorViewportClient* GetCurrentEditingViewportClient(); 27 | FLevelEditorViewportClient* GetCurrentLevelEditingViewportClient(); 28 | FSceneView* CalcSceneViewForActiveEditorViewport(); 29 | FCanvas* GetCurrentEditingViewportDebugCanvas(); 30 | bool IsCurrentLevelEditingViewport(const FEditorViewportClient* EditorViewportClient); 31 | bool IsCurrentLevelEditingViewport(const FSceneView* View); 32 | 33 | ELevelEditingViewportType GetEditingViewportType(); 34 | bool SetEditingViewportType(ELevelEditingViewportType InType); 35 | 36 | bool IsPerspective(); 37 | 38 | FIntPoint GetEditingViewportSize(); 39 | float GetEditingViewportDPIScale(); 40 | 41 | FIntPoint GetEditingViewportMousePosition(); 42 | void LockMouseToEditingViewport(bool bLock); 43 | FLevelEditingViewportCursorLocation GetEditingViewportMouseRay(); 44 | bool GetEditingViewportMouseRayStartAndEnd(FVector& Start, FVector& End); 45 | 46 | bool GetKeyState(FKey InKey); 47 | bool IsAltPressed(); 48 | bool IsCtrlPressed(); 49 | bool IsShiftPressed(); 50 | bool IsCmdPressed(); 51 | 52 | 53 | void SetRealtimeOverride(bool bShouldBeRealtime, FText SystemDisplayName); 54 | void RemoveRealtimeOverride(); 55 | bool ToggleRealtime(); 56 | void SetRealtime(bool bInRealtime); 57 | bool IsRealtime(); 58 | void RequestRealTimeFrames(uint64 NumRealTimeFrames = 1); 59 | bool IsRealtimeOverrideSet(); 60 | FText GetRealtimeOverrideMessage(); 61 | 62 | bool IsEditingViewportFocused(); 63 | 64 | void SetViewLocation(const FVector& NewLocation); 65 | void SetViewRotation(const FRotator& NewRotation); 66 | void SetLookAtLocation(const FVector& LookAt, bool bRecalculateView = false); 67 | void SetOrthoZoom(float InOrthoZoom); 68 | 69 | FVector GetViewportCameraLocation(); 70 | FRotator GetViewportCameraRotation(); 71 | FVector GetViewportCameraLookAtLocation(); 72 | float GetViewportCameraOrthoZoom(); 73 | 74 | FVector4 TransformWorldPointToScreen(const FVector& WorldPoint); 75 | FVector TransformScreenPointToWorld(const FVector4& ScreenPoint); 76 | bool TransformScreenPointToPixel(const FVector4& ScreenPoint, FVector2D& OutPixelLocation); 77 | FVector4 TransformPixelPointToScreen(float X, float Y, float Z); 78 | bool TransformWorldPointToPixel(const FVector& WorldPoint, FVector2D& OutPixelLocation); 79 | FVector4 TransformPixelPointToWorld(float X, float Y, float Z); 80 | 81 | HHitProxy* GetHitProxyUnderCursor(); 82 | void GetActorUnderCursor(bool& bIsValid, FActorHitProxyInfo& OutActorHitProxyInfo); 83 | bool IsPrimitiveComponentUnderCursor(UPrimitiveComponent* InPrimComponent); 84 | 85 | void RedrawLevelEditingViewports(bool bInvalidateHitProxies = true); 86 | void RedrawAllViewports(bool bInvalidateHitProxies = true); 87 | } 88 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Utils/LevelEditorUtils.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "LevelEditorUtils.h" 6 | 7 | #include "Editor.h" 8 | #include "EditorScriptingToolsTypes.h" 9 | #include "Editor/Transactor.h" 10 | 11 | 12 | #define LOCTEXT_NAMESPACE "LevelEditorUtils" 13 | 14 | namespace LevelEditorUtils 15 | { 16 | 17 | EEditorState GetEditorState() 18 | { 19 | 20 | if (GEditor != nullptr) 21 | { 22 | if (GEditor->bIsSimulatingInEditor) 23 | { 24 | return EEditorState::SimulatingInEditor; 25 | } 26 | else if (GEditor->PlayWorld != NULL) 27 | { 28 | return EEditorState::PlayingInEditor; 29 | } 30 | 31 | return EEditorState::Editor; 32 | } 33 | 34 | return EEditorState::Unknown; 35 | } 36 | 37 | void SelectComponent(UActorComponent* Component, bool bInSelected, bool bNotify, bool bSelectEvenIfHidden /*= false*/) 38 | { 39 | if (GEditor != nullptr) 40 | { 41 | GEditor->SelectComponent(Component, bInSelected, bNotify, bSelectEvenIfHidden); 42 | } 43 | } 44 | 45 | void SelectActor(AActor* Actor, bool bInSelected, bool bNotify, bool bSelectEvenIfHidden /*= false*/, bool bForceRefresh /*= false*/) 46 | { 47 | if (GEditor != nullptr) 48 | { 49 | GEditor->SelectActor(Actor, bInSelected, bNotify, bSelectEvenIfHidden, bForceRefresh); 50 | } 51 | } 52 | 53 | void SelectNone(bool bNoteSelectionChange, bool bDeselectBSPSurfs, bool WarnAboutManyActors /*= true*/) 54 | { 55 | if (GEditor != nullptr) 56 | { 57 | GEditor->SelectNone(bNoteSelectionChange, bDeselectBSPSurfs, WarnAboutManyActors); 58 | } 59 | } 60 | 61 | void MarkActorComponentsRenderStateDirty(AActor* InActor) 62 | { 63 | if (IsValid(InActor)) 64 | { 65 | InActor->MarkComponentsRenderStateDirty(); 66 | } 67 | } 68 | 69 | void RerunActorConstructionScripts(AActor* InActor) 70 | { 71 | if (IsValid(InActor)) 72 | { 73 | InActor->RerunConstructionScripts(); 74 | } 75 | } 76 | 77 | void ClearEditorUndoBuffer() 78 | { 79 | if ((GEditor != nullptr) && (GEditor->Trans != nullptr)) 80 | { 81 | GEditor->Trans->Reset(LOCTEXT("DiscardHistoryReason", "Discard undo history.")); 82 | } 83 | } 84 | } 85 | 86 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Utils/LevelEditorUtils.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | 9 | class AActor; 10 | class UActorComponent; 11 | enum class EEditorState : uint8; 12 | 13 | namespace LevelEditorUtils 14 | { 15 | 16 | EEditorState GetEditorState(); 17 | 18 | void SelectComponent( UActorComponent* Component, bool bInSelected, bool bNotify, bool bSelectEvenIfHidden = false); 19 | void SelectActor(AActor* Actor, bool bInSelected, bool bNotify, bool bSelectEvenIfHidden = false, bool bForceRefresh = false); 20 | void SelectNone(bool bNoteSelectionChange, bool bDeselectBSPSurfs, bool WarnAboutManyActors = true); 21 | 22 | void MarkActorComponentsRenderStateDirty(AActor* InActor); 23 | void RerunActorConstructionScripts(AActor* InActor); 24 | 25 | void ClearEditorUndoBuffer(); 26 | } 27 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Utils/LevelViewportCanvasDrawingUtils.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | 9 | class UFont; 10 | class AActor; 11 | 12 | struct FDrawHUDContext; 13 | /// 14 | /// 15 | /// 16 | namespace LevelViewportCanvasDrawingUtils 17 | { 18 | void DrawText(const FDrawHUDContext& Context, const FString& Text, const FLinearColor& TextColor, float ScreenX, float ScreenY, UFont* Font, float Scale); 19 | void DrawLine(const FDrawHUDContext& Context, float StartScreenX, float StartScreenY, float EndScreenX, float EndScreenY, const FLinearColor& LineColor, float LineThickness); 20 | 21 | void DrawActorScreenSpaceBoundingBox(const FDrawHUDContext& Context, AActor* InActor, const FLinearColor& InColor, const bool bInDrawBracket, const FString& InLabelText = TEXT("")); 22 | 23 | } -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Utils/LevelViewportPrimitiveDrawingUtils.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | 9 | 10 | class UMaterialInterface; 11 | class USplineComponent; 12 | 13 | struct FDrawPrimitivesContext; 14 | 15 | enum class EDepthPriorityGroup : uint8; 16 | 17 | namespace LevelViewportPrimitiveDrawingUtils 18 | { 19 | 20 | void DrawPoint(const FDrawPrimitivesContext& Context, const FVector& Position, const FLinearColor& Color, float PointSize, EDepthPriorityGroup DepthPriorityGroup); 21 | 22 | void DrawLine(const FDrawPrimitivesContext& Context, const FVector& Start, const FVector& End, const FLinearColor& Color, EDepthPriorityGroup DepthPriorityGroup, float Thickness, float DepthBias); 23 | 24 | void DrawTriangle(const FDrawPrimitivesContext& Context, const FVector& PointA, const FVector& PointB, const FVector& PointC, const FLinearColor& Color, bool bDrawLines, UMaterialInterface* Material, EDepthPriorityGroup DepthPriorityGroup, bool bDisableBackfaceCulling, bool bReceivesDecals); 25 | 26 | void DrawSphere(const FDrawPrimitivesContext& Context, const FVector& Center, float Radius, int32 NumSides, int32 NumRings, UMaterialInterface* Material, EDepthPriorityGroup DepthPriorityGroup, bool bDisableBackfaceCulling); 27 | void DrawWireSphere(const FDrawPrimitivesContext& Context, const FVector& Center, const FLinearColor& Color, float Radius, int32 NumSides, EDepthPriorityGroup DepthPriorityGroup, float Thickness, float DepthBias); 28 | 29 | void DrawBox(const FDrawPrimitivesContext& Context, const FTransform& Transform, const FVector& Extent, UMaterialInterface* Material, EDepthPriorityGroup DepthPriorityGroup); 30 | void DrawWireBox(const FDrawPrimitivesContext& Context, const FTransform& Transform, const FVector& Extent, const FLinearColor& Color, EDepthPriorityGroup DepthPriorityGroup, float Thickness, float DepthBias); 31 | 32 | void DrawCylinder(const FDrawPrimitivesContext& Context, const FVector& Center, const FRotator& Rotation, const UMaterialInterface* Material, float Radius, float HalfHeight, uint32 NumSides, EDepthPriorityGroup DepthPriorityGroup, float DepthBias); 33 | void DrawWireCylinder(const FDrawPrimitivesContext& Context, const FVector& Center, const FRotator& Rotation, const FLinearColor& Color, float Radius, float HalfHeight, int32 NumSides, EDepthPriorityGroup DepthPriorityGroup, float Thickness, float DepthBias); 34 | 35 | void DrawFlatArrow(const FDrawPrimitivesContext& Context, const FVector& Location, const FVector& XAxis, const FVector& YAxis, const FLinearColor& Color, float Length, int32 Width, UMaterialInterface* Material, EDepthPriorityGroup DepthPriorityGroup, float Thickness); 36 | 37 | void DrawSpline(const FDrawPrimitivesContext& Context, USplineComponent* SplineComponent, const FLinearColor& LineColor, EDepthPriorityGroup DepthPriorityGroup); 38 | } -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Widgets/AssetDropTargetWidget/AssetDropTargetWidget.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "AssetDropTargetWidget/AssetDropTargetWidget.h" 6 | #include "AssetDropTargetWidget/SAssetDropTargetWidget.h" 7 | #include "Components/SlateWrapperTypes.h" 8 | 9 | #define LOCTEXT_NAMESPACE "AssetDropTargetWidget" 10 | 11 | UAssetDropTargetWidget::UAssetDropTargetWidget() 12 | { 13 | 14 | } 15 | 16 | void UAssetDropTargetWidget::SynchronizeProperties() 17 | { 18 | Super::SynchronizeProperties(); 19 | 20 | } 21 | 22 | void UAssetDropTargetWidget::ReleaseSlateResources(bool bReleaseChildren) 23 | { 24 | Super::ReleaseSlateResources(bReleaseChildren); 25 | 26 | SlateAssetDropTargetWidget.Reset(); 27 | } 28 | 29 | TSharedRef UAssetDropTargetWidget::RebuildWidget() 30 | { 31 | SAssignNew(SlateAssetDropTargetWidget, SAssetDropTargetWidget) 32 | .OnAssetDrop(BIND_UOBJECT_DELEGATE(FOnAssetDropDelegate, AssetDroppedEvent)); 33 | 34 | return SlateAssetDropTargetWidget.ToSharedRef(); 35 | } 36 | 37 | void UAssetDropTargetWidget::AssetDroppedEvent(const TArray& DroppedAssets) 38 | { 39 | OnAssetDropped.Broadcast(DroppedAssets); 40 | } 41 | 42 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Widgets/AssetDropTargetWidget/AssetDropTargetWidget.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "EditorWidgetBase.h" 8 | #include "AssetDropTargetWidget.generated.h" 9 | 10 | class SWidget; 11 | struct FAssetData; 12 | class FMenuBuilder; 13 | 14 | DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnAssetDroppedDelegate, const TArray&, DroppedAssets); 15 | 16 | 17 | 18 | UCLASS(meta = (DisplayName = "Asset(s) Drop Target")) 19 | class UAssetDropTargetWidget : public UEditorWidgetBase 20 | { 21 | GENERATED_BODY() 22 | 23 | public: 24 | UAssetDropTargetWidget(); 25 | 26 | //~ Begin UWidget Interface 27 | virtual void SynchronizeProperties() override; 28 | //~ End UWidget Interface 29 | 30 | //~ Begin UVisual Interface 31 | virtual void ReleaseSlateResources(bool bReleaseChildren) override; 32 | //~ End UVisual Interface 33 | 34 | protected: 35 | //~ Begin UWidget Interface 36 | virtual TSharedRef RebuildWidget() override; 37 | //~ End UWidget Interface 38 | 39 | 40 | private: 41 | void AssetDroppedEvent(const TArray& DroppedAssets); 42 | 43 | public: 44 | UPROPERTY(BlueprintAssignable) 45 | FOnAssetDroppedDelegate OnAssetDropped; 46 | 47 | private: 48 | TSharedPtr SlateAssetDropTargetWidget; 49 | 50 | }; 51 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Widgets/AssetDropTargetWidget/SAssetDropTargetWidget.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "AssetDropTargetWidget/SAssetDropTargetWidget.h" 6 | #include "Widgets/Images/SImage.h" 7 | #include "EditorStyleSet.h" 8 | #include "AssetRegistry/AssetData.h" 9 | #include "AssetSelection.h" 10 | 11 | #define LOCTEXT_NAMESPACE "SAssetDropTargetWidget" 12 | 13 | void SAssetDropTargetWidget::Construct(const FArguments& InArgs) 14 | { 15 | bIsDragOn = false; 16 | OnAssetDropDelegate = InArgs._OnAssetDrop; 17 | 18 | this->ChildSlot 19 | [ 20 | SNew(SImage) 21 | .Visibility(this, &SAssetDropTargetWidget::GetDropTargetVisibility) 22 | .ColorAndOpacity(this, &SAssetDropTargetWidget::GetBackgroundColor) 23 | ]; 24 | } 25 | 26 | FReply SAssetDropTargetWidget::OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) 27 | { 28 | bIsDragOn = false; 29 | HandleAssetDropped(MyGeometry, DragDropEvent); 30 | return FReply::Handled(); 31 | } 32 | 33 | void SAssetDropTargetWidget::OnDragEnter(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) 34 | { 35 | bIsDragOn = true; 36 | } 37 | 38 | FReply SAssetDropTargetWidget::OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) 39 | { 40 | if (DragDropEvent.GetOperation().IsValid()) 41 | { 42 | DragDropEvent.GetOperation()->SetCursorOverride(EMouseCursor::Hand); 43 | } 44 | return FReply::Handled(); 45 | } 46 | 47 | void SAssetDropTargetWidget::OnDragLeave(const FDragDropEvent& DragDropEvent) 48 | { 49 | bIsDragOn = false; 50 | } 51 | 52 | FSlateColor SAssetDropTargetWidget::GetBackgroundColor() const 53 | { 54 | return bIsDragOn ? FLinearColor(1.0f, 1.0f, 1.0f, 0.15f) : FLinearColor::Transparent; 55 | } 56 | 57 | EVisibility SAssetDropTargetWidget::GetDropTargetVisibility() const 58 | { 59 | return bIsDragOn ? EVisibility::Visible : EVisibility::Hidden; 60 | } 61 | 62 | FReply SAssetDropTargetWidget::HandleAssetDropped(const FGeometry& DropZoneGeometry, const FDragDropEvent& DragDropEvent) 63 | { 64 | TArray DroppedAssetData = AssetUtil::ExtractAssetDataFromDrag(DragDropEvent); 65 | const int32 NumAssets = DroppedAssetData.Num(); 66 | if (NumAssets > 0) 67 | { 68 | TArray DroppedAssets; 69 | DroppedAssets.SetNumUninitialized(NumAssets); 70 | for (int32 Index = 0; Index < NumAssets; Index++) 71 | { 72 | DroppedAssets[Index] = DroppedAssetData[Index].GetAsset(); 73 | } 74 | OnAssetDropDelegate.Execute(DroppedAssets); 75 | } 76 | 77 | return FReply::Handled(); 78 | } 79 | 80 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Widgets/AssetDropTargetWidget/SAssetDropTargetWidget.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "Widgets/SCompoundWidget.h" 8 | #include "Widgets/DeclarativeSyntaxSupport.h" 9 | #include "Framework/SlateDelegates.h" 10 | #include "Input/Reply.h" 11 | #include "Layout/Visibility.h" 12 | 13 | struct FAssetData; 14 | 15 | DECLARE_DELEGATE_OneParam(FOnAssetDropDelegate,const TArray&); 16 | 17 | class SAssetDropTargetWidget : public SCompoundWidget 18 | { 19 | 20 | SLATE_BEGIN_ARGS(SAssetDropTargetWidget) {} 21 | SLATE_EVENT(FOnAssetDropDelegate, OnAssetDrop) 22 | SLATE_END_ARGS() 23 | 24 | public: 25 | void Construct(const FArguments& InArgs); 26 | 27 | FReply OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override; 28 | virtual void OnDragEnter(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override; 29 | virtual FReply OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override; 30 | virtual void OnDragLeave(const FDragDropEvent& DragDropEvent) override; 31 | 32 | private: 33 | FSlateColor GetBackgroundColor() const; 34 | EVisibility GetDropTargetVisibility() const; 35 | FReply HandleAssetDropped(const FGeometry& DropZoneGeometry, const FDragDropEvent& DragDropEvent); 36 | 37 | private: 38 | FOnAssetDropDelegate OnAssetDropDelegate; 39 | bool bIsDragOn; 40 | }; 41 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Widgets/AssetPickerWidget/AssetPickerWidget.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "AssetPickerWidget/AssetPickerWidget.h" 6 | 7 | #include "EditorTypesWrapperTypes.h" 8 | #include "BluEdModeTypes.h" 9 | 10 | #include "PropertyCustomizationHelpers.h" 11 | 12 | #include "Framework/Application/SlateApplication.h" 13 | #include "Components/Widget.h" 14 | #include "Framework/MultiBox/MultiBoxBuilder.h" 15 | #include "Widgets/Notifications/SErrorText.h" 16 | #include "Styling/SlateIconFinder.h" 17 | 18 | 19 | #define LOCTEXT_NAMESPACE "AssetPickerWidget" 20 | 21 | 22 | UAssetPickerWidget::UAssetPickerWidget() 23 | : AllowedClass(nullptr) 24 | , bAllowClear(true) 25 | , bOpenSubMenuOnClick(false) 26 | , MenuLabelText(LOCTEXT("PickAsset", "Pick Asset")) 27 | , MenuToolTipText(LOCTEXT("PickAssetTooltip", "Pick Asset.")) 28 | , CurrentAssetPtr(nullptr) 29 | { 30 | 31 | } 32 | 33 | 34 | void UAssetPickerWidget::SynchronizeProperties() 35 | { 36 | Super::SynchronizeProperties(); 37 | 38 | RebuildWidget(); 39 | } 40 | 41 | 42 | void UAssetPickerWidget::ReleaseSlateResources(bool bReleaseChildren) 43 | { 44 | Super::ReleaseSlateResources(bReleaseChildren); 45 | 46 | SlateAssetPickerWidget.Reset(); 47 | } 48 | 49 | TSharedRef UAssetPickerWidget::RebuildWidget() 50 | { 51 | 52 | FMenuBuilder MenuBuilder(true, nullptr); 53 | MenuBuilder.AddSubMenu( 54 | MenuLabelText, 55 | MenuToolTipText, 56 | FNewMenuDelegate::CreateUObject(this, &UAssetPickerWidget::OpenAssetPickerMenu), 57 | bOpenSubMenuOnClick, 58 | FSlateIconFinder::FindIconForClass(AllowedClass)); 59 | 60 | SlateAssetPickerWidget = MenuBuilder.MakeWidget(); 61 | 62 | return SlateAssetPickerWidget.ToSharedRef(); 63 | } 64 | 65 | 66 | void UAssetPickerWidget::OpenAssetPickerMenu(FMenuBuilder& MenuBuilder) 67 | { 68 | 69 | if (AllowedClass && !AllowedClass->HasAnyClassFlags(CLASS_Abstract)) 70 | { 71 | TArray AllowedClasses; 72 | AllowedClasses.Add(AllowedClass); 73 | 74 | TSharedRef AssetPickerWidget = PropertyCustomizationHelpers::MakeAssetPickerWithMenu(FAssetData(CurrentAssetPtr.Get()), 75 | bAllowClear, 76 | AllowedClasses, 77 | PropertyCustomizationHelpers::GetNewAssetFactoriesForClasses(AllowedClasses), 78 | FOnShouldFilterAsset(), 79 | FOnAssetSelected::CreateUObject(this, &UAssetPickerWidget::OnNewAssetSelected), 80 | FSimpleDelegate::CreateUObject(this, &UAssetPickerWidget::CloseMenu)); 81 | 82 | 83 | MenuBuilder.AddWidget(AssetPickerWidget, FText::GetEmpty(), /*bNoIndent=*/ true); 84 | } 85 | else 86 | { 87 | MenuBuilder.AddWidget( 88 | SNew(SErrorText) 89 | .ErrorText(LOCTEXT("AllowedClass_Error", "Innvalid Allowed Class")), 90 | FText::GetEmpty()); 91 | } 92 | } 93 | 94 | 95 | void UAssetPickerWidget::OnNewAssetSelected(const FAssetData& AssetData) 96 | { 97 | OnAssetSelected.Broadcast(AssetData.GetAsset()); 98 | } 99 | 100 | 101 | void UAssetPickerWidget::CloseMenu() 102 | { 103 | FSlateApplication::Get().DismissAllMenus(); 104 | } 105 | 106 | 107 | void UAssetPickerWidget::SetCurrentAsset(UObject* InAsset) 108 | { 109 | CurrentAssetPtr = InAsset; 110 | } 111 | 112 | UObject* UAssetPickerWidget::GetCurrentAsset() const 113 | { 114 | return CurrentAssetPtr.Get(); 115 | } 116 | 117 | 118 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Widgets/AssetPickerWidget/AssetPickerWidget.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "EditorWidgetBase.h" 8 | #include "AssetRegistry/AssetData.h" 9 | #include "AssetPickerWidget.generated.h" 10 | 11 | 12 | DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnAssetSelectedDelegate, UObject*, SelectedAsset); 13 | 14 | class SWidget; 15 | struct FAssetData; 16 | class FMenuBuilder; 17 | 18 | 19 | 20 | UCLASS(meta = (DisplayName = "Asset Picker Menu")) 21 | class UAssetPickerWidget : public UEditorWidgetBase 22 | { 23 | GENERATED_BODY() 24 | 25 | public: 26 | UAssetPickerWidget(); 27 | 28 | //~ Begin UWidget Interface 29 | virtual void SynchronizeProperties() override; 30 | //~ End UWidget Interface 31 | 32 | //~ Begin UVisual Interface 33 | virtual void ReleaseSlateResources(bool bReleaseChildren) override; 34 | //~ End UVisual Interface 35 | 36 | protected: 37 | //~ Begin UWidget Interface 38 | virtual TSharedRef RebuildWidget() override; 39 | //~ End UWidget Interface 40 | 41 | void OpenAssetPickerMenu(FMenuBuilder& MenuBuilder); 42 | void OnNewAssetSelected(const FAssetData& AssetData); 43 | void CloseMenu(); 44 | 45 | public: 46 | 47 | /** Called to when an asset is selected */ 48 | UPROPERTY(BlueprintAssignable, Category = "AssetPicker|Event") 49 | FOnAssetSelectedDelegate OnAssetSelected; 50 | 51 | /** Class that is allowed in the asset picker */ 52 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AssetPicker") 53 | TSubclassOf AllowedClass; 54 | 55 | /** Whether the asset can be 'None' */ 56 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AssetPicker") 57 | bool bAllowClear; 58 | 59 | /** Sub-menu will open only if the sub-menu entry is clicked. */ 60 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AssetPicker") 61 | bool bOpenSubMenuOnClick; 62 | 63 | /** The text that should be shown for the menu. */ 64 | UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "AssetPicker") 65 | FText MenuLabelText;; 66 | 67 | /** The tooltip that should be shown when the menu is hovered over. */ 68 | UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "AssetPicker") 69 | FText MenuToolTipText; 70 | 71 | public: 72 | UFUNCTION(BlueprintCallable, Category = "AssetPicker") 73 | void SetCurrentAsset(UObject* InAsset); 74 | 75 | UFUNCTION(BlueprintCallable, Category = "AssetPicker") 76 | UObject* GetCurrentAsset() const; 77 | 78 | private: 79 | UPROPERTY() 80 | TSoftObjectPtr CurrentAssetPtr; 81 | 82 | TSharedPtr SlateAssetPickerWidget; 83 | 84 | }; 85 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Widgets/EditorWidgetBase.cpp: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #include "EditorWidgetBase.h" 6 | 7 | 8 | #define LOCTEXT_NAMESPACE "EditorWidgetBase" 9 | 10 | UEditorWidgetBase::UEditorWidgetBase(const FObjectInitializer& ObjectInitializer) 11 | : Super(ObjectInitializer) 12 | { 13 | 14 | } 15 | 16 | #if WITH_EDITOR 17 | const FText UEditorWidgetBase::GetPaletteCategory() 18 | { 19 | return LOCTEXT("Editor", "Editor"); 20 | } 21 | #endif //WITH_EDITOR 22 | 23 | #undef LOCTEXT_NAMESPACE 24 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Private/Widgets/EditorWidgetBase.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | 7 | #include "CoreMinimal.h" 8 | #include "UObject/ObjectMacros.h" 9 | #include "Widgets/SWidget.h" 10 | #include "Components/Widget.h" 11 | #include "EditorWidgetBase.generated.h" 12 | 13 | 14 | UCLASS(Abstract) 15 | class UEditorWidgetBase : public UWidget 16 | { 17 | GENERATED_UCLASS_BODY() 18 | 19 | public: 20 | #if WITH_EDITOR 21 | virtual const FText GetPaletteCategory() override; 22 | #endif 23 | 24 | }; 25 | -------------------------------------------------------------------------------- /Source/EditorScriptingTools/Public/IEditorScriptingUtilityAssetInterface.h: -------------------------------------------------------------------------------- 1 | //==========================================================================// 2 | // Copyright Elhoussine Mehnik (ue4resources@gmail.com). All Rights Reserved. 3 | //================== http://unrealengineresources.com/ =====================// 4 | 5 | #pragma once 6 | #include "UObject/Interface.h" 7 | #include "IEditorScriptingUtilityAssetInterface.generated.h" 8 | 9 | DECLARE_MULTICAST_DELEGATE_OneParam(FEditorScriptingUtilityRegistered, bool /* bRegister */); 10 | 11 | enum class EDITORSCRIPTINGTOOLS_API EEditorScriptingUtilityType : uint8 12 | { 13 | EditorMode = 0, 14 | DetailCustomization, 15 | ComponentVisulizer, 16 | UserDefinedSettings, 17 | UserDefinedActions, 18 | 19 | None = 255, 20 | }; 21 | 22 | UINTERFACE(MinimalAPI) 23 | class UEditorScriptingUtilityAssetInterface : public UInterface 24 | { 25 | GENERATED_BODY() 26 | }; 27 | 28 | class IEditorScriptingUtilityAssetInterface 29 | { 30 | 31 | GENERATED_BODY() 32 | 33 | public: 34 | 35 | virtual EEditorScriptingUtilityType GetUtilityType() const = 0; 36 | 37 | virtual void OnRegisterDone() = 0; 38 | virtual void OnUnregisterDone() = 0; 39 | 40 | virtual FName GetUtilitySettingsCategoryName() const = 0; 41 | virtual void GetUneditablePropertiesWhenRegistered(TArray& OutProperties) const = 0; 42 | 43 | virtual FEditorScriptingUtilityRegistered& OnEditorScriptingUtilityRegistered() const = 0; 44 | }; --------------------------------------------------------------------------------