From a66065abae513669de593722b301723a8dea518d Mon Sep 17 00:00:00 2001 From: 997146918 <997146918@qq.com> Date: Sun, 31 Aug 2025 15:59:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=83=8C=E5=8C=85=E9=85=8D?= =?UTF-8?q?=E7=BD=AEUI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Private/Widgets/BagConfigEditorWidget.cpp | 62 +++++++------ .../Private/Widgets/SkillListWidget.cpp | 90 +++++++++++++++++++ .../Public/Widgets/BagConfigEditorWidget.h | 10 ++- .../Public/Widgets/BagConfigGridWidget.h | 2 +- .../Public/Widgets/SkillListWidget.h | 57 ++++++++++++ 5 files changed, 188 insertions(+), 33 deletions(-) create mode 100644 ProjectFish/Source/ProjectFishEditor/Private/Widgets/SkillListWidget.cpp create mode 100644 ProjectFish/Source/ProjectFishEditor/Public/Widgets/SkillListWidget.h diff --git a/ProjectFish/Source/ProjectFishEditor/Private/Widgets/BagConfigEditorWidget.cpp b/ProjectFish/Source/ProjectFishEditor/Private/Widgets/BagConfigEditorWidget.cpp index 38dfe32..3cea01a 100644 --- a/ProjectFish/Source/ProjectFishEditor/Private/Widgets/BagConfigEditorWidget.cpp +++ b/ProjectFish/Source/ProjectFishEditor/Private/Widgets/BagConfigEditorWidget.cpp @@ -8,6 +8,7 @@ #include "ProjectFish/DataAsset/BagShapeAsset.h" #include "Widgets/BagConfigGridWidget.h" #include "Widgets/BagShapeGridWidget.h" +#include "Widgets/SkillListWidget.h" #include "Widgets/Notifications/SNotificationList.h" @@ -194,30 +195,30 @@ void SBagConfigEditorWidget::Construct(const FArguments& InArgs) ] ] - // // 右侧:技能列表 - // + SSplitter::Slot() - // .Value(0.3f) - // [ - // SNew(SVerticalBox) - // - // + SVerticalBox::Slot() - // .AutoHeight() - // .Padding(5.0f) - // [ - // SNew(STextBlock) - // .Text(FText::FromString(TEXT("Placed Skills:"))) - // .Font(FCoreStyle::GetDefaultFontStyle("Bold", 12)) - // ] - // - // + SVerticalBox::Slot() - // .FillHeight(1.0f) - // .Padding(5.0f) - // [ - // SAssignNew(SkillListWidget, SSkillListWidget) - // .BagClass(BagClass.Get()) - // .OnSkillSelected(this, &SBagClassEditor::OnSkillSelected) - // ] - // ] + // 右侧:技能列表 + + SSplitter::Slot() + .Value(0.3f) + [ + SNew(SVerticalBox) + + + SVerticalBox::Slot() + .AutoHeight() + .Padding(5.0f) + [ + SNew(STextBlock) + .Text(FText::FromString(TEXT("已添加技能:"))) + .Font(FCoreStyle::GetDefaultFontStyle("Bold", 12)) + ] + + + SVerticalBox::Slot() + .FillHeight(1.0f) + .Padding(5.0f) + [ + SAssignNew(SkillListWidget, SSkillListWidget) + .BagConfig(BagConfig.Get()) + .OnSkillSelected(this, &SBagConfigEditorWidget::OnSkillSelected) + ] + ] ] ]; @@ -320,6 +321,11 @@ void SBagConfigEditorWidget::OnSkillAssetChanged(const FAssetData& AssetData) SelectedSkillAsset = Cast(AssetData.GetAsset()); } +void SBagConfigEditorWidget::OnSkillSelected(int32 SkillIndex) +{ + SelectedSkillIndex = SkillIndex; +} + void SBagConfigEditorWidget::OnGridCellClicked(int32 X, int32 Y) { if (!BagConfig.IsValid()) @@ -372,10 +378,10 @@ void SBagConfigEditorWidget::RefreshUI() BagGridWidget->RefreshGrid(); } - // if (SkillListWidget.IsValid()) - // { - // SkillListWidget->RefreshSkillList(); - // } + if (SkillListWidget.IsValid()) + { + SkillListWidget->RefreshSkillList(); + } } void SBagConfigEditorWidget::ShowWarningMessage(const FString& Message) diff --git a/ProjectFish/Source/ProjectFishEditor/Private/Widgets/SkillListWidget.cpp b/ProjectFish/Source/ProjectFishEditor/Private/Widgets/SkillListWidget.cpp new file mode 100644 index 0000000..1a476ad --- /dev/null +++ b/ProjectFish/Source/ProjectFishEditor/Private/Widgets/SkillListWidget.cpp @@ -0,0 +1,90 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "Widgets/SkillListWidget.h" + + + +void SSkillListWidget::Construct(const FArguments& InArgs) +{ + BagConfig = InArgs._BagConfig; + OnSkillSelected = InArgs._OnSkillSelected; + SelectedSkillIndex = -1; + + ChildSlot + [ + SNew(SBox) + .MinDesiredWidth(200.0f) + .MinDesiredHeight(300.0f) + [ + SAssignNew(SkillListView, SListView>) + .ItemHeight(24.0f) + .ListItemsSource(&SkillIndices) + .OnGenerateRow(this, &SSkillListWidget::OnGenerateSkillRow) + .OnSelectionChanged(this, &SSkillListWidget::OnSkillSelectionChanged) + ] + ]; + + RefreshSkillList(); +} + +void SSkillListWidget::RefreshSkillList() +{ + SkillIndices.Empty(); + + if (BagConfig.IsValid()) + { + for (int32 i = 0; i < BagConfig->PlacedSkills.Num(); i++) + { + SkillIndices.Add(MakeShareable(new int32(i))); + } + } + + if (SkillListView.IsValid()) + { + SkillListView->RequestListRefresh(); + } +} + +TSharedRef SSkillListWidget::OnGenerateSkillRow(TSharedPtr SkillIndex, + const TSharedRef& OwnerTable) +{ + return SNew(STableRow>, OwnerTable) + [ + SNew(STextBlock) + .Text(this, &SSkillListWidget::GetSkillDisplayText, *SkillIndex) + ]; +} + +void SSkillListWidget::OnSkillSelectionChanged(TSharedPtr SelectedItem, ESelectInfo::Type SelectInfo) +{ + if (SelectedItem.IsValid()) + { + SelectedSkillIndex = *SelectedItem; + OnSkillSelected.ExecuteIfBound(SelectedSkillIndex); + } + else + { + SelectedSkillIndex = -1; + OnSkillSelected.ExecuteIfBound(-1); + } +} + +FText SSkillListWidget::GetSkillDisplayText(int32 SkillIndex) const +{ + if (!BagConfig.IsValid() || SkillIndex < 0 || SkillIndex >= BagConfig->PlacedSkills.Num()) + { + return FText::FromString(TEXT("Invalid Skill")); + } + + const FPlacedSkillInfo& PlacedSkill = BagConfig->PlacedSkills[SkillIndex]; + if (!PlacedSkill.SkillAsset) + { + return FText::FromString(TEXT("Invalid Skill")); + } + + return FText::FromString(FString::Printf(TEXT("%s at (%d,%d)"), + *PlacedSkill.SkillAsset->SkillName.ToString(), + PlacedSkill.PositionX, + PlacedSkill.PositionY)); +} diff --git a/ProjectFish/Source/ProjectFishEditor/Public/Widgets/BagConfigEditorWidget.h b/ProjectFish/Source/ProjectFishEditor/Public/Widgets/BagConfigEditorWidget.h index 37ca0b1..9f0f30f 100644 --- a/ProjectFish/Source/ProjectFishEditor/Public/Widgets/BagConfigEditorWidget.h +++ b/ProjectFish/Source/ProjectFishEditor/Public/Widgets/BagConfigEditorWidget.h @@ -35,7 +35,7 @@ private: // UI组件 TSharedPtr BagGridWidget; - //TSharedPtr SkillListWidget; + TSharedPtr SkillListWidget; // 回调函数 FReply OnAddSkillClicked(); @@ -48,9 +48,9 @@ private: // 技能选择回调 void OnSkillAssetChanged(const FAssetData& AssetData); - // // 技能选择回调 - // void OnSkillSelected(int32 SkillIndex); - // + // 技能选择回调 + void OnSkillSelected(int32 SkillIndex); + // 格子点击回调 void OnGridCellClicked(int32 X, int32 Y); @@ -66,3 +66,5 @@ private: + + diff --git a/ProjectFish/Source/ProjectFishEditor/Public/Widgets/BagConfigGridWidget.h b/ProjectFish/Source/ProjectFishEditor/Public/Widgets/BagConfigGridWidget.h index 2ba04ad..d4f140d 100644 --- a/ProjectFish/Source/ProjectFishEditor/Public/Widgets/BagConfigGridWidget.h +++ b/ProjectFish/Source/ProjectFishEditor/Public/Widgets/BagConfigGridWidget.h @@ -61,7 +61,7 @@ private: FVector2D GetGridCellFromPosition(const FVector2D& Position) const; bool IsValidGridPosition(int32 X, int32 Y) const; FLinearColor GetCellColor(int32 X, int32 Y) const; - // int32 GetSkillAtPosition(int32 X, int32 Y) const; + }; inline FVector2D SBagConfigGridWidget::GetCellPosition(int32 X, int32 Y) const diff --git a/ProjectFish/Source/ProjectFishEditor/Public/Widgets/SkillListWidget.h b/ProjectFish/Source/ProjectFishEditor/Public/Widgets/SkillListWidget.h new file mode 100644 index 0000000..7eae258 --- /dev/null +++ b/ProjectFish/Source/ProjectFishEditor/Public/Widgets/SkillListWidget.h @@ -0,0 +1,57 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "ProjectFish/DataAsset/BagConfigAsset.h" + +/** + * + */ +DECLARE_DELEGATE_OneParam(FOnSkillSelected, int32); + +class SSkillListWidget : public SCompoundWidget +{ +public: + SLATE_BEGIN_ARGS(SSkillListWidget) {} + SLATE_ARGUMENT(UBagConfigAsset*, BagConfig) + SLATE_EVENT(FOnSkillSelected, OnSkillSelected) +SLATE_END_ARGS() + +void Construct(const FArguments& InArgs); + + // // 设置背包类 + // void SetBagClass(UBagConfigAsset* InBagClass); + + // 刷新技能列表 + void RefreshSkillList(); + // + // // 获取选中的技能索引 + // int32 GetSelectedSkillIndex() const { return SelectedSkillIndex; } + // + // // 设置选中的技能 + // void SetSelectedSkill(int32 SkillIndex); + +private: + // 背包类引用 + TWeakObjectPtr BagConfig; + + // 回调委托 + FOnSkillSelected OnSkillSelected; + + // 选中的技能索引 + int32 SelectedSkillIndex; + + // UI组件 + TSharedPtr>> SkillListView; + TArray> SkillIndices; + + // 列表项生成函数 + TSharedRef OnGenerateSkillRow(TSharedPtr SkillIndex, const TSharedRef& OwnerTable); + + // 选择改变回调 + void OnSkillSelectionChanged(TSharedPtr SelectedItem, ESelectInfo::Type SelectInfo); + + // 创建技能显示文本 + FText GetSkillDisplayText(int32 SkillIndex) const; +};