feat(slices): SPLIT только у главного флага

У слайса нет своего VFO B — кросс-частотный TX делается TX-бейджем слайса.
Бейдж SPLIT (и его хит-зона) рисуется лишь при IsMain; «×» флага слайса
переехал вплотную к TX. SPLIT главного гаснет, пока TX-источник — слайс
(ActiveTXFreqHz берёт частоту слайса, а не VFO B).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-13 18:32:54 +03:00
co-authored by Claude Opus 4.8
parent 8d65f4d6e8
commit 2474821739
3 changed files with 16 additions and 9 deletions
+1 -1
View File
@@ -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;
+3 -1
View File
@@ -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;
+12 -7
View File
@@ -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);
{ --- Метр: индикаторы + сигнал-бар --- }