Skip to content

Commit

Permalink
Work on ProductionSummary groups
Browse files Browse the repository at this point in the history
  • Loading branch information
ShadowTheAge committed Feb 11, 2022
1 parent 5357add commit 75c7d98
Show file tree
Hide file tree
Showing 7 changed files with 233 additions and 156 deletions.
18 changes: 0 additions & 18 deletions YAFC/Workspace/ProductionSummary/ProductionSummaryFlatHierarchy.cs

This file was deleted.

178 changes: 118 additions & 60 deletions YAFC/Workspace/ProductionSummary/ProductionSummaryView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,72 +10,156 @@ namespace YAFC
public class ProductionSummaryView : ProjectPageView<ProductionSummary>
{
private readonly DataGrid<ProductionSummaryEntry> grid;
private readonly ProductionSummaryFlatHierarchy flatHierarchy;
private readonly SearchableList<ProjectPage> pagesDropdown;
private SearchQuery searchQuery;
private readonly FlatHierarchy<ProductionSummaryEntry, ProductionSummaryGroup> flatHierarchy;
private Goods filteredGoods;
private Func<ProductionSummaryEntry, bool> filteredGoodsFilter;
private readonly Dictionary<ProductionSummaryColumn, GoodsColumn> goodsToColumn = new Dictionary<ProductionSummaryColumn, GoodsColumn>();
private readonly PaddingColumn padding;
private readonly SummaryColumn firstColumn;
private readonly RestGoodsColumn lastColumn;

public ProductionSummaryView()
{
padding = new PaddingColumn(this);
firstColumn = new SummaryColumn(this);
lastColumn = new RestGoodsColumn(this);
grid = new DataGrid<ProductionSummaryEntry>(firstColumn, lastColumn) {headerHeight = 4.2f};
flatHierarchy = new ProductionSummaryFlatHierarchy(grid, null);
pagesDropdown = new SearchableList<ProjectPage>(30f, new Vector2(20f, 2f), PagesDropdownDrawer, PagesDropdownFilter);
grid = new DataGrid<ProductionSummaryEntry>(padding, firstColumn, lastColumn) {headerHeight = 4.2f};
flatHierarchy = new FlatHierarchy<ProductionSummaryEntry, ProductionSummaryGroup>(grid, null, buildExpandedGroupRows:true);
}

private class PaddingColumn : DataColumn<ProductionSummaryEntry>
{
private readonly ProductionSummaryView view;

public PaddingColumn(ProductionSummaryView view) : base(3f)
{
this.view = view;
}

public override void BuildHeader(ImGui gui) {}

public override void BuildElement(ImGui gui, ProductionSummaryEntry row)
{
gui.allocator = RectAllocator.Center;
gui.spacing = 0f;
if (row.subgroup != null)
{
if (gui.BuildButton(row.subgroup.expanded ? Icon.ShevronDown : Icon.ShevronRight))
{
row.subgroup.RecordUndo(true).expanded = !row.subgroup.expanded;
view.flatHierarchy.SetData(view.model.group);
}
}
}
}

private class SummaryColumn : DataColumn<ProductionSummaryEntry>
{
private readonly ProductionSummaryView view;
private SearchQuery productionTableSearchQuery;
private readonly SearchableList<ProjectPage> pagesDropdown;
private ProductionSummaryGroup selectedGroup;
public SummaryColumn(ProductionSummaryView view) : base(20f, 10f, 30f)
{
this.view = view;
pagesDropdown = new SearchableList<ProjectPage>(30f, new Vector2(20f, 2f), PagesDropdownDrawer, PagesDropdownFilter);
}

public override void BuildHeader(ImGui gui)
{
gui.allocator = RectAllocator.LeftAlign;
if (gui.BuildButton(Icon.Plus, SchemeColor.Primary, SchemeColor.PrimalyAlt, SchemeColor.PrimalyAlt, 2))
BuildButtons(gui, 2f, view.model.group);
}

private void BuildButtons(ImGui gui, float size, ProductionSummaryGroup group)
{
using (gui.EnterRow())
{
view.pagesDropdown.data = Project.current.pages.Where(x => x.content is ProductionTable).ToArray();
view.pagesDropdown.filter = view.searchQuery = new SearchQuery();
gui.ShowDropDown(view.AddProductionTableDropdown);
if (gui.BuildButton(Icon.Plus, SchemeColor.Primary, SchemeColor.PrimalyAlt, SchemeColor.PrimalyAlt, size))
{
pagesDropdown.data = Project.current.pages.Where(x => x.content is ProductionTable).ToArray();
pagesDropdown.filter = productionTableSearchQuery = new SearchQuery();
selectedGroup = group;
gui.ShowDropDown(AddProductionTableDropdown);
}

if (gui.BuildButton(Icon.Folder, SchemeColor.Primary, SchemeColor.PrimalyAlt, SchemeColor.PrimalyAlt, size))
{
var entry = new ProductionSummaryEntry(view.model.group);
entry.subgroup = new ProductionSummaryGroup(entry);
view.model.group.RecordUndo().elements.Add(entry);
}
}
}

private void AddProductionTableDropdown(ImGui gui)
{
using (gui.EnterGroup(new Padding(1f)))
{
if (gui.BuildSearchBox(productionTableSearchQuery, out productionTableSearchQuery))
pagesDropdown.filter = productionTableSearchQuery;
}
pagesDropdown.Build(gui);
}

public override void BuildElement(ImGui gui, ProductionSummaryEntry entry)
{
gui.allocator = RectAllocator.LeftAlign;
using (gui.EnterGroup(new Padding(0.3f), RectAllocator.LeftRow, SchemeColor.None, 0.2f))

if (entry.subgroup != null)
{
var icon = entry.icon;
if (icon != Icon.None)
gui.BuildIcon(entry.icon);
gui.BuildText(entry.name);
if (entry.subgroup.expanded)
BuildButtons(gui, 1.5f, entry.subgroup);
else
{
if (gui.BuildTextInput(entry.subgroup.name, out var newText, "Group name", delayed: true))
entry.subgroup.RecordUndo().name = newText;
}
}

var buttonEvent = gui.BuildButton(gui.lastRect, SchemeColor.None, SchemeColor.BackgroundAlt);
if (buttonEvent == ButtonEvent.MouseOver)
MainScreen.Instance.ShowTooltip(gui, entry.page.page, false, gui.lastRect);
else if (buttonEvent == ButtonEvent.Click)
gui.ShowDropDown(tgui =>
else
{
using (gui.EnterGroup(new Padding(0.3f), RectAllocator.LeftRow, SchemeColor.None, 0.2f))
{
if (tgui.BuildButton("Go to page") && tgui.CloseDropdown())
MainScreen.Instance.SetActivePage(entry.page.page);
if (tgui.BuildRedButton("Remove") && tgui.CloseDropdown())
view.model.group.RecordUndo().list.Remove(entry);
});
var icon = entry.icon;
if (icon != Icon.None)
gui.BuildIcon(entry.icon);
gui.BuildText(entry.name);
}

var buttonEvent = gui.BuildButton(gui.lastRect, SchemeColor.None, SchemeColor.BackgroundAlt);
if (buttonEvent == ButtonEvent.MouseOver && entry.page != null)
MainScreen.Instance.ShowTooltip(gui, entry.page.page, false, gui.lastRect);
else if (buttonEvent == ButtonEvent.Click)
gui.ShowDropDown(tgui =>
{
if (tgui.BuildButton("Go to page") && tgui.CloseDropdown())
MainScreen.Instance.SetActivePage(entry.page.page);
if (tgui.BuildRedButton("Remove") && tgui.CloseDropdown())
view.model.group.RecordUndo().elements.Remove(entry);
});
}

using (gui.EnterFixedPositioning(3f, 2f, default))
{
gui.allocator = RectAllocator.LeftRow;
gui.BuildText("x");
if (gui.BuildFloatInput(entry.multiplier, out var newMultiplier, UnitOfMeasure.None, default) && newMultiplier >= 0)
entry.RecordUndo().multiplier = newMultiplier;
entry.SetMultiplier(newMultiplier);
}
}

private bool PagesDropdownFilter(ProjectPage data, SearchQuery searchtokens) => searchtokens.Match(data.name);

private void PagesDropdownDrawer(ImGui gui, ProjectPage element, int index)
{
using (gui.EnterGroup(new Padding(1f, 0.25f), RectAllocator.LeftRow))
{
if (element.icon != null)
gui.BuildIcon(element.icon.icon);
gui.RemainingRow().BuildText(element.name, color:element.visible ? SchemeColor.BackgroundText : SchemeColor.BackgroundTextFaint);
}

if (gui.BuildButton(gui.lastRect, SchemeColor.BackgroundAlt, SchemeColor.Background))
{
selectedGroup.RecordUndo().elements.Add(new ProductionSummaryEntry(selectedGroup) {page = new PageReference(element)});
}
}
}
Expand Down Expand Up @@ -156,32 +240,15 @@ private void ApplyFilter(Goods goods)
{
var filter = filteredGoods == goods ? null : goods;
filteredGoods = filter;
filteredGoodsFilter = filter == null ? null : (Func<ProductionSummaryEntry, bool>) (entry => entry.flow.TryGetValue(filter, out var amount) && amount != 0);
model.group.UpdateFilter(goods, default);
Rebuild();
}

private bool PagesDropdownFilter(ProjectPage data, SearchQuery searchtokens) => searchtokens.Match(data.name);

private void PagesDropdownDrawer(ImGui gui, ProjectPage element, int index)
{
using (gui.EnterGroup(new Padding(1f, 0.25f), RectAllocator.LeftRow))
{
if (element.icon != null)
gui.BuildIcon(element.icon.icon);
gui.RemainingRow().BuildText(element.name, color:element.visible ? SchemeColor.BackgroundText : SchemeColor.BackgroundTextFaint);
}

if (gui.BuildButton(gui.lastRect, SchemeColor.BackgroundAlt, SchemeColor.Background))
{
model.group.RecordUndo().list.Add(new ProductionSummaryEntry(model.group, new PageReference(element)));
}
}

private bool IsColumnsSynced()
{
if (grid.columns.Count != model.columns.Count + 2)
if (grid.columns.Count != model.columns.Count + 3)
return false;
var index = 1;
var index = 2;
foreach (var column in model.columns)
{
if (!(grid.columns[index++] is GoodsColumn goodsColumn) || goodsColumn.goods != column.goods)
Expand All @@ -202,6 +269,7 @@ private void SyncGridHeaderWithColumns()
var columns = grid.columns;
var modelColumns = model.columns;
columns.Clear();
columns.Add(padding);
columns.Add(firstColumn);
foreach (var column in modelColumns)
{
Expand Down Expand Up @@ -253,7 +321,7 @@ protected override void BuildContent(ImGui gui)
gui.AllocateSpacing(1f);
using (gui.EnterGroup(new Padding(1)))
{
if (model.group.list.Count == 0)
if (model.group.elements.Count == 0)
gui.BuildText("Add your existing sheets here to keep track of what you have in your base and to see what shortages you may have");
else gui.BuildText("List of goods produced/consumed by added blocks. Click on any of these to add it to (or remove it from) the table.");
using (var igrid = gui.EnterInlineGrid(3f, 1f))
Expand All @@ -276,16 +344,6 @@ public override void Rebuild(bool visuaOnly = false)
base.Rebuild(visuaOnly);
}

private void AddProductionTableDropdown(ImGui gui)
{
using (gui.EnterGroup(new Padding(1f)))
{
if (gui.BuildSearchBox(searchQuery, out searchQuery))
pagesDropdown.filter = searchQuery;
}
pagesDropdown.Build(gui);
}

public override void CreateModelDropdown(ImGui gui, Type type, Project project)
{
if (gui.BuildContextMenuButton("Create production summary (Preview)") && gui.CloseDropdown())
Expand Down
Loading

0 comments on commit 75c7d98

Please sign in to comment.