mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 18:43:51 +00:00
fix(ui): SETUP заперт, пока устройство не подключено
Почти всё в окне настроек — свойства КОНКРЕТНОГО радио: они грузятся и
сохраняются по его MAC (у AD936x — по серийному номеру). До подключения MAC
неизвестен, и правки уезжали бы в чужую секцию конфига — ровно так когда-то
оборачивался старт по AutoStart с нулевым MAC (66c9fa6). Проще не пускать
оператора внутрь, чем потом объяснять, куда делись настройки.
Кнопка создаётся выключенной и отпирается в ветке rfDevice, то есть после
удачного Connect. TFlatButton уже умеет рисовать выключенное состояние
(приглушённые текст и рамка), так что запрет виден, а не выглядит поломкой;
на кнопке подсказка, почему она заперта.
Гейт продублирован внутри BtnSettingsClick: туда приходит не только мышь, но и
ПКМ по кнопке TX-профиля (BtnTXProfileMouseDown → ShowTransmitPage), и этот
путь открывал бы диалог в обход запертой кнопки.
★После Stop обратно не запираем: FDevConnected означает «устройство известно»,
а не «сеть жива» (он и не сбрасывается в StopAndDisconnect), а править настройки
между сеансами законно.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M37eCTZZ9aqppKWkZRxXkP
This commit is contained in:
@@ -679,6 +679,7 @@ type
|
|||||||
procedure DeactivateXvtr;
|
procedure DeactivateXvtr;
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
procedure BtnSettingsClick(Sender: TObject);
|
procedure BtnSettingsClick(Sender: TObject);
|
||||||
|
procedure UpdateSetupButton; // SETUP заперт, пока не знаем устройство
|
||||||
// Семантические обработчики событий флагов (роутинг по FPan.CurSliceId).
|
// Семантические обработчики событий флагов (роутинг по FPan.CurSliceId).
|
||||||
// Коллекция/раскладка/диспетчер флагов — в TPanafallPanel.
|
// Коллекция/раскладка/диспетчер флагов — в TPanafallPanel.
|
||||||
procedure OnModeFilterSelect(Mode: Integer; FilterBW: Integer);
|
procedure OnModeFilterSelect(Mode: Integer; FilterBW: Integer);
|
||||||
@@ -1861,6 +1862,7 @@ begin
|
|||||||
FCATAdapter.ApplySettings(FController.FLoadedGlobal);
|
FCATAdapter.ApplySettings(FController.FLoadedGlobal);
|
||||||
ApplySliceSlotAudio;
|
ApplySliceSlotAudio;
|
||||||
RelabelBands; // HF ↔ VHF/UHF подписи под тип бэкенда
|
RelabelBands; // HF ↔ VHF/UHF подписи под тип бэкенда
|
||||||
|
UpdateSetupButton; // MAC/серийник известны — SETUP открылся
|
||||||
ApplyBackendCapsToUI; // пресеты sample rate + гейтинг полей
|
ApplyBackendCapsToUI; // пресеты sample rate + гейтинг полей
|
||||||
RebuildXvtrButtons;
|
RebuildXvtrButtons;
|
||||||
PushXvtrToWeb;
|
PushXvtrToWeb;
|
||||||
@@ -2044,6 +2046,8 @@ begin
|
|||||||
BtnDiscover := MakeBtn(PanelToolbar, 'DISCOVER', X, 3, 80, BTN_H, BtnDiscoverClick);
|
BtnDiscover := MakeBtn(PanelToolbar, 'DISCOVER', X, 3, 80, BTN_H, BtnDiscoverClick);
|
||||||
BtnStartStop := MakeBtn(PanelToolbar, 'START', X+84, 3, 76, BTN_H, BtnStartStopClick);
|
BtnStartStop := MakeBtn(PanelToolbar, 'START', X+84, 3, 76, BTN_H, BtnStartStopClick);
|
||||||
BtnSettings := MakeBtn(PanelToolbar, 'SETUP', X+164, 3, 66, BTN_H, BtnSettingsClick);
|
BtnSettings := MakeBtn(PanelToolbar, 'SETUP', X+164, 3, 66, BTN_H, BtnSettingsClick);
|
||||||
|
// SETUP отпирается только после подключения — см. UpdateSetupButton.
|
||||||
|
UpdateSetupButton;
|
||||||
// DX живёт в блоке RX левой панели, рядом с CTUN (см. ниже): споты — часть
|
// DX живёт в блоке RX левой панели, рядом с CTUN (см. ниже): споты — часть
|
||||||
// приёмного вида, а не глобальная команда уровня DISCOVER/START/SETUP.
|
// приёмного вида, а не глобальная команда уровня DISCOVER/START/SETUP.
|
||||||
|
|
||||||
@@ -9717,10 +9721,30 @@ begin
|
|||||||
if FreqDispB <> nil then FreqDispB.MaxFreq := hi;
|
if FreqDispB <> nil then FreqDispB.MaxFreq := hi;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TMainForm.UpdateSetupButton;
|
||||||
|
// Почти всё в окне настроек — свойства КОНКРЕТНОГО устройства: они и грузятся,
|
||||||
|
// и сохраняются по его MAC (у AD936x — по серийному номеру). Пока устройство не
|
||||||
|
// подключено, MAC неизвестен, и правки уезжали бы в чужую секцию конфига —
|
||||||
|
// ровно этим когда-то оборачивался старт по AutoStart с нулевым MAC. Поэтому
|
||||||
|
// SETUP заперт до первого удачного Connect. ★После Stop не запираем обратно:
|
||||||
|
// FDevConnected означает «устройство известно», а не «сеть жива», и настройки
|
||||||
|
// между сеансами править законно.
|
||||||
|
begin
|
||||||
|
if BtnSettings = nil then Exit;
|
||||||
|
BtnSettings.Enabled := (FController <> nil) and FController.FDevConnected;
|
||||||
|
BtnSettings.ShowHint := True;
|
||||||
|
if BtnSettings.Enabled then
|
||||||
|
BtnSettings.Hint := ''
|
||||||
|
else
|
||||||
|
BtnSettings.Hint := 'Connect a radio first — settings are stored per device';
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TMainForm.BtnSettingsClick(Sender: TObject);
|
procedure TMainForm.BtnSettingsClick(Sender: TObject);
|
||||||
var
|
var
|
||||||
SF: TSettingsForm;
|
SF: TSettingsForm;
|
||||||
begin
|
begin
|
||||||
|
// Гейт не только для мыши: сюда же приходит ПКМ по кнопке TX-профиля.
|
||||||
|
if (BtnSettings <> nil) and (not BtnSettings.Enabled) then Exit;
|
||||||
if not Assigned(FSettingsForm) then
|
if not Assigned(FSettingsForm) then
|
||||||
begin
|
begin
|
||||||
SF := TSettingsForm.Create(Self);
|
SF := TSettingsForm.Create(Self);
|
||||||
|
|||||||
Reference in New Issue
Block a user