Browse Source

Issue 2315 – Optimize loading of file panels when switching between tabs with different filters

https://winscp.net/tracker/2315

Source commit: 1796f6af97fcb6e42460ef58591f243640562f2f
Martin Prikryl 1 year ago
parent
commit
2dc85eee36

+ 2 - 2
source/components/UnixDirView.cpp

@@ -358,9 +358,9 @@ void __fastcall TUnixDirView::LoadFiles()
       {
         FHiddenCount++;
       }
-      else if (!Mask.IsEmpty() &&
+      else if (!FEffectiveMask.IsEmpty() &&
                IsRealFile(File->FileName) &&
-               !FileNameMatchesMasks(File->FileName, File->IsDirectory, File->Size, File->Modification, Mask, true))
+               !FileNameMatchesMasks(File->FileName, File->IsDirectory, File->Size, File->Modification, FEffectiveMask, true))
       {
         FFilteredCount++;
       }

+ 24 - 1
source/packages/filemng/CustomDirView.pas

@@ -237,6 +237,7 @@ type
     FDragDrive: string;
     FAnnouncedState: TObject;
     FThumbnail: Boolean;
+    FEffectiveMask: string;
 
     procedure AddToDragFileList(FileList: TFileList; Item: TListItem); virtual;
     function CanEdit(Item: TListItem): Boolean; override;
@@ -3413,8 +3414,22 @@ begin
 end;
 
 procedure TCustomDirView.AnnounceState(AState: TObject);
+var
+  State: TDirViewState;
 begin
   FAnnouncedState := AState;
+  if Assigned(FAnnouncedState) then
+  begin
+    State := AState as TDirViewState;
+    if Assigned(State) then
+    begin
+      FEffectiveMask := State.Mask;
+    end;
+  end
+    else
+  begin
+    FEffectiveMask := Mask;
+  end;
 end;
 
 procedure TCustomDirView.SaveItemsState(
@@ -3566,9 +3581,17 @@ procedure TCustomDirView.SetMask(Value: string);
 begin
   if Mask <> Value then
   begin
+    if Assigned(FAnnouncedState) then
+      Assert(FEffectiveMask = Value)
+    else
+      Assert(FEffectiveMask = Mask);
     FMask := Value;
     UpdatePathLabel;
-    if DirOK then Reload(False);
+    if FEffectiveMask <> Value then
+    begin
+      FEffectiveMask := Value;
+      if DirOK then Reload(False);
+    end;
   end;
 end;{SetMask}
 

+ 2 - 2
source/packages/filemng/DirView.pas

@@ -1185,7 +1185,7 @@ begin
     Inc(FHiddenCount);
   end
     else
-  if Mask <> '' then
+  if FEffectiveMask <> '' then
   begin
     Directory := ((SearchRec.Attr and faDirectory) <> 0);
     if Directory then FileSize := 0
@@ -1197,7 +1197,7 @@ begin
         Directory,
         FileSize,
         FileTimeToDateTime(SearchRec.FindData.ftLastWriteTime),
-        Mask, True);
+        FEffectiveMask, True);
 
     if not Result then
     begin