feat(overlay): glassy buttons (zoom-bar style gloss gradient)

DrawButton теперь рисует стеклянную кнопку как ползунок зум-бара: тёмная
скруглённая база-фаска + вертикальный глянцевый градиент (ярче вверху,
темнее внизу) + блик сверху и тень снизу. Хелпер GlossColor масштабирует
яркость цвета. Только при ребилде кэша — CPU-паритет сохранён.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-01 17:17:46 +03:00
co-authored by Claude Opus 4.8
parent 08c71c47ad
commit 737af0d227
+40 -4
View File
@@ -407,17 +407,53 @@ end;
{ ---- Примитивы отрисовки ---- }
// Масштаб яркости цвета (для стеклянного градиента/фаски).
function GlossColor(Base: TColor; F: Double): TColor;
var
R, G, B: Byte;
begin
RedGreenBlue(ColorToRGB(Base), R, G, B);
Result := RGBToColor(EnsureRange(Round(R * F), 0, 255),
EnsureRange(Round(G * F), 0, 255),
EnsureRange(Round(B * F), 0, 255));
end;
procedure TVfoOverlay.DrawButton(C: TCanvas; const R: TRect; const Lbl: string;
Active, Hot: Boolean; FontSz: Integer);
var
Base: TColor;
Y, H: Integer;
RowT, Gloss: Double;
begin
if Active then C.Brush.Color := CLR_ACCENT
else if Hot then C.Brush.Color := CLR_BTN_HOT
else C.Brush.Color := CLR_BTN_NORM;
if Active then Base := CLR_ACCENT
else if Hot then Base := CLR_BTN_HOT
else Base := CLR_BTN_NORM;
// Скруглённая тёмная база = форма + рамка-фаска.
C.Brush.Color := GlossColor(Base, 0.58);
C.Brush.Style := bsSolid;
C.Pen.Color := GlossColor(Base, 0.42);
C.Pen.Style := psSolid;
C.Pen.Color := C.Brush.Color;
C.RoundRect(R.Left, R.Top, R.Right, R.Bottom, 5, 5);
// Стеклянный вертикальный градиент: ярче вверху, темнее внизу (как ползунок зума).
H := R.Bottom - R.Top;
C.Pen.Style := psClear;
for Y := R.Top + 1 to R.Bottom - 2 do
begin
if H > 3 then RowT := (Y - (R.Top + 1)) / (H - 3) else RowT := 0.0;
Gloss := 1.30 - 0.60 * RowT;
C.Brush.Color := GlossColor(Base, Gloss);
C.FillRect(Rect(R.Left + 2, Y, R.Right - 2, Y + 1));
end;
// Блик сверху + тень снизу (объём).
C.Pen.Style := psSolid;
C.Pen.Color := GlossColor(Base, 1.55);
C.Line(R.Left + 2, R.Top + 1, R.Right - 2, R.Top + 1);
C.Pen.Color := GlossColor(Base, 0.40);
C.Line(R.Left + 2, R.Bottom - 2, R.Right - 2, R.Bottom - 2);
if Active then C.Font.Color := CLR_CARD_BG
else C.Font.Color := CLR_TEXT;
C.Font.Name := 'Courier New';