/* * Copyright (c) <2021> Side Effects Software Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. The name of Side Effects Software may not be used to endorse or * promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY SIDE EFFECTS SOFTWARE "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN * NO EVENT SHALL SIDE EFFECTS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "HoudiniEngineStyle.h" #include "HoudiniEngineEditor.h" #include "HoudiniEngineUtils.h" #include "EditorStyleSet.h" #include "Styling/SlateStyleRegistry.h" #include "Styling/SlateTypes.h" #include "SlateOptMacros.h" #define LOCTEXT_NAMESPACE HOUDINI_LOCTEXT_NAMESPACE #define IMAGE_BRUSH( RelativePath, ... ) FSlateImageBrush( StyleSet->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ ) #define BOX_BRUSH( RelativePath, ... ) FSlateBoxBrush( StyleSet->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ ) #define BORDER_BRUSH( RelativePath, ... ) FSlateBorderBrush( StyleSet->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ ) #define TTF_FONT( RelativePath, ... ) FSlateFontInfo( StyleSet->RootToContentDir( RelativePath, TEXT(".ttf") ), __VA_ARGS__ ) #define TTF_CORE_FONT( RelativePath, ... ) FSlateFontInfo( StyleSet->RootToCoreContentDir( RelativePath, TEXT(".ttf") ), __VA_ARGS__ ) #define OTF_FONT( RelativePath, ... ) FSlateFontInfo( StyleSet->RootToContentDir( RelativePath, TEXT(".otf") ), __VA_ARGS__ ) #define OTF_CORE_FONT( RelativePath, ... ) FSlateFontInfo( StyleSet->RootToCoreContentDir( RelativePath, TEXT(".otf") ), __VA_ARGS__ ) TSharedPtr FHoudiniEngineStyle::StyleSet = nullptr; TSharedPtr FHoudiniEngineStyle::Get() { return StyleSet; } FName FHoudiniEngineStyle::GetStyleSetName() { static FName HoudiniStyleName(TEXT("HoudiniEngineStyle")); return HoudiniStyleName; } BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION void FHoudiniEngineStyle::Initialize() { // Only register the StyleSet once if (StyleSet.IsValid()) return; StyleSet = MakeShareable(new FSlateStyleSet(GetStyleSetName())); StyleSet->SetContentRoot(FPaths::EngineContentDir() / TEXT("Editor/Slate")); StyleSet->SetCoreContentRoot(FPaths::EngineContentDir() / TEXT("Slate")); // Note, these sizes are in Slate Units. // Slate Units do NOT have to map to pixels. const FVector2D Icon5x16(5.0f, 16.0f); const FVector2D Icon8x4(8.0f, 4.0f); const FVector2D Icon8x8(8.0f, 8.0f); const FVector2D Icon10x10(10.0f, 10.0f); const FVector2D Icon12x12(12.0f, 12.0f); const FVector2D Icon12x16(12.0f, 16.0f); const FVector2D Icon14x14(14.0f, 14.0f); const FVector2D Icon16x16(16.0f, 16.0f); const FVector2D Icon20x20(20.0f, 20.0f); const FVector2D Icon22x22(22.0f, 22.0f); const FVector2D Icon24x24(24.0f, 24.0f); const FVector2D Icon25x25(25.0f, 25.0f); const FVector2D Icon32x32(32.0f, 32.0f); const FVector2D Icon40x40(40.0f, 40.0f); const FVector2D Icon64x64(64.0f, 64.0f); const FVector2D Icon36x24(36.0f, 24.0f); const FVector2D Icon128x128(128.0f, 128.0f); static FString IconsDir = FHoudiniEngineUtils::GetHoudiniEnginePluginDir() / TEXT("Resources/Icons/"); StyleSet->Set( "HoudiniEngine.HoudiniEngineLogo", new FSlateImageBrush(IconsDir + TEXT("icon_houdini_logo_16.png"), Icon16x16)); StyleSet->Set( "ClassIcon.HoudiniAssetActor", new FSlateImageBrush(IconsDir + TEXT("icon_houdini_logo_16.png"), Icon16x16)); StyleSet->Set( "HoudiniEngine.HoudiniEngineLogo40", new FSlateImageBrush(IconsDir + TEXT("icon_houdini_logo_40.png"), Icon40x40)); StyleSet->Set( "ClassIcon.HoudiniAsset", new FSlateImageBrush(IconsDir + TEXT("houdini_digital_asset.png"), Icon16x16)); StyleSet->Set( "ClassThumbnail.HoudiniAsset", new FSlateImageBrush(IconsDir + TEXT("houdini_digital_asset_128.png"), Icon64x64)); static FString ResourcesDir = FHoudiniEngineUtils::GetHoudiniEnginePluginDir() / TEXT("Resources/"); FString AssetHelpIcon = IconsDir + TEXT("asset_help16x16.png"); FString BakeAllIcon = IconsDir + TEXT("bake_all16x16.png"); FString BakeSelIcon = IconsDir + TEXT("bake_selected16x16.png"); FString CleanTempIcon = IconsDir + TEXT("clean_temp16x16.png"); FString CookAllIcon = IconsDir + TEXT("cook_all16x16.png"); FString CookLogIcon = IconsDir + TEXT("cook_log16x16.png"); FString CookSelIcon = IconsDir + TEXT("cook_selected16x16.png"); FString DigitalAssetIcon = IconsDir + TEXT("digital_asset16x16.png"); FString OnlineForumIcon = IconsDir + TEXT("online_forum16x16.png"); FString OnlineHelpIcon = IconsDir + TEXT("online_help16x16.png"); FString OpenInHIcon = IconsDir + TEXT("open_in_houdini16x16.png"); FString PauseIcon = IconsDir + TEXT("pause16x16.png"); FString PDGCancelIcon = IconsDir + TEXT("pdg_cancel16x16.png"); FString PDGDirtyAllIcon = IconsDir + TEXT("pdg_dirty_all16x16.png"); FString PDGDirtyNodeIcon = IconsDir + TEXT("pdg_dirty_node16x16.png"); FString PDGLinkIcon = IconsDir + TEXT("pdg_link16x16.png"); FString PDGPauseIcon = IconsDir + TEXT("pdg_pause16x16.png"); FString PDGRefreshIcon = IconsDir + TEXT("pdg_refresh16x16.png"); FString PDGResetIcon = IconsDir + TEXT("pdg_reset16x16.png"); FString RebuildAllIcon = IconsDir + TEXT("rebuild_all16x16.png"); FString RebuildSelIcon = IconsDir + TEXT("rebuild_selected16x16.png"); FString RefineAllIcon = IconsDir + TEXT("refine_all16x16.png"); FString RefineSelIcon = IconsDir + TEXT("refine_selected16x16.png"); FString ReportBugIcon = IconsDir + TEXT("report_bug16x16.png"); FString ResetIcon = IconsDir + TEXT("reset16x16.png"); FString ResetParamIcon = IconsDir + TEXT("reset_parameters16x16.png"); FString SaveToHipIcon = IconsDir + TEXT("save_to_hip16x16.png"); FString SessionConnectIcon = IconsDir + TEXT("session_connect16x16.png"); FString SessionCreateIcon = IconsDir + TEXT("session_create16x16.png"); FString SessionRestartIcon = IconsDir + TEXT("session_restart16x16.png"); FString SessionStopIcon = IconsDir + TEXT("session_stop16x16.png"); FString SessionSyncIcon = IconsDir + TEXT("session_sync16x16.png"); FString SessionSyncStartIcon = IconsDir + TEXT("session_sync_start16x16.png"); FString SessionSyncStopIcon = IconsDir + TEXT("session_sync_stop16x16.png"); FString ViewportSyncIcon = IconsDir + TEXT("viewport_sync16x16.png"); FString ViewportSyncBothIcon = IconsDir + TEXT("viewport_sync_both16x16.png"); FString ViewportSyncHoudiniIcon = IconsDir + TEXT("viewport_sync_houdini16x16.png"); FString ViewportSyncOffIcon = IconsDir + TEXT("viewport_sync_off16x16.png"); FString ViewportSyncUnrealIcon = IconsDir + TEXT("viewport_sync_unreal16x16.png"); FString InfoIcon = FEditorStyle::GetBrush("Icons.Info")->GetResourceName().ToString(); FString SettingsIcon = FEditorStyle::GetBrush("Launcher.EditSettings")->GetResourceName().ToString(); StyleSet->Set("HoudiniEngine._CreateSession", new FSlateImageBrush(SessionCreateIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._ConnectSession", new FSlateImageBrush(SessionConnectIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._StopSession", new FSlateImageBrush(SessionStopIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._RestartSession", new FSlateImageBrush(SessionRestartIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._SessionSync", new FSlateImageBrush(SessionSyncIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._OpenSessionSync", new FSlateImageBrush(SessionSyncStartIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._CloseSessionSync", new FSlateImageBrush(SessionSyncStopIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._SyncViewport", new FSlateImageBrush(ViewportSyncIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._ViewportSyncNone", new FSlateImageBrush(ViewportSyncOffIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._ViewportSyncBoth", new FSlateImageBrush(ViewportSyncBothIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._ViewportSyncUnreal", new FSlateImageBrush(ViewportSyncUnrealIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._ViewportSyncHoudini", new FSlateImageBrush(ViewportSyncHoudiniIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._InstallInfo", new FSlateImageBrush(InfoIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._PluginSettings", new FSlateImageBrush(SettingsIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._OpenInHoudini", new FSlateImageBrush(OpenInHIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._SaveHIPFile", new FSlateImageBrush(SaveToHipIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._CleanUpTempFolder", new FSlateImageBrush(CleanTempIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._OnlineDoc", new FSlateImageBrush(OnlineHelpIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._OnlineForum", new FSlateImageBrush(OnlineForumIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._ReportBug", new FSlateImageBrush(ReportBugIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._CookAll", new FSlateImageBrush(CookAllIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._CookSelected", new FSlateImageBrush(CookSelIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._BakeSelected", new FSlateImageBrush(BakeSelIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._BakeAll", new FSlateImageBrush(BakeAllIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._RebuildAll", new FSlateImageBrush(RebuildAllIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._RebuildSelected", new FSlateImageBrush(RebuildSelIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._RefineAll", new FSlateImageBrush(RefineAllIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._RefineSelected", new FSlateImageBrush(RefineSelIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._PauseAssetCooking", new FSlateImageBrush(PauseIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._Reset", new FSlateImageBrush(ResetIcon, Icon16x16)); StyleSet->Set("HoudiniEngine.DigitalAsset", new FSlateImageBrush(DigitalAssetIcon, Icon16x16)); StyleSet->Set("HoudiniEngine.PDGLink", new FSlateImageBrush(PDGLinkIcon, Icon16x16)); /* FString StopIcon = FEditorStyle::GetBrush("PropertyWindow.Button_Clear")->GetResourceName().ToString(); FString RestartIcon = FEditorStyle::GetBrush("Tutorials.Browser.RestartButton")->GetResourceName().ToString(); FString InfoIcon = FEditorStyle::GetBrush("Icons.Info")->GetResourceName().ToString(); FString SettingsIcon = FEditorStyle::GetBrush("Launcher.EditSettings")->GetResourceName().ToString(); FString ClearIcon = FEditorStyle::GetBrush("PropertyWindow.Button_Delete")->GetResourceName().ToString(); FString HelpIcon = FEditorStyle::GetBrush("Icons.Help")->GetResourceName().ToString(); FString WarningIcon = FEditorStyle::GetBrush("Icons.Warning")->GetResourceName().ToString(); FString BPIcon = FEditorStyle::GetBrush("PropertyWindow.Button_CreateNewBlueprint")->GetResourceName().ToString(); FString PauseIcon = FEditorStyle::GetBrush("Profiler.Pause")->GetResourceName().ToString(); StyleSet->Set("HoudiniEngine._CreateSession", new FSlateImageBrush(IconsDir + TEXT("icon_houdini_logo_16.png"), Icon16x16)); StyleSet->Set("HoudiniEngine._ConnectSession", new FSlateImageBrush(IconsDir + TEXT("icon_houdini_logo_16.png"), Icon16x16)); StyleSet->Set("HoudiniEngine._StopSession", new FSlateImageBrush(StopIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._RestartSession", new FSlateImageBrush(RestartIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._OpenSessionSync", new FSlateImageBrush(IconsDir + TEXT("icon_houdini_logo_16.png"), Icon16x16)); StyleSet->Set("HoudiniEngine._CloseSessionSync", new FSlateImageBrush(StopIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._InstallInfo", new FSlateImageBrush(InfoIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._PluginSettings", new FSlateImageBrush(SettingsIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._OpenInHoudini", new FSlateImageBrush(IconsDir + TEXT("icon_houdini_logo_16.png"), Icon16x16)); StyleSet->Set("HoudiniEngine._SaveHIPFile", new FSlateImageBrush(IconsDir + TEXT("icon_houdini_logo_16.png"), Icon16x16)); StyleSet->Set("HoudiniEngine._CleanUpTempFolder", new FSlateImageBrush(IconsDir + TEXT("icon_houdini_logo_16.png"), Icon16x16)); StyleSet->Set("HoudiniEngine._OnlineDoc", new FSlateImageBrush(HelpIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._OnlineForum", new FSlateImageBrush(InfoIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._ReportBug", new FSlateImageBrush(WarningIcon, Icon16x16)); StyleSet->Set("HoudiniEngine._CookAll", new FSlateImageBrush(ResourcesDir + TEXT("hengine_recook_icon.png"), Icon16x16)); StyleSet->Set("HoudiniEngine._CookSelected", new FSlateImageBrush(ResourcesDir + TEXT("hengine_recook_icon.png"), Icon16x16)); StyleSet->Set("HoudiniEngine._BakeSelected", new FSlateImageBrush(IconsDir + TEXT("icon_houdini_logo_16.png"), Icon16x16)); StyleSet->Set("HoudiniEngine._BakeAll", new FSlateImageBrush(IconsDir + TEXT("icon_houdini_logo_16.png"), Icon16x16)); StyleSet->Set("HoudiniEngine._RebuildAll", new FSlateImageBrush(ResourcesDir + TEXT("hengine_reload_icon.png"), Icon16x16)); StyleSet->Set("HoudiniEngine._RebuildSelected", new FSlateImageBrush(ResourcesDir + TEXT("hengine_reload_icon.png"), Icon16x16)); StyleSet->Set("HoudiniEngine._RefineAll", new FSlateImageBrush(IconsDir + TEXT("icon_houdini_logo_16.png"), Icon16x16)); StyleSet->Set("HoudiniEngine._RefineSelected", new FSlateImageBrush(IconsDir + TEXT("icon_houdini_logo_16.png"), Icon16x16)); StyleSet->Set("HoudiniEngine._PauseAssetCooking", new FSlateImageBrush(IconsDir + TEXT("icon_houdini_logo_16.png"), Icon16x16)); */ // We need some colors from Editor Style & this is the only way to do this at the moment const FSlateColor DefaultForeground = FEditorStyle::GetSlateColor("DefaultForeground"); const FSlateColor InvertedForeground = FEditorStyle::GetSlateColor("InvertedForeground"); const FSlateColor SelectorColor = FEditorStyle::GetSlateColor("SelectorColor"); const FSlateColor SelectionColor = FEditorStyle::GetSlateColor("SelectionColor"); const FSlateColor SelectionColor_Inactive = FEditorStyle::GetSlateColor("SelectionColor_Inactive"); const FTableRowStyle &NormalTableRowStyle = FEditorStyle::Get().GetWidgetStyle("TableView.Row"); StyleSet->Set( "HoudiniEngine.TableRow", FTableRowStyle(NormalTableRowStyle) .SetEvenRowBackgroundBrush(FSlateNoResource()) .SetEvenRowBackgroundHoveredBrush(IMAGE_BRUSH("Common/Selection", Icon8x8, FLinearColor(1.0f, 1.0f, 1.0f, 0.1f))) .SetOddRowBackgroundBrush(FSlateNoResource()) .SetOddRowBackgroundHoveredBrush(IMAGE_BRUSH("Common/Selection", Icon8x8, FLinearColor(1.0f, 1.0f, 1.0f, 0.1f))) .SetSelectorFocusedBrush(BORDER_BRUSH("Common/Selector", FMargin(4.f / 16.f), SelectorColor)) .SetActiveBrush(IMAGE_BRUSH("Common/Selection", Icon8x8, SelectionColor)) .SetActiveHoveredBrush(IMAGE_BRUSH("Common/Selection", Icon8x8, SelectionColor)) .SetInactiveBrush(IMAGE_BRUSH("Common/Selection", Icon8x8, SelectionColor_Inactive)) .SetInactiveHoveredBrush(IMAGE_BRUSH("Common/Selection", Icon8x8, SelectionColor_Inactive)) .SetTextColor(DefaultForeground) .SetSelectedTextColor(InvertedForeground) ); // Normal Text const FTextBlockStyle& NormalText = FEditorStyle::Get().GetWidgetStyle("NormalText"); StyleSet->Set( "HoudiniEngine.ThumbnailText", FTextBlockStyle(NormalText) .SetFont(TTF_CORE_FONT("Fonts/Roboto-Regular", 9)) .SetColorAndOpacity(FSlateColor::UseForeground()) .SetShadowOffset(FVector2D::ZeroVector) .SetShadowColorAndOpacity(FLinearColor::Black) .SetHighlightColor(FLinearColor(0.02f, 0.3f, 0.0f)) .SetHighlightShape(BOX_BRUSH("Common/TextBlockHighlightShape", FMargin(3.f / 8.f))) ); StyleSet->Set("HoudiniEngine.ThumbnailShadow", new BOX_BRUSH("ContentBrowser/ThumbnailShadow", FMargin(4.0f / 64.0f))); StyleSet->Set("HoudiniEngine.ThumbnailBackground", new IMAGE_BRUSH("Common/ClassBackground_64x", FVector2D(64.f, 64.f), FLinearColor(0.75f, 0.75f, 0.75f, 1.0f))); // Register Slate style. FSlateStyleRegistry::RegisterSlateStyle(*StyleSet.Get()); }; END_SLATE_FUNCTION_BUILD_OPTIMIZATION #undef IMAGE_BRUSH #undef BOX_BRUSH #undef BORDER_BRUSH #undef TTF_FONT #undef TTF_CORE_FONT #undef OTF_FONT #undef OTF_CORE_FONT void FHoudiniEngineStyle::Shutdown() { if (StyleSet.IsValid()) { FSlateStyleRegistry::UnRegisterSlateStyle(*StyleSet.Get()); ensure(StyleSet.IsUnique()); StyleSet.Reset(); } } #undef LOCTEXT_NAMESPACE