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:
Ansgar Becker
2013-07-25 04:45:07 +00:00
parent e509ea5437
commit e81ded8238
2 changed files with 17 additions and 10 deletions

View File

@@ -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

View File

@@ -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);