diff --git a/src/GUI/gui.py b/src/GUI/gui.py index d9d50c8..e6f6051 100644 --- a/src/GUI/gui.py +++ b/src/GUI/gui.py @@ -33,7 +33,7 @@ from mission_group import ( # ================================================================================ class ControlStationUI(QMainWindow): - VERSION = '2.0.1' + VERSION = '2.0.2' def __init__(self): super().__init__() @@ -1045,16 +1045,69 @@ class ControlStationUI(QMainWindow): # ================================================================================ def handle_group_selection(self, socket_id, state): + """處理 socket 群組 checkbox 的勾選/取消勾選 + + 這個方法在用戶點擊 socket 群組的 checkbox 時被調用。 + 需要同時更新: + 1. 該 socket 下所有無人機的 checkbox + 2. self.monitor.selected_drones(用於控制面板同步) + 3. 右侧活躍群組的無人機分配(新增) + + 參數: + socket_id: socket ID (str) + state: Qt.CheckState 的整數值 (0=Unchecked, 1=PartiallyChecked, 2=Checked) + """ + print(f"\n📢 [GUI] handle_group_selection 被調用", flush=True) + print(f" socket_id: {socket_id}, state: {state}", flush=True) + print(f" state 類型: {type(state)}", flush=True) + + # 獲取該 socket 下所有無人機 group_drones = [did for did in self.drones.keys() if self.get_socket_id(did) == socket_id] - is_checked = state == Qt.CheckState.Checked.value + print(f" 該 socket 下的無人機: {group_drones}", flush=True) + + # 判斷是否勾選(只有 state == 2 時才是 Checked) + is_checked = (state == 2) # Qt.CheckState.Checked.value == 2 + print(f" is_checked: {is_checked}", flush=True) + + # 更新該 socket 下所有無人機的 checkbox 狀態 for drone_id in group_drones: checkbox = self.drones[drone_id].get_checkbox() if checkbox: + print(f" └─ 更新 {drone_id}: setChecked({is_checked})", flush=True) checkbox.blockSignals(True) checkbox.setChecked(is_checked) checkbox.blockSignals(False) - if is_checked: self.monitor.selected_drones.add(drone_id) - else: self.monitor.selected_drones.discard(drone_id) + + # 同時更新 monitor.selected_drones 以同步控制面板 + if is_checked: + self.monitor.selected_drones.add(drone_id) + else: + self.monitor.selected_drones.discard(drone_id) + + # 👇 新增:同步更新右侧活躍群組的無人機分配 + if self.active_group_id: + group = self.mission_groups.get(self.active_group_id) + panel = self.group_panels.get(self.active_group_id) + if group and panel: + print(f" ├─ 同步右侧群組 {self.active_group_id}", flush=True) + if is_checked: + # 勾選時:將該 socket 下的無人機添加到活躍群組 + for drone_id in group_drones: + group.drone_ids.add(drone_id) + print(f" │ └─ 添加到群組: {group_drones}", flush=True) + else: + # 取消勾選時:從活躍群組移除該 socket 下的無人機 + for drone_id in group_drones: + group.drone_ids.discard(drone_id) + print(f" │ └─ 從群組移除: {group_drones}", flush=True) + + # 更新右側群組面板的顯示 + panel.update_drone_list() + panel.update_status() + print(f" │ └─ 已更新右侧群組面板", flush=True) + + print(f" 最終 selected_drones: {self.monitor.selected_drones}", flush=True) + print(f"✓ handle_group_selection 完成\n", flush=True) def handle_drone_selection(self, drone_id, state): is_checked = state == Qt.CheckState.Checked.value