Files
leonpan-pc/app/view/widgets/new_folder_messageBox.py
2025-10-29 22:20:21 +08:00

143 lines
4.7 KiB
Python

# coding: utf-8
from PyQt6.QtCore import Qt
from qfluentwidgets import (
InfoBar,
InfoBarPosition,
LineEdit,
MessageBoxBase,
SubtitleLabel,
)
from app.core import CreateFolderThread, signalBus
class NewFolderMessageBox(MessageBoxBase):
"""新建文件夹对话框"""
def __init__(self, parent=None):
super().__init__(parent=parent)
self._setupUi()
self._connectSignals()
# 线程引用,防止被垃圾回收
self.createFolderThread = None
def _setupUi(self):
"""设置UI界面"""
self.titleLabel = SubtitleLabel("新建文件夹", self)
self.nameLineEdit = LineEdit(self)
self.nameLineEdit.setPlaceholderText("请输入文件夹名称")
self.nameLineEdit.setClearButtonEnabled(True)
# 设置对话框属性
self.widget.setMinimumWidth(400)
self.yesButton.setText("新建")
self.cancelButton.setText("取消")
# 添加组件到布局
self.viewLayout.addWidget(self.titleLabel)
self.viewLayout.addWidget(self.nameLineEdit)
# 初始时禁用确认按钮
self.yesButton.setEnabled(False)
def _connectSignals(self):
"""连接信号槽"""
self.yesButton.clicked.connect(self._onCreateClicked)
self.nameLineEdit.textChanged.connect(self._onTextChanged)
self.nameLineEdit.returnPressed.connect(self._onReturnPressed)
def _onTextChanged(self, text):
"""文本框内容变化时的处理"""
# 检查文件夹名称是否有效
is_valid = bool(text.strip()) and not any(char in text for char in '/\\:*?"<>|')
self.yesButton.setEnabled(is_valid)
if not is_valid and text.strip():
self.nameLineEdit.setToolTip('文件夹名称不能包含 /\\:*?"<>| 等特殊字符')
else:
self.nameLineEdit.setToolTip("")
def _onReturnPressed(self):
"""回车键处理"""
if self.yesButton.isEnabled():
self._onCreateClicked()
def _onCreateClicked(self):
"""创建文件夹按钮点击处理"""
folder_name = self.nameLineEdit.text().strip()
if not folder_name:
return
# 禁用按钮防止重复点击
self._setUiEnabled(False)
self.yesButton.setText("创建中...")
# 创建并启动线程
self.createFolderThread = CreateFolderThread(folder_name)
self.createFolderThread.successSignal.connect(self._onCreateSuccess)
self.createFolderThread.errorSignal.connect(self._onCreateError)
self.createFolderThread.start()
def _setUiEnabled(self, enabled):
"""设置UI启用状态"""
self.yesButton.setEnabled(enabled)
self.cancelButton.setEnabled(enabled)
self.nameLineEdit.setEnabled(enabled)
def _onCreateSuccess(self):
"""创建成功处理"""
self._showInfoBar("success", "操作成功", "新建文件夹成功")
signalBus.refreshFolderListSignal.emit()
"""线程完成时的清理工作"""
self.yesButton.setText("新建")
self._setUiEnabled(True)
self.accept()
def _onCreateError(self, error_msg):
"""创建失败处理"""
self._showInfoBar("error", "操作失败", error_msg)
# 不关闭对话框,让用户有机会修改后重试
self.nameLineEdit.setFocus()
self.nameLineEdit.selectAll()
"""线程完成时的清理工作"""
self.yesButton.setText("新建")
self._setUiEnabled(True)
def _showInfoBar(self, type_, title, content):
"""显示信息栏"""
if type_ == "success":
InfoBar.success(
title=title,
content=content,
orient=Qt.Orientation.Horizontal,
isClosable=True,
position=InfoBarPosition.TOP_RIGHT,
duration=2000,
parent=self.window(),
)
else:
InfoBar.error(
title=title,
content=content,
orient=Qt.Orientation.Horizontal,
isClosable=True,
position=InfoBarPosition.TOP_RIGHT,
duration=3000, # 错误信息显示稍长时间
parent=self.window(),
)
def showEvent(self, event):
"""显示事件处理"""
super().showEvent(event)
self.nameLineEdit.setFocus()
def closeEvent(self, event):
"""关闭事件处理"""
# 确保线程安全退出
if self.createFolderThread and self.createFolderThread.isRunning():
self.createFolderThread.quit()
self.createFolderThread.wait(1000) # 等待1秒
super().closeEvent(event)