Files
UE5-cyberHuman/Plugins/OpenAi/Source/OpenAIEditor/Private/UI/ChatMessageWidget.cpp
2025-04-07 18:31:41 -07:00

76 lines
2.3 KiB
C++

// OpenAI, Copyright LifeEXE. All Rights Reserved.
#include "UI/ChatMessageWidget.h"
#include "Components/MultiLineEditableText.h"
#include "Components/TextBlock.h"
#include "Components/Border.h"
#include "Components/WidgetSwitcher.h"
#include "Components/HorizontalBox.h"
#include "Components/HorizontalBoxSlot.h"
#include "FuncLib/OpenAIFuncLib.h"
#include "UI/ImagePreviewWidget.h"
namespace
{
const FMargin ImageMargin = FMargin{20.0f};
} // namespace
void UChatMessageWidget::SetMessage(const FMessage& Message, bool WasError)
{
RoleTextBox->SetText(FText::FromString(Message.Role));
FString UserMessage{};
if (Message.Content.IsEmpty())
{
for (const auto& Content : Message.ContentArray)
{
if (Content.Type.Equals(UOpenAIFuncLib::OpenAIMessageContentTypeToString(EMessageContentType::Text)))
{
UserMessage.Append(Content.Text);
}
else if (Content.Type.Equals(UOpenAIFuncLib::OpenAIMessageContentTypeToString(EMessageContentType::Image_URL)))
{
if (auto* ImageWidget = CreateWidget<UImagePreviewWidget>(GetWorld(), ImagePreviewWidgetClass))
{
ImageWidget->SetBase64(Content.Image_URL.URL);
ImageHorizontalBox->AddChild(ImageWidget);
if (auto* ImageSlot = Cast<UHorizontalBoxSlot>(ImageWidget->Slot))
{
ImageSlot->SetPadding(ImageMargin);
}
ImageWidgets.Add(ImageWidget);
}
}
}
}
else
{
UserMessage = Message.Content;
}
MessageText->SetText(FText::FromString(UserMessage));
const auto Role = UOpenAIFuncLib::StringToOpenAIRole(Message.Role);
if (WasError)
{
MainBorder->SetBrushColor(ErrorColor);
}
else if (ColorMap.Contains(Role))
{
MainBorder->SetBrushColor(ColorMap[Role]);
}
else
{
MainBorder->SetBrushColor(DefaultColor);
}
const FDateTime Date = FDateTime::Now();
const FString DisplayDate = FString::Printf(TEXT("%02i:%02i"), Date.GetHour(), Date.GetMinute());
TimeTextBox->SetText(FText::FromString(DisplayDate));
if (!UserMessage.IsEmpty() || !ImageWidgets.IsEmpty())
{
WidgetSwitcher->SetActiveWidgetIndex(1);
}
}