KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
Popup_QuestionnaireResult.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
5
6#include "ALingoPlayerState.h"
8#include "APlayerControl.h"
9#include "FResultStatData.h"
10#include "GameLogging.h"
11#include "Components/Spacer.h"
13#include "UPopupManager.h"
14#include "UImageButton.h"
15#include "ULingoGameHelper.h"
16#include "UResultStatWidget.h"
17#include "Components/VerticalBox.h"
18#include "Onepiece/Onepiece.h"
19
20UPopup_QuestionnaireResult::UPopup_QuestionnaireResult(const FObjectInitializer& ObjectInitializer)
21{
22 ConstructorHelpers::FClassFinder<UPopup_QuestionnaireResultItem> QuestionnaireResultItemRef(TEXT("/Game/CustomContents/UI/Widgets/Write/WBP_WriteResultItem.WBP_WriteResultItem_C"));
23 if (QuestionnaireResultItemRef.Succeeded())
24 {
25 QuestionnaireResultItemClass = QuestionnaireResultItemRef.Class;
26 }
27}
28
29void UPopup_QuestionnaireResult::InitPopup(const FResponseWriteSubmit& InResponseData, const FResponseWriteResult& InResponseResultData)
30{
31 // 피드백 데이터 저장
32 ResponseData = InResponseData;
33 // 질문 데이터 저장
34 TArray<FWriteQuestionData> QuestionArray = ULingoGameHelper::GetLingoPlayerState(GetWorld())->WriteQuestionData.question;
35 for (const auto& question : QuestionArray)
36 {
37 QuestionsKor.Add(question.word_data.kor);
38 QuestionsEng.Add(question.word_data.eng);
39 }
40
41 // 최종 Result 불러오기
42 if (auto PS = ULingoGameHelper::GetLingoPlayerState(GetWorld()))
43 {
44 bool bHasResult = false;
45
46 if (!PS->WriteWholeResultData.grade.IsEmpty())
47 {
48 // 이미 결과가 있으면 바로 표시
49 PRINTLOG(TEXT("[Popup_Result] Read result already exists in GameState"));
50 InitWholeResult(PS->WriteWholeResultData);
51 bHasResult = true;
52 }
53
54 // 결과가 없으면 Host만 요청
55 if (!bHasResult && GetOwningPlayer()->HasAuthority())
56 {
57 PRINTLOG(TEXT("[Popup_Result] 없어요"));
58 }
59 }
60
61 ScrollBox_Result->ClearChildren();
62
63 // 피드백 팝업 창 생성
64 // for (const FResponseOcrData& data : ResponseData.ResponseOcrDataArray)
65 for (int32 i = 1; i <= ResponseData.ResponseWriteDataArray.Num(); ++i)
66 {
68 // PRINTLOG(TEXT("----Display----"));
69 // PRINTLOG(TEXT("%d Success: %s"), i, data.display.is_pass ? TEXT("true") : TEXT("false"));
70 // PRINTLOG(TEXT("%d Display Message: %s"), i, *(data.display.message));
71 // PRINTLOG(TEXT("%d Display Correction: %s"), i, *(data.display.correction));
72 // PRINTLOG(TEXT("----Record----"));
73 // PRINTLOG(TEXT("%d Score: %d"), i, data.record.score);
74 // PRINTLOG(TEXT("%d Record Target: %s"), i, *(data.record.target));
75 // PRINTLOG(TEXT("%d Record Input: %s"), i, *(data.record.input));
76 // PRINTLOG(TEXT("%d Record Stage: %s"), i, *(data.record.stage));
77
78 // 인터뷰 항목 위젯 생성
79 UPopup_QuestionnaireResultItem* ItemWidget = CreateWidget<UPopup_QuestionnaireResultItem>(
81 ItemWidget->InitItem(i, QuestionsEng[i - 1], data);
82 ScrollBox_Result->AddChild(ItemWidget);
83
84 // 마지막 항목이 아니면 Spacer 추가
86 {
87 USpacer* Spacer = NewObject<USpacer>(this);
88 if (Spacer)
89 {
90 Spacer->SetSize(FVector2D(1.0f, ItemSpacing));
91 ScrollBox_Result->AddChild(Spacer);
92 }
93 }
94 }
95}
96
98{
99 Super::NativeConstruct();
100
101 Btn_Confirm->OnButtonClickedEvent.AddDynamic(this, &UPopup_QuestionnaireResult::OnClickClose);
102}
103
105{
106 FResultStatData GradeResultData;
108 GradeResultData.ColorType = EColorStyleType::Gray;
109 GradeResultData.TitleText = FText::FromString(TEXT("Grade"));
110 GradeResultData.GradeTextureType = ULingoGameHelper::ConvertGradeString(InResponseData.grade);
111 Result_Grade->InitData(GradeResultData);
112 PRINTLOG(TEXT("[Popup_Result] Grade: %s"), *(InResponseData.grade));
113
114 FResultStatData TopRateResultData;
115 TopRateResultData.WidgetType = EResultItemWidgetType::Rate;
116 TopRateResultData.ColorType = EColorStyleType::Gray;
117 TopRateResultData.TitleText = FText::FromString(TEXT("Rate"));
118 TopRateResultData.RatePercent = InResponseData.top_percent;
119 Result_TopRate->InitData(TopRateResultData);
120 PRINTLOG(TEXT("[Popup_Result] Rate: %d"), InResponseData.top_percent);
121
122 FResultStatData AverageScoreResultData;
123 AverageScoreResultData.WidgetType = EResultItemWidgetType::Symbol;
124 AverageScoreResultData.ColorType = EColorStyleType::Gray;
125 AverageScoreResultData.TitleText = FText::FromString(TEXT("Score"));
126 AverageScoreResultData.SymbolTextureType = EResourceTextureType::Score;
127 AverageScoreResultData.SymbolValue = FString::Printf(TEXT("%d"), InResponseData.average_score);
128 Result_AverageScore->InitData(AverageScoreResultData);
129 PRINTLOG(TEXT("[Popup_Result] Average Score: %d"), InResponseData.average_score);
130}
131
133{
134 // PopupManager를 통해 팝업 닫기 (마우스 커서 처리 포함)
135 if (UPopupManager* PopupMgr = UPopupManager::Get(GetWorld()))
136 {
137 PopupMgr->HideCurrentPopup();
138 }
139
140 // PlayerController를 통해 서버에 Door 메시지 전송 요청
141 if (APlayerController* PC = GetOwningPlayer())
142 {
143 if (APlayerControl* PlayerControl = Cast<APlayerControl>(PC))
144 {
145 PlayerControl->Server_SendDoorMessage(DoorGroup::Step4_End, true);
146 }
147 }
148}
네트워크 복제를 위한 전역 브로드캐스트 Actor
APlayerControl 선언에 대한 Doxygen 주석을 제공합니다.
YiSan 전반에서 사용하는 공용 인터페이스를 선언합니다.
#define PRINTLOG(fmt,...)
Definition GameLogging.h:30
FQuestWriteInfo WriteQuestionData
static class ALingoPlayerState * GetLingoPlayerState(const UObject *WorldContextObject)
static EResourceTextureType ConvertGradeString(const FString &Grade)
팝업 관리자
void InitItem(int32 index, FString questionKor, const FResponseWriteData &data)
질문 항목 초기화
float ItemSpacing
인터뷰 항목 간 간격 (Spacer Height)
TObjectPtr< class UVerticalBox > ScrollBox_Result
인터뷰 항목들이 추가될 VerticalBox
TSubclassOf< class UPopup_QuestionnaireResultItem > QuestionnaireResultItemClass
팝업 내에서 표시될 인터뷰 항목 위젯 클래스
TObjectPtr< class UResultStatWidget > Result_AverageScore
전체 결과
TObjectPtr< class UImageButton > Btn_Confirm
TObjectPtr< class UResultStatWidget > Result_Grade
void InitPopup(const FResponseWriteSubmit &InResponseData, const FResponseWriteResult &InResponseResultData)
팝업 초기화 (필요 시 API 확장)
virtual void NativeConstruct() override
TObjectPtr< class UResultStatWidget > Result_TopRate
void InitWholeResult(const FResponseWriteResult &ResponseData)
UPopup_QuestionnaireResult(const FObjectInitializer &ObjectInitializer)
static const int32 Step4_End
Definition Onepiece.h:37
TArray< FWriteQuestionData > question
Write Submit 응답 구조체입니다.
TArray< FResponseWriteData > ResponseWriteDataArray
Result Stat 위젯 통합 데이터 구조 위젯 타입, 색상 스타일, 각 타입별 데이터를 통합 관리
EResourceTextureType SymbolTextureType
Symbol 타입 전용: 심볼 문자열
float RatePercent
Rate 타입 전용: 퍼센트 값 (0.0 ~ 1.0)
EColorStyleType ColorType
색상 스타일
FText TitleText
타이틀 텍스트
EResultItemWidgetType WidgetType
위젯 타입
EResourceTextureType GradeTextureType
Grade 타입 전용: 텍스처 타입