143 lines
4.7 KiB
Python
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)
|