130 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
		
		
			
		
	
	
			130 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
|  | 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) |