From 2474821739a393e80a141047d82059a88a21988a Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 13 Jul 2026 18:32:54 +0300 Subject: [PATCH] =?UTF-8?q?feat(slices):=20SPLIT=20=D1=82=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=BA=D0=BE=20=D1=83=20=D0=B3=D0=BB=D0=B0=D0=B2=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D1=84=D0=BB=D0=B0=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit У слайса нет своего VFO B — кросс-частотный TX делается TX-бейджем слайса. Бейдж SPLIT (и его хит-зона) рисуется лишь при IsMain; «×» флага слайса переехал вплотную к TX. SPLIT главного гаснет, пока TX-источник — слайс (ActiveTXFreqHz берёт частоту слайса, а не VFO B). Co-Authored-By: Claude Opus 4.8 --- MainForm.pas | 2 +- PanafallPanel.pas | 4 +++- VfoOverlay.pas | 19 ++++++++++++------- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/MainForm.pas b/MainForm.pas index eb15f3a..a0ec560 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -5380,7 +5380,7 @@ end; procedure TMainForm.OnVfoOverlaySplit(Sender: TObject); begin - if CurSliceId <> 0 then Exit; // SPLIT — только главный (слайсы не передают) + if CurSliceId <> 0 then Exit; // SPLIT-бейджа у слайсов нет (страховка) FController.SetSplit(not FController.FSplitTxB); FPan.PushMainFlagExtState; end; diff --git a/PanafallPanel.pas b/PanafallPanel.pas index 35d10d7..0c9acdb 100644 --- a/PanafallPanel.pas +++ b/PanafallPanel.pas @@ -1346,8 +1346,10 @@ procedure TPanafallPanel.PushMainFlagExtState; begin if not (Assigned(FMainFlag) and FMainFlag.Visible) or (FController = nil) then Exit; // Главный VFO = «слайс A» (id 0). TxSel/Tx активны, когда TX-источник = главный. + // SPLIT (TX на VFO B) актуален только при TX-источнике = главный: когда + // передаём со слайса, ActiveTXFreqHz берёт его частоту, а не VFO B. FMainFlag.SetExtState(FController.ActiveVolume, FController.FMuted, - FController.FSplitTxB, + FController.FSplitTxB and (FController.FTxSliceId = 0), FController.FTransmitting and (FController.FTxSliceId = 0), FController.FTxSliceId = 0); end; diff --git a/VfoOverlay.pas b/VfoOverlay.pas index f295872..9c2ebc7 100644 --- a/VfoOverlay.pas +++ b/VfoOverlay.pas @@ -981,13 +981,14 @@ begin RW := W - PAD*2; CurY := PAD; - { --- Шапка: [A] BW ... [×] SPLIT [TX] --- } + { --- Шапка: главный [A] BW ... SPLIT [TX]; слайс [B] BW ... [×] [TX] --- } DrawBadge(C, Rect(X, CurY, X+16, CurY+HDR_BADGE_H), FSlice, SliceColor(FSlice), CLR_BADGE_TXT); RegisterHit(Rect(X, CurY, X+16, CurY+HDR_BADGE_H), HIT_SLICE_SEL); // бейдж = выбор слайса // Кнопка закрытия × — только у неглавных слайсов (главный приёмник не закрыть). + // Место освободилось от SPLIT (его у слайсов нет) — ставим вплотную к TX. if not FIsMain then begin - R := Rect(W - PAD - 26 - 44 - 6 - 14, CurY, W - PAD - 26 - 44 - 6, CurY + HDR_BADGE_H); + R := Rect(W - PAD - 26 - 6 - 14, CurY, W - PAD - 26 - 6, CurY + HDR_BADGE_H); DrawBadge(C, R, #$C3#$97, CLR_BTN_NORM, CLR_DIM); // UTF-8 '×' RegisterHit(R, HIT_CLOSE); end; @@ -1004,11 +1005,15 @@ begin else if FTxSel then DrawBadge(C, R, 'TX', CLR_TX_SEL, CLR_BADGE_TXT) else DrawBadge(C, R, 'TX', CLR_BTN_NORM, CLR_DIM); RegisterHit(R, HIT_TX); - // SPLIT (левее TX) — кликабельно - R := Rect(W - PAD - 26 - 44, CurY, W - PAD - 26 - 4, CurY + HDR_BADGE_H); - if FSplit then DrawBadge(C, R, 'SPLIT', CLR_SPLIT_ON, CLR_BADGE_TXT) - else DrawBadge(C, R, 'SPLIT', CLR_BTN_NORM, CLR_DIM); - RegisterHit(R, HIT_SPLIT); + // SPLIT (левее TX) — кликабельно; только у главного: split = TX на VFO B, + // у слайса своего B-VFO нет (кросс-частотный TX делается TX-бейджем слайса). + if FIsMain then + begin + R := Rect(W - PAD - 26 - 44, CurY, W - PAD - 26 - 4, CurY + HDR_BADGE_H); + if FSplit then DrawBadge(C, R, 'SPLIT', CLR_SPLIT_ON, CLR_BADGE_TXT) + else DrawBadge(C, R, 'SPLIT', CLR_BTN_NORM, CLR_DIM); + RegisterHit(R, HIT_SPLIT); + end; Inc(CurY, HDR_H); { --- Метр: индикаторы + сигнал-бар --- }