local BagGridWidget = {} local UIUtils = require("UI.Utils") local GamePlayUtils = require("GamePlay.Utils") local RoleUtils = require("GamePlay.Utils.RoleUtils") local BuildUtils = require("GamePlay.Utils.BuildUtils") local ESlateVisibility = import("ESlateVisibility") local BlueprintGameplayTagLibrary = import("BlueprintGameplayTagLibrary") local function SetIsSelected(check_box, is_selected) if is_selected == nil then check_box:SetVisibility(ESlateVisibility.Collapsed) else check_box:SetVisibility(ESlateVisibility.Visible) check_box:SetIsChecked(is_selected) end end local function SetItemAndCnt(entry, item_id, item_cnt) if item_id ~= nil then entry.Icon:SetVisibility(ESlateVisibility.SelfHitTestInvisible) local config = GamePlayUtils.GetItemDescConfig(item_id) local x = slua.loadObject(config.IconResource:ToString()) entry.Icon:SetBrushResourceObject(x) else entry.Icon:SetVisibility(ESlateVisibility.Collapsed) end item_cnt = item_cnt or 0 if item_cnt > 0 then entry.Icon:SetVisibility(ESlateVisibility.SelfHitTestInvisible) if item_cnt > 1 then entry.TxtCnt:SetVisibility(ESlateVisibility.SelfHitTestInvisible) else entry.TxtCnt:SetVisibility(ESlateVisibility.Collapsed) end else entry.TxtCnt:SetVisibility(ESlateVisibility.Collapsed) entry.Icon:SetVisibility(ESlateVisibility.Collapsed) end entry.item_id = item_id end local function GetItemMenuContent(item, item_id) local config = GamePlayUtils.GetItemConfigByID(item_id) if config == nil then return {} end local contents = {} local consume_function = function() local inventory = item.inventory inventory:ConsumeItems(item.index, 1) local grid = inventory:GetGridWithIndex(item.index) item:SetData(grid) end local is_food = BlueprintGameplayTagLibrary.HasTag( config.TypeTagContainer, GamePlayUtils.GetGameplayTag("GameItem.Food"), false ) local is_building = BlueprintGameplayTagLibrary.HasTag( config.TypeTagContainer, GamePlayUtils.GetGameplayTag("GameItem.Building"), false ) if is_food then table.insert(contents, {"使用", function() consume_function() RoleUtils.EatFood(item, item_id) end}) end if is_building then table.insert(contents, {"建造", function() if BuildUtils.Build(item, item_id) == true then consume_function() end -- RoleUtils.EatFood(item, item_id) end}) end table.insert(contents, {"丢弃", function() consume_function() end}) return contents end function BagGridWidget:OnInitialized() self.BtnMain.OnClicked:Add(function() self:OnGridClicked() end) self.CheckBox.OnCheckStateChanged:Add(function(is_selected) if self.item == nil then return end self.item.selected = is_selected end) end function BagGridWidget:SetData(grid) if grid == nil then grid = {} end SetIsSelected(self.CheckBox, grid.selected) SetItemAndCnt(self, grid.ItemID, grid.CurrentCount) end function BagGridWidget:SetInventoryInfo(inventory, index) self.index = index self.inventory = inventory end function BagGridWidget:OnDestroy() end function BagGridWidget:OnGridClicked() if not self.item_id then return end local FVector2D = import("Vector2D") local SlateBlueprintLibrary = import("SlateBlueprintLibrary") local geometry = self:GetCachedGeometry() local size = SlateBlueprintLibrary.GetLocalSize(geometry) local center = FVector2D() center.X, center.Y = size.X * 0.5, size.Y * 0.5 local _, viewport_pos = SlateBlueprintLibrary.LocalToViewport(self, geometry, center, nil, nil) UIUtils.ShowWidget(self, "MenuPanel", { viewport_pos, GetItemMenuContent(self, self.item_id) }) end return Class(nil, nil, BagGridWidget)