import sys from PySide6.QtWidgets import (QApplication, QWidget, QPushButton, QGridLayout, QVBoxLayout, QHBoxLayout, QCheckBox, QComboBox, QLabel, QSlider, QFrame, QGroupBox, QListView, QListWidgetItem, QMessageBox) from PySide6.QtCore import Qt, QSize from PySide6.QtGui import QIcon, QStandardItemModel, QStandardItem 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): super().__init__() self.channel_num = channel_num # 保存通道号 # Create GroupBox for the channel self.group = QGroupBox(f"CH{channel_num}") layout = QVBoxLayout() layout.setSpacing(2) # Channel button self.channel_btn = QPushButton(f"Channel {channel_num}") self.channel_btn.setFixedHeight(25) # Store audio filter window reference self.filter_window = None # Controls container with two rows controls_layout = QGridLayout() controls_layout.setSpacing(2) # SOLO row self.solo_cb = QCheckBox("S") self.solo_btn = QPushButton("SOLO") self.solo_btn.setFixedHeight(20) controls_layout.addWidget(self.solo_cb, 0, 0) controls_layout.addWidget(self.solo_btn, 0, 1) # MUTE row self.mute_cb = QCheckBox("M") self.mute_btn = QPushButton("MUTE") self.mute_btn.setFixedHeight(20) controls_layout.addWidget(self.mute_cb, 1, 0) controls_layout.addWidget(self.mute_btn, 1, 1) # Add widgets to main layout layout.addWidget(self.channel_btn) layout.addLayout(controls_layout) # Set GroupBox layout self.group.setLayout(layout) # Main layout main_layout = QVBoxLayout() main_layout.addWidget(self.group) main_layout.setContentsMargins(2, 2, 2, 2) self.setLayout(main_layout) # Set fixed size for the channel widget self.setFixedSize(110, 100) # Style self.channel_btn.setStyleSheet(""" QPushButton { background-color: #404040; color: white; border: 1px solid #505050; } QPushButton:hover { background-color: #505050; } """) button_style = """ QPushButton { background-color: #303030; color: white; border: 1px solid #404040; padding: 2px; } QPushButton:hover { background-color: #404040; } """ self.solo_btn.setStyleSheet(button_style) self.mute_btn.setStyleSheet(button_style) self.group.setStyleSheet(""" QGroupBox { border: 1px solid #505050; margin-top: 0.5em; padding: 2px; } QCheckBox { spacing: 2px; } """) # Connect button click event self.channel_btn.clicked.connect(self.show_filter_window) def show_filter_window(self): # 如果窗口已存在且可见,则关闭它 if self.filter_window and self.filter_window.isVisible(): self.filter_window.raise_() self.filter_window.activateWindow() else: # 如果窗口不存在或已关闭,创建新窗口 self.filter_window = AudioFilterWidget(channel_id=self.channel_num) self.filter_window.setWindowTitle(f"Channel {self.group.title()} Filter Settings") # 监听窗口关闭事件,在窗口关闭时重置 filter_window self.filter_window.destroyed.connect(self._on_filter_window_closed) self.filter_window.show() def _on_filter_window_closed(self): """当滤波器窗口关闭时调用""" self.filter_window = None class AVAS_WIDGET(QWidget): def __init__(self): super().__init__() # 初始化数据库管理器 self.db_manager = DatabaseManager() # 初始化控制器 self.controller = AVASController(self.db_manager, self) self.setWindowTitle("AVAS") self.is_panel_visible = True self.setup_ui() self.setup_connections() def setup_ui(self): # 创建主水平布局 main_layout = QHBoxLayout() # 左侧项目信息面板 self.left_panel = self.create_project_panel() # 创建切换按钮容器 toggle_container = QVBoxLayout() self.toggle_button = QPushButton("◀") # 使用箭头符号 self.toggle_button.setFixedSize(20, 60) self.toggle_button.clicked.connect(self.controller.toggle_panel) self.toggle_button.setStyleSheet(""" QPushButton { background-color: #404040; color: white; border: 1px solid #505050; border-radius: 3px; } QPushButton:hover { background-color: #505050; } QPushButton:pressed { background-color: #303030; } """) toggle_container.addStretch() toggle_container.addWidget(self.toggle_button) toggle_container.addStretch() # 右侧原有内容面板 right_panel = QVBoxLayout() # 添加原有的通道按钮网格 channels_layout = QGridLayout() for i in range(24): row = i // 8 col = i % 8 channel = ChannelButton(i + 1) channels_layout.addWidget(channel, row, col) # 中间部分 middle_layout = QHBoxLayout() param_matrix = self.create_parameter_matrix() filter_controls = self.create_filter_controls() middle_layout.addWidget(param_matrix, stretch=2) middle_layout.addWidget(filter_controls, stretch=1) # 底部按钮 bottom_layout = QHBoxLayout() clean_btn = QPushButton("Clean") send_btn = QPushButton("Send") enable_cb = QCheckBox("Enable") bottom_layout.addStretch() bottom_layout.addWidget(clean_btn) bottom_layout.addWidget(send_btn) bottom_layout.addWidget(enable_cb) # 将所有部分添加到右侧面板 right_panel.addLayout(channels_layout) right_panel.addLayout(middle_layout) right_panel.addLayout(bottom_layout) # 添加左右面板和切换按钮到主布局 main_layout.addWidget(self.left_panel, stretch=1) main_layout.addLayout(toggle_container) main_layout.addLayout(right_panel, stretch=4) self.setLayout(main_layout) def toggle_panel(self): """切换左侧面板的显示状态""" self.is_panel_visible = not self.is_panel_visible self.left_panel.setVisible(self.is_panel_visible) # 更新切换按钮的箭头方向 if self.is_panel_visible: self.toggle_button.setText("◀") else: self.toggle_button.setText("▶") def create_project_panel(self): """创建左侧项目信息面板""" panel = QGroupBox("项目信息") layout = QVBoxLayout() # 创建列表视图 self.project_list = QListView() self.project_list.setViewMode(QListView.ViewMode.IconMode) self.project_list.setIconSize(QSize(80, 80)) self.project_list.setSpacing(10) self.project_list.setResizeMode(QListView.ResizeMode.Adjust) self.project_list.setMovement(QListView.Movement.Static) # 设置样式 self.project_list.setStyleSheet(""" QListView { background-color: #2D2D2D; border: none; border-radius: 4px; padding: 5px; } QListView::item { background-color: #3D3D3D; border-radius: 6px; margin: 5px; } QListView::item:selected { background-color: #4A4A4A; } QListView::item:hover { background-color: #454545; } """) # 添加工具栏按钮 toolbar = QHBoxLayout() self.add_btn = QPushButton("添加") self.delete_btn = QPushButton("删除") self.refresh_btn = QPushButton("刷新") # 设置按钮样式 button_style = """ QPushButton { background-color: #404040; color: white; border: 1px solid #505050; border-radius: 3px; padding: 5px 10px; min-width: 60px; } QPushButton:hover { background-color: #505050; } QPushButton:pressed { background-color: #303030; } """ self.add_btn.setStyleSheet(button_style) self.delete_btn.setStyleSheet(button_style) self.refresh_btn.setStyleSheet(button_style) toolbar.addWidget(self.add_btn) toolbar.addWidget(self.delete_btn) toolbar.addWidget(self.refresh_btn) # 组装面板 layout.addLayout(toolbar) layout.addWidget(self.project_list) panel.setLayout(layout) # 设置面板样式 panel.setStyleSheet(""" QGroupBox { background-color: #2D2D2D; border: 1px solid #505050; border-radius: 6px; margin-top: 1ex; padding: 10px; color: white; } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top center; padding: 0 3px; } """) return panel def create_parameter_matrix(self): frame = QFrame() frame.setFrameStyle(QFrame.Box) layout = QGridLayout() # Add headers and parameter rows for i in range(24): # 24 channels layout.addWidget(QLabel(f"Ch{i+1}"), i+1, 0) # Add parameter controls for each channel for j in range(5): # Example: 5 parameters per channel layout.addWidget(QSlider(Qt.Horizontal), i+1, j+1) frame.setLayout(layout) return frame def create_filter_controls(self): frame = QFrame() frame.setFrameStyle(QFrame.Box) layout = QVBoxLayout() # Filter selection filter_select = QComboBox() filter_select.addItems(["Filter 1", "Filter 2", "Filter 3"]) # Filter type radio buttons filter_types = QVBoxLayout() types = ["Pink-Pin", "Bass Setting", "Stereo Surround", "None"] for type_name in types: filter_types.addWidget(QCheckBox(type_name)) # Sliders sliders_layout = QVBoxLayout() slider_labels = ["Input Level", "Freq", "Gain"] for label in slider_labels: sliders_layout.addWidget(QLabel(label)) sliders_layout.addWidget(QSlider(Qt.Horizontal)) layout.addWidget(QLabel("Filter Select")) layout.addWidget(filter_select) layout.addLayout(filter_types) layout.addLayout(sliders_layout) frame.setLayout(layout) 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) def add_project(self): dialog = AddProjectDialog(self) if dialog.exec(): name, description = dialog.get_project_data() # 验证输入 if not name: QMessageBox.warning(self, "警告", "项目名称不能为空!") return try: # 保存到数据库 project_id = self.db_manager.add_project(name, description) # 更新项目列表 self.update_project_list() QMessageBox.information(self, "成功", "项目添加成功!") except sqlite3.IntegrityError: QMessageBox.warning(self, "警告", "项目名称已存在!") except Exception as e: QMessageBox.critical(self, "错误", f"添加项目失败:{str(e)}") def update_project_list(self): """更新项目列表显示""" # 创建新的模型 model = QStandardItemModel() self.project_list.setModel(model) # 获取所有项目 projects = self.db_manager.get_all_projects() # 创建项目列表项 for project in projects: item = QStandardItem(project.name) item.setData(project.id, Qt.UserRole) # 存储项目ID 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)