From 3bdcfa06748860112508d78fc9bdb7f4c2ab5e6a Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 22 Jul 2026 12:11:57 +0300 Subject: [PATCH] =?UTF-8?q?ui(pans):=20=D1=84=D0=BB=D0=B0=D0=B3=20A=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=8F=D0=B2=D0=BB=D1=8F=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=B5=20=D1=81=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D1=8B=D0=BC=20=D0=B4=D0=BE=D0=BF.=20=D0=BF=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B5=D1=80=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Доп. панадаптер приходит со своим слайсом и сразу рисует его флаг, а главный приёмник оставался без флага — [A] показывался только когда слайс создавали на самом пане 0 (инвариант «панель скрыта ИЛИ есть слайсы B+»). TPanafallPanel: третье слагаемое инварианта — MainFlagForced, выставляется хозяином. MainForm.ResizeSpectrumPanels после LayoutPanStack ставит FPan.MainFlagForced := PanCount > 1 и зовёт UpdateMainFlagVisibility; это единая точка — добавление/закрытие пана, restore персиста и STOP все идут через пересчёт раскладки. Сворачивание левой панели (MainFlagPinned) на это не влияет: пока жив хотя бы один доп. пан, флаг A остаётся. Co-Authored-By: Claude Opus 4.8 --- MainForm.pas | 8 ++++++++ PanafallPanel.pas | 16 +++++++++++----- ewsdr.lpi | 5 +++-- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/MainForm.pas b/MainForm.pas index f0d98f6..7d17be9 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -2755,6 +2755,14 @@ begin // Стек панов: регионы по долям, каждый пан раскладывает свой стек // спектр/линейка/сплиттер/водопад/пан-зум внутри своего региона. LayoutPanStack(WideH); + // Доп. панадаптер приходит со своим слайсом и сразу показывает его флаг — + // главный приёмник должен быть представлен флагом A с того же момента + // (раньше флаг A появлялся только от слайса, созданного на самом пане 0). + if FPan <> nil then + begin + FPan.MainFlagForced := PanCount > 1; + FPan.UpdateMainFlagVisibility; + end; PositionSampleRateOverlay; end; diff --git a/PanafallPanel.pas b/PanafallPanel.pas index 9f221d2..adaebc4 100644 --- a/PanafallPanel.pas +++ b/PanafallPanel.pas @@ -84,6 +84,7 @@ type FActiveFlag: TVfoOverlay; // чьё событие сейчас обрабатывается FPendingSliceClose: Integer; // SliceId к удалению после мыши (0=нет) FMainFlagPinned: Boolean; // True = левая панель хозяина скрыта + FMainFlagForced: Boolean; // True = есть доп. панадаптеры FLastSliceMeterMs: QWord; // троттлинг S-метра слайсов (~10 Гц) FLastSliceDMRMs: QWord; // семантический DMR-статус (~4 Гц) FOnWireFlag: TWireFlagEvent; @@ -278,7 +279,8 @@ type function CursorOverDisplay: Boolean; // курсор над спектром/водопадом пана // Единый packing всех флагов (A+B+) в один ряд, без наездов. procedure LayoutFlags; - // Флаг A виден: панель хозяина скрыта (MainFlagPinned) ИЛИ есть слайсы B+. + // Флаг A виден: панель хозяина скрыта (MainFlagPinned) ИЛИ есть слайсы B+ + // ИЛИ хозяин требует его принудительно (MainFlagForced — доп. панадаптеры). procedure UpdateMainFlagVisibility; procedure PushSliceFlagState(SliceId: Integer); procedure PushAllSliceFlagStates; // все флаги панели (после смены rate и т.п.) @@ -297,6 +299,9 @@ type property Controller: TRadioController read FController write FController; property MainFlag: TVfoOverlay read FMainFlag; property MainFlagPinned: Boolean read FMainFlagPinned write FMainFlagPinned; + // Хозяин форсит флаг A (есть доп. панадаптеры — их слайсы должны быть + // представлены флагом и на главном приёмнике). + property MainFlagForced: Boolean read FMainFlagForced write FMainFlagForced; // Проводка семантических событий флага (MODE/DSP/AUD/…) — хозяин. property OnWireFlag: TWireFlagEvent read FOnWireFlag write FOnWireFlag; // Слайс закрыт «×» — хозяину сбросить активный слайс и т.п. @@ -1286,15 +1291,16 @@ begin end; // Флаг главного приёмника (слайс A) виден, когда СКРЫТА левая панель хозяина -// (MainFlagPinned) ЛИБО есть доп. слайсы (B+): тогда A всегда представлен -// флагом рядом с B/C…, а сворачивание/раскрытие панели при живых слайсах не -// дёргает его появление. +// (MainFlagPinned) ЛИБО есть доп. слайсы (B+) ЛИБО живут доп. панадаптеры +// (MainFlagForced — их слайсы уже показаны флагами, главный приёмник должен +// быть представлен так же): тогда A всегда представлен флагом рядом с B/C…, +// а сворачивание/раскрытие панели при живых слайсах не дёргает его появление. procedure TPanafallPanel.UpdateMainFlagVisibility; var ShouldShow: Boolean; begin if (FMainFlag = nil) or (FController = nil) then Exit; - ShouldShow := FMainFlagPinned or (Length(FSliceFlags) > 0); + ShouldShow := FMainFlagPinned or FMainFlagForced or (Length(FSliceFlags) > 0); if ShouldShow = FMainFlag.Visible then Exit; if ShouldShow then begin diff --git a/ewsdr.lpi b/ewsdr.lpi index 36c821f..f7ae74f 100644 --- a/ewsdr.lpi +++ b/ewsdr.lpi @@ -17,9 +17,9 @@ - + - + @@ -135,6 +135,7 @@ +