init
This commit is contained in:
142
app/view/widgets/new_folder_messageBox.py
Normal file
142
app/view/widgets/new_folder_messageBox.py
Normal file
@@ -0,0 +1,142 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user