mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-28 10:02:14 +00:00
FIX: Bug [0002301] Scroll position jumps to selection after directory update if the selected file has changed position
This commit is contained in:
parent
da7b579141
commit
25e7449ff9
3 changed files with 31 additions and 7 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue