Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 62 additions & 56 deletions src/Views/Chart.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,77 +103,83 @@ public override void Render(DrawingContext context)
var sampleW = hasUserSamples ? Math.Min(step * 0.5 - 2.5, 14.0) : Math.Min(step - 3, 28.0);
var maxSampleH = h - 24.0;
var maxLabelEndX = w - 4.0;
var labelsToDraw = new List<(FormattedText Text, Point Position)>();

using var clip = context.PushClip(new Rect(leftMargin, 0, w - leftMargin, h));
do
using (context.PushClip(new Rect(leftMargin, 0, w - leftMargin, h)))
{
var (label, total, user) = samples.GetSample(time);

if (x - step <= w && total > 0)
do
{
if (hasUserSamples)
{
var startX = x - step * 0.5 - 1 - sampleW;
var startY = maxSampleH * (1.0 - total * 1.0 / maxValue);
var rect = new Rect(startX, startY, sampleW, maxSampleH - startY);
var (label, total, user) = samples.GetSample(time);

using (context.PushOpacity(0.2))
if (x - step <= w && total > 0)
{
if (hasUserSamples)
{
context.DrawRectangle(sampleBrush, null, new RoundedRect(rect, corner));
var startX = x - step * 0.5 - 1 - sampleW;
var startY = maxSampleH * (1.0 - total * 1.0 / maxValue);
var rect = new Rect(startX, startY, sampleW, maxSampleH - startY);

using (context.PushOpacity(0.2))
{
context.DrawRectangle(sampleBrush, null, new RoundedRect(rect, corner));
}

if (user > 0)
{
var userStartX = startX + sampleW + 2;
var userStartY = maxSampleH * (1.0 - user * 1.0 / maxValue);
var userRect = new Rect(userStartX, userStartY, sampleW, maxSampleH - userStartY);
context.DrawRectangle(sampleBrush, null, new RoundedRect(userRect, corner));
}

var hitRect = new Rect(startX, startY, sampleW * 2 + 2, maxSampleH - startY);
_hitBoxes.Add(new(hitRect, new(label, true, total, user)));
}

if (user > 0)
else
{
var userStartX = startX + sampleW + 2;
var userStartY = maxSampleH * (1.0 - user * 1.0 / maxValue);
var userRect = new Rect(userStartX, userStartY, sampleW, maxSampleH - userStartY);
context.DrawRectangle(sampleBrush, null, new RoundedRect(userRect, corner));
}

var hitRect = new Rect(startX, startY, sampleW * 2 + 2, maxSampleH - startY);
_hitBoxes.Add(new(hitRect, new(label, true, total, user)));
}
else
{
var startX = x - step * 0.5 - sampleW * 0.5;
var startY = maxSampleH * (1.0 - total * 1.0 / maxValue);
var rect = new Rect(startX, startY, sampleW, maxSampleH - startY);
var startX = x - step * 0.5 - sampleW * 0.5;
var startY = maxSampleH * (1.0 - total * 1.0 / maxValue);
var rect = new Rect(startX, startY, sampleW, maxSampleH - startY);

context.DrawRectangle(sampleBrush, null, new RoundedRect(rect, corner));
_hitBoxes.Add(new(rect, new(label, false, total, 0)));
context.DrawRectangle(sampleBrush, null, new RoundedRect(rect, corner));
_hitBoxes.Add(new(rect, new(label, false, total, 0)));
}
}
}

if (x <= w)
{
var formattedLabel = new FormattedText(
label,
CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
labelTypeface,
11,
Brushes.Gray);

var labelCenterX = x - step * 0.5;
var labelEndX = labelCenterX + formattedLabel.Width * 0.5;
if (labelEndX <= maxLabelEndX)
if (x <= w)
{
var labelStartX = labelCenterX - formattedLabel.Width * 0.5;
var labelStartY = h - formattedLabel.Height - 2.0;
context.DrawText(formattedLabel, new Point(labelStartX, labelStartY));
maxLabelEndX = labelStartX - 16.0;
var formattedLabel = new FormattedText(
label,
CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
labelTypeface,
11,
Brushes.Gray);

var labelCenterX = x - step * 0.5;
var labelEndX = labelCenterX + formattedLabel.Width * 0.5;
if (labelEndX <= maxLabelEndX)
{
var labelStartX = labelCenterX - formattedLabel.Width * 0.5;
var labelStartY = h - formattedLabel.Height - 2.0;
labelsToDraw.Add((formattedLabel, new Point(labelStartX, labelStartY)));
maxLabelEndX = labelStartX - 16.0;
}
}
}

if (x <= leftMargin)
break;
if (x <= leftMargin)
break;

x -= step;
x -= step;

time = samples.NextSampleTime(time);
if (time < minTime)
break;
} while (true);
}

time = samples.NextSampleTime(time);
if (time < minTime)
break;
} while (true);
foreach (var (text, position) in labelsToDraw)
context.DrawText(text, position);
}

protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
Expand Down