添加角色信息UI

This commit is contained in:
997146918 2025-07-07 17:19:10 +08:00
parent 142c31a322
commit 34bc37e864
4 changed files with 132 additions and 5 deletions

View File

@ -4,12 +4,95 @@
#include "Widget/CharacterWindow.h" #include "Widget/CharacterWindow.h"
#include "AIGC.h" #include "AIGC.h"
#include "JsonObjectConverter.h"
#include "WebSocketManager.h" #include "WebSocketManager.h"
#include "Widgets/Input/STextComboBox.h"
#define LOCTEXT_NAMESPACE "FAIGCModule"
void SCharacterWindow::Construct(const FArguments& InArgs) void SCharacterWindow::Construct(const FArguments& InArgs)
{ {
ChildSlot[
SNew(SVerticalBox)
+SVerticalBox::Slot()
.AutoHeight()
[
//角色列表
SAssignNew(CharacterComboBox, SComboBox<TSharedPtr<FCharacterInfo>>)
.OptionsSource(&CharacterInfos)
.Content()
[
SNew(STextBlock)
.Text_Lambda([this]() -> FText {
return FText::FromString(SelectedCharacter.name);
})
]
.OnGenerateWidget_Lambda([this](TSharedPtr<FCharacterInfo> CharacterInfo) {
return SNew(STextBlock).Text(FText::FromString(CharacterInfo->name));
})
.OnSelectionChanged_Lambda([this](TSharedPtr<FCharacterInfo> CharacterInfo, ESelectInfo::Type)
{
SelectedCharacter = *CharacterInfo;
this->CharacterWidget_Name->SetInputText(SelectedCharacter.name);
this->CharacterWidget_Age->SetInputText(FString::FromInt(SelectedCharacter.age));
this->CharacterWidget_Personality->SetInputText(SelectedCharacter.personality);
this->CharacterWidget_Profession->SetInputText(SelectedCharacter.profession);
this->CharacterWidget_BG->SetInputText(SelectedCharacter.characterBackground);
this->CharacterWidget_Style->SetInputText(SelectedCharacter.chat_style);
})
]
+SVerticalBox::Slot()
.AutoHeight()
.Padding(0, 10, 0, 0)
[
SAssignNew(CharacterWidget_Name, SConfigItem_Text)
.Title(LOCTEXT("CharacterName", "角色名称"))
.HintText(LOCTEXT("HintCharacterName", "请输入角色名称"))
]
+SVerticalBox::Slot()
.AutoHeight()
.Padding(0, 10, 0, 0)
[
SAssignNew(CharacterWidget_Age, SConfigItem_Text)
.Title(LOCTEXT("CharacterAge", "角色年龄"))
.HintText(LOCTEXT("HintCharacterName", "请输入角色年龄"))
]
+SVerticalBox::Slot()
.AutoHeight()
.Padding(0, 10, 0, 0)
[
SAssignNew(CharacterWidget_Personality, SConfigItem_Text)
.Title(LOCTEXT("CharacterName", "角色性格"))
.HintText(LOCTEXT("HintCharacterName", "请输入角色性格"))
]
+SVerticalBox::Slot()
.AutoHeight()
.Padding(0, 10, 0, 0)
[
SAssignNew(CharacterWidget_Profession, SConfigItem_Text)
.Title(LOCTEXT("CharacterName", "角色职业"))
.HintText(LOCTEXT("HintCharacterName", "请输入角色职业"))
]
+SVerticalBox::Slot()
.AutoHeight()
.Padding(0, 10, 0, 0)
[
SAssignNew(CharacterWidget_BG, SConfigItem_Text)
.Title(LOCTEXT("CharacterName", "角色背景"))
.HintText(LOCTEXT("HintCharacterName", "请输入角色背景"))
]
+SVerticalBox::Slot()
.AutoHeight()
.Padding(0, 10, 0, 0)
[
SAssignNew(CharacterWidget_Style, SConfigItem_Text)
.Title(LOCTEXT("CharacterName", "角色对话风格"))
.HintText(LOCTEXT("HintCharacterName", "请输入角色对话风格"))
]
];
// 注册绘制后回调 // 注册绘制后回调
RegisterActiveTimer(0.f, RegisterActiveTimer(0.f,
FWidgetActiveTimerDelegate::CreateSP( FWidgetActiveTimerDelegate::CreateSP(
@ -48,6 +131,21 @@ void SCharacterWindow::HandleReceiveData(FNetProtocol protocol)
{ {
if (protocol.cmd == FNetCommand::CharacterList) if (protocol.cmd == FNetCommand::CharacterList)
{ {
//刷新角色列表
//解析json角色信息
FJsonObjectConverter::JsonObjectStringToUStruct<FCharacterArray>(
protocol.data,
&Characters,
0, // 检查标志位
0 // 转换标志位
);
CharacterInfos.Empty();
for (auto Character: Characters.characterInfos)
{
CharacterInfos.Add(MakeShareable(new FCharacterInfo(Character)));
}
CharacterComboBox->RefreshOptions();
} }
} }
#undef LOCTEXT_NAMESPACE

View File

@ -51,12 +51,28 @@ USTRUCT()
struct FCharacterInfo struct FCharacterInfo
{ {
GENERATED_BODY() GENERATED_BODY()
UPROPERTY()
int32 id;
UPROPERTY()
FString name; FString name;
UPROPERTY()
int32 age; int32 age;
UPROPERTY()
FString personality; FString personality;
UPROPERTY()
FString profession;
UPROPERTY()
FString characterBackground; FString characterBackground;
UPROPERTY()
FString chat_style; FString chat_style;
}; };
USTRUCT()
struct FCharacterArray
{
GENERATED_BODY()
UPROPERTY()
TArray<FCharacterInfo> characterInfos;
};
USTRUCT() USTRUCT()
struct FNetProtocol struct FNetProtocol

View File

@ -3,6 +3,7 @@
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "ConfigItem_Text.h"
#include "Definations.h" #include "Definations.h"
/** /**
@ -12,12 +13,24 @@ class AIGC_API SCharacterWindow: public SCompoundWidget
{ {
public: public:
SLATE_BEGIN_ARGS(SCharacterWindow) SLATE_BEGIN_ARGS(SCharacterWindow)
: _CharactersJsons()
{} {}
SLATE_ARGUMENT(FString, CharactersJsons)
SLATE_END_ARGS() SLATE_END_ARGS()
void Construct(const FArguments& InArgs); void Construct(const FArguments& InArgs);
EActiveTimerReturnType OnPostPaint(double X, float Arg); EActiveTimerReturnType OnPostPaint(double X, float Arg);
void HandleReceiveData(FNetProtocol protocol); void HandleReceiveData(FNetProtocol protocol);
protected:
TSharedPtr<SComboBox<TSharedPtr<FCharacterInfo>>> CharacterComboBox;
TSharedPtr<SConfigItem_Text> CharacterWidget_Name; //角色名称
TSharedPtr<SConfigItem_Text> CharacterWidget_Age; //角色年龄
TSharedPtr<SConfigItem_Text> CharacterWidget_Personality; //角色性格
TSharedPtr<SConfigItem_Text> CharacterWidget_Profession; //角色专业
TSharedPtr<SConfigItem_Text> CharacterWidget_BG; //角色背景
TSharedPtr<SConfigItem_Text> CharacterWidget_Style; //说话风格
FCharacterArray Characters;
TArray<TSharedPtr<FCharacterInfo>> CharacterInfos;
FCharacterInfo SelectedCharacter;
}; };

View File

@ -23,7 +23,7 @@ public:
void Construct(const FArguments& InArgs); void Construct(const FArguments& InArgs);
FString GetInputText() const { return InputText; } FString GetInputText() const { return InputText; }
void SetInputText(const FString& NewText) { InputText = NewText; }
private: private:
FString InputText; FString InputText;