mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
ui(pans): флаг A появляется вместе с первым доп. панадаптером
Доп. панадаптер приходит со своим слайсом и сразу рисует его флаг, а главный приёмник оставался без флага — [A] показывался только когда слайс создавали на самом пане 0 (инвариант «панель скрыта ИЛИ есть слайсы B+»). TPanafallPanel: третье слагаемое инварианта — MainFlagForced, выставляется хозяином. MainForm.ResizeSpectrumPanels после LayoutPanStack ставит FPan.MainFlagForced := PanCount > 1 и зовёт UpdateMainFlagVisibility; это единая точка — добавление/закрытие пана, restore персиста и STOP все идут через пересчёт раскладки. Сворачивание левой панели (MainFlagPinned) на это не влияет: пока жив хотя бы один доп. пан, флаг A остаётся. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -2755,6 +2755,14 @@ begin
|
|||||||
// Стек панов: регионы по долям, каждый пан раскладывает свой стек
|
// Стек панов: регионы по долям, каждый пан раскладывает свой стек
|
||||||
// спектр/линейка/сплиттер/водопад/пан-зум внутри своего региона.
|
// спектр/линейка/сплиттер/водопад/пан-зум внутри своего региона.
|
||||||
LayoutPanStack(WideH);
|
LayoutPanStack(WideH);
|
||||||
|
// Доп. панадаптер приходит со своим слайсом и сразу показывает его флаг —
|
||||||
|
// главный приёмник должен быть представлен флагом A с того же момента
|
||||||
|
// (раньше флаг A появлялся только от слайса, созданного на самом пане 0).
|
||||||
|
if FPan <> nil then
|
||||||
|
begin
|
||||||
|
FPan.MainFlagForced := PanCount > 1;
|
||||||
|
FPan.UpdateMainFlagVisibility;
|
||||||
|
end;
|
||||||
PositionSampleRateOverlay;
|
PositionSampleRateOverlay;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|||||||
+11
-5
@@ -84,6 +84,7 @@ type
|
|||||||
FActiveFlag: TVfoOverlay; // чьё событие сейчас обрабатывается
|
FActiveFlag: TVfoOverlay; // чьё событие сейчас обрабатывается
|
||||||
FPendingSliceClose: Integer; // SliceId к удалению после мыши (0=нет)
|
FPendingSliceClose: Integer; // SliceId к удалению после мыши (0=нет)
|
||||||
FMainFlagPinned: Boolean; // True = левая панель хозяина скрыта
|
FMainFlagPinned: Boolean; // True = левая панель хозяина скрыта
|
||||||
|
FMainFlagForced: Boolean; // True = есть доп. панадаптеры
|
||||||
FLastSliceMeterMs: QWord; // троттлинг S-метра слайсов (~10 Гц)
|
FLastSliceMeterMs: QWord; // троттлинг S-метра слайсов (~10 Гц)
|
||||||
FLastSliceDMRMs: QWord; // семантический DMR-статус (~4 Гц)
|
FLastSliceDMRMs: QWord; // семантический DMR-статус (~4 Гц)
|
||||||
FOnWireFlag: TWireFlagEvent;
|
FOnWireFlag: TWireFlagEvent;
|
||||||
@@ -278,7 +279,8 @@ type
|
|||||||
function CursorOverDisplay: Boolean; // курсор над спектром/водопадом пана
|
function CursorOverDisplay: Boolean; // курсор над спектром/водопадом пана
|
||||||
// Единый packing всех флагов (A+B+) в один ряд, без наездов.
|
// Единый packing всех флагов (A+B+) в один ряд, без наездов.
|
||||||
procedure LayoutFlags;
|
procedure LayoutFlags;
|
||||||
// Флаг A виден: панель хозяина скрыта (MainFlagPinned) ИЛИ есть слайсы B+.
|
// Флаг A виден: панель хозяина скрыта (MainFlagPinned) ИЛИ есть слайсы B+
|
||||||
|
// ИЛИ хозяин требует его принудительно (MainFlagForced — доп. панадаптеры).
|
||||||
procedure UpdateMainFlagVisibility;
|
procedure UpdateMainFlagVisibility;
|
||||||
procedure PushSliceFlagState(SliceId: Integer);
|
procedure PushSliceFlagState(SliceId: Integer);
|
||||||
procedure PushAllSliceFlagStates; // все флаги панели (после смены rate и т.п.)
|
procedure PushAllSliceFlagStates; // все флаги панели (после смены rate и т.п.)
|
||||||
@@ -297,6 +299,9 @@ type
|
|||||||
property Controller: TRadioController read FController write FController;
|
property Controller: TRadioController read FController write FController;
|
||||||
property MainFlag: TVfoOverlay read FMainFlag;
|
property MainFlag: TVfoOverlay read FMainFlag;
|
||||||
property MainFlagPinned: Boolean read FMainFlagPinned write FMainFlagPinned;
|
property MainFlagPinned: Boolean read FMainFlagPinned write FMainFlagPinned;
|
||||||
|
// Хозяин форсит флаг A (есть доп. панадаптеры — их слайсы должны быть
|
||||||
|
// представлены флагом и на главном приёмнике).
|
||||||
|
property MainFlagForced: Boolean read FMainFlagForced write FMainFlagForced;
|
||||||
// Проводка семантических событий флага (MODE/DSP/AUD/…) — хозяин.
|
// Проводка семантических событий флага (MODE/DSP/AUD/…) — хозяин.
|
||||||
property OnWireFlag: TWireFlagEvent read FOnWireFlag write FOnWireFlag;
|
property OnWireFlag: TWireFlagEvent read FOnWireFlag write FOnWireFlag;
|
||||||
// Слайс закрыт «×» — хозяину сбросить активный слайс и т.п.
|
// Слайс закрыт «×» — хозяину сбросить активный слайс и т.п.
|
||||||
@@ -1286,15 +1291,16 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
// Флаг главного приёмника (слайс A) виден, когда СКРЫТА левая панель хозяина
|
// Флаг главного приёмника (слайс A) виден, когда СКРЫТА левая панель хозяина
|
||||||
// (MainFlagPinned) ЛИБО есть доп. слайсы (B+): тогда A всегда представлен
|
// (MainFlagPinned) ЛИБО есть доп. слайсы (B+) ЛИБО живут доп. панадаптеры
|
||||||
// флагом рядом с B/C…, а сворачивание/раскрытие панели при живых слайсах не
|
// (MainFlagForced — их слайсы уже показаны флагами, главный приёмник должен
|
||||||
// дёргает его появление.
|
// быть представлен так же): тогда A всегда представлен флагом рядом с B/C…,
|
||||||
|
// а сворачивание/раскрытие панели при живых слайсах не дёргает его появление.
|
||||||
procedure TPanafallPanel.UpdateMainFlagVisibility;
|
procedure TPanafallPanel.UpdateMainFlagVisibility;
|
||||||
var
|
var
|
||||||
ShouldShow: Boolean;
|
ShouldShow: Boolean;
|
||||||
begin
|
begin
|
||||||
if (FMainFlag = nil) or (FController = nil) then Exit;
|
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 = FMainFlag.Visible then Exit;
|
||||||
if ShouldShow then
|
if ShouldShow then
|
||||||
begin
|
begin
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
<UseVersionInfo Value="True"/>
|
<UseVersionInfo Value="True"/>
|
||||||
<AutoIncrementBuild Value="True"/>
|
<AutoIncrementBuild Value="True"/>
|
||||||
<MinorVersionNr Value="9"/>
|
<MinorVersionNr Value="9"/>
|
||||||
<BuildNr Value="283"/>
|
<BuildNr Value="284"/>
|
||||||
</VersionInfo>
|
</VersionInfo>
|
||||||
<MacroValues Count="115">
|
<MacroValues Count="116">
|
||||||
<Macro1 Name="LCLWidgetType" Value="qt6"/>
|
<Macro1 Name="LCLWidgetType" Value="qt6"/>
|
||||||
<Macro2 Name="LCLWidgetType" Value="qt6"/>
|
<Macro2 Name="LCLWidgetType" Value="qt6"/>
|
||||||
<Macro3 Name="LCLWidgetType" Value="qt6"/>
|
<Macro3 Name="LCLWidgetType" Value="qt6"/>
|
||||||
@@ -135,6 +135,7 @@
|
|||||||
<Macro113 Name="LCLWidgetType" Value="qt6"/>
|
<Macro113 Name="LCLWidgetType" Value="qt6"/>
|
||||||
<Macro114 Name="LCLWidgetType" Value="qt6"/>
|
<Macro114 Name="LCLWidgetType" Value="qt6"/>
|
||||||
<Macro115 Name="LCLWidgetType" Value="qt6"/>
|
<Macro115 Name="LCLWidgetType" Value="qt6"/>
|
||||||
|
<Macro116 Name="LCLWidgetType" Value="qt6"/>
|
||||||
</MacroValues>
|
</MacroValues>
|
||||||
<BuildModes>
|
<BuildModes>
|
||||||
<Item Name="Debug" Default="True"/>
|
<Item Name="Debug" Default="True"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user