KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
Popup_QuestionnaireResultItem.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 "GameLogging.h"
7#include "IImageWrapper.h"
8#include "IImageWrapperModule.h"
9#include "Components/Image.h"
10#include "Components/SizeBox.h"
11#include "Components/TextBlock.h"
12#include "Onepiece/Onepiece.h"
13
14void UPopup_QuestionnaireResultItem::InitItem(int32 index, FString questionKor, const FResponseWriteData& data)
15{
16 // 질문 인덱스 설정 (예: "Question.01")
17 if (Text_Index)
18 {
19 FString IndexText = FString::Printf(TEXT("Q%d"), index);
20 Text_Index->SetText(FText::FromString(IndexText));
21 }
22
23 if (Text_Question)
24 {
25 PRINTLOG(TEXT("Question: %s"), *questionKor);
26 Text_Question->SetText(FText::FromString(questionKor));
27 }
28
29 // 이미지 불러와서 적용
30 FString FileName = FString::Printf(TEXT("Answer%d.PNG"), index);
31 UTexture2D* LoadedTexture = LoadTextureFromFile(WriteImagePath / FileName);
32
33 if (LoadedTexture)
34 {
35 // SizeBox 비율 이미지에 맞게 수정
36 const float MaxWidthLimit = 1080.0f;
37 const float TargetHeight = 360.0f;
38
39 const float TextureWidth = static_cast<float>(LoadedTexture->GetSizeX());
40 const float TextureHeight = static_cast<float>(LoadedTexture->GetSizeY());
41 const float AspectRatio = TextureWidth / TextureHeight;
42
43 // 1. 이미지 위젯의 브러시 정보를 가져와서 텍스처와 사이즈를 일치시킴
44 // 이 작업이 빠지면 이미지는 이전 브러시 사이즈(360x360)에 텍스처를 맞춥니다.
45 FSlateBrush NewBrush = Image_Answer->GetBrush();
46 NewBrush.SetResourceObject(LoadedTexture);
47 NewBrush.ImageSize = FVector2D(TextureWidth, TextureHeight); // 브러시 자체 크기를 원본으로 설정
48 Image_Answer->SetBrush(NewBrush);
49
50 float NewWidth = TargetHeight * AspectRatio;
51 float NewHeight = TargetHeight;
52
53 // 가로 제한을 넘을 경우 비율 유지하며 축소
54 if (NewWidth > MaxWidthLimit)
55 {
56 NewWidth = MaxWidthLimit;
57 NewHeight = NewWidth / AspectRatio;
58 }
59
60 // 3. SizeBox의 가로/세로를 모두 명시적으로 고정
61 SizeBox_Answer->SetWidthOverride(NewWidth);
62 SizeBox_Answer->SetHeightOverride(NewHeight);
63
64 Image_Answer->SetBrushFromTexture(LoadedTexture);
65 }
66
67 // 피드백 내용 설정
68 FString Description = FString::Printf(TEXT("%s\n\n[Correction]\n%s"),
69 *data.display.message,
70 *data.display.correction);
71
72 Text_Feedback->SetText(FText::FromString(Description));
73 Text_Feedback->SetLineHeightPercentage( DefineData::LineHeightPercentage );
74}
75
76UTexture2D* UPopup_QuestionnaireResultItem::LoadTextureFromFile(const FString& filePath)
77{
78 TArray<uint8> RawFileData;
79 if (!FFileHelper::LoadFileToArray(RawFileData, *filePath))
80 {
81 PRINTLOG(TEXT("Failed to load file: %s"), *filePath);
82 return nullptr;
83 }
84
85 IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));
86 TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG);
87
88 if (!ImageWrapper.IsValid() || !ImageWrapper->SetCompressed(RawFileData.GetData(), RawFileData.Num()))
89 {
90 PRINTLOG(TEXT("Failed to parse PNG: %s"), *filePath);
91 return nullptr;
92 }
93
94 TArray<uint8> UncompressedBGRA;
95 if (!ImageWrapper->GetRaw(ERGBFormat::BGRA, 8, UncompressedBGRA))
96 {
97 PRINTLOG(TEXT("Failed to decompress PNG: %s"), *filePath);
98 return nullptr;
99 }
100
101 UTexture2D* Texture = UTexture2D::CreateTransient(ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), PF_B8G8R8A8);
102 if (!Texture)
103 {
104 return nullptr;
105 }
106
107 void* TextureData = Texture->GetPlatformData()->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
108 FMemory::Memcpy(TextureData, UncompressedBGRA.GetData(), UncompressedBGRA.Num());
109 Texture->GetPlatformData()->Mips[0].BulkData.Unlock();
110 Texture->UpdateResource();
111
112 return Texture;
113}
YiSan 전반에서 사용하는 공용 인터페이스를 선언합니다.
#define PRINTLOG(fmt,...)
Definition GameLogging.h:30
TObjectPtr< class UTextBlock > Text_Feedback
"What is your current country..." 같은 질문 내용
TObjectPtr< class UImage > Image_Answer
플레이어가 작성한 답안 이미지
TObjectPtr< class USizeBox > SizeBox_Answer
UTexture2D * LoadTextureFromFile(const FString &filePath)
void InitItem(int32 index, FString questionKor, const FResponseWriteData &data)
질문 항목 초기화
TObjectPtr< class UTextBlock > Text_Question
TObjectPtr< class UTextBlock > Text_Index
"Question.01" 같은 질문 인덱스
static const float LineHeightPercentage
Definition Onepiece.h:63
FWriteDisplay display
FString correction
FString message