SEditableTextBox 생성시 FEditableTextBoxStyle 내부의 FTextBlockStyle 가 적용되지 않음

이 포스팅은 엔진 버전 5.3을 기준으로 작성되었습니다.

증상

  1. SEditableTextBox 사용시
  2. FEditableTextBoxStyle 에서 FTextBlockStyle 을 설정하고,
  3. Slate 생성에서 아래처럼 스타일을 적용하면,
1
2
SNew(SEditableTextBox)
.Style(SomeStyleThatHasAFTextBlockStyle)
  1. FEditableTextBoxStyleFTextBlockStyle 은 적용되지 않습니다.

원인

SEditableTextBox::Construct() 에 원인이 있습니다.

  1. SEditableTextBoxConstruct() 내부에서 TSharedPtr< SEditableText > EditableText 를 생성할 때, 스타일을 전달하지 않습니다. GitHub 링크
  2. 대신, Construct()의 좀 더 이른 타이밍에, 별도의 함수인 SEditableTextBox::SetStyle() 호출을 통해 스타일을 설정합니다. GitHub 링크
  3. SEditableTextBox::SetStyle()는 마지막 부분에서 SEditableTextBox::SetTextBlockStyle()를 호출하고, 이 함수는 내부에서 FTextBlockStyle 를 설정하기 위해 SEditableText::SetTextBlockStyle()를 호출합니다. GitHub 링크
  4. 여기서, SEditableTextBox::SetTextBlockStyle()SEditableText::SetTextBlockStyle() 를 호출하기 전에, TSharedPtr< SEditableText > EditableText의 유효성을 체크하는 부분이 있습니다. 만일 유효하지 않으면 SEditableText::SetTextBlockStyle() 를 실행하지 않습니다. 그리고 이 타이밍은 TSharedPtr< SEditableText > EditableText 의 생성 전이기 때문에, FTextBlockStyle의 설정은 건너 뛰게 됩니다. GitHub 링크
  5. 그리고 이에 대한 별도의 후속 조치 없이, SEditableTextBox::Construct()는 종료됩니다.
  6. 결과적으로, SEditableText 의 생성과정에서 FTextBlockStyle 의 적용은 언제나 건너뛰어집니다.

우회 방법

생성 후에는 유효성체크에 성공할 것이므로, 생성 후에 SEditableTextBox::SetStyle()SEditableTextBox::SetTextBlockStyle() 를 호출해주면 FTextBlockStyleSEditableTextBox 에 적용할 수 있습니다.

이런 모양이 됩니다:

1
2
3
4
...
SAssignNew(SomePtr, SEditableTextBox)
...
SomePtr->SetTextBlockStyle(SomeFTextBlockStyle));

풀 리퀘스트를 보내볼까 생각도 했습니다만, 최근에 여러 차례 풀 리퀘스트에서 마음이 아픈 경험을 해서 주저하고 있습니다. 이게 그다지 치명적인 게 아니라는 점도 주저하게 만드네요.

하지만 저에겐 치명적이었어요.


                        Before

Before


                        After

After

태그