From bda98b0cceb1d5b072b2e876bebc231b5775a4cf Mon Sep 17 00:00:00 2001 From: wyatt Date: Tue, 19 Aug 2025 03:24:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E4=B8=8A=E4=B8=80=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... --- .../Lua/GamePlay/CookSystem/CookManager.lua | 4 + .../Private/BusyGamePlayLibrary.cpp | 7 ++ .../BusyRabbit/Private/Core/UI/PW_UILayer.cpp | 103 ++++++++++++------ 3 files changed, 78 insertions(+), 36 deletions(-) diff --git a/Content/Lua/GamePlay/CookSystem/CookManager.lua b/Content/Lua/GamePlay/CookSystem/CookManager.lua index 96f86bc..4da8105 100644 --- a/Content/Lua/GamePlay/CookSystem/CookManager.lua +++ b/Content/Lua/GamePlay/CookSystem/CookManager.lua @@ -81,9 +81,13 @@ function CookManager:CheckFinishStatus() end function CookManager:AddCookMaterial(cook_material_id, is_auto_push) + local BusyGamePlayLibrary = import("BusyGamePlayLibrary") + local config = Utils.GetDataTableConfig( "CookMaterialStateConfig", cook_material_id ) + BusyGamePlayLibrary.SetTest(config) + print("?>????", config) if not config then print("ERROR: can't find ", cook_material_id, " in CookMaterialStateConfig") return diff --git a/Source/BusyRabbit/Private/BusyGamePlayLibrary.cpp b/Source/BusyRabbit/Private/BusyGamePlayLibrary.cpp index eb3d768..0c9d8d4 100644 --- a/Source/BusyRabbit/Private/BusyGamePlayLibrary.cpp +++ b/Source/BusyRabbit/Private/BusyGamePlayLibrary.cpp @@ -82,3 +82,10 @@ bool UBusyGamePlayLibrary::GetItemDescription(const FName& RowName, FBusyItemDes bool UBusyGamePlayLibrary::GetCookMaterialStateConfig(const FName& RowName, FBusyCookMaterialStateConfig& RowData){ return GetTableConfig(TEXT("CookMaterialStateConfig"), RowName, RowData); } + +FLuaBPVar UBusyGamePlayLibrary::TestTable(const FName& RowName){ + UDataTable* Table = UBusyGamePlayLibrary::GetGameDataTable("CookMaterialStateConfig"); + auto Config = Table->FindRow(RowName, "", true); + + return FLuaBPVar(); +} diff --git a/Source/BusyRabbit/Private/Core/UI/PW_UILayer.cpp b/Source/BusyRabbit/Private/Core/UI/PW_UILayer.cpp index e2506fc..1c6f84d 100644 --- a/Source/BusyRabbit/Private/Core/UI/PW_UILayer.cpp +++ b/Source/BusyRabbit/Private/Core/UI/PW_UILayer.cpp @@ -7,51 +7,82 @@ #include "Components/OverlaySlot.h" +bool UPW_UILayer::PushWidget(UPW_UserWidget* WidgetInst){ + UOverlay* Overlay; + UOverlaySlot* OverlaySlot; -UPW_UserWidget* UPW_UILayer::ShowWidget(const FName& WidgetName){ - UPW_UserWidget **result = WidgetPool.Find(WidgetName); - if (result == nullptr) { - return nullptr; - } - UPW_UserWidget* Widget = *result; - if (Widget == nullptr) { - return nullptr; - } - Widget->SetVisible(true); - return Widget; -} + Overlay = _GetOverlayByLayerType(WidgetInst->LayoutType); + if (!Overlay) return false; -bool UPW_UILayer::HideWidget(const FName& WidgetName){ - UPW_UserWidget* Widget = *WidgetPool.Find(WidgetName); - if (Widget == nullptr) { - return false; + Overlay->AddChild(WidgetInst); + OverlaySlot = Cast(WidgetInst->Slot); + if (!OverlaySlot) return false; + + OverlaySlot->SetVerticalAlignment(EVerticalAlignment::VAlign_Fill); + OverlaySlot->SetHorizontalAlignment(EHorizontalAlignment::HAlign_Fill); + + // 隐藏这个层级下,除新push的所有widget + auto AllOverlayChildren = Overlay->GetAllChildren(); + for (int i = 0; i < AllOverlayChildren.Num() - 1; ++i) { + UPW_UserWidget* Child = Cast(AllOverlayChildren[i]); + if (!Child) continue; + Child->FrameWorkSetVisible(false); } - Widget->SetVisible(false); + + WidgetInst->FrameWorkSetVisible(true); return true; } -bool UPW_UILayer::PushWidget(const FName& WidgetName, UPW_UserWidget* WidgetInst){ +void UPW_UILayer::PopWidget(const UPW_UserWidget* WidgetInst){ UOverlay* Overlay; - UOverlaySlot* OverlaySlot; - switch (WidgetInst->LayoutType) { - case EWidgetLayoutType::MainLayer: Overlay = MainLayer; break; - case EWidgetLayoutType::PopupLayer: Overlay = PopupLayer; break; - case EWidgetLayoutType::FloatLayer: Overlay = FloatLayer; break; - case EWidgetLayoutType::TopLayer: Overlay = TopLayer; break; - default: return false; + bool bNeedRemove; + int32 i, OverlayWidgetCount; + UPW_UserWidget* Child, * NeedShowWidget; + TArray AllOverlayChildren; + TArray NeedRemoveWidgets; + + bNeedRemove = true; + NeedShowWidget = nullptr; + + Overlay = _GetOverlayByLayerType(WidgetInst->LayoutType); + if (!Overlay) return; + + AllOverlayChildren = Overlay->GetAllChildren(); + OverlayWidgetCount = AllOverlayChildren.Num(); + + for (i = OverlayWidgetCount - 1; i >= 0; --i) { + Child = Cast(AllOverlayChildren[i]); + if (!Child) continue; + if(bNeedRemove){ + NeedRemoveWidgets.Add(Child); + } + else if(Child->bVisible) { + NeedShowWidget = Child; + break; + } + if (Child == WidgetInst) { + bNeedRemove = false; + } } - Overlay->AddChild(WidgetInst); - if ((OverlaySlot = Cast(WidgetInst->Slot))) { - OverlaySlot->SetVerticalAlignment(EVerticalAlignment::VAlign_Fill); - OverlaySlot->SetHorizontalAlignment(EHorizontalAlignment::HAlign_Fill); - WidgetInst->SetVisible(true); - WidgetPool.Add(WidgetName, WidgetInst); - return true; - } else { - return false; + for (i = 0; i < NeedRemoveWidgets.Num(); ++i) { + NeedRemoveWidgets[i]->RemoveFromParent(); + } + if (NeedShowWidget) { + NeedShowWidget->FrameWorkSetVisible(true); } } -bool UPW_UILayer::PopWidget(const FName& WidgetName){ - return HideWidget(WidgetName); +UOverlay* UPW_UILayer::_GetOverlayByLayerType(EWidgetLayoutType InLayoutType){ + switch (LayoutType) { + case EWidgetLayoutType::MainLayer: + return MainLayer; + case EWidgetLayoutType::PopupLayer: + return PopupLayer; + case EWidgetLayoutType::FloatLayer: + return FloatLayer; + case EWidgetLayoutType::TopLayer: + return TopLayer; + default: + return nullptr; + } }