You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
6.5 KiB
183 lines
6.5 KiB
|
3 months ago
|
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QListWidget, QPushButton, QHBoxLayout, QLineEdit, QMessageBox
|
||
|
|
from utils.globals import get_serial_manager
|
||
|
|
from utils.logger import logger
|
||
|
|
from utils.config_manager import ConfigManager
|
||
|
|
|
||
|
|
class PresetPanel(QWidget):
|
||
|
|
def __init__(self, preset_manager, screen_manager):
|
||
|
|
super().__init__()
|
||
|
|
self.preset_manager = preset_manager
|
||
|
|
self.screen_manager = screen_manager # 用来获取当前选中或发送指令
|
||
|
|
self.init_ui()
|
||
|
|
|
||
|
|
# --- 新增:实例化配置管理器 ---
|
||
|
|
self.config_manager = ConfigManager()
|
||
|
|
|
||
|
|
# --- 新增:初始化时尝试加载配置 ---
|
||
|
|
self.load_presets_from_disk()
|
||
|
|
|
||
|
|
def init_ui(self):
|
||
|
|
layout = QVBoxLayout()
|
||
|
|
|
||
|
|
# 名称输入和保存按钮
|
||
|
|
top_layout = QHBoxLayout()
|
||
|
|
self.name_input = QLineEdit()
|
||
|
|
self.name_input.setPlaceholderText("输入预案名称")
|
||
|
|
save_btn = QPushButton("保存当前布局")
|
||
|
|
save_btn.clicked.connect(self.on_save)
|
||
|
|
|
||
|
|
top_layout.addWidget(self.name_input)
|
||
|
|
top_layout.addWidget(save_btn)
|
||
|
|
|
||
|
|
# 预案列表
|
||
|
|
self.list_widget = QListWidget()
|
||
|
|
self.list_widget.addItems(self.preset_manager.presets.keys())
|
||
|
|
self.list_widget.itemDoubleClicked.connect(self.on_call) # 双击调用
|
||
|
|
|
||
|
|
# 操作按钮
|
||
|
|
btn_layout = QHBoxLayout()
|
||
|
|
call_btn = QPushButton("调用")
|
||
|
|
del_btn = QPushButton("删除")
|
||
|
|
call_btn.clicked.connect(self.on_call)
|
||
|
|
del_btn.clicked.connect(self.on_delete)
|
||
|
|
|
||
|
|
btn_layout.addWidget(call_btn)
|
||
|
|
btn_layout.addWidget(del_btn)
|
||
|
|
|
||
|
|
layout.addLayout(top_layout)
|
||
|
|
layout.addWidget(self.list_widget)
|
||
|
|
layout.addLayout(btn_layout)
|
||
|
|
|
||
|
|
self.setLayout(layout)
|
||
|
|
|
||
|
|
def on_save(self):
|
||
|
|
name = self.name_input.text()
|
||
|
|
if not name:
|
||
|
|
return
|
||
|
|
|
||
|
|
# 获取当前的布局参数 (这里需要你从 screen_manager 或当前选中状态获取)
|
||
|
|
# 假设 get_current_layout_params() 是你封装好的方法
|
||
|
|
current_layouts = self.screen_manager.get_current_layout_params()
|
||
|
|
|
||
|
|
self.preset_manager.save_preset(name, current_layouts)
|
||
|
|
self.list_widget.addItem(name) # 刷新界面
|
||
|
|
print(f"预案 {name} 保存成功")
|
||
|
|
|
||
|
|
def on_call(self):
|
||
|
|
try:
|
||
|
|
serial_manager = get_serial_manager()
|
||
|
|
|
||
|
|
if serial_manager.is_connected:
|
||
|
|
# 发送指令...
|
||
|
|
current_item = self.list_widget.currentItem()
|
||
|
|
if current_item:
|
||
|
|
preset_name = current_item.text()
|
||
|
|
preset_data = self.preset_manager.get_preset(preset_name)
|
||
|
|
|
||
|
|
if preset_data and 'layouts' in preset_data:
|
||
|
|
for layout in preset_data['layouts']:
|
||
|
|
# 确保参数完整
|
||
|
|
self.screen_manager.send_mosaic_command(
|
||
|
|
start=layout.get('start', 0),
|
||
|
|
hcount=layout.get('hcount', 1),
|
||
|
|
vcount=layout.get('vcount', 1)
|
||
|
|
)
|
||
|
|
else:
|
||
|
|
logger.warning("没连上,别发")
|
||
|
|
except Exception as e:
|
||
|
|
print(f"调用预案时出错: {e}")
|
||
|
|
|
||
|
|
def on_delete(self):
|
||
|
|
"""
|
||
|
|
处理删除预案的逻辑
|
||
|
|
"""
|
||
|
|
# 1. 获取当前选中的列表项
|
||
|
|
current_item = self.list_widget.currentItem()
|
||
|
|
|
||
|
|
if current_item:
|
||
|
|
# 2. 获取预案名称
|
||
|
|
preset_name = current_item.text()
|
||
|
|
|
||
|
|
# 3. 从列表控件中移除
|
||
|
|
self.list_widget.takeItem(self.list_widget.row(current_item))
|
||
|
|
|
||
|
|
# 4. 从数据管理器中删除
|
||
|
|
if preset_name in self.preset_manager.presets:
|
||
|
|
del self.preset_manager.presets[preset_name]
|
||
|
|
self.preset_manager.save_to_file() # 立即保存到文件
|
||
|
|
|
||
|
|
print(f"预案 {preset_name} 已删除")
|
||
|
|
|
||
|
|
def save_presets_to_disk(self):
|
||
|
|
"""
|
||
|
|
将当前界面的预案保存到磁盘
|
||
|
|
"""
|
||
|
|
name = self.name_input.text()
|
||
|
|
if not name:
|
||
|
|
return
|
||
|
|
# 1. 准备数据:遍历所有按钮,把它们的参数抓出来
|
||
|
|
preset_list = []
|
||
|
|
|
||
|
|
current_layouts = self.screen_manager.get_current_layout_params()
|
||
|
|
|
||
|
|
self.preset_manager.save_preset(name, current_layouts)
|
||
|
|
self.list_widget.addItem(name) # 刷新界面
|
||
|
|
|
||
|
|
current_item = self.list_widget.currentItem()
|
||
|
|
|
||
|
|
print(current_item)
|
||
|
|
if current_item:
|
||
|
|
preset_name = current_item.text()
|
||
|
|
preset_data = self.preset_manager.get_preset(preset_name)
|
||
|
|
|
||
|
|
print(preset_data)
|
||
|
|
|
||
|
|
if preset_data and 'layouts' in preset_data:
|
||
|
|
for layout in preset_data['layouts']:
|
||
|
|
preset_data = {
|
||
|
|
"name": preset_name,
|
||
|
|
"start": layout.start_idx, # 假设你存了
|
||
|
|
"hcount": layout.h_count,
|
||
|
|
"vcount": layout.v_count
|
||
|
|
}
|
||
|
|
# 这里需要根据你实际存储参数的方式修改
|
||
|
|
# 比如:我之前把参数存到了按钮的属性里
|
||
|
|
preset_list.append(preset_data)
|
||
|
|
|
||
|
|
# 2. 交给管家保存
|
||
|
|
if self.config_manager.save_presets(preset_list):
|
||
|
|
logger.info("💾 预案保存成功")
|
||
|
|
else:
|
||
|
|
logger.error("💾 预案保存失败")
|
||
|
|
|
||
|
|
def load_presets_from_disk(self):
|
||
|
|
"""
|
||
|
|
从磁盘加载预案,并重建按钮
|
||
|
|
"""
|
||
|
|
# 1. 从硬盘读数据
|
||
|
|
preset_data_list = self.config_manager.load_presets()
|
||
|
|
|
||
|
|
if not preset_data_list:
|
||
|
|
logger.info("📭 没有找到历史预案,开始新工作")
|
||
|
|
return
|
||
|
|
|
||
|
|
# 2. 遍历数据,重建按钮
|
||
|
|
logger.info(f"📂 正在加载 {len(preset_data_list)} 个预案...")
|
||
|
|
|
||
|
|
for data in preset_data_list:
|
||
|
|
# 调用你创建按钮的函数
|
||
|
|
# 假设你有一个 create_button(name, start, h, v) 函数
|
||
|
|
self.create_button(
|
||
|
|
name=data["name"],
|
||
|
|
start=data["start"],
|
||
|
|
hcount=data["hcount"],
|
||
|
|
vcount=data["vcount"]
|
||
|
|
)
|
||
|
|
|
||
|
|
# 假设你在 init_ui 里有一个保存按钮 self.btnSave
|
||
|
|
def on_save_clicked(self):
|
||
|
|
"""
|
||
|
|
当用户点击保存按钮时
|
||
|
|
"""
|
||
|
|
self.save_presets_to_disk()
|
||
|
|
QMessageBox.information(self, "成功", "当前的预案布局已保存!")
|