using Godot; using System.Collections.Generic; using System.Linq; public partial class DynamicTabManager : TabContainer { private PackedScene itemPanelScene; private PackedScene craftingItemScene; private PackedScene productionLineItemScene; private PackedScene manualCollectionItemScene; public override void _Ready() { GD.Print("DynamicTabManager _Ready 开始"); // 设置标签靠左对齐 TabAlignment = TabBar.AlignmentMode.Left; // 加载ItemPanel场景(用于生产线) itemPanelScene = GD.Load("res://scenes/ItemPanel.tscn"); if (itemPanelScene == null) { GD.PrintErr("无法加载ItemPanel场景"); return; } // 加载CraftingItem场景(用于合成) craftingItemScene = GD.Load("res://scenes/CraftingItem.tscn"); if (craftingItemScene == null) { GD.PrintErr("无法加载CraftingItem场景"); return; } // 加载ProductionLineItem场景(用于生产线) productionLineItemScene = GD.Load("res://scenes/ProductionLineItem.tscn"); if (productionLineItemScene == null) { GD.PrintErr("无法加载ProductionLineItem场景"); return; } // 加载ManualCollectionItem场景(用于手动采集) manualCollectionItemScene = GD.Load("res://scenes/ManualCollectionItem.tscn"); if (manualCollectionItemScene == null) { GD.PrintErr("无法加载ManualCollectionItem场景"); return; } GD.Print("开始初始化标签页"); // 延迟初始化以确保所有管理器都已初始化 CallDeferred(nameof(InitializeTabs)); } public void RefreshTabs() { GD.Print("刷新标签页"); InitializeTabs(); } private void InitializeTabs() { GD.Print("开始创建固定标签页"); // 清空现有标签页 foreach (Node child in GetChildren()) { child.QueueFree(); } // 创建固定的标签页 CreateFixedTabs(); GD.Print("成功创建固定标签页"); } private void CreateFixedTabs() { // 创建"合成"标签 CreateTabForCrafting(); // 创建"生产线"标签 CreateTabForProduction(); } private void CreateTabForCrafting() { GD.Print("创建合成标签"); // 创建合成标签的滚动容器 var scrollContainer = new ScrollContainer(); scrollContainer.Name = "CraftingScroll"; // 创建垂直容器来放置所有分类块 var vboxContainer = new VBoxContainer(); vboxContainer.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill; vboxContainer.SizeFlagsVertical = Control.SizeFlags.ExpandFill; scrollContainer.AddChild(vboxContainer); // 获取所有分类 var categoryManager = ResourceCategoryManager.Instance; if (categoryManager == null) { GD.PrintErr("ResourceCategoryManager 实例为null"); return; } var allCategories = categoryManager.GetAllCategories(); // 为合成相关的分类创建块 foreach (var category in allCategories) { // 合成标签包含:手动采集、冶炼、制作物品、建筑设施 if (category.CategoryName == "手动采集" || category.CategoryName == "冶炼" || category.CategoryName == "制作物品" || category.CategoryName == "建筑设施") { CreateCategoryBlock(vboxContainer, category, "合成"); } } // 添加到TabContainer AddChild(scrollContainer); SetTabTitle(GetTabCount() - 1, "合成"); } private void CreateTabForProduction() { GD.Print("创建生产线标签"); // 创建生产线标签的滚动容器 var scrollContainer = new ScrollContainer(); scrollContainer.Name = "ProductionScroll"; // 创建垂直容器来放置所有分类块 var vboxContainer = new VBoxContainer(); vboxContainer.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill; vboxContainer.SizeFlagsVertical = Control.SizeFlags.ExpandFill; scrollContainer.AddChild(vboxContainer); // 获取生产线管理器 var productionLineManager = ProductionLineManager.Instance; if (productionLineManager == null) { GD.PrintErr("ProductionLineManager 实例为null,创建空的生产线标签"); // 创建一个提示标签 var noDataLabel = new Label(); noDataLabel.Text = "生产线管理器未初始化"; noDataLabel.HorizontalAlignment = HorizontalAlignment.Center; noDataLabel.VerticalAlignment = VerticalAlignment.Center; vboxContainer.AddChild(noDataLabel); // 添加到TabContainer AddChild(scrollContainer); SetTabTitle(GetTabCount() - 1, "生产线"); return; } // 获取所有生产线分类 var categories = productionLineManager.GetAllCategories(); GD.Print($"获取到 {categories.Count} 个生产线分类"); if (categories.Count == 0) { GD.Print("没有找到生产线分类,创建提示标签"); // 创建一个提示标签 var noDataLabel = new Label(); noDataLabel.Text = "暂无生产线配置"; noDataLabel.HorizontalAlignment = HorizontalAlignment.Center; noDataLabel.VerticalAlignment = VerticalAlignment.Center; vboxContainer.AddChild(noDataLabel); } else { // 为每个分类创建块 foreach (var category in categories) { GD.Print($"处理生产线分类: {category}"); CreateProductionCategoryBlock(vboxContainer, category); } } // 添加到TabContainer AddChild(scrollContainer); SetTabTitle(GetTabCount() - 1, "生产线"); GD.Print("生产线标签创建完成"); } private void CreateProductionCategoryBlock(VBoxContainer parentContainer, string category) { GD.Print($"创建生产线分类块: {category}"); // 创建分类块的容器 var categoryContainer = new VBoxContainer(); categoryContainer.Name = $"{category}Block"; // 添加间距 var topSpacer = new Control(); topSpacer.CustomMinimumSize = new Vector2(0, 10); categoryContainer.AddChild(topSpacer); // 创建标题行(分类名称 + 横线) var titleContainer = new HBoxContainer(); // 分类名称标签 var titleLabel = new Label(); titleLabel.Text = category; titleLabel.HorizontalAlignment = HorizontalAlignment.Left; titleContainer.AddChild(titleLabel); // 添加小间距 var labelSpacer = new Control(); labelSpacer.CustomMinimumSize = new Vector2(10, 0); titleContainer.AddChild(labelSpacer); // HSeparator 横线分隔符 var separator = new HSeparator(); separator.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill; separator.SizeFlagsVertical = Control.SizeFlags.ShrinkCenter; titleContainer.AddChild(separator); categoryContainer.AddChild(titleContainer); // 创建流容器来放置生产线(完全按照合成菜单的方式) var flowContainer = new FlowContainer(); flowContainer.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill; categoryContainer.AddChild(flowContainer); // 添加该分类的所有生产线 AddProductionLinesToContainer(flowContainer, category); // 添加到父容器 parentContainer.AddChild(categoryContainer); } private void AddProductionLinesToContainer(FlowContainer container, string category) { GD.Print($"为分类 '{category}' 添加生产线"); var productionLineManager = ProductionLineManager.Instance; if (productionLineManager == null) { GD.PrintErr("ProductionLineManager 实例为null"); return; } // 获取该分类的所有生产线 var productionLines = productionLineManager.GetProductionLinesByCategory(category); GD.Print($"获取到 {productionLines.Count} 条生产线"); foreach (var productionLine in productionLines) { // 创建ProductionLineItem实例 var productionLineItem = productionLineItemScene.Instantiate(); if (productionLineItem == null) { GD.PrintErr($"无法创建ProductionLineItem实例: {productionLine.Name}"); continue; } // 设置生产线数据 productionLineItem.SetupProductionLine(productionLine); // 添加到容器 container.AddChild(productionLineItem); GD.Print($"成功添加生产线: {productionLine.Name}"); } } private void CreateCategoryBlock(VBoxContainer parentContainer, ResourceCategoryManager.ResourceCategory category, string tabType) { GD.Print($"创建分类块: {category.CategoryName}"); // 创建分类块的容器 var categoryContainer = new VBoxContainer(); categoryContainer.Name = $"{category.CategoryName}Block"; // 添加间距 var topSpacer = new Control(); topSpacer.CustomMinimumSize = new Vector2(0, 10); categoryContainer.AddChild(topSpacer); // 创建标题行(分类名称 + 横线) var titleContainer = new HBoxContainer(); // 分类名称标签 var titleLabel = new Label(); titleLabel.Text = category.CategoryName; titleLabel.HorizontalAlignment = HorizontalAlignment.Left; titleContainer.AddChild(titleLabel); // 添加小间距 var labelSpacer = new Control(); labelSpacer.CustomMinimumSize = new Vector2(10, 0); titleContainer.AddChild(labelSpacer); // 使用HSeparator横线分隔符 var separator = new HSeparator(); separator.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill; separator.SizeFlagsVertical = Control.SizeFlags.ShrinkCenter; titleContainer.AddChild(separator); categoryContainer.AddChild(titleContainer); // 创建流容器来放置物品 var flowContainer = new FlowContainer(); flowContainer.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill; categoryContainer.AddChild(flowContainer); // 获取分类中的物品数据 var items = ResourceCategoryManager.Instance?.GetItemsByCategory(category.CategoryName); if (items == null) { GD.PrintErr($"无法获取分类 {category.CategoryName} 的物品数据"); return; } GD.Print($"分类 {category.CategoryName} 包含 {items.Count} 个物品"); // 为每个物品创建对应的面板 foreach (var itemPair in items) { string itemId = itemPair.Key; var itemData = itemPair.Value; string categoryName = category.CategoryName; Control itemPanel; // 手动采集使用新的ManualCollectionItem if (categoryName == "手动采集") { // 使用专门的手动采集场景 itemPanel = manualCollectionItemScene.Instantiate(); if (itemPanel == null) { GD.PrintErr($"无法实例化ManualCollectionItem for {itemId}"); continue; } // 设置手动采集物品数据 var manualCollectionItem = itemPanel as ManualCollectionItem; manualCollectionItem?.SetupItem(itemId, itemData); GD.Print($"为 {itemId} 创建手动采集面板"); } // 其他合成物品根据标签类型选择面板 else if (tabType == "合成") { // 合成标签的非手动采集物品使用CraftingItem itemPanel = craftingItemScene.Instantiate(); if (itemPanel == null) { GD.PrintErr($"无法实例化CraftingItem for {itemId}"); continue; } // 设置合成物品数据 SetupCraftingItem(itemPanel, itemData, categoryName); } else { // 生产线标签使用ItemPanel itemPanel = itemPanelScene.Instantiate(); if (itemPanel == null) { GD.PrintErr($"无法实例化ItemPanel for {itemId}"); continue; } // 判断是否为生产设备 bool isProductionDevice = categoryName != "手动采集"; // 设置物品数据 SetupItemPanel(itemPanel, itemData, isProductionDevice); } // 添加到流容器 flowContainer.AddChild(itemPanel); } // 添加分类块到父容器 parentContainer.AddChild(categoryContainer); GD.Print($"成功创建分类块: {category.CategoryName},包含 {items.Count} 个物品"); } private void SetupItemPanel(Control itemPanel, GameData.ItemData itemData, bool isProductionDevice = true) { try { // 设置图标 var iconTexture = itemPanel.GetNode("MarginContainer/VBoxContainer/TopRow/IconTexture"); if (iconTexture != null && !string.IsNullOrEmpty(itemData.IconPath)) { // 检查文件是否存在 if (ResourceLoader.Exists(itemData.IconPath)) { // 尝试加载为Texture2D资源 var resource = ResourceLoader.Load(itemData.IconPath); if (resource is Texture2D texture) { iconTexture.Texture = texture; GD.Print($"设置图标成功: {itemData.IconPath}"); } else { GD.PrintErr($"资源不是Texture2D类型: {itemData.IconPath}"); LoadDefaultIcon(iconTexture); } } else { GD.Print($"图标文件不存在: {itemData.IconPath},使用默认图标"); LoadDefaultIcon(iconTexture); } } // 设置名称 var nameLabel = itemPanel.GetNode