mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2026-03-13 09:24:25 +08:00
editDatabaseTableFilter.OnChange is triggered in DBtree.AfterPaint, which is implicitly called a million times, when mouse hovers over the tree.
* Move that call from DBtree.AfterPaint to RefreshTree, and call it only when it required. Removes a big bunch of useless magic code execution. * This way, I can wrap the code in editDatabaseTableFilter.OnChange in a BeginUpdate/EndUpdate block to postpone painting while looping over the nodes. * Set focus to dbtree in FormShow, to prevent editDatabaseFilter from catching it * Fixes issue #3293
This commit is contained in:
@@ -16,6 +16,7 @@ object MainForm: TMainForm
|
||||
OnDestroy = FormDestroy
|
||||
OnMouseWheel = FormMouseWheel
|
||||
OnResize = FormResize
|
||||
OnShow = FormShow
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object spltTopBottom: TSplitter
|
||||
@@ -401,7 +402,6 @@ object MainForm: TMainForm
|
||||
TabOrder = 1
|
||||
TreeOptions.PaintOptions = [toHotTrack, toShowButtons, toShowDropmark, toShowRoot, toShowTreeLines, toThemeAware, toUseBlendedImages, toGhostedIfUnfocused, toUseExplorerTheme, toHideTreeLinesIfThemed]
|
||||
TreeOptions.SelectionOptions = [toFullRowSelect, toRightClickSelect]
|
||||
OnAfterPaint = DBtreeAfterPaint
|
||||
OnBeforeCellPaint = DBtreeBeforeCellPaint
|
||||
OnChange = DBtreeChange
|
||||
OnDblClick = DBtreeDblClick
|
||||
|
||||
@@ -571,6 +571,7 @@ type
|
||||
procedure FormDestroy(Sender: TObject);
|
||||
procedure FormCreate(Sender: TObject);
|
||||
procedure AfterFormCreate;
|
||||
procedure FormShow(Sender: TObject);
|
||||
procedure FormResize(Sender: TObject);
|
||||
procedure actUserManagerExecute(Sender: TObject);
|
||||
procedure actAboutBoxExecute(Sender: TObject);
|
||||
@@ -839,7 +840,6 @@ type
|
||||
procedure spltPreviewMoved(Sender: TObject);
|
||||
procedure actDataSaveBlobToFileExecute(Sender: TObject);
|
||||
procedure DataGridColumnResize(Sender: TVTHeader; Column: TColumnIndex);
|
||||
procedure DBtreeAfterPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas);
|
||||
procedure treeQueryHelpersGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
|
||||
Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
|
||||
procedure treeQueryHelpersInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode;
|
||||
@@ -1941,6 +1941,14 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TMainForm.FormShow(Sender: TObject);
|
||||
begin
|
||||
// Manually set focus to tree - otherwise the database filter as the first
|
||||
// control catches focus on startup, which is ugly.
|
||||
if DBtree.CanFocus then
|
||||
DBtree.SetFocus;
|
||||
end;
|
||||
|
||||
procedure TMainForm.actUserManagerExecute(Sender: TObject);
|
||||
var
|
||||
Dialog: TUserManagerForm;
|
||||
@@ -7644,6 +7652,11 @@ begin
|
||||
|
||||
finally
|
||||
FTreeRefreshInProgress := False;
|
||||
// Tree node filtering needs a hit in special cases, e.g. after a db was dropped
|
||||
if editDatabaseFilter.Text <> '' then
|
||||
editDatabaseFilter.OnChange(editDatabaseFilter);
|
||||
if editTableFilter.Text <> '' then
|
||||
editTableFilter.OnChange(editTableFilter);
|
||||
end;
|
||||
end;
|
||||
|
||||
@@ -9439,6 +9452,7 @@ begin
|
||||
VisibleCount := 0;
|
||||
FilterError := False;
|
||||
|
||||
DBtree.BeginUpdate;
|
||||
Node := DBtree.GetFirst;
|
||||
while Assigned(Node) do begin
|
||||
Obj := DBtree.GetNodeData(Node);
|
||||
@@ -9458,6 +9472,7 @@ begin
|
||||
end;
|
||||
Node := DBtree.GetNextInitialized(Node);
|
||||
end;
|
||||
DBtree.EndUpdate;
|
||||
|
||||
rx.Free;
|
||||
if VisibleCount = 0 then
|
||||
@@ -10200,14 +10215,6 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
procedure TMainForm.DBtreeAfterPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas);
|
||||
begin
|
||||
// Tree node filtering needs a hit in special cases, e.g. after a db was dropped
|
||||
editDatabaseFilter.OnChange(editDatabaseFilter);
|
||||
editTableFilter.OnChange(editTableFilter);
|
||||
end;
|
||||
|
||||
|
||||
procedure TMainForm.DBtreeBeforeCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas;
|
||||
Node: PVirtualNode; Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect;
|
||||
var ContentRect: TRect);
|
||||
|
||||
Reference in New Issue
Block a user