@@ -307,24 +307,8 @@ def paintEvent(self, a0: QPaintEvent | None):
307
307
# 画场景物体
308
308
309
309
# 先画文件夹
310
- for folder_entity in self .file_observer .get_entity_folders ():
311
- if folder_entity .body_shape .is_collision (self .camera .cover_world_rectangle ):
312
- # 获得一个世界坐标系的视野矩形,用于排除视野之外的绘制,防止放大了之后会卡
313
- paint_folder_rect (
314
- painter ,
315
- self .camera ,
316
- folder_entity ,
317
- folder_entity .deep_level / self .file_observer .folder_max_deep_index ,
318
- )
319
- # 后画文件
320
- for file_entity in self .file_observer .get_entity_files ():
321
- if file_entity .body_shape .is_collision (self .camera .cover_world_rectangle ):
322
- paint_file_rect (
323
- painter ,
324
- self .camera ,
325
- file_entity ,
326
- file_entity .deep_level / self .file_observer .folder_max_deep_index ,
327
- )
310
+ if self .file_observer .root_folder :
311
+ self .paint_folder_dfs (painter , self .file_observer .root_folder )
328
312
# 绘制选中的区域
329
313
if self .file_observer .dragging_entity :
330
314
paint_selected_rect (
@@ -342,6 +326,34 @@ def paintEvent(self, a0: QPaintEvent | None):
342
326
f"drag locked: { self .file_observer .is_drag_locked } " ,
343
327
],
344
328
)
329
+
330
+ def paint_folder_dfs (self , painter : QPainter , folder_entity : EntityFolder ):
331
+ """
332
+ 递归绘制文件夹,遇到视野之外的直接排除
333
+ """
334
+ # 先绘制本体
335
+ if folder_entity .body_shape .is_collision (self .camera .cover_world_rectangle ):
336
+ paint_folder_rect (
337
+ painter ,
338
+ self .camera ,
339
+ folder_entity ,
340
+ folder_entity .deep_level / self .file_observer .folder_max_deep_index ,
341
+ )
342
+ else :
343
+ return
344
+ # 递归绘制子文件夹
345
+ for child in folder_entity .children :
346
+ if isinstance (child , EntityFolder ):
347
+ self .paint_folder_dfs (painter , child )
348
+ elif isinstance (child , EntityFile ):
349
+ if child .body_shape .is_collision (self .camera .cover_world_rectangle ):
350
+ paint_file_rect (
351
+ painter ,
352
+ self .camera ,
353
+ child ,
354
+ child .deep_level / self .file_observer .folder_max_deep_index ,
355
+ )
356
+ pass
345
357
346
358
def mousePressEvent (self , a0 : QMouseEvent | None ):
347
359
assert a0 is not None
0 commit comments