diff --git a/Yafc/Windows/MainScreen.cs b/Yafc/Windows/MainScreen.cs index 99e0ae61..f10eabf4 100644 --- a/Yafc/Windows/MainScreen.cs +++ b/Yafc/Windows/MainScreen.cs @@ -83,6 +83,8 @@ private void SetProject(Project project) { project.AssureFirstPage(); } + summaryView.SetProject(project); + // Activate all page solvers for the summary view foreach (var page in project.pages) { _ = page.SolvePage(); diff --git a/Yafc/Workspace/SummaryView.cs b/Yafc/Workspace/SummaryView.cs index 82c8db1d..c3f9aa35 100644 --- a/Yafc/Workspace/SummaryView.cs +++ b/Yafc/Workspace/SummaryView.cs @@ -164,6 +164,7 @@ private struct GoodDetails { private readonly SummaryScrollArea scrollArea; private readonly SummaryDataColumn goodsColumn; private readonly DataGrid mainGrid; + private readonly HashSet subscribedPages = []; private Dictionary allGoods = []; @@ -210,20 +211,48 @@ public SummaryView(Project project) { [MemberNotNull(nameof(project))] public void SetProject(Project project) { - if (this.project != null) { - this.project.metaInfoChanged -= Recalculate; + if (ReferenceEquals(this.project, project)) { + SyncPageSubscriptions(); + Recalculate(); + return; + } - foreach (ProjectPage page in this.project.pages) { - page.contentChanged -= Recalculate; - } + if (this.project != null) { + this.project.metaInfoChanged -= ProjectMetaInfoChanged; + UnsubscribeFromAllPages(); } this.project = project; - project.metaInfoChanged += Recalculate; + project.metaInfoChanged += ProjectMetaInfoChanged; + SyncPageSubscriptions(); + + Recalculate(); + } + + private void ProjectMetaInfoChanged() { + SyncPageSubscriptions(); + Recalculate(); + } + + private void SyncPageSubscriptions() { + foreach (ProjectPage page in subscribedPages.Where(page => !project.pages.Contains(page)).ToList()) { + page.contentChanged -= Recalculate; + _ = subscribedPages.Remove(page); + } foreach (ProjectPage page in project.pages) { - page.contentChanged += Recalculate; + if (subscribedPages.Add(page)) { + page.contentChanged += Recalculate; + } + } + } + + private void UnsubscribeFromAllPages() { + foreach (ProjectPage page in subscribedPages) { + page.contentChanged -= Recalculate; } + + subscribedPages.Clear(); } protected override void BuildPageTooltip(ImGui gui, Summary contents) { @@ -281,6 +310,8 @@ protected override async void BuildContent(ImGui gui) { scrollArea.Build(gui); } + protected override void ModelContentsChanged(bool visualOnly) => Recalculate(visualOnly); + private async Task AutoBalance() { try { // The things we've already updated, and the error each had before their previous update.