From 209e490dfa7999f36c4594f658e3e72d044b3fae Mon Sep 17 00:00:00 2001 From: Vladimir Date: Sun, 12 Jul 2026 11:05:10 +0300 Subject: [PATCH] =?UTF-8?q?fix(slices):=20pop-out=20=D0=BF=D1=80=D0=B8=20w?= =?UTF-8?q?ideband=20+=20=D1=87=D0=B8=D1=82=D0=B0=D0=B5=D0=BC=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D1=8C=20=D1=88=D0=B0=D0=BF=D0=BA=D0=B8;=20=D0=B1=D0=B5?= =?UTF-8?q?=D0=B9=D0=B4=D0=B6=20=D0=90=D0=A6=D0=9F=20=E2=86=92=20RX1/RX2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1) LayoutPanStack прятал шапку пана 0 по числу застекованных панов, а wideband ставится со сдвигом Pan0HeaderH по общему числу (вкл. плавающие) — спектр накрывал линейку частот wideband. Теперь видимость шапки по PanCount. 2) Лейблы шапки наследовали шрифт формы (ParentFont) — в pop-out окне текст был дефолтно-тёмным на тёмном. Темизация шапки вынесена в ApplyPanHeaderTheme (зовётся из UpdatePanHeaders: создание пана/pop-out/dock), окну — шрифт формы. 3) Бейдж ADC-источника переименован A1/A2 → RX1/RX2. Co-Authored-By: Claude Fable 5 --- MainForm.pas | 58 ++++++++++++++++++++++++++++++----------------- PanafallPanel.pas | 6 ++--- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/MainForm.pas b/MainForm.pas index eba1cb5..49def34 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -574,10 +574,11 @@ type procedure ClosePanadapter(PanId: Integer); procedure DestroyAllExtraPans; // stop/выход procedure UpdatePanHeaders; // текст+видимость шапок + procedure ApplyPanHeaderTheme(P: TPanafallPanel); // цвета шапки пана procedure UpdateAddPanButton; procedure OnPanRateClick(Sender: TObject); // «NNN kHz» шапки пана N procedure PanRateMenuItemClick(Sender: TObject); - procedure OnPanADCClick(Sender: TObject); // бейдж «A1/A2» (3.4) + procedure OnPanADCClick(Sender: TObject); // бейдж «RX1/RX2» (3.4) // Pop-out (3.5): «⧉» выносит пан в отдельное окно, [×] окна возвращает в стек. procedure OnPanPopOutClick(Sender: TObject); procedure PopOutPan(PanId: Integer); @@ -1072,7 +1073,7 @@ begin // Стек панов (этап 3.3): пан 0 — в общем массиве; «⊞» добавляет пан. FPan.PanId := 0; FPan.OnAddPan := OnAddPanClick; - FPan.OnADCClick := OnPanADCClick; // бейдж A1/A2 (3.4, платы с 2 АЦП) + FPan.OnADCClick := OnPanADCClick; // бейдж RX1/RX2 (3.4, платы с 2 АЦП) FPans[0] := FPan; FPanShare[0] := 1.0; FPanCbLock := SyncObjs.TCriticalSection.Create; @@ -2604,7 +2605,11 @@ begin Hi := Round(UsableH * FPanShare[i] / ShareSum); FPans[i].StackTop := Y; FPans[i].StackHeight := Hi; - FPans[i].HeaderVisible := N > 1; + // Видимость шапки — по ОБЩЕМУ числу панов (включая плавающие), как + // Pan0HeaderH/UpdatePanHeaders: иначе при pop-out пана N шапка пана 0 + // прячется, а wideband остаётся сдвинутым на Pan0HeaderH — спектр + // накрывает линейку частот wideband. + FPans[i].HeaderVisible := PanCount > 1; if i = 0 then FPans[i].Layout(AWideH, FController.FShowSpectrum, FController.FShowWaterfall) else @@ -2695,21 +2700,7 @@ begin if FPans[i].BtnAddPan <> nil then StyleButton(FPans[i].BtnAddPan, False); if FPans[i].BtnPopPan <> nil then StyleButton(FPans[i].BtnPopPan, False); if FPans[i].BtnClosePan <> nil then StyleButton(FPans[i].BtnClosePan, False); - if FPans[i].HeaderPanel <> nil then - begin - FPans[i].HeaderPanel.Color := T.Panel; - FPans[i].HeaderLabel.Font.Color := T.Text; - // Rate-лейбл: кликабельный (паны N) подсвечиваем акцентом селектора. - if FPans[i].RateClickable then - FPans[i].HeaderRateLabel.Font.Color := T.BtnTextActive - else - FPans[i].HeaderRateLabel.Font.Color := T.Text; - // ADC-бейдж кликабелен на 2-АЦПшных платах — тоже акцент. - if FPans[i].ADCClickable then - FPans[i].HeaderADCLabel.Font.Color := T.BtnTextActive - else - FPans[i].HeaderADCLabel.Font.Color := T.Text; - end; + ApplyPanHeaderTheme(FPans[i]); if i > 0 then begin FPans[i].SetFlagsTheme(T); @@ -5377,7 +5368,7 @@ begin end; procedure TMainForm.OnPanADCClick(Sender: TObject); -// Бейдж «A1/A2»: тумблер ADC-источника пана (двух-АЦПшные платы, 3.4). +// Бейдж «RX1/RX2»: тумблер ADC-источника пана (двух-АЦПшные платы, 3.4). var P: TPanafallPanel; N: Integer; @@ -5425,6 +5416,8 @@ begin F := TForm.CreateNew(Self); F.Caption := Format('EWSDR · PAN %d', [PanId]); F.Color := T.BG; + F.Font.Assign(Font); // ParentFont-наследники (лейблы шапки) берут шрифт + // формы — без этого текст дефолтно-тёмный на тёмном F.Position := poDefault; F.Width := PanelRight.ClientWidth; F.Height := Max(300, P.StackHeight); @@ -5526,6 +5519,28 @@ begin MarkPanDirty(P); end; +procedure TMainForm.ApplyPanHeaderTheme(P: TPanafallPanel); +// Явные цвета шапки пана. Зовётся и из ApplyDarkTheme, и из UpdatePanHeaders: +// лейблы без явного Font.Color наследуют шрифт формы-родителя (ParentFont), +// и в pop-out окне текст становился дефолтно-тёмным на тёмном фоне. +var T: TAppTheme; +begin + if (P = nil) or (P.HeaderPanel = nil) then Exit; + if FLightTheme then T := LightTheme else T := DarkTheme; + P.HeaderPanel.Color := T.Panel; + P.HeaderLabel.Font.Color := T.Text; + // Rate-лейбл: кликабельный (паны N) подсвечиваем акцентом селектора. + if P.RateClickable then + P.HeaderRateLabel.Font.Color := T.BtnTextActive + else + P.HeaderRateLabel.Font.Color := T.Text; + // ADC-бейдж кликабелен на 2-АЦПшных платах — тоже акцент. + if P.ADCClickable then + P.HeaderADCLabel.Font.Color := T.BtnTextActive + else + P.HeaderADCLabel.Font.Color := T.Text; +end; + procedure TMainForm.UpdatePanHeaders; // Текст/видимость шапок: у одного пана шапки нет, у стека — у всех; // у плавающего (pop-out) пана шапка всегда (там его rate/ADC/×). @@ -5558,7 +5573,7 @@ begin // Бейдж АЦП: только на двух-АЦПшных платах; клик = тумблер. if NADC > 1 then begin - P.SetHeaderADC(Format('A%d', [FController.PanADC(i) + 1])); + P.SetHeaderADC(Format('RX%d', [FController.PanADC(i) + 1])); P.ADCClickable := True; end else @@ -5566,6 +5581,7 @@ begin P.SetHeaderADC(''); P.ADCClickable := False; end; + ApplyPanHeaderTheme(P); // клик-статусы могли смениться + свежесозданные паны end; end; @@ -5616,7 +5632,7 @@ begin P.OnSplitterMoved := RightPanelResize; // ratio обновлён → полный re-layout P.OnRateClick := OnPanRateClick; // «NNN kHz» в шапке → меню rate P.RateClickable := True; - P.OnADCClick := OnPanADCClick; // «A1/A2» тумблер АЦП (3.4) + P.OnADCClick := OnPanADCClick; // «RX1/RX2» тумблер АЦП (3.4) P.OnPanPopOut := OnPanPopOutClick; // «⧉» в отдельное окно (3.5) P.SpectrumMouseDown := PanNSpectrumMouseDown; P.SpectrumMouseMove := PanNSpectrumMouseMove; diff --git a/PanafallPanel.pas b/PanafallPanel.pas index 8ed1893..8dd563c 100644 --- a/PanafallPanel.pas +++ b/PanafallPanel.pas @@ -98,7 +98,7 @@ type FHeaderRateLabel: TLabel; // «NNN kHz»; у панов N>0 кликабелен (селектор rate) FRateClickable: Boolean; FOnRateClick: TNotifyEvent; - FHeaderADCLabel: TLabel; // «A1»/«A2»; кликабелен при 2 АЦП (тумблер, 3.4) + FHeaderADCLabel: TLabel; // «RX1»/«RX2»; кликабелен при 2 АЦП (тумблер, 3.4) FADCClickable: Boolean; FOnADCClick: TNotifyEvent; FBtnPopPan: TFlatButton; // «⧉» pop-out в отдельное окно (паны N>0, 3.5) @@ -194,7 +194,7 @@ type procedure SetHeaderRate(const S: string); property RateClickable: Boolean read FRateClickable write SetRateClickable; property OnRateClick: TNotifyEvent read FOnRateClick write FOnRateClick; - // Бейдж ADC-источника «A1»/«A2» (3.4): показывается при NumADCs>1, + // Бейдж ADC-источника «RX1»/«RX2» (3.4): показывается при NumADCs>1, // клик = тумблер АЦП (хозяин). procedure SetHeaderADC(const S: string); property ADCClickable: Boolean read FADCClickable write SetADCClickable; @@ -401,7 +401,7 @@ begin FHeaderRateLabel.Parent := FHeaderPanel; FHeaderRateLabel.AutoSize := True; FHeaderRateLabel.OnClick := HeaderRateClick; - // ADC-бейдж «A1»/«A2» (3.4): пустой текст = скрыт (одноАЦПшные платы). + // ADC-бейдж «RX1»/«RX2» (3.4): пустой текст = скрыт (одноАЦПшные платы). FHeaderADCLabel := TLabel.Create(Self); FHeaderADCLabel.Parent := FHeaderPanel; FHeaderADCLabel.AutoSize := True;