mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 17:27:32 +00:00
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:
+4
-1
@@ -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)
|
||||
|
||||
+12
-3
@@ -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);
|
||||
|
||||
+10
-4
@@ -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);
|
||||
|
||||
@@ -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-метр (перезалить текстуру, но рендер дешёвый — одна полоска).
|
||||
|
||||
Reference in New Issue
Block a user