FIX: Bug [0002301] Scroll position jumps to selection after directory update if the selected file has changed position

This commit is contained in:
Alexander Koblov 2019-08-16 21:25:59 +00:00
commit 25e7449ff9
3 changed files with 31 additions and 7 deletions

View file

@ -928,16 +928,20 @@ begin
end;
procedure TColumnsFileView.DisplayFileListChanged;
var
ScrollTo: Boolean;
begin
ScrollTo := IsActiveFileVisible;
// Update grid row count.
SetRowCount(FFiles.Count);
SetFilesDisplayItems;
RedrawFiles;
if SetActiveFileNow(RequestedActiveFile, FLastTopRowIndex) then
if SetActiveFileNow(RequestedActiveFile, True, FLastTopRowIndex) then
RequestedActiveFile := ''
// Requested file was not found, restore position to last active file.
else if not SetActiveFileNow(LastActiveFile, FLastTopRowIndex) then
else if not SetActiveFileNow(LastActiveFile, ScrollTo, FLastTopRowIndex) then
// Make sure at least that the previously active file is still visible after displaying file list.
MakeActiveVisible;

View file

@ -537,7 +537,11 @@ begin
end;
procedure TFileViewWithGrid.DisplayFileListChanged;
var
ScrollTo: Boolean;
begin
ScrollTo := IsActiveFileVisible;
// Update grid col and row count
dgPanel.SetColRowCount(FFiles.Count);
@ -545,11 +549,11 @@ begin
dgPanel.CalculateColumnWidth;
SetFilesDisplayItems;
if SetActiveFileNow(RequestedActiveFile, FLastTopRowIndex) then
if SetActiveFileNow(RequestedActiveFile, True, FLastTopRowIndex) then
RequestedActiveFile := ''
else
// Requested file was not found, restore position to last active file.
SetActiveFileNow(LastActiveFile, FLastTopRowIndex);
SetActiveFileNow(LastActiveFile, ScrollTo, FLastTopRowIndex);
Notify([fvnVisibleFilePropertiesChanged]);

View file

@ -75,7 +75,9 @@ type
function GetActiveFileIndex: PtrInt; virtual; abstract;
function GetFileRect(FileIndex: PtrInt): TRect; virtual; abstract;
function GetVisibleFilesIndexes: TRange; virtual; abstract;
function IsFileIndexVisible(FileIndex: PtrInt): Boolean;
function IsFileIndexInRange(FileIndex: PtrInt): Boolean; inline;
function IsActiveFileVisible: Boolean;
{en
If marking a single file only redraws that file.
Otherwise files are marked and full update is performed.
@ -95,7 +97,7 @@ type
Sets a file as active if the file currently exists.
@returns(@true if the file was found and selected.)
}
function SetActiveFileNow(aFilePath: String; aLastTopRowIndex: PtrInt = -1): Boolean;
function SetActiveFileNow(aFilePath: String; ScrollTo: Boolean = True; aLastTopRowIndex: PtrInt = -1): Boolean;
public
procedure CloneTo(AFileView: TFileView); override;
@ -484,11 +486,24 @@ begin
Result := nil;
end;
function TOrderedFileView.IsFileIndexVisible(FileIndex: PtrInt): Boolean;
var
VisibleFiles: TRange;
begin
VisibleFiles := GetVisibleFilesIndexes;
Result := InRange(FileIndex, VisibleFiles.First, VisibleFiles.Last);
end;
function TOrderedFileView.IsFileIndexInRange(FileIndex: PtrInt): Boolean;
begin
Result := InRange(FileIndex, 0, FFiles.Count - 1);
end;
function TOrderedFileView.IsActiveFileVisible: Boolean;
begin
Result := IsFileIndexVisible(GetActiveFileIndex);
end;
procedure TOrderedFileView.lblFilterClick(Sender: TObject);
begin
quickSearch.Execute(qsFilter, []);
@ -808,12 +823,13 @@ begin
end;
end;
function TOrderedFileView.SetActiveFileNow(aFilePath: String; aLastTopRowIndex: PtrInt = -1): Boolean;
function TOrderedFileView.SetActiveFileNow(aFilePath: String;
ScrollTo: Boolean; aLastTopRowIndex: PtrInt): Boolean;
procedure SetUpdate(Index: PtrInt);
begin
FUpdatingActiveFile := True;
SetActiveFile(Index, True, aLastTopRowIndex);
SetActiveFile(Index, ScrollTo, aLastTopRowIndex);
FUpdatingActiveFile := False;
SetLastActiveFile(Index, aLastTopRowIndex);
end;