{
  Copyright (C)
  2026 - Uladzimir Karpenka, EW8BAK

  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  as published by the Free Software Foundation; either version 2
  of the License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
}

unit AppTheme;

{ Цветовые темы приложения EWSDR.
  Определяет TAppTheme — запись со всеми цветами интерфейса.
  Два конструктора: DarkTheme() и LightTheme(). }

{$mode objfpc}{$H+}

interface

uses Graphics;

type
  TAppTheme = record
    // Форма / панели
    BG, Panel, Border: TColor;
    // Текст
    Text, TextDim: TColor;
    // Обычные кнопки (StyleButton)
    BtnNorm, BtnActive, BtnHot: TColor;
    BtnBorderNorm, BtnBorderActive: TColor;
    BtnText, BtnTextActive: TColor;
    // Кнопки SPAN / VFO-copy / HidePanel (StyleSpanButton)
    SpanNorm, SpanActive: TColor;
    SpanBorder: TColor;
    SpanText: TColor;
    // Кнопки тулбара (Discover / StartStop)
    TbDiscoverNorm, TbDiscoverHot, TbDiscoverBorder: TColor;
    TbDiscoverText: TColor;
    TbStartNorm, TbStartBorder, TbStartText: TColor;
    // VFO-select кнопка — активный VFO
    VfoSelActNorm, VfoSelActBorder: TColor;
    VfoSelActText, VfoSelActTextAct: TColor;
    // VFO-select кнопка — неактивный VFO
    VfoSelInaNorm, VfoSelInaBorder: TColor;
    VfoSelInaText, VfoSelInaTextAct: TColor;
    // VFO-TX кнопка — активна (TX на этом VFO)
    VfoTxActNorm, VfoTxActBorder: TColor;
    VfoTxActText: TColor;
    // VFO-TX кнопка — неактивна
    VfoTxInaNorm, VfoTxInaBorder: TColor;
    VfoTxInaText: TColor;
    // Дисплей частоты
    FreqActive, FreqDim: TColor;
    FreqHover, FreqHoverBG, FreqDimDot: TColor;
    // Индикаторы (S-meter, мощность)
    MeterOn, MeterOvr: TColor;
    Amber: TColor;
    // Спектр — фон и сетка
    SpecGradTop, SpecGradBot: TColor;
    SpecLabelBand: TColor;
    SpecLabelText: TColor;
    SpecGrid: TColor;
    // Спектр — сигнал и маркеры
    SpecLine: TColor;
    SpecFilter: TColor;
    // Заливка полосы главного фильтра. Отдельно от SpecFilter (тот остался
    // подложкой подписей AGC): полоса теперь полупрозрачная, как у слайсов, и
    // цвет ей нужен СВОЙ — SpecFilter почти совпадает с нижним цветом фонового
    // градиента спектра, поэтому такая заливка читалась не оттенком, а
    // затемнением.
    SpecFilterBand: TColor;
    SpecFilterEdge: TColor;
    SpecAgcColor: TColor;
    SpecAgcHangColor: TColor;
    SpecVfoCursor: TColor;
    // Спектр — градиент заливки (каналы Blue/Green/Red в сыром пикселе)
    SpecGradB, SpecGradG, SpecGradR: Byte;  // при Alpha=200
    // Линейка частот
    RulerGradTop, RulerGradBot: TColor;
    RulerBorder: TColor;
    RulerText: TColor;
    RulerVfo: TColor;
    // Ползунки
    SliderBG: TColor;
    SliderTrackEmpty: TColor;
    SliderTrackFill: TColor;
    SliderThumbNorm: TColor;
    SliderThumbHot: TColor;
    SliderThumbDrag: TColor;
    SliderThumbBdr: TColor;
    // S-метр (широкий)
    SMeterBG: TColor;
    SMeterBarGreen: TColor;
    SMeterBarOver: TColor;
    SMeterPeakMarker: TColor;
    SMeterTickGreen: TColor;
    SMeterTickWhite: TColor;
    SMeterTickBlue: TColor;
    SMeterLabelDbm: TColor;
    SMeterLabelS: TColor;
    SMeterScaleDbm: TColor;
    SMeterScaleSGreen: TColor;
    SMeterScaleSBlue: TColor;
    SMeterBdr: TColor;
    SMeterDivider: TColor;
  end;

function DarkTheme: TAppTheme;
function LightTheme: TAppTheme;

implementation

function DarkTheme: TAppTheme;
begin
  FillChar(Result, SizeOf(Result), 0);
  Result.BG     := TColor($00101010);
  Result.Panel  := TColor($00181818);
  Result.Border := TColor($00303030);
  Result.Text    := TColor($00CCCCCC);
  Result.TextDim := TColor($00666666);

  Result.BtnNorm         := TColor($001A1A1A);
  Result.BtnActive       := TColor($000C3010);
  Result.BtnHot          := TColor($00282828);
  Result.BtnBorderNorm   := TColor($00444444);
  Result.BtnBorderActive := TColor($00387838);
  Result.BtnText         := TColor($00CCCCCC);
  Result.BtnTextActive   := TColor($0000FF88);

  Result.SpanNorm   := TColor($00543F18);
  Result.SpanActive := TColor($00624B1D);
  Result.SpanBorder := TColor($00685624);
  Result.SpanText   := TColor($00D8E6EE);

  Result.TbDiscoverNorm   := TColor($00101828);
  Result.TbDiscoverHot    := TColor($00182038);
  Result.TbDiscoverBorder := TColor($00304860);
  Result.TbDiscoverText   := TColor($0090B8D0);
  Result.TbStartNorm      := TColor($00101810);
  Result.TbStartBorder    := TColor($00304830);
  Result.TbStartText      := TColor($0090C090);

  Result.VfoSelActNorm    := TColor($00101C10);
  Result.VfoSelActBorder  := TColor($004A7A4A);
  Result.VfoSelActText    := TColor($0060B860);
  Result.VfoSelActTextAct := TColor($0040FF60);
  Result.VfoSelInaNorm    := TColor($001A1A1A);
  Result.VfoSelInaBorder  := TColor($00404040);
  Result.VfoSelInaText    := TColor($00666666);
  Result.VfoSelInaTextAct := TColor($00CCCCCC);

  Result.VfoTxActNorm    := TColor($00000060);
  Result.VfoTxActBorder  := TColor($001010B0);
  Result.VfoTxActText    := TColor($00C8D8FF);
  Result.VfoTxInaNorm    := TColor($00303030);
  Result.VfoTxInaBorder  := TColor($00404040);
  Result.VfoTxInaText    := TColor($00808080);

  Result.FreqActive   := TColor($0000FF00);
  Result.FreqDim      := TColor($00007800);
  Result.FreqHover    := TColor($0080FFCC);
  Result.FreqHoverBG  := TColor($00182838);
  Result.FreqDimDot   := TColor($00607080);

  Result.MeterOn  := TColor($0000CC44);
  Result.MeterOvr := TColor($000000CC);
  Result.Amber    := TColor($0000AAFF);

  Result.SpecGradTop   := TColor($0020160B);
  Result.SpecGradBot   := TColor($006C4F1F);
  Result.SpecLabelBand := TColor($00543F18);
  Result.SpecLabelText := TColor($00A8C9D9);
  Result.SpecGrid      := TColor($00685624);
  Result.SpecLine      := TColor($0040FF80);
  Result.SpecFilter    := TColor($006A4E22);
  // Оттенок полосы — тёплый янтарный, из семейства курсора VFO (Amber): фон
  // спектра сине-стальной, поэтому янтарь на нём читается как оттенок, а не
  // как «потемнее фона». RGB(255,150,40).
  Result.SpecFilterBand   := TColor($002896FF);
  Result.SpecFilterEdge   := TColor($0040FFCC);
  Result.SpecAgcColor     := TColor($0000AAFF);
  Result.SpecAgcHangColor := TColor($00FFCC00);
  Result.SpecVfoCursor    := TColor($0000AAFF);
  Result.SpecGradB := 100; Result.SpecGradG := 200; Result.SpecGradR := 0;

  Result.RulerGradTop := TColor($00372A12);
  Result.RulerGradBot := TColor($00705A2A);
  Result.RulerBorder  := TColor($00685624);
  Result.RulerText    := TColor($00C8D8E2);
  Result.RulerVfo     := TColor($0000FF80);

  Result.SliderBG         := TColor($00181818);
  Result.SliderTrackEmpty := TColor($00323232);
  Result.SliderTrackFill  := TColor($00205018);
  Result.SliderThumbNorm  := TColor($00407840);
  Result.SliderThumbHot   := TColor($0066BB66);
  Result.SliderThumbDrag  := TColor($0099EE99);
  Result.SliderThumbBdr   := TColor($00122012);

  Result.SMeterBG         := TColor($00181818);
  Result.SMeterBarGreen   := TColor($00091F00);
  Result.SMeterBarOver    := TColor($00091528);
  Result.SMeterPeakMarker := TColor($00F8F8FF);
  Result.SMeterTickGreen  := TColor($00708070);
  Result.SMeterTickWhite  := TColor($00E0E0DC);
  Result.SMeterTickBlue   := TColor($0070A090);
  Result.SMeterLabelDbm   := TColor($0096D8DC);
  Result.SMeterLabelS     := TColor($00F0F0F0);
  Result.SMeterScaleDbm   := TColor($00D0DCDC);
  Result.SMeterScaleSGreen:= TColor($00E0E0E0);
  Result.SMeterScaleSBlue := TColor($0090D090);
  Result.SMeterBdr        := TColor($00303028);
  Result.SMeterDivider    := TColor($00404040);
end;

function LightTheme: TAppTheme;
begin
  FillChar(Result, SizeOf(Result), 0);
  // Фон — тёплый белый, панели — тёплый светло-серый
  Result.BG     := TColor($00F0EEE8);
  Result.Panel  := TColor($00E8E6E0);
  Result.Border := TColor($00B8B4AC);
  Result.Text    := TColor($00181410);
  Result.TextDim := TColor($00706860);

  // Обычные кнопки — светло-серые, активная — светло-зелёная
  Result.BtnNorm         := TColor($00DCDAD4);
  Result.BtnActive       := TColor($00B8D8B8);
  Result.BtnHot          := TColor($00CFCDC6);
  Result.BtnBorderNorm   := TColor($00A8A4A0);
  Result.BtnBorderActive := TColor($00407840);
  Result.BtnText         := TColor($00181410);
  Result.BtnTextActive   := TColor($00004800);

  // Span/VFO-copy — тёплый тан/пергамент
  Result.SpanNorm   := TColor($00D4C8A0);
  Result.SpanActive := TColor($00C0B488);
  Result.SpanBorder := TColor($00A09070);
  Result.SpanText   := TColor($00302010);

  // Тулбар — более насыщенные оттенки
  Result.TbDiscoverNorm   := TColor($00C8D8E8);
  Result.TbDiscoverHot    := TColor($00B8CCE0);
  Result.TbDiscoverBorder := TColor($00789CB8);
  Result.TbDiscoverText   := TColor($00284860);
  Result.TbStartNorm      := TColor($00C8E0C8);
  Result.TbStartBorder    := TColor($00609860);
  Result.TbStartText      := TColor($00204820);

  // VFO-select активный — зелёная подсветка
  Result.VfoSelActNorm    := TColor($00C0E0C0);
  Result.VfoSelActBorder  := TColor($00508050);
  Result.VfoSelActText    := TColor($00205020);
  Result.VfoSelActTextAct := TColor($00006600);
  // VFO-select неактивный — нейтральный
  Result.VfoSelInaNorm    := TColor($00DCDAD4);
  Result.VfoSelInaBorder  := TColor($00A8A4A0);
  Result.VfoSelInaText    := TColor($00706860);
  Result.VfoSelInaTextAct := TColor($00181410);

  // VFO-TX — синеватый акцент
  Result.VfoTxActNorm    := TColor($00C0CCEC);
  Result.VfoTxActBorder  := TColor($006070C0);
  Result.VfoTxActText    := TColor($00102060);
  Result.VfoTxInaNorm    := TColor($00DCDAD4);
  Result.VfoTxInaBorder  := TColor($00A8A4A0);
  Result.VfoTxInaText    := TColor($00706860);

  // Дисплей частоты — насыщенный зелёный
  Result.FreqActive   := TColor($00005500);
  Result.FreqDim      := TColor($00447044);
  Result.FreqHover    := TColor($00003A00);
  Result.FreqHoverBG  := TColor($00C8E8C8);
  Result.FreqDimDot   := TColor($00909080);

  // Индикаторы
  Result.MeterOn  := TColor($00006820);
  Result.MeterOvr := TColor($00AA1010);
  Result.Amber    := TColor($00904000);

  // Спектр — светлый пергаментный фон, тёмно-зелёный сигнал
  Result.SpecGradTop   := TColor($00E8E4D8);
  Result.SpecGradBot   := TColor($00D0CCBE);
  Result.SpecLabelBand := TColor($00D8D4C8);
  Result.SpecLabelText := TColor($00404038);
  Result.SpecGrid      := TColor($00B8B4A4);
  Result.SpecLine      := TColor($00006400);  // тёмно-зелёная линия
  Result.SpecFilter    := TColor($00C8DCC8);  // подложка подписей AGC
  // Полоса фильтра на светлой теме: насыщённее фона (тот пергаментный), иначе
  // при той же полупрозрачности её не видно. RGB(60,150,60).
  Result.SpecFilterBand   := TColor($003C963C);
  Result.SpecFilterEdge   := TColor($00407840);
  Result.SpecAgcColor     := TColor($00904000);  // тёмно-оранжевый AGC
  Result.SpecAgcHangColor := TColor($00802000);
  Result.SpecVfoCursor    := TColor($00004800);
  // Пиксели градиента: тёмно-зелёный (B=0, G=80, R=10 при Alpha=200)
  Result.SpecGradB := 0; Result.SpecGradG := 80; Result.SpecGradR := 10;

  // Линейка — тёплый пергамент
  Result.RulerGradTop := TColor($00DDD8CC);
  Result.RulerGradBot := TColor($00C8C2B4);
  Result.RulerBorder  := TColor($00A09878);
  Result.RulerText    := TColor($00302820);
  Result.RulerVfo     := TColor($00006800);

  // Ползунки — светлые с зелёным акцентом
  Result.SliderBG         := TColor($00E8E6E0);
  Result.SliderTrackEmpty := TColor($00CCCAC4);
  Result.SliderTrackFill  := TColor($0080AA80);
  Result.SliderThumbNorm  := TColor($00508050);
  Result.SliderThumbHot   := TColor($003D9040);
  Result.SliderThumbDrag  := TColor($0028A830);
  Result.SliderThumbBdr   := TColor($00183018);

  // S-метр — светлый
  Result.SMeterBG         := TColor($00ECE8E0);
  Result.SMeterBarGreen   := TColor($00C0EAC0);
  Result.SMeterBarOver    := TColor($00EAC0C0);
  Result.SMeterPeakMarker := TColor($00181010);
  Result.SMeterTickGreen  := TColor($00508050);
  Result.SMeterTickWhite  := TColor($00282018);
  Result.SMeterTickBlue   := TColor($00406880);
  Result.SMeterLabelDbm   := TColor($00204860);
  Result.SMeterLabelS     := TColor($00201810);
  Result.SMeterScaleDbm   := TColor($00304848);
  Result.SMeterScaleSGreen:= TColor($00204020);
  Result.SMeterScaleSBlue := TColor($00204050);
  Result.SMeterBdr        := TColor($00A0A090);
  Result.SMeterDivider    := TColor($00B0ACA0);
end;

end.
