From a2e403af3d63a4e7088b0b6f7849aca913957da3 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 13 Jul 2026 18:48:30 +0300 Subject: [PATCH] =?UTF-8?q?fix(slices):=20=D0=BA=D1=80=D0=B0=D1=81=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=BF=D0=BE=D0=BB=D0=BE=D1=81=D0=B0=20=D1=84?= =?UTF-8?q?=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=B0=20=D0=BF=D1=80=D0=B8=20TX?= =?UTF-8?q?=20=E2=80=94=20=D1=83=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0?= =?UTF-8?q?=D1=8E=D1=89=D0=B5=D0=B3=D0=BE=20=D1=81=D0=BB=D0=B0=D0=B9=D1=81?= =?UTF-8?q?=D0=B0,=20=D0=BD=D0=B5=20=D1=83=20=D0=B3=D0=BB=D0=B0=D0=B2?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- MainForm.pas | 5 ++++- SpectrumView.pas | 15 ++++++++++++--- SpectrumViewOpengl.pas | 14 ++++++++++---- VfoOverlay.pas | 2 ++ 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/MainForm.pas b/MainForm.pas index a0ec560..f3e7829 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -1350,7 +1350,10 @@ begin // DUP: данные от RX-анализатора (TXMode=False), TX-полоса рисуется // поверх через TXOverlay. Без DUP при TX оба флага True. FSpecView.TXMode := FController.FTransmitting and not FController.FDisplayDuplex; - FSpecView.TXOverlay := FController.FTransmitting; + // Красная полоса главного VFO — только когда передаём с него: при + // TX со слайса краснеет полоса ТОГО слайса (DrawSliceFilterMarkers). + FSpecView.TXOverlay := FController.FTransmitting and + (FController.FTxSliceId = 0); ApplySpecViewGridFromState; // сетка спектра под активный тракт RefreshTxIndicators; // TX-бейджи флагов (какой слайс передаёт) end; // (DUC-очередь сбрасывает SetMOX) diff --git a/SpectrumView.pas b/SpectrumView.pas index 88320cb..838689f 100644 --- a/SpectrumView.pas +++ b/SpectrumView.pas @@ -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); diff --git a/SpectrumViewOpengl.pas b/SpectrumViewOpengl.pas index b4f2c21..c1c6220 100644 --- a/SpectrumViewOpengl.pas +++ b/SpectrumViewOpengl.pas @@ -118,6 +118,9 @@ implementation const KEY_COLOR = TColor($00FF00FF); + // Полоса фильтра передающего тракта (главный VFO или TX-слайс): красная. + // TColor = $00BBGGRR (ColorToRGB читает младший байт как R). + CLR_TX_BAND = TColor($003030E0); function ClampI(V, Lo, Hi: Integer): Integer; begin @@ -582,9 +585,9 @@ begin if X2 > X1 then DrawRect(X1, 0, X2, H, TColor($0030C030), 100 / 255); if FTXVfoIndex = 0 then CalcFilterBandX(FVfoA, W, TXX1, TXX2, TXVfoX) else CalcFilterBandX(FVfoB, W, TXX1, TXX2, TXVfoX); - if TXX2 > TXX1 then DrawRect(TXX1, 0, TXX2, H, TColor($00E03030), 100 / 255); + if TXX2 > TXX1 then DrawRect(TXX1, 0, TXX2, H, CLR_TX_BAND, 100 / 255); end - else if X2 > X1 then DrawRect(X1, 0, X2, H, TColor($00E03030), 100 / 255); + else if X2 > X1 then DrawRect(X1, 0, X2, H, CLR_TX_BAND, 100 / 255); end else if X2 > X1 then DrawRect(X1, 0, X2, H, FTheme.SpecFilter, 1); @@ -621,9 +624,12 @@ begin begin O := SliceOverlayAt(i); if (O = nil) or (not O.Visible) then Continue; - Clr := SliceColor(O.SliceLetter); // оттенок бейджа слайса + // Передающий слайс — красная полоса (как у главного при TX), иначе оттенок бейджа. + if O.TxActive then Clr := CLR_TX_BAND + else Clr := SliceColor(O.SliceLetter); CalcFilterBandXFor(O.DisplayVfoHz, O.DisplayMode, O.DisplayBW, W, SX1, SX2, SVfoX); - if SX2 > SX1 then DrawRect(SX1, 0, SX2, H, Clr, 60 / 255); + if SX2 > SX1 then + DrawRect(SX1, 0, SX2, H, Clr, IfThen(O.TxActive, 100, 60) / 255); DrawLine(SX1, 0, SX1, H, Clr, 1, False); DrawLine(SX2, 0, SX2, H, Clr, 1, False); DrawLine(SVfoX, 0, SVfoX, H - 12, Clr, 2, False); diff --git a/VfoOverlay.pas b/VfoOverlay.pas index 9c2ebc7..19d0bfe 100644 --- a/VfoOverlay.pas +++ b/VfoOverlay.pas @@ -192,6 +192,8 @@ type property DisplayVfoHz: Double read FVfoHz; property DisplayMode: Integer read FMode; property DisplayBW: Integer read FFilterBW; + // Слайс сейчас передаёт (полоса фильтра на спектре краснеет, как у главного). + property TxActive: Boolean read FTx; // Битмап-кэш требует перерисовки (GL-вьюха решает, перезаливать ли текстуру). property CacheDirty: Boolean read FCacheDirty; // Изменился только S-метр (перезалить текстуру, но рендер дешёвый — одна полоска).