Skip to content

Commit 20573e9

Browse files
committed
fix: prevent leftmost x-axis label from being clipped in Statistics chart
1 parent 6f670b1 commit 20573e9

1 file changed

Lines changed: 62 additions & 56 deletions

File tree

src/Views/Chart.cs

Lines changed: 62 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -103,77 +103,83 @@ public override void Render(DrawingContext context)
103103
var sampleW = hasUserSamples ? Math.Min(step * 0.5 - 2.5, 14.0) : Math.Min(step - 3, 28.0);
104104
var maxSampleH = h - 24.0;
105105
var maxLabelEndX = w - 4.0;
106+
var labelsToDraw = new List<(FormattedText Text, Point Position)>();
106107

107-
using var clip = context.PushClip(new Rect(leftMargin, 0, w - leftMargin, h));
108-
do
108+
using (context.PushClip(new Rect(leftMargin, 0, w - leftMargin, h)))
109109
{
110-
var (label, total, user) = samples.GetSample(time);
111-
112-
if (x - step <= w && total > 0)
110+
do
113111
{
114-
if (hasUserSamples)
115-
{
116-
var startX = x - step * 0.5 - 1 - sampleW;
117-
var startY = maxSampleH * (1.0 - total * 1.0 / maxValue);
118-
var rect = new Rect(startX, startY, sampleW, maxSampleH - startY);
112+
var (label, total, user) = samples.GetSample(time);
119113

120-
using (context.PushOpacity(0.2))
114+
if (x - step <= w && total > 0)
115+
{
116+
if (hasUserSamples)
121117
{
122-
context.DrawRectangle(sampleBrush, null, new RoundedRect(rect, corner));
118+
var startX = x - step * 0.5 - 1 - sampleW;
119+
var startY = maxSampleH * (1.0 - total * 1.0 / maxValue);
120+
var rect = new Rect(startX, startY, sampleW, maxSampleH - startY);
121+
122+
using (context.PushOpacity(0.2))
123+
{
124+
context.DrawRectangle(sampleBrush, null, new RoundedRect(rect, corner));
125+
}
126+
127+
if (user > 0)
128+
{
129+
var userStartX = startX + sampleW + 2;
130+
var userStartY = maxSampleH * (1.0 - user * 1.0 / maxValue);
131+
var userRect = new Rect(userStartX, userStartY, sampleW, maxSampleH - userStartY);
132+
context.DrawRectangle(sampleBrush, null, new RoundedRect(userRect, corner));
133+
}
134+
135+
var hitRect = new Rect(startX, startY, sampleW * 2 + 2, maxSampleH - startY);
136+
_hitBoxes.Add(new(hitRect, new(label, true, total, user)));
123137
}
124-
125-
if (user > 0)
138+
else
126139
{
127-
var userStartX = startX + sampleW + 2;
128-
var userStartY = maxSampleH * (1.0 - user * 1.0 / maxValue);
129-
var userRect = new Rect(userStartX, userStartY, sampleW, maxSampleH - userStartY);
130-
context.DrawRectangle(sampleBrush, null, new RoundedRect(userRect, corner));
131-
}
132-
133-
var hitRect = new Rect(startX, startY, sampleW * 2 + 2, maxSampleH - startY);
134-
_hitBoxes.Add(new(hitRect, new(label, true, total, user)));
135-
}
136-
else
137-
{
138-
var startX = x - step * 0.5 - sampleW * 0.5;
139-
var startY = maxSampleH * (1.0 - total * 1.0 / maxValue);
140-
var rect = new Rect(startX, startY, sampleW, maxSampleH - startY);
140+
var startX = x - step * 0.5 - sampleW * 0.5;
141+
var startY = maxSampleH * (1.0 - total * 1.0 / maxValue);
142+
var rect = new Rect(startX, startY, sampleW, maxSampleH - startY);
141143

142-
context.DrawRectangle(sampleBrush, null, new RoundedRect(rect, corner));
143-
_hitBoxes.Add(new(rect, new(label, false, total, 0)));
144+
context.DrawRectangle(sampleBrush, null, new RoundedRect(rect, corner));
145+
_hitBoxes.Add(new(rect, new(label, false, total, 0)));
146+
}
144147
}
145-
}
146148

147-
if (x <= w)
148-
{
149-
var formattedLabel = new FormattedText(
150-
label,
151-
CultureInfo.CurrentCulture,
152-
FlowDirection.LeftToRight,
153-
labelTypeface,
154-
11,
155-
Brushes.Gray);
156-
157-
var labelCenterX = x - step * 0.5;
158-
var labelEndX = labelCenterX + formattedLabel.Width * 0.5;
159-
if (labelEndX <= maxLabelEndX)
149+
if (x <= w)
160150
{
161-
var labelStartX = labelCenterX - formattedLabel.Width * 0.5;
162-
var labelStartY = h - formattedLabel.Height - 2.0;
163-
context.DrawText(formattedLabel, new Point(labelStartX, labelStartY));
164-
maxLabelEndX = labelStartX - 16.0;
151+
var formattedLabel = new FormattedText(
152+
label,
153+
CultureInfo.CurrentCulture,
154+
FlowDirection.LeftToRight,
155+
labelTypeface,
156+
11,
157+
Brushes.Gray);
158+
159+
var labelCenterX = x - step * 0.5;
160+
var labelEndX = labelCenterX + formattedLabel.Width * 0.5;
161+
if (labelEndX <= maxLabelEndX)
162+
{
163+
var labelStartX = labelCenterX - formattedLabel.Width * 0.5;
164+
var labelStartY = h - formattedLabel.Height - 2.0;
165+
labelsToDraw.Add((formattedLabel, new Point(labelStartX, labelStartY)));
166+
maxLabelEndX = labelStartX - 16.0;
167+
}
165168
}
166-
}
167169

168-
if (x <= leftMargin)
169-
break;
170+
if (x <= leftMargin)
171+
break;
170172

171-
x -= step;
173+
x -= step;
174+
175+
time = samples.NextSampleTime(time);
176+
if (time < minTime)
177+
break;
178+
} while (true);
179+
}
172180

173-
time = samples.NextSampleTime(time);
174-
if (time < minTime)
175-
break;
176-
} while (true);
181+
foreach (var (text, position) in labelsToDraw)
182+
context.DrawText(text, position);
177183
}
178184

179185
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)

0 commit comments

Comments
 (0)