Files
UnrealEngine/Engine/Plugins/Runtime/HairStrands/Source/HairStrandsEditor/Private/GroomMaterialDetails.h
2025-05-18 13:04:45 +08:00

176 lines
5.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Layout/Visibility.h"
#include "Input/Reply.h"
#include "Widgets/SWidget.h"
#include "Widgets/SBoxPanel.h"
#include "EngineDefines.h"
#include "PropertyHandle.h"
#include "IDetailCustomNodeBuilder.h"
#include "IDetailCustomization.h"
#include "Widgets/Input/SComboBox.h"
class UGroomAsset;
class UMaterialInterface;
class IGroomCustomAssetEditorToolkit;
class FGroomMaterialDetails : public IDetailCustomization
{
UGroomAsset* GroomAsset = nullptr;
public:
FGroomMaterialDetails(IGroomCustomAssetEditorToolkit* InToolkit);
~FGroomMaterialDetails();
/** Makes a new instance of this detail layout class for a specific detail view requesting it */
static TSharedRef<IDetailCustomization> MakeInstance(IGroomCustomAssetEditorToolkit* InToolkit);
/** IDetailCustomization interface */
virtual void CustomizeDetails(IDetailLayoutBuilder& DetailLayout) override;
private:
FReply AddMaterialSlot();
FText GetMaterialArrayText() const;
bool IsMaterialValid(int32 MaterialIndex) const;
/**
* Called by the material list widget when we need to get new materials for the list
*
* @param OutMaterials Handle to a material list builder that materials should be added to
*/
void OnGetMaterialsForArray(class IMaterialListBuilder& OutMaterials, int32 LODIndex);
/**
* Called when a user drags a new material over a list item to replace it
*
* @param NewMaterial The material that should replace the existing material
* @param PrevMaterial The material that should be replaced
* @param SlotIndex The index of the slot on the component where materials should be replaces
* @param bReplaceAll If true all materials in the slot should be replaced not just ones using PrevMaterial
*/
void OnMaterialArrayChanged(UMaterialInterface* NewMaterial, UMaterialInterface* PrevMaterial, int32 SlotIndex, bool bReplaceAll, int32 LODIndex);
/**
* Called by the material list widget on generating each name widget
*
* @param Material The material that is being displayed
* @param SlotIndex The index of the material slot
*/
TSharedRef<SWidget> OnGenerateCustomNameWidgetsForSection(int32 LodIndex, int32 SectionIndex);
/**
* Called by the material list widget on generating each thumbnail widget
*
* @param Material The material that is being displayed
* @param SlotIndex The index of the material slot
*/
TSharedRef<SWidget> OnGenerateCustomSectionWidgetsForSection(int32 LODIndex, int32 SectionIndex);
EVisibility ShowEnabledSectionDetail(int32 LodIndex, int32 SectionIndex) const;
EVisibility ShowDisabledSectionDetail(int32 LodIndex, int32 SectionIndex) const;
FText GetMaterialNameText(int32 MaterialIndex)const;
void OnMaterialNameCommitted(const FText& InValue, ETextCommit::Type CommitType, int32 MaterialIndex);
/**
* Called by the material list widget on generating name side content
*
* @param Material The material that is being displayed
* @param MaterialIndex The index of the material slot
*/
TSharedRef<SWidget> OnGenerateCustomNameWidgetsForMaterialArray(UMaterialInterface* Material, int32 MaterialIndex);
/**
* Called by the material list widget on generating each thumbnail widget
*
* @param Material The material that is being displayed
* @param MaterialIndex The index of the material slot
*/
TSharedRef<SWidget> OnGenerateCustomMaterialWidgetsForMaterialArray(UMaterialInterface* Material, int32 MaterialIndex, int32 LODIndex);
/* If the material list is dirty this function will return true */
bool OnMaterialListDirty();
bool CanDeleteMaterialSlot(int32 MaterialIndex) const;
void OnDeleteMaterialSlot(int32 MaterialIndex);
/**
* Handler for changing highlight status on a material
*
* @param MaterialIndex The material index that is being selected
*/
void OnMaterialSelectedChanged(ECheckBoxState NewState, int32 MaterialIndex);
/**
* Handler for check box display based on whether the material is isolated
*
* @param MaterialIndex The material index that is being isolate
*/
ECheckBoxState IsIsolateMaterialEnabled(int32 MaterialIndex) const;
/**
* Handler for changing isolated status on a material
*
* @param MaterialIndex The material index that is being isolate
*/
void OnMaterialIsolatedChanged(ECheckBoxState NewState, int32 MaterialIndex);
/**
* Handler for check box display based on whether the material is highlighted
*
* @param SectionIndex The material section that is being tested
*/
ECheckBoxState IsSectionSelected(int32 SectionIndex) const;
/**
* Handler for changing highlight status on a material
*
* @param SectionIndex The material section that is being tested
*/
void OnSectionSelectedChanged(ECheckBoxState NewState, int32 SectionIndex);
/**
* Handler for check box display based on whether the material is isolated
*
* @param SectionIndex The material section that is being tested
*/
ECheckBoxState IsIsolateSectionEnabled(int32 SectionIndex) const;
/**
* Handler for changing isolated status on a material
*
* @param SectionIndex The material section that is being tested
*/
void OnSectionIsolatedChanged(ECheckBoxState NewState, int32 SectionIndex);
/** Creates the UI for Current LOD panel */
void AddMaterials(IDetailLayoutBuilder& DetailLayout);
FText GetMaterialSlotNameText(int32 MaterialIndex) const;
void OnCopyMaterialList();
bool OnCanCopyMaterialList() const;
void OnPasteMaterialList();
void OnCopyMaterialItem(int32 CurrentSlot);
bool OnCanCopyMaterialItem(int32 CurrentSlot) const;
void OnPasteMaterialItem(int32 CurrentSlot);
public:
void ApplyChanges();
private:
void CallPostEditChange(FProperty* PropertyChanged=nullptr);
IDetailLayoutBuilder* GroomDetailLayout;
/*
* This prevent showing the delete material slot warning dialog more then once per editor session
*/
bool bDeleteWarningConsumed;
};