From ce43355167da7a846e73e86770a049bd55f514f0 Mon Sep 17 00:00:00 2001 From: Hector <2055590199@qq.com> Date: Fri, 5 Sep 2025 11:37:26 +0800 Subject: [PATCH] =?UTF-8?q?=E9=99=90=E5=88=B6=E6=9D=90=E8=B4=A8=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E9=95=BF=E5=BA=A6=E9=98=B2=E6=AD=A2=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E5=90=84=E9=A1=B9=E5=B1=9E=E6=80=A7=E5=AE=BD?= =?UTF-8?q?=E5=BA=A6=E8=BF=87=E9=95=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/main_window.py | 11 ++++++++ ui/property_panel.py | 3 ++ ui/widgets.py | 66 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+) diff --git a/ui/main_window.py b/ui/main_window.py index 5286e327..d44cc169 100644 --- a/ui/main_window.py +++ b/ui/main_window.py @@ -378,10 +378,21 @@ class MainWindow(QMainWindow): self.addModelToCesiumAction.triggered.connect(self.onAddModelClicked) + #资源菜单 + self.assetsMenu = menubar.addMenu('资源') + self.refreshAssetsAction = self.assetsMenu.addAction('刷新资源') + self.refreshAssetsAction.triggered.connect(self.refreshAssetsView) + # 帮助菜单 self.helpMenu = menubar.addMenu('帮助') self.aboutAction = self.helpMenu.addAction('关于') + def refreshAssetsView(self): + """"刷新资源视图""" + if hasattr(self,'fileView') and self.fileView: + self.fileView.refreshView() + print("资源视图已刷新") + def setupCreateMenuActions(self): """统一设置创建菜单的所有动作 - 避免重复代码""" # 基础对象 diff --git a/ui/property_panel.py b/ui/property_panel.py index 165324c1..534aae92 100644 --- a/ui/property_panel.py +++ b/ui/property_panel.py @@ -3412,6 +3412,9 @@ class PropertyPanelManager: material_layout = QGridLayout() material_layout.addWidget(QLabel("名称:"), 0, 0) + limited_length = 25 + if len(display_name) > limited_length: + display_name = f"{display_name[:limited_length - 3]}..." name_label = QLabel(display_name) # name_label.setStyleSheet("color: #FF6B6B; font-weight: bold;") material_layout.addWidget(name_label, 0, 1, 1, 3) diff --git a/ui/widgets.py b/ui/widgets.py index cba839b2..f52c0437 100644 --- a/ui/widgets.py +++ b/ui/widgets.py @@ -315,6 +315,9 @@ class CustomFileView(QTreeView): print("不支持的文件类型") super().mouseDoubleClickEvent(event) +from PyQt5.QtCore import QFileSystemWatcher,QTimer +import os + class CustomAssetsTreeWidget(QTreeWidget): def __init__(self, world, parent=None): if parent is None: @@ -325,6 +328,18 @@ class CustomAssetsTreeWidget(QTreeWidget): self.setupUI() self.setupDragDrop() + #添加文件系统监控器 + self.file_watcher = QFileSystemWatcher() + self.file_watcher.directoryChanged.connect(self.onDirectoryChanged) + self.file_watcher.fileChanged.connect(self.onFileChanged) + + self.refresh_timer = QTimer() + self.refresh_timer.setSingleShot(True) + self.refresh_timer.timeout.connect(self.refreshView) + + #存储监控的目录 + self.watched_directories = set() + # 默认加载项目根路径 self.load_file_tree() # 设置右键菜单 @@ -624,6 +639,9 @@ class CustomAssetsTreeWidget(QTreeWidget): # 加载当前目录内容 self.load_directory_tree(self.current_path, root_item) + #添加目录到监控器 + self.addWatchedDirectory(self.current_path) + # 展开根节点 root_item.setExpanded(True) @@ -631,6 +649,54 @@ class CustomAssetsTreeWidget(QTreeWidget): error_item = QTreeWidgetItem(["❌ 无权限访问此目录"]) self.addTopLevelItem(error_item) + def addWatchedDirectory(self,directory): + """添加监控目录""" + if os.path.exists(directory) and directory not in self.watched_directories: + if self.file_watcher.addPath(directory): + self.watched_directories.add(directory) + print(f"开始监控目录:{directory}") + try: + for item in os.listdir(directory): + item_path = os.path.join(directory,item) + if os.path.isdir(item_path): + self.addWatchedDirectory(item_path) + except Exception as e: + pass + else: + print(f"无法监控目录:{directory}") + + def removeWatchedDirectory(self,directory): + """移除监控目录""" + if directory in self.watched_directories: + if self.file_watcher.removePath(directory): + self.watched_directories.discard(directory) + print(f"停止监控目录:{directory}") + else: + print(f"无法停止监控目录:{directory}") + + def onDirectoryChanged(self,path): + """目录发生变化时处理""" + print(f"目录变化{path}") + if not self.refresh_timer.isActive(): + self.refresh_timer.start(1000) + + def onFileChanged(self,path): + """目录发生变化时的处理""" + print(f"目录变化{path}") + if not self.refresh_timer.isActive(): + self.refresh_timer.start(1000) + + def refreshView(self): + """刷新视图""" + print("刷新资源视图...") + try: + expanded_paths = self._saveExpandedState() + self.load_file_tree() + self._restoreExpandedState(expanded_paths) + print("资源视图刷新完成") + except Exception as e: + print(f"刷新资源视图失败{e}") + def load_directory_tree(self, path, parent_item, max_depth=3, current_depth=0): """递归加载目录树(类似左侧导航面板)""" if current_depth >= max_depth: