from PySide6.QtCore import QObject, Signal from PySide6.QtWidgets import QMessageBox from database.db_manager import DatabaseManager from database.models import ProjectData, ConfigData from typing import Optional, List from widgets.audio_filter_widget import AudioFilterWidget class AVASController(QObject): # 定义信号 channel_selected = Signal(int) # 通道选择信号 panel_toggled = Signal(bool) # 面板切换信号 def __init__(self, db_manager: DatabaseManager, view: 'AVAS_WIDGET'): super().__init__() self.db_manager = db_manager self.view = view self.current_channel: Optional[int] = None self.filter_windows: dict[int, AudioFilterWidget] = {} # 存储打开的滤波器窗口 def toggle_panel(self) -> None: """切换左侧面板显示状态""" self.view.is_panel_visible = not self.view.is_panel_visible self.view.left_panel.setVisible(self.view.is_panel_visible) # 更新切换按钮文本 self.view.toggle_button.setText("▶" if self.view.is_panel_visible else "◀") self.panel_toggled.emit(self.view.is_panel_visible) def select_channel(self, channel_num: int) -> None: """选择通道""" self.current_channel = channel_num self.channel_selected.emit(channel_num) def show_filter_window(self, channel_num: int) -> None: """显示滤波器窗口""" # 如果窗口已存在且可见,则激活它 if channel_num in self.filter_windows and self.filter_windows[channel_num].isVisible(): self.filter_windows[channel_num].raise_() self.filter_windows[channel_num].activateWindow() else: # 创建新窗口 filter_window = AudioFilterWidget(channel_id=channel_num) filter_window.setWindowTitle(f"Channel {channel_num} Filter Settings") # 存储窗口引用 self.filter_windows[channel_num] = filter_window # 监听窗口关闭事件 filter_window.destroyed.connect( lambda: self._on_filter_window_closed(channel_num) ) filter_window.show() def _on_filter_window_closed(self, channel_num: int) -> None: """处理滤波器窗口关闭事件""" if channel_num in self.filter_windows: del self.filter_windows[channel_num] def close_all_filter_windows(self) -> None: """关闭所有打开的滤波器窗口""" for window in self.filter_windows.values(): window.close() self.filter_windows.clear() def load_channel_config(self, channel_num: int, config_id: int) -> bool: """加载通道配置""" try: params, filters = self.db_manager.load_config(config_id) if params and filters: # 更新对应通道的滤波器窗口 if channel_num in self.filter_windows: self.filter_windows[channel_num].model.load_data(params, filters) return True return False except Exception as e: QMessageBox.critical(self.view, "错误", f"加载通道配置失败:{str(e)}") return False