using System; using System.Collections; using TMPro; using UnityEngine; using UnityEngine.UI; /// /// BFI阈值设置弹窗 /// 用于设置BFI数值的上下限阈值,超过阈值会触发报警 /// public class BFIThresholdDialog : BasePanel { [Header("阈值设置")] public Slider MinThresholdSlider; public Slider MaxThresholdSlider; public TMP_InputField MinThresholdInput; public TMP_InputField MaxThresholdInput; public TextMeshProUGUI MinValueText; public TextMeshProUGUI MaxValueText; [Header("当前值显示")] public TextMeshProUGUI CurrentBFIText; public TextMeshProUGUI StatusText; public Image BFIStatusIndicator; [Header("按钮")] public Button HomeButton; public Button ConfirmButton; public Button CancelButton; public Button ResetButton; // [Header("预设按钮")] // public Button NormalPresetButton; // 正常范围预设 // public Button SensitivePresetButton; // 敏感范围预设 // public Button CustomPresetButton; // 自定义范围预设 // [Header("报警设置")] // public Toggle EnableLowAlarmToggle; // public Toggle EnableHighAlarmToggle; // public Dropdown AlarmPriorityDropdown; // 阈值数据 private BFIThresholdSettings _settings; private IDataService _dataService; // 默认阈值 private const float DEFAULT_MIN = 0f; private const float DEFAULT_MAX = 200f; private const float BFI_MIN_RANGE = 0f; private const float BFI_MAX_RANGE = 200f; public static event Action OnThresholdChanged; public override void Init() { // 获取数据服务 _dataService = ServiceLocator.Get(); // 加载当前设置 LoadCurrentSettings(); // 初始化UI InitializeUI(); // 订阅数据更新事件 if (_dataService != null) { _dataService.OnBFIValueUpdated += OnBFIValueUpdated; } // 开始实时更新 // StartCoroutine(UpdateCurrentBFIDisplay()); } private void LoadCurrentSettings() { // 从配置服务加载当前阈值设置 var settingsService = ServiceLocator.Get(); _settings = new BFIThresholdSettings { MinThreshold = settingsService?.BFILowThreshold ?? DEFAULT_MIN, MaxThreshold = settingsService?.BFIHighThreshold ?? DEFAULT_MAX, // EnableLowAlarm = settingsService?.EnableBFIAlarm ?? true, // EnableHighAlarm = settingsService?.EnableBFIAlarm ?? true, AlarmPriority = AlarmPriority.High, }; } private void InitializeUI() { // 初始化滑块 if (MinThresholdSlider != null) { MinThresholdSlider.minValue = BFI_MIN_RANGE; MinThresholdSlider.maxValue = BFI_MAX_RANGE; MinThresholdSlider.value = _settings.MinThreshold; MinThresholdSlider.onValueChanged.AddListener(OnMinThresholdSliderChanged); } if (MaxThresholdSlider != null) { MaxThresholdSlider.minValue = BFI_MIN_RANGE; MaxThresholdSlider.maxValue = BFI_MAX_RANGE; MaxThresholdSlider.value = _settings.MaxThreshold; MaxThresholdSlider.onValueChanged.AddListener(OnMaxThresholdSliderChanged); } // 初始化输入框 if (MinThresholdInput != null) { MinThresholdInput.text = _settings.MinThreshold.ToString("F1"); MinThresholdInput.onEndEdit.AddListener(OnMinThresholdInputChanged); } if (MaxThresholdInput != null) { MaxThresholdInput.text = _settings.MaxThreshold.ToString("F1"); MaxThresholdInput.onEndEdit.AddListener(OnMaxThresholdInputChanged); } // 初始化按钮 if(HomeButton != null) { HomeButton.onClick.AddListener(OnCancelClicked); } if (ConfirmButton != null) { ConfirmButton.onClick.AddListener(OnConfirmClicked); // #if UNITY_ANDROID && !UNITY_EDITOR // ConfirmButton.gameObject.SetActive(false); // #endif } if (CancelButton != null) { CancelButton.onClick.AddListener(OnCancelClicked); } if (ResetButton != null) { ResetButton.onClick.AddListener(OnResetClicked); } // 更新显示 UpdateDisplayValues(); // 禁用系统键盘(安卓优化) DisableSystemKeyboardForInputFields(); } private void OnMinThresholdSliderChanged(float value) { _settings.MinThreshold = value; // 确保最小值不大于最大值 if (_settings.MinThreshold >= _settings.MaxThreshold) { _settings.MaxThreshold = _settings.MinThreshold + 1f; if (MaxThresholdSlider != null) { MaxThresholdSlider.value = _settings.MaxThreshold; } } UpdateDisplayValues(); } private void OnMaxThresholdSliderChanged(float value) { _settings.MaxThreshold = value; // 确保最大值不小于最小值 if (_settings.MaxThreshold <= _settings.MinThreshold) { _settings.MinThreshold = _settings.MaxThreshold - 1f; if (MinThresholdSlider != null) { MinThresholdSlider.value = _settings.MinThreshold; } } UpdateDisplayValues(); } private void OnMinThresholdInputChanged(string value) { if (float.TryParse(value, out float newValue)) { newValue = Mathf.Clamp(newValue, BFI_MIN_RANGE, BFI_MAX_RANGE); _settings.MinThreshold = newValue; if (MinThresholdSlider != null) { MinThresholdSlider.value = newValue; } UpdateDisplayValues(); } } private void OnMaxThresholdInputChanged(string value) { if (float.TryParse(value, out float newValue)) { newValue = Mathf.Clamp(newValue, BFI_MIN_RANGE, BFI_MAX_RANGE); _settings.MaxThreshold = newValue; if (MaxThresholdSlider != null) { MaxThresholdSlider.value = newValue; } UpdateDisplayValues(); } } private void UpdateDisplayValues() { if (MinValueText != null) { MinValueText.text = $"下限: {_settings.MinThreshold:F1}"; } if (MaxValueText != null) { MaxValueText.text = $"上限: {_settings.MaxThreshold:F1}"; } if (MinThresholdInput != null) { MinThresholdInput.text = _settings.MinThreshold.ToString("F1"); } if (MaxThresholdInput != null) { MaxThresholdInput.text = _settings.MaxThreshold.ToString("F1"); } if (StatusText != null) { string priorityText = GetPriorityText(_settings.AlarmPriority); StatusText.text = $"正常范围: {_settings.MinThreshold:F1} - {_settings.MaxThreshold:F1}\n" + $"报警优先级: {priorityText}"; } } private string GetPriorityText(AlarmPriority priority) { return priority switch { AlarmPriority.Low => "低", AlarmPriority.Medium => "中", AlarmPriority.High => "高", _ => "中" }; } private void OnBFIValueUpdated(float currentBFI) { // 在主线程更新UI if (CurrentBFIText != null) { CurrentBFIText.text = $"当前BFI: {currentBFI:F1}"; } // 更新状态指示器 UpdateBFIStatusIndicator(currentBFI); } private void UpdateBFIStatusIndicator(float currentBFI) { if (BFIStatusIndicator == null) return; Color indicatorColor; if (currentBFI < _settings.MinThreshold) { indicatorColor = Color.red ; } else if (currentBFI > _settings.MaxThreshold) { indicatorColor = Color.red ; } else { indicatorColor = Color.green; } BFIStatusIndicator.color = indicatorColor; } private void SyncUIWithSettings() { if (MinThresholdSlider != null) MinThresholdSlider.value = _settings.MinThreshold; if (MaxThresholdSlider != null) MaxThresholdSlider.value = _settings.MaxThreshold; // if (EnableLowAlarmToggle != null) EnableLowAlarmToggle.isOn = _settings.EnableLowAlarm; // if (EnableHighAlarmToggle != null) EnableHighAlarmToggle.isOn = _settings.EnableHighAlarm; // if (AlarmPriorityDropdown != null) AlarmPriorityDropdown.value = (int)_settings.AlarmPriority; UpdateDisplayValues(); } private void OnConfirmClicked() { // 保存设置到系统配置 var settingsService = ServiceLocator.Get(); if (settingsService != null) { settingsService.SetBFIAlarmSettings( _settings.MinThreshold, _settings.MaxThreshold, (int)_settings.AlarmPriority, settingsService.EnableBFIAlarm); } // 通知其他系统阈值已更改 OnThresholdChanged?.Invoke(_settings); // 只显示确认按钮,不显示取消按钮 ConfirmDialog.Show("提示", "设置已保存", () => { ClosePanel(); }, null, "确认", "取消", false, false); // 延迟关闭 // StartCoroutine(CloseAfterDelay(1f)); } private void OnCancelClicked() { ConfirmDialog.Show("确认", "是否返回主界面?", () => { ClosePanel(); ClosePanel(); }); } private void OnResetClicked() { _settings.MinThreshold = DEFAULT_MIN; _settings.MaxThreshold = DEFAULT_MAX; // _settings.EnableLowAlarm = true; // _settings.EnableHighAlarm = true; _settings.AlarmPriority = AlarmPriority.High; SyncUIWithSettings(); // SetStatusMessage("已重置为默认设置", Color.yellow); // 只显示确认按钮,不显示取消按钮 ConfirmDialog.Show("提示", "已重置为默认设置", () => { }, null, "确认", "取消", false, false); } private IEnumerator CloseAfterDelay(float delay) { yield return new WaitForSeconds(delay); ClosePanel(); } void OnDestroy() { // 取消数据服务订阅 if (_dataService != null) { _dataService.OnBFIValueUpdated -= OnBFIValueUpdated; } // 关闭自定义键盘(如果正在显示) if (CustomKeyboardManager.Instance != null && CustomKeyboardManager.Instance.IsKeyboardShowing()) { CustomKeyboardManager.Instance.HideKeyboard(); } } /// /// 禁用InputField的系统键盘,改用自定义输入对话框 /// private void DisableSystemKeyboardForInputFields() { // #if UNITY_ANDROID && !UNITY_EDITOR // 在安卓平台设置InputField为只读,通过透明按钮触发自定义输入 // SetupCustomNumericInput(MinThresholdInput, "请输入BFI下限值"); // SetupCustomNumericInput(MaxThresholdInput, "请输入BFI上限值"); if (MinThresholdInput != null) CustomKeyboardManager.SetupInputField(MinThresholdInput, KeyboardLayout.Numeric, (newValue) => { // 验证数字输入 if (float.TryParse(newValue, out float numValue)) { numValue = Mathf.Clamp(numValue, BFI_MIN_RANGE, BFI_MAX_RANGE); // 更新对应的输入框和滑块 _settings.MinThreshold = numValue; if (MinThresholdSlider != null) { MinThresholdSlider.value = numValue; } OnConfirmClicked(); UpdateDisplayValues(); } else if (!string.IsNullOrEmpty(newValue)) { // 只显示确认按钮,不显示取消按钮 ConfirmDialog.Show("提示", "请输入有效的数字(0.0-200.0)", () => { }, null, "确认", "取消", false, false); } }, clearOnFirstInput: true); // 首次输入时清空原内容 if (MaxThresholdInput != null) CustomKeyboardManager.SetupInputField(MaxThresholdInput, KeyboardLayout.Numeric, (newValue) => { // 验证数字输入 if (float.TryParse(newValue, out float numValue)) { numValue = Mathf.Clamp(numValue, BFI_MIN_RANGE, BFI_MAX_RANGE); // 更新对应的输入框和滑块 _settings.MaxThreshold = numValue; if (MaxThresholdSlider != null) { MaxThresholdSlider.value = numValue; } OnConfirmClicked(); UpdateDisplayValues(); } else if (!string.IsNullOrEmpty(newValue)) { // 只显示确认按钮,不显示取消按钮 ConfirmDialog.Show("提示", "请输入有效的数字(0.0-200.0)", () => { }, null, "确认", "取消", false, false); } }, clearOnFirstInput: true); // 首次输入时清空原内容 // #endif } } /// /// BFI阈值设置数据结构 /// [Serializable] public class BFIThresholdSettings { public float MinThreshold; public float MaxThreshold; // public bool EnableLowAlarm; // public bool EnableHighAlarm; public AlarmPriority AlarmPriority; }