fix(ui): handle edge cases in DensityBar and PhaseStepperControl

DensityBar: clamp rounded rect radius for small fill widths to avoid
GDI+ artifacts at very low density values.

PhaseStepperControl: use float arithmetic for circle spacing to
handle DPI-scaled widths evenly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-18 17:39:13 -04:00
parent 9a4f20ca00
commit b6cde145e1
2 changed files with 6 additions and 5 deletions

View File

@@ -46,8 +46,9 @@ namespace OpenNest.Controls
var fillWidth = (int)(rect.Width * value);
if (fillWidth > 0)
{
var fillRadius = System.Math.Min(4, fillWidth / 2);
var fillRect = new Rectangle(rect.X, rect.Y, fillWidth, rect.Height);
using var fillPath = CreateRoundedRect(fillRect, 4);
using var fillPath = CreateRoundedRect(fillRect, fillRadius);
using var gradientBrush = new LinearGradientBrush(
new Point(rect.X, 0), new Point(rect.Right, 0),
LowColor, HighColor);

View File

@@ -81,7 +81,7 @@ namespace OpenNest.Controls
var padding = 30;
var usableWidth = Width - padding * 2;
var spacing = usableWidth / (count - 1);
var spacing = (float)usableWidth / (count - 1);
var circleY = 18;
var normalRadius = 9;
var activeRadius = 11;
@@ -96,8 +96,8 @@ namespace OpenNest.Controls
// Draw connecting lines
for (var i = 0; i < count - 1; i++)
{
var x1 = padding + i * spacing;
var x2 = padding + (i + 1) * spacing;
var x1 = (int)(padding + i * spacing);
var x2 = (int)(padding + (i + 1) * spacing);
g.DrawLine(linePen, x1, circleY, x2, circleY);
}
@@ -105,7 +105,7 @@ namespace OpenNest.Controls
for (var i = 0; i < count; i++)
{
var phase = Phases[i];
var cx = padding + i * spacing;
var cx = (int)(padding + i * spacing);
var isActive = activePhase == phase && !isComplete;
var isVisited = visitedPhases.Contains(phase) || isComplete;