Skip to content

Commit

Permalink
Merge branch 'master' into build-amount-v2
Browse files Browse the repository at this point in the history
  • Loading branch information
veger committed Dec 7, 2022
2 parents 5a0e37e + 7e7225e commit f87cf71
Show file tree
Hide file tree
Showing 36 changed files with 1,612 additions and 755 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ obj/
desktop.ini
Build/
*DotSettings
*DotSettings.user
*DotSettings.user
.vs
2 changes: 1 addition & 1 deletion CommandLineToolExample/CommandLineToolExample.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<TargetFramework>netcoreapp6.0</TargetFramework>
<RootNamespace>YafcCommandLineToolExample</RootNamespace>
<LangVersion>8</LangVersion>
<OutputType>Exe</OutputType>
Expand Down
83 changes: 51 additions & 32 deletions YAFC/Widgets/DataGrid.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,43 +5,68 @@

namespace YAFC.UI
{
public class DataColumn<TData>
public abstract class DataColumn<TData>
{
public readonly Action<ImGui, TData> build;
public readonly GuiBuilder menuBuilder;
public readonly string header;
public readonly float minWidth;
public readonly float maxWidth;
public readonly bool isFixedSize;
public float width;

public DataColumn(string header, Action<ImGui, TData> build, GuiBuilder menuBuilder, float width, float minWidth = 0f, float maxWidth = 0f)
public DataColumn(float width, float minWidth = 0f, float maxWidth = 0f)
{
this.build = build;
this.menuBuilder = menuBuilder;

this.header = header;
this.width = width;
this.minWidth = minWidth == 0f ? width : minWidth;
this.maxWidth = maxWidth == 0f ? width : maxWidth;
isFixedSize = minWidth == maxWidth;
}

public abstract void BuildHeader(ImGui gui);
public abstract void BuildElement(ImGui gui, TData data);
}


public abstract class TextDataColumn<TData> : DataColumn<TData>
{
public readonly string header;
private readonly bool hasMenu;

protected TextDataColumn(string header, float width, float minWidth = 0, float maxWidth = 0, bool hasMenu = false) : base(width, minWidth, maxWidth)
{
this.header = header;
this.hasMenu = hasMenu;
}
public override void BuildHeader(ImGui gui)
{
gui.BuildText(header);
if (hasMenu)
{
var rect = gui.statePosition;
var menuRect = new Rect(rect.Right-1.7f, rect.Y, 1.5f, 1.5f);
if (gui.isBuilding)
gui.DrawIcon(menuRect, Icon.DropDown, SchemeColor.BackgroundText);
if (gui.BuildButton(menuRect, SchemeColor.None, SchemeColor.Grey))
gui.ShowDropDown(menuRect, BuildMenu, new Padding(1f));
}
}

public virtual void BuildMenu(ImGui gui) {}
}

public class DataGrid<TData> where TData:class
{
private readonly DataColumn<TData>[] columns;
public readonly List<DataColumn<TData>> columns;
private readonly Padding innerPadding = new Padding(0.2f);
public float width { get; private set; }
private readonly float spacing;
private Vector2 buildingStart;
private ImGui contentGui;
public float headerHeight = 1.3f;

public DataGrid(DataColumn<TData>[] columns)
public DataGrid(params DataColumn<TData>[] columns)
{
this.columns = columns;
this.columns = new List<DataColumn<TData>>(columns);
spacing = innerPadding.left + innerPadding.right;
}


private void BuildHeaderResizer(ImGui gui, DataColumn<TData> column, Rect rect)
{
Expand Down Expand Up @@ -83,34 +108,26 @@ public void BuildHeader(ImGui gui)
var x = 0f;
var topSeparator = gui.AllocateRect(0f, 0.1f);
var y = gui.statePosition.Y;
using (var group = gui.EnterFixedPositioning(0f, 1f, innerPadding))
using (var group = gui.EnterFixedPositioning(0f, headerHeight, innerPadding))
{
foreach (var column in columns)
for (var index = 0; index < columns.Count; index++) // Do not change to foreach
{
var column = columns[index];
if (column.width < column.minWidth)
column.width = column.minWidth;
var rect = new Rect(x, y, column.width, 0f);
group.SetManualRectRaw(rect, RectAllocator.LeftRow);
gui.BuildText(column.header);
@group.SetManualRectRaw(rect, RectAllocator.LeftRow);
column.BuildHeader(gui);
rect.Bottom = gui.statePosition.Y;
x += column.width + spacing;

if (!column.isFixedSize)
{
BuildHeaderResizer(gui, column, new Rect(x-0.7f, y, 1f, 2.2f));
}

if (column.menuBuilder != null)
{
var menuRect = new Rect(rect.Right-1.7f, rect.Y + 0.3f, 1.5f, 1.5f);
if (gui.isBuilding)
gui.DrawIcon(menuRect, Icon.DropDown, SchemeColor.BackgroundText);
if (gui.BuildButton(menuRect, SchemeColor.None, SchemeColor.Grey))
gui.ShowDropDown(menuRect, column.menuBuilder, new Padding(1f));
BuildHeaderResizer(gui, column, new Rect(x - 0.7f, y, 1f, headerHeight + 0.9f));
}
}
}
width = x + 0.2f - spacing;
width = MathF.Max(x + 0.2f - spacing, gui.width - 1f);

var separator = gui.AllocateRect(x, 0.1f);
if (gui.isBuilding)
Expand Down Expand Up @@ -138,7 +155,7 @@ public Rect BuildRow(ImGui gui, TData element, float startX = 0f)
if (column.width < column.minWidth)
column.width = column.minWidth;
@group.SetManualRect(new Rect(x, 0, column.width, 0f), RectAllocator.LeftRow);
column.build(gui, element);
column.BuildElement(gui, element);
x += column.width + spacing;
}
}
Expand All @@ -148,7 +165,7 @@ public Rect BuildRow(ImGui gui, TData element, float startX = 0f)
var rect = gui.lastRect;
var bottom = gui.lastRect.Bottom;
if (gui.isBuilding)
gui.DrawRectangle(new Rect(startX, bottom - 0.1f, x-startX, 0.1f), SchemeColor.Grey);
gui.DrawRectangle(new Rect(startX, bottom - 0.1f, width-startX, 0.1f), SchemeColor.Grey);
return rect;
}

Expand All @@ -164,16 +181,18 @@ public Rect EndBuildingContent(ImGui gui)
return new Rect(buildingStart.X, buildingStart.Y, width, bottom-buildingStart.Y);
}

public bool BuildContent(ImGui gui, IReadOnlyList<TData> data, out (TData from, TData to) reorder, out Rect rect)
public bool BuildContent(ImGui gui, IReadOnlyList<TData> data, out (TData from, TData to) reorder, out Rect rect, Func<TData, bool> filter = null)
{
BeginBuildingContent(gui);
reorder = default;
var hasReorder = false;
for (var i = 0; i < data.Count; i++) // do not change to foreach
{
var t = data[i];
if (filter != null && !filter(t))
continue;
var rowRect = BuildRow(gui, t);
if (gui.DoListReordering(rowRect, rowRect, t, out var from))
if (!hasReorder && gui.DoListReordering(rowRect, rowRect, t, out var from, SchemeColor.PureBackground, false))
{
reorder = (@from, t);
hasReorder = true;
Expand Down
21 changes: 17 additions & 4 deletions YAFC/Widgets/ImmediateWidgets.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,14 @@ public static void BuildFactorioObjectIcon(this ImGui gui, FactorioObject obj, M
}
}
}

public static bool BuildFloatInput(this ImGui gui, float value, out float newValue, UnitOfMeasure unit, Padding padding)
{
if (gui.BuildTextInput(DataUtils.FormatAmount(value, unit), out var newText, null, Icon.None, true, padding) && DataUtils.TryParseAmount(newText, out newValue, unit))
return true;
newValue = value;
return false;
}

public static bool BuildFactorioObjectButton(this ImGui gui, Rect rect, FactorioObject obj, SchemeColor bgColor = SchemeColor.None, bool extendHeader = false)
{
Expand Down Expand Up @@ -168,21 +176,26 @@ public static bool BuildFactorioObjectWithAmount(this ImGui gui, FactorioObject

public static void ShowPrecisionValueTootlip(ImGui gui, float amount, UnitOfMeasure unit, FactorioObject goods)
{
string text;
switch (unit)
{
case UnitOfMeasure.PerSecond: case UnitOfMeasure.FluidPerSecond: case UnitOfMeasure.ItemPerSecond:
var perSecond = DataUtils.FormatAmountRaw(amount, 1f, "/s", formatSpec:DataUtils.PreciseFormat);
var perMinute = DataUtils.FormatAmountRaw(amount, 60f, "/m", formatSpec:DataUtils.PreciseFormat);
var perHour = DataUtils.FormatAmountRaw(amount, 3600f, "/h", formatSpec:DataUtils.PreciseFormat);
var text = perSecond + "\n" + perMinute + "\n" + perHour;
text = perSecond + "\n" + perMinute + "\n" + perHour;
if (goods is Item item)
text += DataUtils.FormatAmount(item.stackSize / amount, UnitOfMeasure.Second, "\n", " per stack");
gui.ShowTooltip(gui.lastRect, text, 10f);
text += DataUtils.FormatAmount(MathF.Abs(item.stackSize / amount), UnitOfMeasure.Second, "\n", " per stack");
break;
default:
gui.ShowTooltip(gui.lastRect, DataUtils.FormatAmount(amount, unit, precise:true), 10f);
text = DataUtils.FormatAmount(amount, unit, precise: true);
break;
}
gui.ShowTooltip(gui.lastRect, x =>
{
x.BuildFactorioObjectButtonWithText(goods);
x.BuildText(text, wrap:true);
}, 10f);
}

public static void BuildObjectSelectDropDown<T>(this ImGui gui, ICollection<T> list, IComparer<T> ordering, Action<T> select, string header, int count = 6, bool multiple = false, Predicate<T> checkmark = null, bool allowNone = false, Func<T, string> extra = null) where T:FactorioObject
Expand Down
4 changes: 1 addition & 3 deletions YAFC/Widgets/MainScreenTabBar.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,7 @@ private void BuildContents(ImGui gui)
changePageTo = page;
}
else if (evt == ButtonEvent.MouseOver)
{
MainScreen.Instance.ShowTooltip(gui, page, false);
}
MainScreen.Instance.ShowTooltip(gui, page, false, gui.lastRect);

prevPage = page;

Expand Down
16 changes: 16 additions & 0 deletions YAFC/Widgets/ObjectTooltip.cs
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,22 @@ private void BuildRecipe(RecipeOrTechnology recipe, ImGui gui)
BuildSubHeader(gui, "Allowed modules");
using (gui.EnterGroup(contentPadding))
BuildIconRow(gui, recipe.modules, 1);
var crafterCommonModules = AllowedEffects.All;
foreach (var crafter in recipe.crafters)
{
if (crafter.moduleSlots > 0)
crafterCommonModules &= crafter.allowedEffects;
}

foreach (var module in recipe.modules)
{
if (!EntityWithModules.CanAcceptModule(module.module, crafterCommonModules))
{
using (gui.EnterGroup(contentPadding))
gui.BuildText("Some crafters restrict module usage");
break;
}
}
}

if (recipe is Recipe lockedRecipe && !lockedRecipe.enabled)
Expand Down
2 changes: 1 addition & 1 deletion YAFC/Windows/ImageSharePanel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public override void Build(ImGui gui)
Ui.VisitLink("file:///"+TempImageFile);
}

if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && gui.BuildButton(copied ? "Copied to clipboard" : "Copy to clipboard (Ctrl+C)", active:!copied))
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && gui.BuildButton(copied ? "Copied to clipboard" : "Copy to clipboard (Ctrl+"+ImGuiUtils.ScanToString(SDL.SDL_Scancode.SDL_SCANCODE_C)+")", active:!copied))
{
WindowsClipboard.CopySurfaceToClipboard(surface);
copied = true;
Expand Down
22 changes: 13 additions & 9 deletions YAFC/Windows/MainScreen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public MainScreen(int display, Project project) : base(default)
{
RegisterPageView<ProductionTable>(new ProductionTableView());
RegisterPageView<AutoPlanner>(new AutoPlannerView());
RegisterPageView<ProductionSummary>(new ProductionSummaryView());
searchGui = new ImGui(BuildSearch, new Padding(1f)) {boxShadow = RectangleBorder.Thin, boxColor = SchemeColor.Background};
Instance = this;
tabBar = new MainScreenTabBar(this);
Expand Down Expand Up @@ -121,7 +122,7 @@ private void BuildPage(ImGui gui, ProjectPage element, int index)
else SetActivePage(element);
}
else if (evt == ButtonEvent.MouseOver)
ShowTooltip(gui, element, true);
ShowTooltip(gui, element, true, gui.lastRect);
}

private void ProjectOnMetaInfoChanged()
Expand Down Expand Up @@ -287,9 +288,11 @@ private void BuildPage(ImGui gui)
}
}

public ProjectPage AddProjectPage(string name, FactorioObject icon, Type contentType, bool setActive)
public ProjectPage AddProjectPage(string name, FactorioObject icon, Type contentType, bool setActive, bool initNew)
{
var page = new ProjectPage(project, contentType) {name = name, icon = icon};
if (initNew)
page.content.InitNew();
project.RecordUndo().pages.Add(page);
if (setActive)
SetActivePage(page);
Expand Down Expand Up @@ -367,13 +370,13 @@ private void BuildSearch(ImGui gui)
private void SettingsDropdown(ImGui gui)
{
gui.boxColor = SchemeColor.Background;
if (gui.BuildContextMenuButton("Undo", "Ctrl+Z") && gui.CloseDropdown())
if (gui.BuildContextMenuButton("Undo", "Ctrl+" +ImGuiUtils.ScanToString(SDL.SDL_Scancode.SDL_SCANCODE_Z)) && gui.CloseDropdown())
project.undo.PerformUndo();
if (gui.BuildContextMenuButton("Save", "Ctrl+S") && gui.CloseDropdown())
if (gui.BuildContextMenuButton("Save", "Ctrl+" + ImGuiUtils.ScanToString(SDL.SDL_Scancode.SDL_SCANCODE_S)) && gui.CloseDropdown())
SaveProject().CaptureException();
if (gui.BuildContextMenuButton("Save As") && gui.CloseDropdown())
SaveProjectAs().CaptureException();
if (gui.BuildContextMenuButton("Find on page", "Ctrl+F") && gui.CloseDropdown())
if (gui.BuildContextMenuButton("Find on page", "Ctrl+" + ImGuiUtils.ScanToString(SDL.SDL_Scancode.SDL_SCANCODE_F)) && gui.CloseDropdown())
ShowSearch();
if (gui.BuildContextMenuButton("Load another project (Same mods)") && gui.CloseDropdown())
LoadProjectLight();
Expand All @@ -386,7 +389,7 @@ private void SettingsDropdown(ImGui gui)
if (gui.BuildContextMenuButton("Preferences") && gui.CloseDropdown())
PreferencesScreen.Show();

if (gui.BuildContextMenuButton("Never Enough Items Explorer", "Ctrl+N") && gui.CloseDropdown())
if (gui.BuildContextMenuButton("Never Enough Items Explorer", "Ctrl+" + ImGuiUtils.ScanToString(SDL.SDL_Scancode.SDL_SCANCODE_N)) && gui.CloseDropdown())
ShowNeie();

if (gui.BuildContextMenuButton("Dependency Explorer") && gui.CloseDropdown())
Expand Down Expand Up @@ -650,10 +653,11 @@ public void Report((string, string) value)

public bool IsSameObjectHovered(ImGui gui, FactorioObject obj) => objectTooltip.IsSameObjectHovered(gui, obj);

public void ShowTooltip(ImGui gui, ProjectPage page, bool isMiddleEdit)
public void ShowTooltip(ImGui gui, ProjectPage page, bool isMiddleEdit, Rect rect)
{
registeredPageViews.TryGetValue(page.content.GetType(), out var pageView);
ShowTooltip(gui, gui.lastRect, x =>
if (page == null || !registeredPageViews.TryGetValue(page.content.GetType(), out var pageView))
return;
ShowTooltip(gui, rect, x =>
{
pageView.BuildPageTooltip(x, page.content);
if (isMiddleEdit)
Expand Down
2 changes: 2 additions & 0 deletions YAFC/Windows/PreferencesScreen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ public override void Build(ImGui gui)
Close();
if (prefs.justChanged)
MainScreen.Instance.RebuildProjectView();
if (settings.justChanged)
Project.current.RecalculateDisplayPages();
}

private void ChoiceObject<T>(ImGui gui, string text, T[] list, T current, Action<T> select) where T:FactorioObject
Expand Down
4 changes: 2 additions & 2 deletions YAFC/Windows/ProjectPageSettingsPanel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public override void Build(ImGui gui)
gui.allocator = RectAllocator.LeftRow;
if (editingPage != null && gui.BuildRedButton("Delete page"))
{
Project.current.RecordUndo().pages.Remove(editingPage);
Project.current.RemovePage(editingPage);
Close();
}
}
Expand Down Expand Up @@ -181,7 +181,7 @@ public static void LoadProjectPageFromClipboard()
if (!haveChoice)
return;
if (choice)
project.RecordUndo().pages.Remove(existing);
project.RemovePage(existing);
else
page.GenerateNewGuid();
project.RecordUndo().pages.Add(page);
Expand Down
2 changes: 1 addition & 1 deletion YAFC/Workspace/AutoPlannerView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ void Page1(ImGui gui, ref bool valid)
pages.Add(Page1);
return () =>
{
var planner = MainScreen.Instance.AddProjectPage("Auto planner", goal[0].item, typeof(AutoPlanner), false);
var planner = MainScreen.Instance.AddProjectPage("Auto planner", goal[0].item, typeof(AutoPlanner), false, false);
(planner.content as AutoPlanner).goals.AddRange(goal);
MainScreen.Instance.SetActivePage(planner);
};
Expand Down
Loading

0 comments on commit f87cf71

Please sign in to comment.