mirror of
https://github.com/ajisaacs/OpenNest.git
synced 2026-10-27 09:21:05 -04:00
Roslyn duplicate scans found the same code copied across layers: - Data: the three browse sessions share BrowseSession<TPage, TSort>; the remote clients share NestServerHttp (JSON options, If-Match, error text). - WinForms: five paged lists share BrowsePager for loading text, navigation, sort glyphs and failure messages. The Add Drawings to Release, Drawing Library and set browser dialogs now dispose their browse sessions. - Server: NestQueryRequest reuses DrawingLibraryRequest's helpers; revision history queries share count and paging binds. - Engine: RemnantPlateNester delegates to DefaultPlateNester; CuttingPlanService reuses JointCuttingPlanSearch.Map. - Core: LineArc and CleanHole lead-ins share LineArcApproach with unchanged arithmetic order, so output is bit-identical. - IO: Dxf.GetGeometry overloads share one reader; .nest JSON test helpers move to NestArchiveJson. Also fixes the production compiler warnings (CS8632, CS8603, CS0108) and moves a test off an obsolete forwarding API. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
74 lines
3.2 KiB
C#
74 lines
3.2 KiB
C#
namespace OpenNest.Data;
|
|
|
|
/// <summary>
|
|
/// Browse state for Add from Drawing Library: the requested search, sort, page and
|
|
/// nest filter, and the last page applied. By default only drawings with the nest's
|
|
/// material, grade and thickness are listed; <see cref="SetShowAllAsync"/> lifts that
|
|
/// filter. Paging, superseding and disposal follow <see cref="BrowseSession{TPage, TSort}"/>.
|
|
/// Call from one thread (the UI thread).
|
|
/// </summary>
|
|
public sealed class DrawingLibraryBrowseSession : BrowseSession<DrawingLibraryPage, DrawingSortField>
|
|
{
|
|
private readonly IDrawingLibrary _library;
|
|
|
|
public DrawingLibraryBrowseSession(IDrawingLibrary library, Nest nest, int pageSize = DrawingLibraryQuery.DefaultLimit)
|
|
: base(pageSize, DrawingLibraryQuery.MaxLimit, DrawingSortField.SavedAt)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(library);
|
|
ArgumentNullException.ThrowIfNull(nest);
|
|
|
|
_library = library;
|
|
MaterialName = (nest.Material?.Name ?? "").Trim();
|
|
MaterialGrade = (nest.Material?.Grade ?? "").Trim();
|
|
// A nest without a thickness has nothing to match; it filters by material only.
|
|
Thickness = double.IsFinite(nest.Thickness) && nest.Thickness > 0
|
|
? DrawingLibraryRules.NormalizeThickness(nest.Thickness)
|
|
: null;
|
|
}
|
|
|
|
/// <summary>The nest's material name, applied unless <see cref="ShowAll"/>; blank means any.</summary>
|
|
public string MaterialName { get; }
|
|
|
|
/// <summary>The nest's grade, applied unless <see cref="ShowAll"/>; blank means any.</summary>
|
|
public string MaterialGrade { get; }
|
|
|
|
/// <summary>The nest's thickness, applied unless <see cref="ShowAll"/>; null means any.</summary>
|
|
public double? Thickness { get; }
|
|
|
|
/// <summary>True when the nest filter is lifted and every active drawing is listed.</summary>
|
|
public bool ShowAll { get; private set; }
|
|
|
|
/// <summary>True when the latest request narrows by the nest's material, grade or thickness.</summary>
|
|
public bool IsFilteredToNest =>
|
|
!ShowAll && (MaterialName.Length > 0 || MaterialGrade.Length > 0 || Thickness is not null);
|
|
|
|
/// <inheritdoc />
|
|
public override string Summary =>
|
|
PageSummary("drawings",
|
|
Search.Length > 0 ? "No drawings match the search."
|
|
: IsFilteredToNest ? "No library drawings match this nest's material and thickness. Choose Show all to see every drawing."
|
|
: "No drawings in the library.");
|
|
|
|
/// <summary>Lifts or restores the nest filter and returns to the first page.</summary>
|
|
public Task<bool> SetShowAllAsync(bool showAll)
|
|
{
|
|
ShowAll = showAll;
|
|
return FirstPageAsync();
|
|
}
|
|
|
|
protected override Task<DrawingLibraryPage> QueryAsync(CancellationToken cancellationToken) =>
|
|
_library.QueryAsync(
|
|
new DrawingLibraryQuery
|
|
{
|
|
Search = Search,
|
|
MaterialName = ShowAll ? "" : MaterialName,
|
|
MaterialGrade = ShowAll ? "" : MaterialGrade,
|
|
Thickness = ShowAll ? null : Thickness,
|
|
Sort = Sort,
|
|
Descending = Descending,
|
|
Offset = Offset,
|
|
Limit = PageSize,
|
|
},
|
|
cancellationToken);
|
|
}
|