@@ -465,7 +465,7 @@ def _safe_is_dir(path: Path) -> bool:
465465 """
466466 try :
467467 return path .is_dir ()
468- except PermissionError :
468+ except OSError :
469469 # We may or may not have been looking at a directory, but we
470470 # don't have the rights or permissions to even know that. Best
471471 # we can do, short of letting the error blow up, is assume it's
@@ -505,7 +505,7 @@ def _directory_content(self, location: Path, worker: Worker) -> Iterator[Path]:
505505 if worker .is_cancelled :
506506 break
507507 yield entry
508- except PermissionError :
508+ except OSError :
509509 pass
510510
511511 @work (thread = True , exit_on_error = False )
@@ -526,14 +526,15 @@ def _load_directory(self, node: TreeNode[DirEntry]) -> list[Path]:
526526 key = lambda path : (not self ._safe_is_dir (path ), path .name .lower ()),
527527 )
528528
529- @work ()
529+ @work (exclusive = True , group = "_loader" )
530530 async def _loader (self ) -> None :
531531 """Background loading queue processor."""
532532 worker = get_current_worker ()
533+ load_queue = self ._load_queue
533534 while not worker .is_cancelled :
534535 # Get the next node that needs loading off the queue. Note that
535536 # this blocks if the queue is empty.
536- node = await self . _load_queue .get ()
537+ node = await load_queue .get ()
537538 content : list [Path ] = []
538539 async with self .lock :
539540 cursor_node = self .cursor_node
@@ -557,25 +558,28 @@ async def _loader(self) -> None:
557558 if cursor_node is not None :
558559 self .move_cursor (cursor_node , animate = False )
559560 finally :
560- # Mark this iteration as done.
561- self ._load_queue .task_done ()
561+ load_queue .task_done ()
562562
563563 async def _on_tree_node_expanded (self , event : Tree .NodeExpanded [DirEntry ]) -> None :
564564 event .stop ()
565565 dir_entry = event .node .data
566566 if dir_entry is None :
567567 return
568568 if await asyncio .to_thread (self ._safe_is_dir , dir_entry .path ):
569- await self ._add_to_load_queue (event .node )
569+ if event .node .data is not None :
570+ await self ._add_to_load_queue (event .node )
570571 else :
571- self .post_message (self .FileSelected (event .node , dir_entry .path ))
572+ if event .node .data is not None :
573+ self .post_message (self .FileSelected (event .node , dir_entry .path ))
572574
573575 async def _on_tree_node_selected (self , event : Tree .NodeSelected [DirEntry ]) -> None :
574576 event .stop ()
575577 dir_entry = event .node .data
576578 if dir_entry is None :
577579 return
578580 if await asyncio .to_thread (self ._safe_is_dir , dir_entry .path ):
579- self .post_message (self .DirectorySelected (event .node , dir_entry .path ))
581+ if event .node .data is not None :
582+ self .post_message (self .DirectorySelected (event .node , dir_entry .path ))
580583 else :
581- self .post_message (self .FileSelected (event .node , dir_entry .path ))
584+ if event .node .data is not None :
585+ self .post_message (self .FileSelected (event .node , dir_entry .path ))
0 commit comments