Skip to content

Commit ec4c237

Browse files
committed
fix: work around out-of-view item in left tree after FormShow
Also, remove error dialog when InitialDir is an invalid path. Climb up path until it's valid. Refs #2268
1 parent 251f632 commit ec4c237

File tree

2 files changed

+40
-9
lines changed

2 files changed

+40
-9
lines changed

source/extfiledialog.lfm

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,8 @@ object frmExtFileDialog: TfrmExtFileDialog
174174
Align = alLeft
175175
BorderSpacing.Left = 10
176176
HideSelection = False
177-
ReadOnly = False
178177
TabOrder = 0
179-
Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw]
178+
Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw]
180179
ObjectTypes = [otFolders, otHidden]
181180
ShellListView = ShellListView
182181
OnChange = ShellTreeViewChange
@@ -200,6 +199,7 @@ object frmExtFileDialog: TfrmExtFileDialog
200199
Color = clDefault
201200
SortType = stText
202201
TabOrder = 1
202+
ObjectTypes = [otNonFolders, otHidden]
203203
ShellTreeView = ShellTreeView
204204
OnClick = ShellListViewClick
205205
OnDblClick = ShellListViewDblClick
@@ -220,4 +220,11 @@ object frmExtFileDialog: TfrmExtFileDialog
220220
OnMouseDown = lblPathMouseDown
221221
OnMouseMove = lblPathMouseMove
222222
end
223+
object IdleTimerTreeNodeScrolltoview: TIdleTimer
224+
AutoEnabled = True
225+
Interval = 100
226+
OnTimer = IdleTimerTreeNodeScrolltoviewTimer
227+
Left = 32
228+
Top = 64
229+
end
223230
end

source/extfiledialog.pas

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ TfrmExtFileDialog = class(TExtForm)
1919
comboEncoding: TComboBox;
2020
comboFileType: TComboBox;
2121
editFilename: TEdit;
22+
IdleTimerTreeNodeScrolltoview: TIdleTimer;
2223
lblPath: TLabel;
2324
lblLinebreaks: TLabel;
2425
lblEncoding: TLabel;
@@ -34,6 +35,7 @@ TfrmExtFileDialog = class(TExtForm)
3435
procedure FormCreate(Sender: TObject);
3536
procedure FormDestroy(Sender: TObject);
3637
procedure FormShow(Sender: TObject);
38+
procedure IdleTimerTreeNodeScrolltoviewTimer(Sender: TObject);
3739
procedure lblPathClick(Sender: TObject);
3840
procedure lblPathMouseDown(Sender: TObject; Button: TMouseButton;
3941
Shift: TShiftState; X, Y: Integer);
@@ -163,6 +165,17 @@ procedure TfrmExtFileDialog.FormShow(Sender: TObject);
163165
comboLineBreaks.ItemIndex := LineBreakIndexInt;
164166
end;
165167

168+
procedure TfrmExtFileDialog.IdleTimerTreeNodeScrolltoviewTimer(Sender: TObject);
169+
begin
170+
// Work around tree node not being in scroll area in the first place
171+
if not Visible then
172+
Exit;
173+
if Assigned(ShellTreeView.Selected) then
174+
ShellTreeView.Selected.MakeVisible;
175+
IdleTimerTreeNodeScrolltoview.AutoEnabled := False;
176+
IdleTimerTreeNodeScrolltoview.Enabled := False;
177+
end;
178+
166179
procedure TfrmExtFileDialog.lblPathClick(Sender: TObject);
167180
begin
168181
if (not FClickedPathPart.IsEmpty) and DirectoryExists(FClickedPathPart) then begin
@@ -200,6 +213,7 @@ function TfrmExtFileDialog.GetPathPartAt(X: Integer): String;
200213
Inc(CurrentWidth, TextWidth);
201214
end;
202215
if CharIndex > 0 then begin
216+
i := 0;
203217
for i:=CharIndex to Length(lblPath.Caption) do begin
204218
if Copy(lblPath.Caption, i, 1) = PathDelim then
205219
break;
@@ -330,15 +344,25 @@ procedure TfrmExtFileDialog.SetFileName(const AValue: String);
330344
end;
331345

332346
procedure TfrmExtFileDialog.SetInitialDir(const AValue: String);
347+
var
348+
CurPath: String;
349+
i: Integer;
333350
begin
351+
// Try to set path on tree
334352
FInitialDir := AValue;
335-
try
336-
ShellTreeView.Path := FInitialDir;
337-
except
338-
on E:EInvalidPath do begin
339-
ErrorDialog(E.Message);
340-
// In case, re-enable changing directory in tree
341-
Exclude(FOptions, ofNoChangeDir);
353+
CurPath := AValue;
354+
for i:=0 to 10 do begin
355+
try
356+
ShellTreeView.Path := CurPath;
357+
Break;
358+
except
359+
on E:EInvalidPath do begin
360+
// Go up to parent folder
361+
// Testable on connections > advanced > file logging, due to virtual template strings.
362+
CurPath := ExtractFilePath(ExcludeTrailingPathDelimiter(CurPath));
363+
// In case, re-enable changing directory in tree
364+
Exclude(FOptions, ofNoChangeDir);
365+
end;
342366
end;
343367
end;
344368
end;

0 commit comments

Comments
 (0)