From 440fe767f1cd65573818998f6f085b7ead1ec8ea Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Wed, 4 Nov 2026 20:47:51 -0500 Subject: [PATCH] fix(ui): keep the drawing library dialogs above the main window The library dialogs were owned by the nest tab (an MDI child) or by the library view, both child windows. Windows only keeps a dialog above its owner, so the main window could cover them. Own them by the top-level window instead. Co-Authored-By: Claude Opus 5.5 --- OpenNest/Controls/DrawingLibraryView.cs | 16 +++++++++++----- OpenNest/Forms/EditNestForm.cs | 14 ++++++++++---- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/OpenNest/Controls/DrawingLibraryView.cs b/OpenNest/Controls/DrawingLibraryView.cs index 4498729f..cf0b8c82 100644 --- a/OpenNest/Controls/DrawingLibraryView.cs +++ b/OpenNest/Controls/DrawingLibraryView.cs @@ -100,6 +100,12 @@ namespace OpenNest.Controls /// public bool QuantitiesChanged { get; private set; } + /// + /// The window that owns this view's dialogs. A dialog owned by a child control is not kept + /// above its top-level window, so it can fall behind it. + /// + private IWin32Window DialogOwner => (IWin32Window)TopLevelControl ?? this; + public DrawingLibraryView() { InitializeComponent(); @@ -126,24 +132,24 @@ namespace OpenNest.Controls EditDrawing = edit => { using var form = new EditLibraryDrawingForm(edit); - return form.ShowDialog(this) == DialogResult.OK ? form.Saved : null; + return form.ShowDialog(DialogOwner) == DialogResult.OK ? form.Saved : null; }; ChooseSet = () => { using var form = new ChooseDrawingSetForm(sets, library, this.serverUrl); - return form.ShowDialog(this) == DialogResult.OK ? (true, form.PickedSet) : (false, null); + return form.ShowDialog(DialogOwner) == DialogResult.OK ? (true, form.PickedSet) : (false, null); }; EditSet = edit => { using var form = new EditDrawingSetForm(edit, library, this.serverUrl); - return form.ShowDialog(this) == DialogResult.OK ? form.Saved : null; + return form.ShowDialog(DialogOwner) == DialogResult.OK ? form.Saved : null; }; ShowReleases = record => { using var form = new DrawingSetsForm(sets, library, this.serverUrl); enableSetsRelease(form); _ = form.ShowReleasesAsync(drawing: record); - form.ShowDialog(this); + form.ShowDialog(DialogOwner); }; LoadPreview = async (record, token) => { @@ -437,7 +443,7 @@ namespace OpenNest.Controls using var form = new ReleaseSetForm(sets, library, nests, serverUrl, Array.Empty(), new[] { new SetReleaseDrawingLine(record, quantity) }, openNest) { IsNestOpen = isNestOpen ?? (_ => false) }; - form.ShowDialog(this); + form.ShowDialog(DialogOwner); }; enableSetsRelease = form => form.EnableRelease(nests, openNest, isNestOpen); releaseSeparator.Visible = true; diff --git a/OpenNest/Forms/EditNestForm.cs b/OpenNest/Forms/EditNestForm.cs index 57215c39..8391b267 100644 --- a/OpenNest/Forms/EditNestForm.cs +++ b/OpenNest/Forms/EditNestForm.cs @@ -1177,7 +1177,7 @@ namespace OpenNest.Forms PlateView.EndAction(); cutSimulatorForm = new CutSimulatorForm(this); cutSimulatorForm.FormClosed += (_, _) => cutSimulatorForm = null; - var owner = MdiParent ?? (Form)this; + var owner = DialogOwner; var corner = owner.PointToScreen(new Point(owner.ClientSize.Width, owner.ClientSize.Height)); cutSimulatorForm.Show(owner); cutSimulatorForm.Location = new Point( @@ -1457,6 +1457,12 @@ namespace OpenNest.Forms drawingListBox1.SaveToLibraryUnavailableReason = enabled ? null : NestStorage.DatabaseModeOnly; } + /// + /// The top-level window that owns this tab's dialogs. An MDI child is a child window, and a + /// dialog owned by one is not kept above the main window, so it can fall behind it. + /// + private Form DialogOwner => MdiParent ?? this; + /// Opens the drawing library browser and lists whatever it added. public void AddFromDrawingLibrary() { @@ -1483,7 +1489,7 @@ namespace OpenNest.Forms // The dialog adds drawings and sets quantities as the operator works in it. using var change = BeginChange("Drawing Library"); var job = (Nest.Material, Nest.Thickness); - form.ShowDialog(this); + form.ShowDialog(DialogOwner); if (form.AddedDrawings.Count > 0 || form.QuantitiesChanged) { change.MarkChanged(); @@ -1531,7 +1537,7 @@ namespace OpenNest.Forms lastCutType, Environment.UserName); // The library itself is on the server; the drawing's link to it is saved with the nest. using var change = BeginChange("Save to Drawing Library"); - if (form.ShowDialog(this) != DialogResult.OK || form.Result == null) + if (form.ShowDialog(DialogOwner) != DialogResult.OK || form.Result == null) { change.Complete(); return; @@ -1574,7 +1580,7 @@ namespace OpenNest.Forms addingToSet = true; try { - await new NestDrawingsToSet(this, sets, library, NestStorage.Settings.ServerUrl).RunAsync(Nest); + await new NestDrawingsToSet(DialogOwner, sets, library, NestStorage.Settings.ServerUrl).RunAsync(Nest); } finally {