ui(tx): треугольник пилюли профиля выровнен по надписи

Треугольник центрировался по прямоугольнику пилюли, а текст — по TextHeight,
который включает выносные элементы вниз. В подписи одни заглавные, они сидят
в верхней части бокса, поэтому треугольник визуально проваливался: по пикселям
текст занимал строки 7..13, треугольник 11..15.

Считаем от метрики самой надписи (TxtY + TextHeight div 2 - 2), а не от бокса,
чтобы выравнивание пережило смену шрифта или кегля. После правки текст 7..13,
треугольник 8..12.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-04 19:30:54 +03:00
co-authored by Claude Opus 5
parent 249881a579
commit 199d0ffa85
+11 -6
View File
@@ -1236,7 +1236,7 @@ procedure TVfoOverlay.DrawSelf(C: TCanvas; W, H: Integer);
var var
FreqStr, SStr, BWStr, DMRStr, TxStr, PStr: string; FreqStr, SStr, BWStr, DMRStr, TxStr, PStr: string;
CurY, X, RW, i, DMRX, DMRRight, TxRight, TxW: Integer; CurY, X, RW, i, DMRX, DMRRight, TxRight, TxW: Integer;
ProfLeft, ProfRight, ProfW: Integer; ProfLeft, ProfRight, ProfW, TxtY, TriY: Integer;
R: TRect; R: TRect;
Tri3: array[0..2] of TPoint; Tri3: array[0..2] of TPoint;
BarL, BarW, MeterX: Integer; BarL, BarW, MeterX: Integer;
@@ -1347,14 +1347,19 @@ begin
C.Brush.Style := bsClear; C.Brush.Style := bsClear;
while (Length(PStr) > 1) and (C.TextWidth(PStr) > ProfW - 14) do while (Length(PStr) > 1) and (C.TextWidth(PStr) > ProfW - 14) do
SetLength(PStr, Length(PStr) - 1); SetLength(PStr, Length(PStr) - 1);
C.TextOut(R.Left + 4, R.Top + (HDR_BADGE_H - C.TextHeight('A')) div 2, PStr); TxtY := R.Top + (HDR_BADGE_H - C.TextHeight('A')) div 2;
C.TextOut(R.Left + 4, TxtY, PStr);
// Треугольник «список» справа — рисуем, а не пишем: в Courier New // Треугольник «список» справа — рисуем, а не пишем: в Courier New
// юникодных стрелок может не оказаться. // юникодных стрелок может не оказаться. Центрируем не по прямоугольнику
// текста, а по САМИМ буквам: TextHeight включает выносные элементы, а в
// подписи одни заглавные, они сидят в верхней части бокса — иначе
// треугольник визуально проваливается ниже надписи.
TriY := TxtY + C.TextHeight('A') div 2 - 2;
C.Brush.Color := C.Font.Color; C.Brush.Style := bsSolid; C.Brush.Color := C.Font.Color; C.Brush.Style := bsSolid;
C.Pen.Color := C.Font.Color; C.Pen.Color := C.Font.Color;
Tri3[0] := Point(R.Right - 9, CurY + 5); Tri3[0] := Point(R.Right - 9, TriY - 2);
Tri3[1] := Point(R.Right - 3, CurY + 5); Tri3[1] := Point(R.Right - 3, TriY - 2);
Tri3[2] := Point(R.Right - 6, CurY + 9); Tri3[2] := Point(R.Right - 6, TriY + 2);
C.Polygon(Tri3); C.Polygon(Tri3);
C.Font.Size := 8; C.Font.Size := 8;
RegisterHit(R, HIT_TXPROF); RegisterHit(R, HIT_TXPROF);