[feature] 新增avas_widget相关控制类

This commit is contained in:
samhandsome 2025-02-17 14:40:34 +08:00
parent 451086bac8
commit 92245276fc
6 changed files with 107 additions and 2 deletions

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,77 @@
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

View File

@ -8,6 +8,7 @@ from widgets.audio_filter_widget import AudioFilterWidget
from widgets.project_dialog import AddProjectDialog
import sqlite3
from database.db_manager import DatabaseManager # 添加这行导入
from widgets.avas_controller import AVASController
class ChannelButton(QWidget):
def __init__(self, channel_num):
@ -126,8 +127,11 @@ class AVAS_WIDGET(QWidget):
# 初始化数据库管理器
self.db_manager = DatabaseManager()
# 初始化控制器
self.controller = AVASController(self.db_manager, self)
self.setWindowTitle("AVAS")
self.is_panel_visible = True # 添加状态标记
self.is_panel_visible = True
self.setup_ui()
self.setup_connections()
@ -142,7 +146,7 @@ class AVAS_WIDGET(QWidget):
toggle_container = QVBoxLayout()
self.toggle_button = QPushButton("") # 使用箭头符号
self.toggle_button.setFixedSize(20, 60)
self.toggle_button.clicked.connect(self.toggle_panel)
self.toggle_button.clicked.connect(self.controller.toggle_panel)
self.toggle_button.setStyleSheet("""
QPushButton {
background-color: #404040;
@ -347,6 +351,14 @@ class AVAS_WIDGET(QWidget):
return frame
def setup_connections(self):
"""设置信号连接"""
# 连接控制器信号
self.controller.channel_selected.connect(self.on_channel_selected)
self.controller.panel_toggled.connect(self.on_panel_toggled)
# 连接切换按钮
self.toggle_button.clicked.connect(self.controller.toggle_panel)
# 假设添加按钮的变量名是 add_btn
self.add_btn.clicked.connect(self.add_project)
@ -390,3 +402,19 @@ class AVAS_WIDGET(QWidget):
item.setToolTip(project.description) # 显示项目描述为提示
model.appendRow(item)
def on_channel_selected(self, channel_num: int):
"""处理通道选择事件"""
# 更新UI显示
pass
def on_panel_toggled(self, is_visible: bool):
"""处理面板切换事件"""
# 更新UI布局
self.adjustSize()
def closeEvent(self, event):
"""窗口关闭事件"""
# 关闭所有打开的滤波器窗口
self.controller.close_all_filter_windows()
super().closeEvent(event)