using System; using System.Collections; using System.Collections.Generic; using Kill.Bluetooth; using Kill.Bluetooth.Protocol; using Kill.Managers; using Kill.UI.Components; using UnityEngine; using UnityEngine.UI; namespace Kill.UI.Pages { /// /// 定时任务编辑页面 /// 用于新增和编辑单个定时任务 /// public class ScheduleEditPage : MonoBehaviour { /// /// 0:模式 1:开始时间 2:结束时间 3:重复 /// public Button[] buttons; /// /// 0:模式 1:开始时间 2:结束时间 3:重复 /// public Text[] texts; // 各选择组件的预设(用于Instantiate) public MutiSelectPage modeSelectPagePrefab; public TimeSelection timeSelectionPrefab; public RepeatSelection repeatSelectionPrefab; // 实例化的组件(运行时创建) private MutiSelectPage _modeSelectPageInstance; private TimeSelection _startTimeSelectionInstance; private TimeSelection _endTimeSelectionInstance; private RepeatSelection _repeatSelectionInstance; // 组件父节点(实例化时作为父物体) public Transform componentParent; public Button saveButton; public Button backButton; public Button deleteButton; public WindowTipCtrl deleteTip; // 当前编辑的任务索引,-1表示新增 private int _editTaskIndex = -1; // 当前任务数据 private ScheduleTask _currentTask; // 编辑完成回调 private Action _onSaveCallback; // 删除回调 private Action _onDeleteCallback; // 模式选项文本 private List _modeStrs = new List(); private List _modeKeys = new List { "100094", "100095", "100096" }; // 临时存储的选择值 private ScheduleTaskMode _selectedMode; private byte _startHour; private byte _startMinute; private byte _endHour; private byte _endMinute; private byte _repeat; /// /// 初始化编辑页面 /// /// 任务索引,-1表示新增 /// 任务数据 /// 保存回调 /// 删除回调 public void Init(int taskIndex, ScheduleTask task, Action onSave = null, Action onDelete = null) { _editTaskIndex = taskIndex; _onSaveCallback = onSave; _onDeleteCallback = onDelete; // 加载多语言 LoadLocalizedStrings(); // 设置默认值或现有值 if (taskIndex < 0) { // 新增模式:设置默认值 _currentTask = new ScheduleTask { TaskId = 0, Enabled = true, StartHour = 8, StartMinute = 0, EndHour = 12, EndMinute = 0, Mode = ScheduleTaskMode.Scan, Repeat = 0 }; } else { // 编辑模式:使用传入的任务数据 _currentTask = task; } // 初始化临时值 _selectedMode = _currentTask.Mode; _startHour = _currentTask.StartHour; _startMinute = _currentTask.StartMinute; _endHour = _currentTask.EndHour; _endMinute = _currentTask.EndMinute; _repeat = _currentTask.Repeat; // 更新UI显示 UpdateUI(); // 设置删除按钮显示状态 if (deleteButton != null) { deleteButton.gameObject.SetActive(taskIndex >= 0); } // 绑定按钮事件 BindButtonEvents(); Debug.Log($"[ScheduleEditPage] 初始化 - {(taskIndex < 0 ? "新增" : "编辑")}任务"); } /// /// 加载多语言字符串 /// private void LoadLocalizedStrings() { _modeStrs.Clear(); foreach (var key in _modeKeys) { _modeStrs.Add(LanguageManager.Instance?.GetLanguage(key) ?? key); } } /// /// 更新UI显示 /// private void UpdateUI() { // 更新模式文本 if (texts.Length > 0 && texts[0] != null) { int modeIndex = (int)_selectedMode; texts[0].text = modeIndex >= 0 && modeIndex < _modeStrs.Count ? _modeStrs[modeIndex] : _selectedMode.ToString(); } // 更新开始时间文本 if (texts.Length > 1 && texts[1] != null) { texts[1].text = $"{_startHour:D2}:{_startMinute:D2}"; } // 更新结束时间文本 if (texts.Length > 2 && texts[2] != null) { texts[2].text = $"{_endHour:D2}:{_endMinute:D2}"; } // 更新重复文本 if (texts.Length > 3 && texts[3] != null) { texts[3].text = GetRepeatDisplayText(_repeat); } } /// /// 获取重复显示文本 /// private string GetRepeatDisplayText(byte repeat) { if (repeat == 0) { return ""; } // 检查是否7天都重复 byte allDays = ScheduleTask.REPEAT_SUNDAY | ScheduleTask.REPEAT_MONDAY | ScheduleTask.REPEAT_TUESDAY | ScheduleTask.REPEAT_WEDNESDAY | ScheduleTask.REPEAT_THURSDAY | ScheduleTask.REPEAT_FRIDAY | ScheduleTask.REPEAT_SATURDAY; if (repeat == allDays) { return LanguageManager.Instance?.GetLanguage("100138") ?? "Everyday"; } // 获取星期文本 List weekStr = new List(); List weekStrKeys = new List { "100130", "100124", "100125", "100126", "100127", "100128", "100129" }; foreach (var key in weekStrKeys) { weekStr.Add(LanguageManager.Instance?.GetLanguage(key) ?? key); } var days = new List(); if ((repeat & ScheduleTask.REPEAT_SUNDAY) != 0) days.Add(weekStr[0]); if ((repeat & ScheduleTask.REPEAT_MONDAY) != 0) days.Add(weekStr[1]); if ((repeat & ScheduleTask.REPEAT_TUESDAY) != 0) days.Add(weekStr[2]); if ((repeat & ScheduleTask.REPEAT_WEDNESDAY) != 0) days.Add(weekStr[3]); if ((repeat & ScheduleTask.REPEAT_THURSDAY) != 0) days.Add(weekStr[4]); if ((repeat & ScheduleTask.REPEAT_FRIDAY) != 0) days.Add(weekStr[5]); if ((repeat & ScheduleTask.REPEAT_SATURDAY) != 0) days.Add(weekStr[6]); return string.Join(", ", days); } /// /// 绑定按钮事件 /// private void BindButtonEvents() { // 模式选择按钮 if (buttons.Length > 0 && buttons[0] != null) { buttons[0].onClick.RemoveAllListeners(); buttons[0].onClick.AddListener(OnModeButtonClick); } // 开始时间按钮 if (buttons.Length > 1 && buttons[1] != null) { buttons[1].onClick.RemoveAllListeners(); buttons[1].onClick.AddListener(OnStartTimeButtonClick); } // 结束时间按钮 if (buttons.Length > 2 && buttons[2] != null) { buttons[2].onClick.RemoveAllListeners(); buttons[2].onClick.AddListener(OnEndTimeButtonClick); } // 重复按钮 if (buttons.Length > 3 && buttons[3] != null) { buttons[3].onClick.RemoveAllListeners(); buttons[3].onClick.AddListener(OnRepeatButtonClick); } // 保存按钮 if (saveButton != null) { saveButton.onClick.RemoveAllListeners(); saveButton.onClick.AddListener(OnSaveButtonClick); } // 返回按钮 if (backButton != null) { backButton.onClick.RemoveAllListeners(); backButton.onClick.AddListener(OnBackButtonClick); } // 删除按钮 if (deleteButton != null) { deleteButton.onClick.RemoveAllListeners(); deleteButton.onClick.AddListener(OnDeleteButtonClick); } } /// /// 获取或创建模式选择页面 /// private MutiSelectPage GetOrCreateModeSelectPage() { if (_modeSelectPageInstance == null && modeSelectPagePrefab != null) { Transform parent = componentParent != null ? componentParent : transform; _modeSelectPageInstance = Instantiate(modeSelectPagePrefab, parent); _modeSelectPageInstance.gameObject.SetActive(false); } return _modeSelectPageInstance; } /// /// 模式选择按钮点击 /// private void OnModeButtonClick() { var page = GetOrCreateModeSelectPage(); if (page != null) { page.gameObject.SetActive(true); page.Init((int)_selectedMode, OnModeSelected); } } /// /// 模式选择回调 /// private void OnModeSelected(int index) { _selectedMode = (ScheduleTaskMode)index; UpdateUI(); } /// /// 获取或创建开始时间选择页面 /// private TimeSelection GetOrCreateStartTimeSelection() { if (_startTimeSelectionInstance == null && timeSelectionPrefab != null) { Transform parent = componentParent != null ? componentParent : transform; _startTimeSelectionInstance = Instantiate(timeSelectionPrefab, parent); _startTimeSelectionInstance.gameObject.SetActive(false); } return _startTimeSelectionInstance; } /// /// 开始时间按钮点击 /// private void OnStartTimeButtonClick() { var page = GetOrCreateStartTimeSelection(); if (page != null) { page.gameObject.SetActive(true); page.Init(_startHour, _startMinute, OnStartTimeSelected); } } /// /// 开始时间选择回调 /// private void OnStartTimeSelected(int hour, int minute) { _startHour = (byte)hour; _startMinute = (byte)minute; UpdateUI(); } /// /// 获取或创建结束时间选择页面 /// private TimeSelection GetOrCreateEndTimeSelection() { if (_endTimeSelectionInstance == null && timeSelectionPrefab != null) { Transform parent = componentParent != null ? componentParent : transform; _endTimeSelectionInstance = Instantiate(timeSelectionPrefab, parent); _endTimeSelectionInstance.gameObject.SetActive(false); } return _endTimeSelectionInstance; } /// /// 结束时间按钮点击 /// private void OnEndTimeButtonClick() { var page = GetOrCreateEndTimeSelection(); if (page != null) { page.gameObject.SetActive(true); page.Init(_endHour, _endMinute, OnEndTimeSelected); } } /// /// 结束时间选择回调 /// private void OnEndTimeSelected(int hour, int minute) { _endHour = (byte)hour; _endMinute = (byte)minute; UpdateUI(); } /// /// 获取或创建重复选择页面 /// private RepeatSelection GetOrCreateRepeatSelection() { if (_repeatSelectionInstance == null && repeatSelectionPrefab != null) { Transform parent = componentParent != null ? componentParent : transform; _repeatSelectionInstance = Instantiate(repeatSelectionPrefab, parent); _repeatSelectionInstance.gameObject.SetActive(false); } return _repeatSelectionInstance; } /// /// 重复按钮点击 /// private void OnRepeatButtonClick() { var page = GetOrCreateRepeatSelection(); if (page != null) { // 将repeat byte转换为List List selectedDays = new List(); if ((_repeat & ScheduleTask.REPEAT_SUNDAY) != 0) selectedDays.Add(0); if ((_repeat & ScheduleTask.REPEAT_MONDAY) != 0) selectedDays.Add(1); if ((_repeat & ScheduleTask.REPEAT_TUESDAY) != 0) selectedDays.Add(2); if ((_repeat & ScheduleTask.REPEAT_WEDNESDAY) != 0) selectedDays.Add(3); if ((_repeat & ScheduleTask.REPEAT_THURSDAY) != 0) selectedDays.Add(4); if ((_repeat & ScheduleTask.REPEAT_FRIDAY) != 0) selectedDays.Add(5); if ((_repeat & ScheduleTask.REPEAT_SATURDAY) != 0) selectedDays.Add(6); page.gameObject.SetActive(true); page.Init(selectedDays, OnRepeatSelected); } } /// /// 重复选择回调 /// private void OnRepeatSelected(List days, string displayText) { // 将List转换为repeat byte _repeat = 0; foreach (var day in days) { switch (day) { case 0: _repeat |= ScheduleTask.REPEAT_SUNDAY; break; case 1: _repeat |= ScheduleTask.REPEAT_MONDAY; break; case 2: _repeat |= ScheduleTask.REPEAT_TUESDAY; break; case 3: _repeat |= ScheduleTask.REPEAT_WEDNESDAY; break; case 4: _repeat |= ScheduleTask.REPEAT_THURSDAY; break; case 5: _repeat |= ScheduleTask.REPEAT_FRIDAY; break; case 6: _repeat |= ScheduleTask.REPEAT_SATURDAY; break; } } UpdateUI(); } /// /// 保存按钮点击 /// private void OnSaveButtonClick() { // 验证数据 if (!ValidateInput()) { return; } // 构建任务数据 var task = new ScheduleTask { TaskId = (byte)(_editTaskIndex >= 0 ? _editTaskIndex : 0), Enabled = _currentTask.Enabled, StartHour = _startHour, StartMinute = _startMinute, EndHour = _endHour, EndMinute = _endMinute, Mode = _selectedMode, Repeat = _repeat }; Debug.Log($"[ScheduleEditPage] 保存任务 - 模式:{_selectedMode}, 时间:{_startHour:D2}:{_startMinute:D2}-{_endHour:D2}:{_endMinute:D2}, 重复:{_repeat}"); _onSaveCallback?.Invoke(task, _editTaskIndex); ClosePage(); } /// /// 返回按钮点击 /// private void OnBackButtonClick() { Debug.Log("[ScheduleEditPage] 返回"); ClosePage(); } /// /// 删除按钮点击 /// private void OnDeleteButtonClick() { if (_editTaskIndex < 0) { Debug.LogWarning("[ScheduleEditPage] 新增模式不能删除"); return; } Debug.Log($"[ScheduleEditPage] 点击删除任务 {_editTaskIndex},弹出确认提示"); // 显示删除确认提示 if (deleteTip != null) { deleteTip.gameObject.SetActive(true); deleteTip.Init(OnDeleteConfirmed, OnDeleteCancelled); } else { // 如果没有配置deleteTip,直接删除 Debug.LogWarning("[ScheduleEditPage] deleteTip 未配置,直接删除"); ExecuteDelete(); } } /// /// 确认删除 /// private void OnDeleteConfirmed() { Debug.Log($"[ScheduleEditPage] 确认删除任务 {_editTaskIndex}"); // 隐藏提示框 if (deleteTip != null) { deleteTip.gameObject.SetActive(false); } ExecuteDelete(); } /// /// 取消删除 /// private void OnDeleteCancelled() { Debug.Log("[ScheduleEditPage] 取消删除"); // 隐藏提示框 if (deleteTip != null) { deleteTip.gameObject.SetActive(false); } } /// /// 执行删除操作 /// private void ExecuteDelete() { if (_editTaskIndex >= 0) { _onDeleteCallback?.Invoke(_editTaskIndex); } ClosePage(); } /// /// 验证输入数据 /// private bool ValidateInput() { // 验证时间范围 if (_startHour > 23 || _endHour > 23) { Debug.LogWarning("[ScheduleEditPage] 小时必须在0-23之间"); return false; } if (_startMinute > 59 || _endMinute > 59) { Debug.LogWarning("[ScheduleEditPage] 分钟必须在0-59之间"); return false; } // 验证开始时间小于结束时间 int startTime = _startHour * 60 + _startMinute; int endTime = _endHour * 60 + _endMinute; if (startTime >= endTime) { Debug.LogWarning("[ScheduleEditPage] 开始时间必须小于结束时间"); return false; } return true; } /// /// 关闭页面 /// private void ClosePage() { gameObject.SetActive(false); } private void OnEnable() { // 页面显示时的初始化 } private void OnDisable() { // 页面隐藏时的清理 // 确保子页面也关闭 if (_modeSelectPageInstance != null) _modeSelectPageInstance.gameObject.SetActive(false); if (_startTimeSelectionInstance != null) _startTimeSelectionInstance.gameObject.SetActive(false); if (_endTimeSelectionInstance != null) _endTimeSelectionInstance.gameObject.SetActive(false); if (_repeatSelectionInstance != null) _repeatSelectionInstance.gameObject.SetActive(false); } /// /// 销毁时清理实例化的对象 /// private void OnDestroy() { if (_modeSelectPageInstance != null) Destroy(_modeSelectPageInstance.gameObject); if (_startTimeSelectionInstance != null) Destroy(_startTimeSelectionInstance.gameObject); if (_endTimeSelectionInstance != null) Destroy(_endTimeSelectionInstance.gameObject); if (_repeatSelectionInstance != null) Destroy(_repeatSelectionInstance.gameObject); } } }