Войти
Unreal EngineФорумПрограммирование

UE4 IDetailCustomization

#0
10:57, 13 янв. 2020

Кто-нибудь использовал это в своих проектах ? Хотел сделать так, чтобы при изменении enum прятались/появлялись некоторые поля. Не совсем получилось, то чего я ожидал. Делается однократно, только при создании. Привязывался к эвентам смены значения, они не приходят.


#1
11:49, 13 янв. 2020

gary_cho
в UE есть аттрибут
>EditCondition
обычно через него делают

#2
16:36, 13 янв. 2020

FireFenix
спасибо. я попробовал это аттрибут. Поле стало не активным. Но хотелось бы, чтобы оно вообще исчезало, чтобы не вводить в заблуждение. Или от разных enum появлялись разные настройки.

#3
0:57, 17 янв. 2020

gary_cho
Скинь что у тебя есть, посмотрю и подскажу что делаешь не так

#4
(Правка: 19 янв. 2020, 23:52) 12:47, 17 янв. 2020

[Deadly]
я сделал

class FMyComponentDetailsCustomization : public IDetailCustomization

в FMyComponentDetailsCustomization::CustomizeDetails( IDetailLayoutBuilder& DetailBuilder ) и вызывал

if( pMyComponent->Type != EMyType::Generator )
  DetailBuilder.HideProperty( TEXT( "GenerateVoltage" ) );

Чтобы подписаться на изменение переменной pMyComponent->Type я пробовал разные варианты. Пытался подписаться делегатом на изменение значения.

TSharedRef< IPropertyHandle > Type = DetailBuilder.GetProperty( TEXT( "Type" ) );
FSimpleDelegate OnTypeChangedDelegate = FSimpleDelegate::CreateSP( this, &FMyComponentDetailsCustomization::OnTypeChanged );
Type->SetOnPropertyValueChanged( OnGenerateVoltageChangedDelegate );

Потом нашёл способ, но он не особо красивый. Я создал поле в самой компоненте m_pLayoutBuilder

#if WITH_EDITOR
public:
  IDetailLayoutBuilder*  m_pLayoutBuilder = nullptr;
  virtual void      PostEditChangeProperty( FPropertyChangedEvent& PropertyChangedEvent ) override;
#endif // WITH_EDITOR
и при создании FMyComponentDetailsCustomization я делал запись
pMyComponent->m_pLayoutBuilder = &DetailBuilder;

В функции UMyComponent::PostEditChangeProperty при изменении поля Type я вызывал
if( m_pLayoutBuilder )
  m_pLayoutBuilder->ForceRefreshDetails();

Так работает, как я хотел.

Unreal EngineФорумПрограммирование