From 34bc37e864e1ba4ac4504e5d5f587fe064d7b776 Mon Sep 17 00:00:00 2001 From: 997146918 <997146918@qq.com> Date: Mon, 7 Jul 2025 17:19:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A7=92=E8=89=B2=E4=BF=A1?= =?UTF-8?q?=E6=81=AFUI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AIGC/Private/Widget/CharacterWindow.cpp | 102 +++++++++++++++++- .../AIGC/Source/AIGC/Public/Definations.h | 16 +++ .../AIGC/Public/Widget/CharacterWindow.h | 17 ++- .../AIGC/Public/Widget/ConfigItem_Text.h | 2 +- 4 files changed, 132 insertions(+), 5 deletions(-) diff --git a/TestForAIGC/Plugins/AIGC/Source/AIGC/Private/Widget/CharacterWindow.cpp b/TestForAIGC/Plugins/AIGC/Source/AIGC/Private/Widget/CharacterWindow.cpp index 01b4b01..262858e 100644 --- a/TestForAIGC/Plugins/AIGC/Source/AIGC/Private/Widget/CharacterWindow.cpp +++ b/TestForAIGC/Plugins/AIGC/Source/AIGC/Private/Widget/CharacterWindow.cpp @@ -4,12 +4,95 @@ #include "Widget/CharacterWindow.h" #include "AIGC.h" +#include "JsonObjectConverter.h" #include "WebSocketManager.h" - +#include "Widgets/Input/STextComboBox.h" +#define LOCTEXT_NAMESPACE "FAIGCModule" void SCharacterWindow::Construct(const FArguments& InArgs) { + + ChildSlot[ + SNew(SVerticalBox) + +SVerticalBox::Slot() + .AutoHeight() + [ + //角色列表 + SAssignNew(CharacterComboBox, SComboBox>) + .OptionsSource(&CharacterInfos) + .Content() + [ + SNew(STextBlock) + .Text_Lambda([this]() -> FText { + + return FText::FromString(SelectedCharacter.name); + }) + ] + .OnGenerateWidget_Lambda([this](TSharedPtr CharacterInfo) { + return SNew(STextBlock).Text(FText::FromString(CharacterInfo->name)); + }) + .OnSelectionChanged_Lambda([this](TSharedPtr 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, FWidgetActiveTimerDelegate::CreateSP( @@ -48,6 +131,21 @@ void SCharacterWindow::HandleReceiveData(FNetProtocol protocol) { if (protocol.cmd == FNetCommand::CharacterList) { - //刷新角色列表 + + //解析json角色信息 + FJsonObjectConverter::JsonObjectStringToUStruct( + protocol.data, + &Characters, + 0, // 检查标志位 + 0 // 转换标志位 + ); + CharacterInfos.Empty(); + for (auto Character: Characters.characterInfos) + { + CharacterInfos.Add(MakeShareable(new FCharacterInfo(Character))); + } + CharacterComboBox->RefreshOptions(); } } + +#undef LOCTEXT_NAMESPACE \ No newline at end of file diff --git a/TestForAIGC/Plugins/AIGC/Source/AIGC/Public/Definations.h b/TestForAIGC/Plugins/AIGC/Source/AIGC/Public/Definations.h index 2c2163c..f5adbb1 100644 --- a/TestForAIGC/Plugins/AIGC/Source/AIGC/Public/Definations.h +++ b/TestForAIGC/Plugins/AIGC/Source/AIGC/Public/Definations.h @@ -51,12 +51,28 @@ USTRUCT() struct FCharacterInfo { GENERATED_BODY() + UPROPERTY() + int32 id; + UPROPERTY() FString name; + UPROPERTY() int32 age; + UPROPERTY() FString personality; + UPROPERTY() + FString profession; + UPROPERTY() FString characterBackground; + UPROPERTY() FString chat_style; }; +USTRUCT() +struct FCharacterArray +{ + GENERATED_BODY() + UPROPERTY() + TArray characterInfos; +}; USTRUCT() struct FNetProtocol diff --git a/TestForAIGC/Plugins/AIGC/Source/AIGC/Public/Widget/CharacterWindow.h b/TestForAIGC/Plugins/AIGC/Source/AIGC/Public/Widget/CharacterWindow.h index 48b23e5..6c39e50 100644 --- a/TestForAIGC/Plugins/AIGC/Source/AIGC/Public/Widget/CharacterWindow.h +++ b/TestForAIGC/Plugins/AIGC/Source/AIGC/Public/Widget/CharacterWindow.h @@ -3,6 +3,7 @@ #pragma once #include "CoreMinimal.h" +#include "ConfigItem_Text.h" #include "Definations.h" /** @@ -12,12 +13,24 @@ class AIGC_API SCharacterWindow: public SCompoundWidget { public: SLATE_BEGIN_ARGS(SCharacterWindow) - : _CharactersJsons() {} - SLATE_ARGUMENT(FString, CharactersJsons) + SLATE_END_ARGS() void Construct(const FArguments& InArgs); EActiveTimerReturnType OnPostPaint(double X, float Arg); void HandleReceiveData(FNetProtocol protocol); +protected: + TSharedPtr>> CharacterComboBox; + TSharedPtr CharacterWidget_Name; //角色名称 + TSharedPtr CharacterWidget_Age; //角色年龄 + TSharedPtr CharacterWidget_Personality; //角色性格 + TSharedPtr CharacterWidget_Profession; //角色专业 + TSharedPtr CharacterWidget_BG; //角色背景 + TSharedPtr CharacterWidget_Style; //说话风格 + + + FCharacterArray Characters; + TArray> CharacterInfos; + FCharacterInfo SelectedCharacter; }; diff --git a/TestForAIGC/Plugins/AIGC/Source/AIGC/Public/Widget/ConfigItem_Text.h b/TestForAIGC/Plugins/AIGC/Source/AIGC/Public/Widget/ConfigItem_Text.h index c6c4a2c..5867d00 100644 --- a/TestForAIGC/Plugins/AIGC/Source/AIGC/Public/Widget/ConfigItem_Text.h +++ b/TestForAIGC/Plugins/AIGC/Source/AIGC/Public/Widget/ConfigItem_Text.h @@ -23,7 +23,7 @@ public: void Construct(const FArguments& InArgs); FString GetInputText() const { return InputText; } - + void SetInputText(const FString& NewText) { InputText = NewText; } private: FString InputText;