mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-26 04:47:35 +00:00
fix(slices): pop-out при wideband + читаемость шапки; бейдж АЦП → RX1/RX2
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 <noreply@anthropic.com>
This commit is contained in:
+37
-21
@@ -574,10 +574,11 @@ type
|
|||||||
procedure ClosePanadapter(PanId: Integer);
|
procedure ClosePanadapter(PanId: Integer);
|
||||||
procedure DestroyAllExtraPans; // stop/выход
|
procedure DestroyAllExtraPans; // stop/выход
|
||||||
procedure UpdatePanHeaders; // текст+видимость шапок
|
procedure UpdatePanHeaders; // текст+видимость шапок
|
||||||
|
procedure ApplyPanHeaderTheme(P: TPanafallPanel); // цвета шапки пана
|
||||||
procedure UpdateAddPanButton;
|
procedure UpdateAddPanButton;
|
||||||
procedure OnPanRateClick(Sender: TObject); // «NNN kHz» шапки пана N
|
procedure OnPanRateClick(Sender: TObject); // «NNN kHz» шапки пана N
|
||||||
procedure PanRateMenuItemClick(Sender: TObject);
|
procedure PanRateMenuItemClick(Sender: TObject);
|
||||||
procedure OnPanADCClick(Sender: TObject); // бейдж «A1/A2» (3.4)
|
procedure OnPanADCClick(Sender: TObject); // бейдж «RX1/RX2» (3.4)
|
||||||
// Pop-out (3.5): «⧉» выносит пан в отдельное окно, [×] окна возвращает в стек.
|
// Pop-out (3.5): «⧉» выносит пан в отдельное окно, [×] окна возвращает в стек.
|
||||||
procedure OnPanPopOutClick(Sender: TObject);
|
procedure OnPanPopOutClick(Sender: TObject);
|
||||||
procedure PopOutPan(PanId: Integer);
|
procedure PopOutPan(PanId: Integer);
|
||||||
@@ -1072,7 +1073,7 @@ begin
|
|||||||
// Стек панов (этап 3.3): пан 0 — в общем массиве; «⊞» добавляет пан.
|
// Стек панов (этап 3.3): пан 0 — в общем массиве; «⊞» добавляет пан.
|
||||||
FPan.PanId := 0;
|
FPan.PanId := 0;
|
||||||
FPan.OnAddPan := OnAddPanClick;
|
FPan.OnAddPan := OnAddPanClick;
|
||||||
FPan.OnADCClick := OnPanADCClick; // бейдж A1/A2 (3.4, платы с 2 АЦП)
|
FPan.OnADCClick := OnPanADCClick; // бейдж RX1/RX2 (3.4, платы с 2 АЦП)
|
||||||
FPans[0] := FPan;
|
FPans[0] := FPan;
|
||||||
FPanShare[0] := 1.0;
|
FPanShare[0] := 1.0;
|
||||||
FPanCbLock := SyncObjs.TCriticalSection.Create;
|
FPanCbLock := SyncObjs.TCriticalSection.Create;
|
||||||
@@ -2604,7 +2605,11 @@ begin
|
|||||||
Hi := Round(UsableH * FPanShare[i] / ShareSum);
|
Hi := Round(UsableH * FPanShare[i] / ShareSum);
|
||||||
FPans[i].StackTop := Y;
|
FPans[i].StackTop := Y;
|
||||||
FPans[i].StackHeight := Hi;
|
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
|
if i = 0 then
|
||||||
FPans[i].Layout(AWideH, FController.FShowSpectrum, FController.FShowWaterfall)
|
FPans[i].Layout(AWideH, FController.FShowSpectrum, FController.FShowWaterfall)
|
||||||
else
|
else
|
||||||
@@ -2695,21 +2700,7 @@ begin
|
|||||||
if FPans[i].BtnAddPan <> nil then StyleButton(FPans[i].BtnAddPan, False);
|
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].BtnPopPan <> nil then StyleButton(FPans[i].BtnPopPan, False);
|
||||||
if FPans[i].BtnClosePan <> nil then StyleButton(FPans[i].BtnClosePan, False);
|
if FPans[i].BtnClosePan <> nil then StyleButton(FPans[i].BtnClosePan, False);
|
||||||
if FPans[i].HeaderPanel <> nil then
|
ApplyPanHeaderTheme(FPans[i]);
|
||||||
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;
|
|
||||||
if i > 0 then
|
if i > 0 then
|
||||||
begin
|
begin
|
||||||
FPans[i].SetFlagsTheme(T);
|
FPans[i].SetFlagsTheme(T);
|
||||||
@@ -5377,7 +5368,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMainForm.OnPanADCClick(Sender: TObject);
|
procedure TMainForm.OnPanADCClick(Sender: TObject);
|
||||||
// Бейдж «A1/A2»: тумблер ADC-источника пана (двух-АЦПшные платы, 3.4).
|
// Бейдж «RX1/RX2»: тумблер ADC-источника пана (двух-АЦПшные платы, 3.4).
|
||||||
var
|
var
|
||||||
P: TPanafallPanel;
|
P: TPanafallPanel;
|
||||||
N: Integer;
|
N: Integer;
|
||||||
@@ -5425,6 +5416,8 @@ begin
|
|||||||
F := TForm.CreateNew(Self);
|
F := TForm.CreateNew(Self);
|
||||||
F.Caption := Format('EWSDR · PAN %d', [PanId]);
|
F.Caption := Format('EWSDR · PAN %d', [PanId]);
|
||||||
F.Color := T.BG;
|
F.Color := T.BG;
|
||||||
|
F.Font.Assign(Font); // ParentFont-наследники (лейблы шапки) берут шрифт
|
||||||
|
// формы — без этого текст дефолтно-тёмный на тёмном
|
||||||
F.Position := poDefault;
|
F.Position := poDefault;
|
||||||
F.Width := PanelRight.ClientWidth;
|
F.Width := PanelRight.ClientWidth;
|
||||||
F.Height := Max(300, P.StackHeight);
|
F.Height := Max(300, P.StackHeight);
|
||||||
@@ -5526,6 +5519,28 @@ begin
|
|||||||
MarkPanDirty(P);
|
MarkPanDirty(P);
|
||||||
end;
|
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;
|
procedure TMainForm.UpdatePanHeaders;
|
||||||
// Текст/видимость шапок: у одного пана шапки нет, у стека — у всех;
|
// Текст/видимость шапок: у одного пана шапки нет, у стека — у всех;
|
||||||
// у плавающего (pop-out) пана шапка всегда (там его rate/ADC/×).
|
// у плавающего (pop-out) пана шапка всегда (там его rate/ADC/×).
|
||||||
@@ -5558,7 +5573,7 @@ begin
|
|||||||
// Бейдж АЦП: только на двух-АЦПшных платах; клик = тумблер.
|
// Бейдж АЦП: только на двух-АЦПшных платах; клик = тумблер.
|
||||||
if NADC > 1 then
|
if NADC > 1 then
|
||||||
begin
|
begin
|
||||||
P.SetHeaderADC(Format('A%d', [FController.PanADC(i) + 1]));
|
P.SetHeaderADC(Format('RX%d', [FController.PanADC(i) + 1]));
|
||||||
P.ADCClickable := True;
|
P.ADCClickable := True;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@@ -5566,6 +5581,7 @@ begin
|
|||||||
P.SetHeaderADC('');
|
P.SetHeaderADC('');
|
||||||
P.ADCClickable := False;
|
P.ADCClickable := False;
|
||||||
end;
|
end;
|
||||||
|
ApplyPanHeaderTheme(P); // клик-статусы могли смениться + свежесозданные паны
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -5616,7 +5632,7 @@ begin
|
|||||||
P.OnSplitterMoved := RightPanelResize; // ratio обновлён → полный re-layout
|
P.OnSplitterMoved := RightPanelResize; // ratio обновлён → полный re-layout
|
||||||
P.OnRateClick := OnPanRateClick; // «NNN kHz» в шапке → меню rate
|
P.OnRateClick := OnPanRateClick; // «NNN kHz» в шапке → меню rate
|
||||||
P.RateClickable := True;
|
P.RateClickable := True;
|
||||||
P.OnADCClick := OnPanADCClick; // «A1/A2» тумблер АЦП (3.4)
|
P.OnADCClick := OnPanADCClick; // «RX1/RX2» тумблер АЦП (3.4)
|
||||||
P.OnPanPopOut := OnPanPopOutClick; // «⧉» в отдельное окно (3.5)
|
P.OnPanPopOut := OnPanPopOutClick; // «⧉» в отдельное окно (3.5)
|
||||||
P.SpectrumMouseDown := PanNSpectrumMouseDown;
|
P.SpectrumMouseDown := PanNSpectrumMouseDown;
|
||||||
P.SpectrumMouseMove := PanNSpectrumMouseMove;
|
P.SpectrumMouseMove := PanNSpectrumMouseMove;
|
||||||
|
|||||||
+3
-3
@@ -98,7 +98,7 @@ type
|
|||||||
FHeaderRateLabel: TLabel; // «NNN kHz»; у панов N>0 кликабелен (селектор rate)
|
FHeaderRateLabel: TLabel; // «NNN kHz»; у панов N>0 кликабелен (селектор rate)
|
||||||
FRateClickable: Boolean;
|
FRateClickable: Boolean;
|
||||||
FOnRateClick: TNotifyEvent;
|
FOnRateClick: TNotifyEvent;
|
||||||
FHeaderADCLabel: TLabel; // «A1»/«A2»; кликабелен при 2 АЦП (тумблер, 3.4)
|
FHeaderADCLabel: TLabel; // «RX1»/«RX2»; кликабелен при 2 АЦП (тумблер, 3.4)
|
||||||
FADCClickable: Boolean;
|
FADCClickable: Boolean;
|
||||||
FOnADCClick: TNotifyEvent;
|
FOnADCClick: TNotifyEvent;
|
||||||
FBtnPopPan: TFlatButton; // «⧉» pop-out в отдельное окно (паны N>0, 3.5)
|
FBtnPopPan: TFlatButton; // «⧉» pop-out в отдельное окно (паны N>0, 3.5)
|
||||||
@@ -194,7 +194,7 @@ type
|
|||||||
procedure SetHeaderRate(const S: string);
|
procedure SetHeaderRate(const S: string);
|
||||||
property RateClickable: Boolean read FRateClickable write SetRateClickable;
|
property RateClickable: Boolean read FRateClickable write SetRateClickable;
|
||||||
property OnRateClick: TNotifyEvent read FOnRateClick write FOnRateClick;
|
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);
|
procedure SetHeaderADC(const S: string);
|
||||||
property ADCClickable: Boolean read FADCClickable write SetADCClickable;
|
property ADCClickable: Boolean read FADCClickable write SetADCClickable;
|
||||||
@@ -401,7 +401,7 @@ begin
|
|||||||
FHeaderRateLabel.Parent := FHeaderPanel;
|
FHeaderRateLabel.Parent := FHeaderPanel;
|
||||||
FHeaderRateLabel.AutoSize := True;
|
FHeaderRateLabel.AutoSize := True;
|
||||||
FHeaderRateLabel.OnClick := HeaderRateClick;
|
FHeaderRateLabel.OnClick := HeaderRateClick;
|
||||||
// ADC-бейдж «A1»/«A2» (3.4): пустой текст = скрыт (одноАЦПшные платы).
|
// ADC-бейдж «RX1»/«RX2» (3.4): пустой текст = скрыт (одноАЦПшные платы).
|
||||||
FHeaderADCLabel := TLabel.Create(Self);
|
FHeaderADCLabel := TLabel.Create(Self);
|
||||||
FHeaderADCLabel.Parent := FHeaderPanel;
|
FHeaderADCLabel.Parent := FHeaderPanel;
|
||||||
FHeaderADCLabel.AutoSize := True;
|
FHeaderADCLabel.AutoSize := True;
|
||||||
|
|||||||
Reference in New Issue
Block a user