mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 17:27:32 +00:00
feat(slices): per-pan дисплей — палитра/gamma/уровни на пан («◑»-поповер)
Кнопка «◑» в шапке каждого пана открывает компактный поповер настроек отображения (палитра, gamma, ref/range спектра, авто-уровень водопада + offset/ручные min-max). Модель «глобальный дефолт + override на пан»: пан 0 правит глобальные поля рендера (зеркалятся в контроллер), паны N ставят DisplayOverride и персистятся в воркспейс раздельно КВ/трансвертер. - PanDisplayPopup.pas (new): borderless fsStayOnTop форма, гаснет по OnDeactivate; Flat*-контролы; крестик «×» закрытия; дим-хинт «правки применяются и сохраняются сами»; кнопки «⟳ Reset»/«⇄ Copy to all». - TPanafallPanel: FBtnDisplay + OnDisplayClick + DisplayOverride; PositionHeaderChildren каскадит [×][⧉][◑] справа по Visible. - MainForm: OnPanDisplayClick/Applied/Reset/ApplyAll + ApplyGlobalRenderToView + MarkPanDisplayDirty. При смене палитры/сбросе чистим историю GL-водопада (TSpectrumView.ClearWaterfall) — GL хранит уже раскрашенные пиксели. - Settings/TPanCfg: под-объект 'display' (палитра/gamma/ref/range/wf-уровни), пишется только при override. Глобальными осознанно оставлены разрешение анализатора, MSAA, скорость водопада, детектор/усреднение (движок/перф, не косметика). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+34
-5
@@ -103,6 +103,9 @@ type
|
||||
FOnADCClick: TNotifyEvent;
|
||||
FBtnPopPan: TFlatButton; // «⧉» pop-out в отдельное окно (паны N>0, 3.5)
|
||||
FOnPanPopOut: TNotifyEvent;
|
||||
FBtnDisplay: TFlatButton; // «◑» per-pan настройки дисплея (3.6)
|
||||
FOnDisplayClick: TNotifyEvent;
|
||||
FDisplayOverride: Boolean; // True = пан переопределил глобальный дефолт (persist)
|
||||
FBtnClosePan: TFlatButton; // «×» в шапке (только паны N>0)
|
||||
FBtnAddPan: TFlatButton; // «⊞» в ряду пан/зума (только пан 0)
|
||||
FHeaderVisible: Boolean;
|
||||
@@ -122,6 +125,7 @@ type
|
||||
procedure HeaderADCClick(Sender: TObject);
|
||||
procedure SetADCClickable(AValue: Boolean);
|
||||
procedure BtnPopPanClick(Sender: TObject);
|
||||
procedure BtnDisplayClick(Sender: TObject);
|
||||
procedure PositionHeaderChildren(RW, H: Integer);
|
||||
// Видимое частотное окно ЭТОГО пана: пан 0 — окно главного (зум/пан),
|
||||
// паны N — центр их DDC ± rate/2 (пан-зум — этап 3.3+).
|
||||
@@ -213,6 +217,11 @@ type
|
||||
property OnADCClick: TNotifyEvent read FOnADCClick write FOnADCClick;
|
||||
// «⧉» (3.5): вынести пан в отдельное окно (хозяин).
|
||||
property OnPanPopOut: TNotifyEvent read FOnPanPopOut write FOnPanPopOut;
|
||||
// «◑» (3.6): открыть поповер per-pan настроек дисплея (хозяин).
|
||||
property OnDisplayClick: TNotifyEvent read FOnDisplayClick write FOnDisplayClick;
|
||||
property BtnDisplay: TFlatButton read FBtnDisplay;
|
||||
// Пан переопределил глобальный дефолт дисплея (для персиста панов N).
|
||||
property DisplayOverride: Boolean read FDisplayOverride write FDisplayOverride;
|
||||
property HeaderPanel: TPanel read FHeaderPanel;
|
||||
property HeaderLabel: TLabel read FHeaderLabel;
|
||||
property HeaderRateLabel: TLabel read FHeaderRateLabel;
|
||||
@@ -435,6 +444,10 @@ begin
|
||||
FHeaderADCLabel.Parent := FHeaderPanel;
|
||||
FHeaderADCLabel.AutoSize := True;
|
||||
FHeaderADCLabel.OnClick := HeaderADCClick;
|
||||
FBtnDisplay := MakeFlatBtn(FHeaderPanel, '◑', 0, 0, 10, 10, BtnDisplayClick);
|
||||
FBtnDisplay.Hint := 'Display settings';
|
||||
FBtnDisplay.ShowHint := True;
|
||||
FBtnDisplay.Visible := False; // хозяин включает при видимой шапке
|
||||
FBtnPopPan := MakeFlatBtn(FHeaderPanel, '⧉', 0, 0, 10, 10, BtnPopPanClick);
|
||||
FBtnPopPan.Hint := 'Pop out';
|
||||
FBtnPopPan.ShowHint := True;
|
||||
@@ -538,6 +551,11 @@ begin
|
||||
if Assigned(FOnPanPopOut) then FOnPanPopOut(Self);
|
||||
end;
|
||||
|
||||
procedure TPanafallPanel.BtnDisplayClick(Sender: TObject);
|
||||
begin
|
||||
if Assigned(FOnDisplayClick) then FOnDisplayClick(Self);
|
||||
end;
|
||||
|
||||
procedure TPanafallPanel.ViewWindow(out VC, VS: Double);
|
||||
begin
|
||||
VC := 0; VS := 0;
|
||||
@@ -547,7 +565,7 @@ begin
|
||||
end;
|
||||
|
||||
procedure TPanafallPanel.PositionHeaderChildren(RW, H: Integer);
|
||||
var BtnS: Integer;
|
||||
var BtnS, X: Integer;
|
||||
begin
|
||||
if FHeaderLabel <> nil then
|
||||
FHeaderLabel.Top := (H - FHeaderLabel.Height) div 2;
|
||||
@@ -561,11 +579,22 @@ begin
|
||||
FHeaderADCLabel.Top := (H - FHeaderADCLabel.Height) div 2;
|
||||
FHeaderADCLabel.Left := FHeaderRateLabel.Left + FHeaderRateLabel.Width + 10;
|
||||
end;
|
||||
// Кнопки шапки прижаты вправо, справа налево: [×] [⧉] [◑]. Позиция каждой
|
||||
// зависит от видимости соседей (у пана 0 нет × и ⧉ — ◑ уезжает к краю).
|
||||
BtnS := H - 4;
|
||||
if FBtnClosePan <> nil then
|
||||
FBtnClosePan.SetBounds(RW - BtnS - 2, 2, BtnS, BtnS);
|
||||
if FBtnPopPan <> nil then
|
||||
FBtnPopPan.SetBounds(RW - 2 * BtnS - 6, 2, BtnS, BtnS);
|
||||
X := RW - 2;
|
||||
if (FBtnClosePan <> nil) and FBtnClosePan.Visible then
|
||||
begin
|
||||
Dec(X, BtnS); FBtnClosePan.SetBounds(X, 2, BtnS, BtnS); Dec(X, 4);
|
||||
end;
|
||||
if (FBtnPopPan <> nil) and FBtnPopPan.Visible then
|
||||
begin
|
||||
Dec(X, BtnS); FBtnPopPan.SetBounds(X, 2, BtnS, BtnS); Dec(X, 4);
|
||||
end;
|
||||
if (FBtnDisplay <> nil) and FBtnDisplay.Visible then
|
||||
begin
|
||||
Dec(X, BtnS); FBtnDisplay.SetBounds(X, 2, BtnS, BtnS); Dec(X, 4);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TPanafallPanel.PositionPanZoomBar(X0, BottomY, RW, H: Integer;
|
||||
|
||||
Reference in New Issue
Block a user