KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
UTabButtonGroup.cpp
이 파일의 문서화 페이지로 가기
1// Copyright (c) 2025 Doppleddiggong. All rights reserved. Unauthorized copying, modification, or distribution of this file, via any medium is strictly prohibited. Proprietary and confidential.
2
3#include "UTabButtonGroup.h"
4#include "UTabButton.h"
5#include "UTabIndicator.h"
6#include "Components/HorizontalBox.h"
7#include "Components/HorizontalBoxSlot.h"
8#include "Components/CanvasPanelSlot.h"
9#include "Blueprint/WidgetTree.h"
10
12{
13 Super::NativePreConstruct();
14
15 // 에디터 프리뷰를 위해 탭을 재구성
16 ApplyTab();
17}
18
20{
21 Super::NativeConstruct();
22
23 // 인디케이터 이동 완료 이벤트 바인딩 및 설정
24 if (TabIndicator)
25 {
26 TabIndicator->OnMoveCompleted.RemoveDynamic(this, &UTabButtonGroup::OnMoveCompleted);
27 TabIndicator->OnMoveCompleted.AddDynamic(this, &UTabButtonGroup::OnMoveCompleted);
28
29 // 애니메이션 속도 설정
30 TabIndicator->SetAnimationSpeed(IndicatorAnimationSpeed);
31
32 // TabIndicator 크기를 TabSize로 자동 설정
33 UCanvasPanelSlot* indicatorSlot = Cast<UCanvasPanelSlot>(TabIndicator->Slot);
34 if (indicatorSlot)
35 {
36 indicatorSlot->SetSize(TabSize);
37 }
38 }
39
40 // 탭 구성
41 ApplyTab();
42
43 // 기본 탭 선택 (이벤트는 발생시키지 않음)
45}
46
48{
49 // TabButtonClass 유효성 검사
50 if (!TabButtonClass)
51 return;
52
53 // TabContainer 유효성 검사
54 if (!TabContainer)
55 return;
56
57 // 기존 탭 버튼들 제거
58 TabContainer->ClearChildren();
59 TabButtonList.Empty();
60
61 // TabLabels 배열을 순회하며 탭 버튼 생성
62 for (int32 i = 0; i < TabLabels.Num(); ++i)
63 {
64 // UTabButton 인스턴스 생성
65 UTabButton* newButton = CreateWidget<UTabButton>(this, TabButtonClass);
66 if (!newButton)
67 continue;
68
69 // 버튼 초기화
70 newButton->InitData(i, this);
71 newButton->SetLabel(TabLabels[i]);
72
73 // 클릭 이벤트 바인딩
74 newButton->OnTabButtonClicked.RemoveDynamic(this, &UTabButtonGroup::OnTabClicked);
75 newButton->OnTabButtonClicked.AddDynamic(this, &UTabButtonGroup::OnTabClicked);
76
77 // HorizontalBox에 추가
78 UHorizontalBoxSlot* slot = TabContainer->AddChildToHorizontalBox(newButton);
79 if (slot)
80 {
81 // 슬롯 설정 (균등 분배)
82 slot->SetHorizontalAlignment(HAlign_Fill);
83 slot->SetVerticalAlignment(VAlign_Fill);
84 slot->SetSize(FSlateChildSize(ESlateSizeRule::Fill));
85 }
86
87 // 인스턴스 배열에 추가
88 TabButtonList.Add(newButton);
89 }
90}
91
93{
94 OnSelectTab(TabIndex, true);
95}
96
97void UTabButtonGroup::OnSelectTab(int32 TabIndex, bool bBroadcastEvent)
98{
99 // 인덱스 유효성 검사
100 if (!TabButtonList.IsValidIndex(TabIndex))
101 return;
102
103 // 이미 선택된 탭이면 무시
104 if (CurTabIndex == TabIndex)
105 return;
106
107 // 현재 탭 인덱스 업데이트
108 CurTabIndex = TabIndex;
109
110 // 모든 탭 버튼의 선택 상태 업데이트
111 for (int32 i = 0; i < TabButtonList.Num(); ++i)
112 {
113 if (TabButtonList[i])
114 {
115 TabButtonList[i]->SetSelected(i == CurTabIndex);
116 }
117 }
118
119 // 인디케이터 위치 업데이트
121
122 // 이벤트 브로드캐스트
123 if (bBroadcastEvent)
124 OnTabSelected.Broadcast(CurTabIndex);
125}
126
128{
129 // 인디케이터 유효성 검사
130 if (!TabIndicator)
131 return;
132
133 // 고정 폭 기반으로 X 위치 계산: X = TabSize.X * TabIndex
134 FVector2D targetPosition(TabSize.X * CurTabIndex, 0.0f);
135
136 // UTabIndicator에게 이동 요청
137 TabIndicator->MoveTo(targetPosition, bAnimateIndicator);
138}
139
141{
142 // 인디케이터 이동이 완료되었을 때 수행할 작업
143 // 예: 사운드 재생, 추가 이벤트 발생 등
144}
void OnTabClicked(int32 TabIndex)
탭 버튼 중 하나가 클릭되었을 때 호출될 내부 핸들러.
int32 CurTabIndex
현재 선택된 탭의 인덱스.
float IndicatorAnimationSpeed
선택 인디케이터의 애니메이션 속도 (초 단위).
TArray< TObjectPtr< class UTabButton > > TabButtonList
동적으로 생성되어 현재 관리 중인 탭 버튼 위젯 인스턴스 배열.
virtual void NativeConstruct() override
TObjectPtr< class UHorizontalBox > TabContainer
생성된 탭 버튼들이 추가될 컨테이너. 블루프린트에서 'TabContainer' 이름으로 생성해야 합니다.
void OnMoveCompleted()
인디케이터 이동 완료 시 호출될 핸들러
void ApplyTab()
TabLabels 데이터를 기반으로 탭 버튼들을 다시 생성하고 배치합니다.
void UpdateIndicatorPosition()
선택 인디케이터의 위치를 현재 선택된 탭으로 업데이트합니다.
FVector2D TabSize
각 탭의 고정 크기 (Width × Height). TabIndicator 크기도 자동으로 이 값으로 설정됩니다.
FOnTabSelected OnTabSelected
탭 선택이 변경될 때 발생하는 이벤트
bool bAnimateIndicator
선택 인디케이터의 이동 애니메이션 활성화 여부.
int32 DefaultTabIndex
위젯이 생성될 때 기본으로 선택될 탭의 인덱스.
TSubclassOf< class UTabButton > TabButtonClass
탭 버튼으로 생성할 UTabButton 위젯 블루프린트 클래스.
void OnSelectTab(int32 TabIndex, bool bBroadcastEvent=true)
특정 인덱스의 탭을 강제로 선택합니다.
virtual void NativePreConstruct() override
TArray< FText > TabLabels
각 탭에 표시될 텍스트 라벨 배열. 이 배열의 크기에 따라 탭이 생성됩니다.
TObjectPtr< class UTabIndicator > TabIndicator
선택된 탭을 따라 움직이는 인디케이터 위젯. 블루프린트에서 'TabIndicator' 이름으로 생성해야 합니다.
UTabButtonGroup에 의해 관리되는 개별 탭 버튼 위젯.
Definition UTabButton.h:15
void InitData(const int32 InTabIndex, class UTabButtonGroup *InOwnerGroup)
버튼을 초기화하는 함수. 부모 그룹에 의해 호출됩니다.
void SetLabel(const FText &InText) const
버튼의 텍스트 라벨을 설정합니다.
FOnTabButtonClicked OnTabButtonClicked
탭 버튼이 클릭되었을 때 발생하는 이벤트
Definition UTabButton.h:40