brisonus_app_eq/widgets/avas_controller.py

77 lines
3.2 KiB
Python
Raw Permalink Normal View History

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