private void BuildItem(ImGui gui, IFactorioObjectWrapper item) { using (gui.EnterRow()) { gui.BuildFactorioObjectIcon(item.target); gui.BuildText(item.text, wrap: true); } }
public override void Build(ImGui gui) { BuildHeader(gui, "Never Enough Items Explorer"); using (gui.EnterRow()) { if (recent.Count == 0) { gui.AllocateRect(0f, 3f); } for (var i = recent.Count - 1; i >= 0; i--) { var elem = recent[i]; if (gui.BuildFactorioObjectButton(elem, 3f)) { changing = elem; } } } using (gui.EnterGroup(new Padding(0.5f), RectAllocator.LeftRow)) { gui.spacing = 0.2f; gui.BuildFactorioObjectIcon(current, size: 3f); gui.BuildText(current.locName, Font.subheader); gui.allocator = RectAllocator.RightAlign; gui.BuildText(CostAnalysis.GetDisplayCost(current)); var amount = CostAnalysis.Instance.GetItemAmount(current); if (amount != null) { gui.BuildText(amount, wrap: true); } } if (gui.BuildFactorioObjectButton(gui.lastRect, current, SchemeColor.Grey)) { SelectObjectPanel.Select(Database.goods.all, "Select item", SetItem); } using (var split = gui.EnterHorizontalSplit(2)) { split.Next(); gui.BuildText("Production:", Font.subheader); productionList.Build(gui); split.Next(); gui.BuildText("Usages:", Font.subheader); usageList.Build(gui); } CheckChanging(); using (gui.EnterRow()) { gui.BuildText("Legend:"); gui.BuildText("This color is flow (Estimated fraction of item production/consumption)"); gui.DrawRectangle(gui.lastRect, SchemeColor.Primary); gui.BuildText("This color is estimated recipe efficiency"); gui.DrawRectangle(gui.lastRect, SchemeColor.Secondary); } }
protected override void BuildPageTooltip(ImGui gui, ProductionTable contents) { foreach (var link in contents.links) { if (link.amount != 0f) { using (gui.EnterRow()) { gui.BuildFactorioObjectIcon(link.goods); using (gui.EnterGroup(default, RectAllocator.LeftAlign, spacing: 0))
private void BuildIconRow(ImGui gui, IReadOnlyList <FactorioObject> objects, int maxRows) { const int itemsPerRow = 9; var count = objects.Count; if (count == 0) { gui.BuildText("Nothing", color: SchemeColor.BackgroundTextFaint); return; } var arr = new List <FactorioObject>(count); arr.AddRange(objects); arr.Sort(DataUtils.DefaultOrdering); if (count <= maxRows) { for (var i = 0; i < count; i++) { gui.BuildFactorioObjectButtonWithText(arr[i]); } return; } var index = 0; if (count - 1 < (maxRows - 1) * itemsPerRow) { gui.BuildFactorioObjectButtonWithText(arr[0]); index++; } var rows = Math.Min(((count - 1 - index) / itemsPerRow) + 1, maxRows); for (var i = 0; i < rows; i++) { using (gui.EnterRow()) { for (var j = 0; j < itemsPerRow; j++) { if (arr.Count <= index) { return; } gui.BuildFactorioObjectIcon(arr[index++]); } } } if (rows * itemsPerRow < count) { gui.BuildText("... and " + (count - rows * itemsPerRow) + " more"); } }
private void MilestoneDrawer(ImGui gui, FactorioObject element, int index) { using (gui.EnterRow()) { var settings = Project.current.settings; gui.BuildFactorioObjectIcon(element, MilestoneDisplay.None, 3f); gui.BuildText(element.locName); gui.allocator = RectAllocator.RightRow; if (gui.BuildButton(Icon.Close, size: 1f)) { settings.RecordUndo().milestones.Remove(element); Rebuild(); milestoneList.data = settings.milestones; } } if (gui.DoListReordering(gui.lastRect, gui.lastRect, index, out var moveFrom)) { Project.current.settings.RecordUndo().milestones.MoveListElementIndex(moveFrom, index); } }
private void BuildRecipe(RecipeOrTechnology recipe, ImGui gui) { BuildCommon(recipe, gui); using (gui.EnterGroup(contentPadding, RectAllocator.LeftRow)) { gui.BuildIcon(Icon.Time, 2f, SchemeColor.BackgroundText); gui.BuildText(DataUtils.FormatAmount(recipe.time, UnitOfMeasure.Second)); } using (gui.EnterGroup(contentPadding)) { foreach (var ingredient in recipe.ingredients) { BuildItem(gui, ingredient); } if (recipe is Recipe rec) { var waste = rec.RecipeWaste(); if (waste > 0.01f) { var wasteAmount = MathUtils.Round(waste * 100f); var wasteText = ". (Wasting " + wasteAmount + "% of YAFC cost)"; var color = wasteAmount < 90 ? SchemeColor.BackgroundText : SchemeColor.Error; if (recipe.products.Length == 1) { gui.BuildText("YAFC analysis: There are better recipes to create " + recipe.products[0].goods.locName + wasteText, wrap: true, color: color); } else if (recipe.products.Length > 0) { gui.BuildText("YAFC analysis: There are better recipes to create each of the products" + wasteText, wrap: true, color: color); } else { gui.BuildText("YAFC analysis: This recipe wastes useful products. Don't do this recipe.", wrap: true, color: color); } } } if (recipe.flags.HasFlags(RecipeFlags.UsesFluidTemperature)) { gui.BuildText("Uses fluid temperature"); } if (recipe.flags.HasFlags(RecipeFlags.UsesMiningProductivity)) { gui.BuildText("Uses mining productivity"); } if (recipe.flags.HasFlags(RecipeFlags.ScaleProductionWithPower)) { gui.BuildText("Production scaled with power"); } } if (recipe.products.Length > 0 && !(recipe.products.Length == 1 && recipe.products[0].IsSimple && recipe.products[0].goods is Item && recipe.products[0].amount == 1f)) { BuildSubHeader(gui, "Products"); using (gui.EnterGroup(contentPadding)) foreach (var product in recipe.products) { BuildItem(gui, product); } } BuildSubHeader(gui, "Made in"); using (gui.EnterGroup(contentPadding)) BuildIconRow(gui, recipe.crafters, 2); if (recipe.modules.Length > 0) { BuildSubHeader(gui, "Allowed modules"); using (gui.EnterGroup(contentPadding)) BuildIconRow(gui, recipe.modules, 1); } if (recipe is Recipe lockedRecipe && !lockedRecipe.enabled) { BuildSubHeader(gui, "Unlocked by"); using (gui.EnterGroup(contentPadding)) { if (lockedRecipe.technologyUnlock.Count > 2) { BuildIconRow(gui, lockedRecipe.technologyUnlock, 1); } else { foreach (var technology in lockedRecipe.technologyUnlock) { var ingredient = TechnologyScienceAnalysis.Instance.GetMaxTechnologyIngredient(technology); using (gui.EnterRow(allocator: RectAllocator.RightRow)) { gui.spacing = 0f; if (ingredient != null) { gui.BuildFactorioObjectIcon(ingredient.goods); gui.BuildText(DataUtils.FormatAmount(ingredient.amount, UnitOfMeasure.None)); } gui.allocator = RectAllocator.RemainigRow; gui.BuildFactorioObjectButtonWithText(technology); } } } } } }
public override void Build(ImGui gui) { BuildHeader(gui, "Never Enough Items Explorer"); using (gui.EnterRow()) { if (recent.Count == 0) { gui.AllocateRect(0f, 3f); } for (var i = recent.Count - 1; i >= 0; i--) { var elem = recent[i]; if (gui.BuildFactorioObjectButton(elem, 3f)) { changing = elem; } } } using (gui.EnterGroup(new Padding(0.5f), RectAllocator.LeftRow)) { gui.spacing = 0.2f; gui.BuildFactorioObjectIcon(current, size: 3f); gui.BuildText(current.locName, Font.subheader); gui.allocator = RectAllocator.RightAlign; gui.BuildText(CostAnalysis.GetDisplayCost(current)); var amount = CostAnalysis.Instance.GetItemAmount(current); if (amount != null) { gui.BuildText(amount, wrap: true); } } if (gui.BuildFactorioObjectButton(gui.lastRect, current, SchemeColor.Grey)) { SelectObjectPanel.Select(Database.goods.all, "Select item", SetItem); } using (var split = gui.EnterHorizontalSplit(2)) { split.Next(); gui.BuildText("Production:", Font.subheader); productionList.Build(gui); split.Next(); gui.BuildText("Usages:", Font.subheader); usageList.Build(gui); } CheckChanging(); using (gui.EnterRow()) { if (gui.BuildLink("What do colored bars mean?")) { MessageBox.Show("How to read colored bars", "Blue bar means estimated production or comsumption of the thing you selected. Blue bar at 50% means that that recipe produces(consumes) 50% of the product.\n\n" + "Orange bar means estimated recipe efficiency. If it is not full, the recipe looks inefficient to YAFC.\n\n" + "It is possible for a recipe to be efficient but not useful - for example a recipe that produces something that is not useful.\n\n" + "YAFC only estimates things that are required for science recipes. So buildings, belts, weapons, fuel - are not shown in estimations.", "Ok"); } if (gui.BuildCheckBox("Current milestones info", atCurrentMilestones, out atCurrentMilestones, allocator: RectAllocator.RightRow)) { var item = current; current = null; SetItem(item); } } }