Browse Source

feat(Navigation) Improved desktop navigation UI

main
Jonathan McCaffrey 4 years ago
parent
commit
16223cd010
  1. 107
      Components/Navigation/DesktopNavComponent.razor
  2. 38
      Components/Navigation/DesktopNavLinkComponent.razor
  3. 30
      Components/Navigation/DesktopNavSectionComponent.razor
  4. 59
      Components/Navigation/NavSectionComponent.razor
  5. 14
      Components/Navigation/TabletNavComponent.razor
  6. BIN
      IGP/Database.db
  7. 4
      IGP/PageLayout.razor
  8. 2
      IGP/wwwroot/generated/AgileTaskModels.json
  9. 2
      IGP/wwwroot/generated/WebSectionModels.json
  10. 2
      Model/Entity/EntityModel.cs
  11. 2
      Model/Website/WebPageModel.cs
  12. 7
      Model/Website/WebSectionModel.cs
  13. 20
      Services/IServices.cs
  14. 170
      Services/Immortal/BuildOrderService.cs
  15. 40
      Services/Immortal/EconomyService.cs
  16. 16
      Services/Website/NavigationService.cs
  17. 44
      Services/Website/WebsiteService.cs

107
Components/Navigation/DesktopNavComponent.razor

@ -2,33 +2,53 @@
@inject INavigationService navigationService
@implements IDisposable
<div onmouseleave="@HoverOut" class="desktopNavContainer">
<div class="menuHeader" @onmouseover="() => navigationService.ChangeNavigationState(NavigationStateType.Hovering_Menu)">
@{
var visibleStyle = navigationService.GetNavigationSectionId() > 0 ? "clickOffVisible" : "";
}
<div onclick="@MenuClosed" class="clickOffBackground @visibleStyle">
</div>
<div class="desktopNavContainer">
<div class="menuHeader">
<NavLink href="/" class="websiteTitle">
IGP Fan Reference
</NavLink>
@foreach (var webSection in WebSections) {
<div class="sectionButton">@webSection.Name</div>
@foreach (var webSection in WebSections)
{
<div>
<button onclick="@(() => MenuClicked(webSection.Id))" class="sectionButton">@webSection.Name</button>
@if (webSection.Id.Equals(navigationService.GetNavigationSectionId()))
{
<div class="navMenuPosition">
<div class="navMenuContainer">
<DesktopNavSectionComponent Section=webSection/>
</div>
</div>
}
</div>
}
</div>
</div>
@{
var hoveredStyle = NavigationStateType.Hovering_Menu.Equals(navigationService.GetNavigationState()) ?
"navMenuContainerShow" : "";
<style>
.clickOffBackground {
top: 0;
left: 0;
position: fixed;
width: 100vw;
height: 100vh;
visibility: hidden;
}
<div class="navMenuContainer @hoveredStyle">
@foreach (var section in WebSections) {
var pages = (from page in WebPages
where page.WebSectionModelId == section.Id
select page).ToList();
<NavSectionComponent Section=section Children=pages/>
}
</div>
</div>
.clickOffBackground.clickOffVisible {
visibility:visible;
}
<style>
.sectionButton {
cursor: pointer;
}
@ -60,27 +80,32 @@
color: white;
}
.navMenuPosition {
position: relative;
top: calc(100% - 18px);
left: -64px;
width: 0;
height: 0;
}
.navMenuContainer {
display: none;
position: fixed;
top: 50px;
width: 330px;
flex-direction: row;
gap: 20px;
width: 100%;
align-items: flex-start;
justify-content: center;
flex-wrap: wrap;
border-bottom: 4px solid black;
padding-top: 20px;
padding-bottom: 20px;
padding-top: 4px;
padding-bottom: 4px;
padding-left: 4px;
padding-right: 4px;
background-color: rgba(22, 22, 24, 0.95);
}
.navMenuContainerShow {
border: 1px solid black;
border-radius: 4px;
display: flex;
}
@@media only screen and (max-width: 1025px) {
.desktopNavContainer {
display: none;
@ -97,20 +122,36 @@
@code {
[Parameter] public List<WebSectionModel> WebSections { get; set; } = default!;
[Parameter]
public List<WebSectionModel> WebSections { get; set; } = default!;
[Parameter] public List<WebPageModel> WebPages { get; set; } = default!;
[Parameter]
public List<WebPageModel> WebPages { get; set; } = default!;
protected override void OnInitialized() {
protected override void OnInitialized()
{
navigationService.Subscribe(StateHasChanged);
}
void IDisposable.Dispose() {
void IDisposable.Dispose()
{
navigationService.Unsubscribe(StateHasChanged);
}
void HoverOut(MouseEventArgs mouseEventArgs) {
void MenuClicked(int menuName)
{
Console.WriteLine($"MenuClicked {menuName}");
navigationService.ChangeNavigationSectionId(menuName);
}
void MenuClosed()
{
navigationService.ChangeNavigationSectionId(-1);
}
void HoverOut(MouseEventArgs mouseEventArgs)
{
Console.WriteLine(NavigationStateType.Default);
navigationService.ChangeNavigationState(NavigationStateType.Default);
}

38
Components/Navigation/NavLinkComponent.razor → Components/Navigation/DesktopNavLinkComponent.razor

@ -1,18 +1,15 @@
@using Services
@using Model.Website
@using Model.Website.Enums
@inject INavigationService navigationService;
@inject INavigationService navigationService;
@inject NavigationManager navigationManager;
@if (isOnPage) {
<NavLink href="@Page.Href" class="navContainer navLink navSelected">
<NavLink href="@Page.Href" class="desktopNavLink navSelected">
<div class="navName">
@Page.Name
</div>
</NavLink>
}
else {
<NavLink @onclick="() => navigationService.ChangeNavigationState(NavigationStateType.Default)" href="@Page.Href" class="navContainer navLink">
<NavLink @onclick="() => navigationService.ChangeNavigationState(NavigationStateType.Default)" href="@Page.Href" class="desktopNavLink">
<div class="navName">
@Page.Name
</div>
@ -20,16 +17,6 @@ else {
}
<style>
.navContainer {
cursor: pointer;
border: 2px solid black;
border: none;
height: 60px;
width: 100%;
display: block;
display: flex;
border: none;
}
.navName {
margin: auto;
@ -40,12 +27,27 @@ else {
}
.navLink {
.desktopNavLink {
cursor: pointer;
height: 60px;
width: 100%;
display: flex;
background-color: var(--primary);
border: 1px solid var(--primary);
}
.navLink:hover {
.desktopNavLink:first-of-type {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
.desktopNavLink:last-of-type {
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
}
.desktopNavLink:hover {
color: #8EC3FF;
background-color: var(--primary-hover);
border-color: var(--primary-border-hover);

30
Components/Navigation/DesktopNavSectionComponent.razor

@ -0,0 +1,30 @@
@using Model.Website
<div class="sectionContainer">
@foreach (var childPage in Section.WebPageModels) {
if (childPage.IsPrivate.Equals("True")) {
continue;
}
<DesktopNavLinkComponent Page=childPage></DesktopNavLinkComponent>
}
</div>
<style>
.sectionContainer {
display: flex;
flex-direction: column;
gap: 4px;
justify-content: flex-start;
position: relative;
width: 100%;
}
</style>
@code {
[Parameter]
public WebSectionModel Section { get; set; } = default!;
}

59
Components/Navigation/NavSectionComponent.razor

@ -1,59 +0,0 @@
@using Model.Website
<div class="sectionContainer">
<div class="sectionHeader">
<div class="sectionTitle">
@Section.Name
</div>
</div>
@foreach (var childPage in Children) {
if (childPage.IsPrivate.Equals("True")) {
continue;
}
<NavLinkComponent Page=childPage></NavLinkComponent>
}
</div>
<style>
.sectionContainer {
display: flex;
flex-direction: column;
gap: 4px;
justify-content: flex-start;
position: relative;
margin-top: 12px;
padding: 18px;
width: 300px;
margin-left: 4px;
}
.sectionHeader {
bottom: 100%;
position: absolute;
top: 0px;
left: -8px;
padding-right: 12px;
padding-left: 4px;
width: 100%;
display: flex;
line-height: 0px;
}
.sectionTitle {
font-weight: bold;
padding-right: 8px;
margin-top: -2px;
white-space: pre;
}
</style>
@code {
[Parameter]
public WebSectionModel Section { get; set; } = default!;
[Parameter]
public List<WebPageModel> Children { get; set; } = default!;
}

14
Components/Navigation/TabletNavComponent.razor

@ -19,23 +19,23 @@
<div class="tabletNav @navOpen">
@foreach (var _section in WebSections) {
@foreach (var webSection in WebSections) {
var pages = (from page in WebPages
where page.WebSectionModelId == _section.Id
where page.WebSectionModelId == webSection.Id
select page).ToList();
<div>
<div>
@_section.Name
@webSection.Name
</div>
<div class="tabletNavItems">
@foreach (var _page in pages) {
if (_page.IsPrivate.Equals("True")) {
@foreach (var webPage in pages) {
if (webPage.IsPrivate.Equals("True")) {
continue;
}
<NavLink href="@_page.Href" class="tabletNavItem" @onclick="OnPageClicked">
@_page.Name
<NavLink href="@webPage.Href" class="tabletNavItem" @onclick="OnPageClicked">
@webPage.Name
</NavLink>
}
</div>

BIN
IGP/Database.db

Binary file not shown.

4
IGP/PageLayout.razor

@ -41,11 +41,7 @@
protected override async Task OnInitializedAsync()
{
#if NO_SQL
await webService.Load();
#else
await WebService.Load(Database);
#endif
}
void IDisposable.Dispose()

2
IGP/wwwroot/generated/AgileTaskModels.json

File diff suppressed because one or more lines are too long

2
IGP/wwwroot/generated/WebSectionModels.json

@ -1 +1 @@
[{"Id":1,"Name":"Tools","Description":"Tools Stuff","Href":null,"Order":1,"IsPrivate":"False"},{"Id":2,"Name":"Resources","Description":"Resources Stuff","Href":null,"Order":2,"IsPrivate":"False"},{"Id":3,"Name":"General","Description":"About Stuff","Href":null,"Order":3,"IsPrivate":"False"},{"Id":4,"Name":"Development","Description":"Development Stuff","Href":null,"Order":4,"IsPrivate":"False"}]
[{"Id":1,"Name":"Tools","Description":"Tools Stuff","Href":null,"Order":1,"IsPrivate":"False","WebPageModels":[]},{"Id":2,"Name":"Resources","Description":"Resources Stuff","Href":null,"Order":2,"IsPrivate":"False","WebPageModels":[]},{"Id":3,"Name":"General","Description":"About Stuff","Href":null,"Order":3,"IsPrivate":"False","WebPageModels":[]},{"Id":4,"Name":"Development","Description":"Development Stuff","Href":null,"Order":4,"IsPrivate":"False","WebPageModels":[]}]

2
Model/Entity/EntityModel.cs

@ -177,7 +177,7 @@ public class EntityModel
}
public EntityProductionModel Production()
public EntityProductionModel? Production()
{
return ((EntityProductionModel)EntityParts.Find(x => x.GetType() == typeof(EntityProductionModel))!)!;
}

2
Model/Website/WebPageModel.cs

@ -3,7 +3,7 @@
public class WebPageModel
{
public int Id { get; set; }
public int WebSectionModelId { get; set; }
public int? WebSectionModelId { get; set; }
public string Name { get; set; } = "Add name";
public string Description { get; set; } = "Add description";
public string Href { get; set; } = null;

7
Model/Website/WebSectionModel.cs

@ -1,4 +1,7 @@
namespace Model.Website;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace Model.Website;
public class WebSectionModel
{
@ -8,4 +11,6 @@ public class WebSectionModel
public string Href { get; set; } = null;
public int Order { get; set; } = 0;
public string IsPrivate { get; set; } = "True";
[NotMapped] public List<WebPageModel> WebPageModels { get; set; } = new List<WebPageModel>();
}

20
Services/IServices.cs

@ -1,15 +1,8 @@

#if NO_SQL
#else
using Contexts;
using Microsoft.EntityFrameworkCore;
#endif
using Model.Doc;
using Model.BuildOrders;
using Model.Economy;
using Model.Entity;
using Model.Entity.Data;
using Model.MemoryTester;
using Model.Notes;
using Model.Website;
@ -52,26 +45,15 @@ public interface IEntityDialogService
}
public interface IWebsiteService {
#if NO_SQL
public List<WebPageModel> WebPageModels { get; set; }
public List<WebSectionModel> WebSectionModels { get; set; }
#else
public DbSet<WebPageModel> WebPageModels { get; }
public DbSet<WebSectionModel> WebSectionModels { get; }
#endif
public void Subscribe(Action action);
public void Unsubscribe(Action action);
public void Update();
#if NO_SQL
public Task Load();
#else
public Task Load(DatabaseContext database);
#endif
public bool IsLoaded();
}
@ -146,6 +128,8 @@ public interface INavigationService {
public void Subscribe(Action action);
public void Unsubscribe(Action action);
public void ChangeNavigationSectionId(int newState);
public int GetNavigationSectionId();
public void ChangeNavigationState(string newState);
public string GetNavigationState();

170
Services/Immortal/BuildOrderService.cs

@ -9,29 +9,34 @@ using YamlDotNet.Serialization;
namespace Services.Immortal;
public class BuildOrderService : IBuildOrderService {
private int HumanMicro = 2;
public class BuildOrderService : IBuildOrderService
{
private readonly BuildOrderModel buildOrder = new();
private int lastInterval = 0;
private readonly int HumanMicro = 2;
private int lastInterval;
public int GetLastRequestInterval() {
public int GetLastRequestInterval()
{
return lastInterval;
}
public Dictionary<int, List<EntityModel>> GetOrders() {
public Dictionary<int, List<EntityModel>> GetOrders()
{
return buildOrder.Orders;
}
public void Subscribe(Action action) {
public void Subscribe(Action action)
{
OnChange += action;
}
public void Unsubscribe(Action action) {
public void Unsubscribe(Action action)
{
OnChange -= action;
}
public void Add(EntityModel entity, int atInterval) {
public void Add(EntityModel entity, int atInterval)
{
if (!buildOrder.Orders.ContainsKey(atInterval))
buildOrder.Orders.Add(atInterval, new List<EntityModel> { entity.Clone() });
else
@ -40,64 +45,76 @@ public class BuildOrderService : IBuildOrderService {
if (atInterval > lastInterval) lastInterval = atInterval;
}
public bool Add(EntityModel entity, IEconomyService withEconomy, IToastService withToasts) {
if (entity != null) {
var production = entity.Production();
public bool Add(EntityModel entity, IEconomyService withEconomy, IToastService withToasts)
{
var production = entity.Production();
if (production != null)
{
for (var interval = lastInterval; interval < withEconomy.GetOverTime().Count; interval++)
{
var economyAtSecond = withEconomy.GetOverTime()[interval];
if (economyAtSecond.Alloy >= production.Alloy && economyAtSecond.Ether >= production.Ether &&
economyAtSecond.Pyre >= production.Pyre)
{
if (!MeetsSupply(entity))
{
withToasts.AddToast(new ToastModel
{
Title = "Supply Cap Reached", Message = "Build more supply!",
SeverityType = SeverityType.Error
});
return false;
}
if (production != null) {
for (var interval = lastInterval; interval < withEconomy.GetOverTime().Count; interval++) {
var economyAtSecond = withEconomy.GetOverTime()[interval];
if (economyAtSecond.Alloy >= production.Alloy && economyAtSecond.Ether >= production.Ether &&
economyAtSecond.Pyre >= production.Pyre) {
if (!MeetsSupply(entity)) {
withToasts.AddToast(new ToastModel {Title = "Supply Cap Reached", Message = "Build more supply!", SeverityType = SeverityType.Error});
return false;
}
if (!MeetsRequirements(entity, interval)) continue;
if (!MeetsRequirements(entity, interval)) continue;
//Account for human Micro delay
interval += HumanMicro;
//Account for human Micro delay
interval += HumanMicro;
if (!buildOrder.Orders.ContainsKey(interval))
buildOrder.Orders.Add(interval, new List<EntityModel> { entity.Clone() });
else
buildOrder.Orders[interval].Add(entity.Clone());
if (!buildOrder.Orders.ContainsKey(interval))
buildOrder.Orders.Add(interval, new List<EntityModel> { entity.Clone() });
else
buildOrder.Orders[interval].Add(entity.Clone());
lastInterval = interval;
lastInterval = interval;
NotifyDataChanged();
return true;
}
NotifyDataChanged();
return true;
}
else if(interval + 1 == withEconomy.GetOverTime().Count)
{
if (economyAtSecond.Ether < production.Ether)
if (interval + 1 == withEconomy.GetOverTime().Count)
{
if (economyAtSecond.Ether < production.Ether)
withToasts.AddToast(new ToastModel
{
withToasts.AddToast(new ToastModel {Title = "Not Enough Ether", Message = "Build more ether extractors!", SeverityType = SeverityType.Error});
}
}
Title = "Not Enough Ether", Message = "Build more ether extractors!",
SeverityType = SeverityType.Error
});
}
}
else {
Add(entity, 0);
NotifyDataChanged();
return true;
}
}
else
{
Add(entity, 0);
NotifyDataChanged();
return true;
}
return false;
}
public void RemoveLast() {
public void RemoveLast()
{
EntityModel entityRemoved = null!;
if (buildOrder.Orders.Keys.Count > 1) {
if (buildOrder.Orders.Keys.Count > 1)
{
var last = buildOrder.Orders.Keys.Last();
if (buildOrder.Orders[last].Count > 0) {
if (buildOrder.Orders[last].Count > 0)
{
entityRemoved = buildOrder.Orders[last].Last();
buildOrder.Orders[last].Remove(buildOrder.Orders[last].Last());
}
@ -109,7 +126,8 @@ public class BuildOrderService : IBuildOrderService {
else
lastInterval = 1;
if (entityRemoved?.Info()?.Descriptive == DescriptiveType.Worker) {
if (entityRemoved?.Info()?.Descriptive == DescriptiveType.Worker)
{
RemoveLast();
return;
}
@ -119,15 +137,18 @@ public class BuildOrderService : IBuildOrderService {
}
public string AsJson() {
var options = new JsonSerializerOptions {
public string AsJson()
{
var options = new JsonSerializerOptions
{
WriteIndented = true
};
options.Converters.Add(new JsonStringEnumConverter());
return JsonSerializer.Serialize(buildOrder, options);
}
public string BuildOrderAsYaml() {
public string BuildOrderAsYaml()
{
var stringBuilder = new StringBuilder();
var serializer = new Serializer();
stringBuilder.AppendLine(serializer.Serialize(buildOrder));
@ -135,28 +156,32 @@ public class BuildOrderService : IBuildOrderService {
return buildOrderText;
}
public List<EntityModel> GetOrdersAt(int interval) {
public List<EntityModel> GetOrdersAt(int interval)
{
return (from ordersAtTime in buildOrder.Orders
from orders in ordersAtTime.Value
where ordersAtTime.Key == interval
select orders).ToList();
}
public List<EntityModel> GetCompletedAt(int interval) {
public List<EntityModel> GetCompletedAt(int interval)
{
return (from ordersAtTime in buildOrder.Orders
from orders in ordersAtTime.Value
where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) == interval
select orders).ToList();
}
public List<EntityModel> GetCompletedBefore(int interval) {
public List<EntityModel> GetCompletedBefore(int interval)
{
return (from ordersAtTime in buildOrder.Orders
from orders in ordersAtTime.Value
where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) <= interval
select orders).ToList();
}
public List<EntityModel> GetHarvestersCompletedBefore(int interval) {
public List<EntityModel> GetHarvestersCompletedBefore(int interval)
{
return (from ordersAtTime in buildOrder.Orders
from orders in ordersAtTime.Value
where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) <= interval
@ -164,12 +189,14 @@ public class BuildOrderService : IBuildOrderService {
select orders).ToList();
}
public bool MeetsRequirements(EntityModel entity, int requestedInterval) {
public bool MeetsRequirements(EntityModel entity, int requestedInterval)
{
var requirements = entity.Requirements();
if (requirements.Count == 0) return true;
foreach (var requirement in requirements)
if (requirement.Requirement == RequirementType.Morph) {
if (requirement.Requirement == RequirementType.Morph)
{
var entitiesNeeded = from entitiesAtInterval in buildOrder.Orders
from requiredEntity in entitiesAtInterval.Value
where requestedInterval > entitiesAtInterval.Key +
@ -185,7 +212,8 @@ public class BuildOrderService : IBuildOrderService {
if (entitiesAlreadyMorphed.Count() >= entitiesNeeded.Count())
return false;
}
else {
else
{
var entitiesNeeded = from entitiesAtInterval in buildOrder.Orders
from requiredEntity in entitiesAtInterval.Value
where requestedInterval > entitiesAtInterval.Key +
@ -204,40 +232,48 @@ public class BuildOrderService : IBuildOrderService {
return true;
}
public void SetName(string Name) {
public void SetName(string Name)
{
buildOrder.Name = Name;
NotifyDataChanged();
}
public string GetName() {
public string GetName()
{
return buildOrder.Name;
}
public void SetNotes(string Notes) {
public void SetNotes(string Notes)
{
buildOrder.Notes = Notes;
NotifyDataChanged();
}
public string GetNotes() {
public string GetNotes()
{
return buildOrder.Notes;
}
public void SetColor(string color) {
public void SetColor(string color)
{
buildOrder.Color = color;
NotifyDataChanged();
}
public string GetColor() {
public string GetColor()
{
return buildOrder.Color;
}
private event Action OnChange = null!;
private void NotifyDataChanged() {
private void NotifyDataChanged()
{
OnChange?.Invoke();
}
public bool MeetsSupply(EntityModel entity) {
public bool MeetsSupply(EntityModel entity)
{
var supply = entity.Supply();
if (supply == null || supply.Takes == 0) return true;

40
Services/Immortal/EconomyService.cs

@ -5,10 +5,10 @@ using Model.Types;
namespace Services.Immortal;
public class EconomyService : IEconomyService {
private List<EconomyModel> _overTime = null!;
private List<EconomyModel> _economyOverTime = null!;
public List<EconomyModel> GetOverTime() {
return _overTime;
return _economyOverTime;
}
public void Subscribe(Action action) {
@ -20,28 +20,32 @@ public class EconomyService : IEconomyService {
}
public void Calculate(IBuildOrderService buildOrder, ITimingService timing, int fromInterval) {
if (_overTime == null) {
_overTime = new List<EconomyModel>();
//TODO Break all this up
if (_economyOverTime == null) {
_economyOverTime = new List<EconomyModel>();
for (var interval = 0; interval < timing.GetTiming(); interval++)
_overTime.Add(new EconomyModel { Interval = interval });
_economyOverTime.Add(new EconomyModel { Interval = interval });
}
if (_overTime.Count > timing.GetTiming())
_overTime.RemoveRange(timing.GetTiming(), _overTime.Count - timing.GetTiming());
while (_overTime.Count < timing.GetTiming()) _overTime.Add(new EconomyModel { Interval = _overTime.Count - 1 });
if (_economyOverTime.Count > timing.GetTiming())
_economyOverTime.RemoveRange(timing.GetTiming(), _economyOverTime.Count - timing.GetTiming());
while (_economyOverTime.Count < timing.GetTiming()) _economyOverTime.Add(new EconomyModel { Interval = _economyOverTime.Count - 1 });
for (var interval = fromInterval; interval < timing.GetTiming(); interval++) {
var economyAtSecond = _overTime[interval];
var economyAtSecond = _economyOverTime[interval];
if (interval > 0) {
economyAtSecond.Alloy = _overTime[interval - 1].Alloy;
economyAtSecond.Ether = _overTime[interval - 1].Ether;
economyAtSecond.Pyre = _overTime[interval - 1].Pyre;
economyAtSecond.WorkerCount = _overTime[interval - 1].WorkerCount;
economyAtSecond.BusyWorkerCount = _overTime[interval - 1].BusyWorkerCount;
economyAtSecond.CreatingWorkerCount = _overTime[interval - 1].CreatingWorkerCount;
economyAtSecond.Harvesters = _overTime[interval - 1].Harvesters.ToList();
economyAtSecond.CreatingWorkerDelays = _overTime[interval - 1].CreatingWorkerDelays.ToList();
economyAtSecond.Alloy = _economyOverTime[interval - 1].Alloy;
economyAtSecond.Ether = _economyOverTime[interval - 1].Ether;
economyAtSecond.Pyre = _economyOverTime[interval - 1].Pyre;
economyAtSecond.WorkerCount = _economyOverTime[interval - 1].WorkerCount;
economyAtSecond.BusyWorkerCount = _economyOverTime[interval - 1].BusyWorkerCount;
economyAtSecond.CreatingWorkerCount = _economyOverTime[interval - 1].CreatingWorkerCount;
economyAtSecond.Harvesters = _economyOverTime[interval - 1].Harvesters.ToList();
economyAtSecond.CreatingWorkerDelays = _economyOverTime[interval - 1].CreatingWorkerDelays.ToList();
}
economyAtSecond.Interval = interval;
@ -134,7 +138,7 @@ public class EconomyService : IEconomyService {
public EconomyModel GetEconomy(int atInterval) {
return _overTime[atInterval];
return _economyOverTime[atInterval];
}
private event Action onChange = null!;

16
Services/Website/NavigationService.cs

@ -4,13 +4,18 @@ namespace Services.Website;
public class NavigationService : INavigationService {
private string navigationStateType = NavigationStateType.Default;
private int navigationStateId = -1;
private NavSelectionType navSelectionType = NavSelectionType.None;
private Type renderType = null!;
private int webPageType;
private int webSectionType;
public void Subscribe(Action action) {
OnChange += action;
}
@ -19,6 +24,17 @@ public class NavigationService : INavigationService {
OnChange += action;
}
public void ChangeNavigationSectionId(int newState)
{
navigationStateId = newState;
NotifyDataChanged();
}
public int GetNavigationSectionId()
{
return navigationStateId;
}
public void ChangeNavigationState(string newState) {
if (newState.Equals(navigationStateType))
return;

44
Services/Website/WebsiteService.cs

@ -1,10 +1,5 @@
using System.Net.Http.Json;
#if !NO_SQL
using Contexts;
using Microsoft.EntityFrameworkCore;
#endif
using Model.Website;
namespace Services.Development;
@ -24,17 +19,8 @@ public class WebsiteService : IWebsiteService {
#if NO_SQL
public List<WebSectionModel> WebSectionModels { get; set; } = default!;
public List<WebPageModel> WebPageModels { get; set; } = default!;
#else
private DatabaseContext Database { get; set; }
public DbSet<WebSectionModel> WebSectionModels => Database.WebSectionModels;
public DbSet<WebPageModel> WebPageModels => Database.WebPageModels;
#endif
public void Subscribe(Action action) {
@ -49,38 +35,34 @@ public class WebsiteService : IWebsiteService {
return isLoaded;
}
#if NO_SQL
public async Task Load() {
if (isLoaded) {return;}
WebPageModels = ((await httpClient.GetFromJsonAsync<WebPageModel[]>("generated/WebPageModels.json"))!).ToList();
WebSectionModels =((await httpClient.GetFromJsonAsync<WebSectionModel[]>("generated/WebSectionModels.json"))!).ToList();
isLoaded = true;
SortSql();
NotifyDataChanged();
}
#else
public async Task Load(DatabaseContext database) {
Database = database;
if (isLoaded) {return;}
Database.WebPageModels.AddRange(await httpClient.GetFromJsonAsync<WebPageModel[]>("generated/WebPageModels.json"));
Database.WebSectionModels.AddRange(
await httpClient.GetFromJsonAsync<WebSectionModel[]>("generated/WebSectionModels.json"));
void SortSql()
{
foreach (var page in WebPageModels)
{
Database.SaveChanges();
if (page.WebSectionModelId != null)
{
WebSectionModel webSection =
WebSectionModels.Find(webSection => webSection.Id == page.WebSectionModelId);
isLoaded = true;
webSection.WebPageModels.Add(page);
}
}
NotifyDataChanged();
}
#endif
public void Update() {
NotifyDataChanged();

Loading…
Cancel
Save