fix(slices): красная полоса фильтра при TX — у передающего слайса, не у главного

- MainForm: TXOverlay главной вьюхи взводился по FTransmitting без учёта
  источника TX → красной становилась полоса главного VFO даже при передаче
  со слайса. Теперь TXOverlay = FTransmitting and (FTxSliceId = 0).
- VfoOverlay: публичный TxActive (FTx) — вьюхи знают, какой слайс передаёт.
- SpectrumView/SpectrumViewOpengl: полоса/края/несущая передающего слайса
  красные (alpha 100, как у главного при TX), иначе цвет бейджа слайса.
- Фикс цвета TX-полосы в GL: $00E03030 при ColorToRGB (младший байт = R)
  давал синий вместо красного; общая константа CLR_TX_BAND = $003030E0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-13 18:48:30 +03:00
co-authored by Claude Opus 4.8
parent 2474821739
commit a2e403af3d
4 changed files with 28 additions and 8 deletions
+12 -3
View File
@@ -312,6 +312,11 @@ type
implementation
const
// Полоса фильтра передающего тракта (главный VFO при TX / передающий слайс).
// TColor = $00BBGGRR, младший байт = R (как в BlendBand/RawPack).
CLR_TX_BAND = TColor($003030E0);
// Упаковка TColor в пиксель кадра (непрозрачный). Раскладка байтов как в
// BlendBand: non-Darwin = BGRA, Darwin = ARGB.
function RawPack(Color: TColor): LongWord; inline;
@@ -1000,10 +1005,13 @@ begin
begin
O := TVfoOverlay(FSliceOverlays[i]);
if (O = nil) or (not O.Visible) then Continue;
Clr := SliceColor(O.SliceLetter); // оттенок бейджа слайса ($00BBGGRR)
// Передающий слайс — красная полоса (как у главного при TX), иначе бейдж-цвет.
if O.TxActive then Clr := CLR_TX_BAND
else Clr := SliceColor(O.SliceLetter); // $00BBGGRR
CalcFilterBandXFor(O.DisplayVfoHz, O.DisplayMode, O.DisplayBW, W, SX1, SX2, SVfoX);
if SX2 > SX1 then
BlendBand(SX1, SX2, H, Clr and $FF, (Clr shr 8) and $FF, (Clr shr 16) and $FF, 60);
BlendBand(SX1, SX2, H, Clr and $FF, (Clr shr 8) and $FF, (Clr shr 16) and $FF,
IfThen(O.TxActive, 100, 60));
end;
end;
@@ -1017,7 +1025,8 @@ begin
begin
O := TVfoOverlay(FSliceOverlays[i]);
if (O = nil) or (not O.Visible) then Continue;
Clr := SliceColor(O.SliceLetter); // оттенок бейджа слайса
if O.TxActive then Clr := CLR_TX_BAND // передающий слайс
else Clr := SliceColor(O.SliceLetter); // оттенок бейджа слайса
CalcFilterBandXFor(O.DisplayVfoHz, O.DisplayMode, O.DisplayBW, W, SX1, SX2, SVfoX);
RawVLine(SX1, 0, H - 1, Clr);
RawVLine(SX2, 0, H - 1, Clr);