🎮Unreal4/C++_Plugin

[UE4] Detail View 커스텀 : 체크박스 -2 (IsChecked, OnCheckStateChanged, AsShared, TSharedFromThis, IPropertyUtilities, ForceRefresh)

공대 컴린이 2023. 5. 9. 20:59
728x90

이전 학습에 이어서 체크박스의 체크/해제 기능을 구현해보았다.

☑️ 체크박스 체크/해제 하기

SCheckBox를 생성한 후, IsChecked 명령어를 사용하여 체크박스의 체크를 하거나 해제할 수 있다.

 

IsChecked 명령어의 매개변수에는 ECheckBoxState 열거형 타입이 들어가는데, 해당 열거형을 살펴보면 체크해제가 0, 체크가 1 이므로 true, false로 사용해도 무방하다.

따라서 InternalDatas의 bChecked 변수로 체크의 유무를 설정하였다.

☑️ 체크박스 이벤트/델리게이트

또한 SCheckBox 객체에 OnCheckStateChange 델리게이트를 이용하여 체크박스가 체크될때마다 호출되는 함수를 등록해주었다.

 

🚩AsShared 에러

이 상태에서 프로그램을 실행시키면 아래와 같은 AsShared 에러가 발생한다.

 

델리게이트에 this 객체를 넘겨주면 SWeaponCheckBoxes 클래스의 부모의 AsShared 함수가 호출되며 this 객체의 주소가 전달된다.

이때 AsShared 함수는 상속구조의 문제점을 발생시키는데, AsShared 함수가 무조건 부모로 가서, SWeaponCheckBoxes 클래스의 델리게이트와 주소가 맵핑될 수 없어서 에러가 발생한 것이다.

즉, SWeaponCheckBoxes 클래스의 AsShared 함수로 가져와야하는데 부모의 AsShared 함수로 가져와져서 문제가 된 것이다.

 

이러한 문제를 해결해주기 위해 TSharedFromThis 클래스를 상속받아 자신의 AsShared 함수가 호출될 수 있도록 처리해주었다.

 

OnCheckStateChanged 델리게이트에 등록한 OnCheckStateChanged 함수는 CheckBoxState를 매개변수로 받고, 변환된 체크박스가 누구의 체크박스인지 판별하기 위해 별도의 매개변수 InIndex를 추가해주었다.

델리게이트에도 이렇게 매개변수를 추가하여 사용할 수 있다.

 

체크가 바뀌면 InternalDatas의 bChecked 변수를 반전시켜주었고, 변환된 체크박스의 상태를 Refresh 하기 위한 Utilities의 ForceRefresh 함수를 호출하였다. (아래에서 마저 설명한다)

 

체크박스를 Refresh하는 구간의 On/Off 함수를 생성하였고, 그 구간 안에서만 체크박스를 새로고침하였다.

 

이때 SWeaponDetailsView 클래스의 CustomizeDetails 함수를 다시 살펴보면, SWeaponCheckBoxes 객체를 생성할 때 CreateCheckBoxes 함수의 내부적으로 모든 CheckBox를 모두 삭제한 후 다시 생성하여 초기화한다.

 

그러나 체크박스를 의도적으로 체크하고 해제한 경우에도 CheckBox를 모두 제거한 후 다시 생성한다면 값이 저장되지 않으므로, 의도적인 체크박스 조작 후 RefreshByCheckBoxes 변수를 활성화하여 "삭제 후 재생성" 작업을 실행하지 않도록 조정하였다.

 

이러한 RefreshByCheckBoxes 값을 조정하기 위한 함수와 변수를 SWeaponDetailsView 클래스에 추가하였다.

🔃 체크박스 새로고침 - Utilities

이후, 체크박스의 새로고침을 위해 IPropertyUtilities 객체를 전달받아 저장하였다.

 

이러한 Utilities의 전달은 SEquipmentData 클래스의 CustomizeHeader 함수에서 수행하였다.

 

컴파일 후 프로그램을 실행시켜보면 체크박스에 체크 된 Equipment 데이터 항목만 하위 Property로 잘 나타나는것을 확인할 수 있었다.

728x90