# 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)