diff options
author | Alexander Neumann <alexander.neumann@picos-software.com> | 2019-10-23 18:03:48 +0200 |
---|---|---|
committer | Alexander Neumann <alexander.neumann@picos-software.com> | 2019-10-23 18:03:48 +0200 |
commit | 06b8b6ab5c855a9f81e90ed1bf3033902fa7a22d (patch) | |
tree | 493a294dd8fa58b065935f2d14f81f359c07e209 | |
parent | Fix FormatFloatGrouped (diff) | |
download | wireguard-windows-06b8b6ab5c855a9f81e90ed1bf3033902fa7a22d.tar.xz wireguard-windows-06b8b6ab5c855a9f81e90ed1bf3033902fa7a22d.zip |
TreeView: Enable performance improvements by not counting all children
-rw-r--r-- | models.go | 6 | ||||
-rw-r--r-- | treeview.go | 13 |
2 files changed, 16 insertions, 3 deletions
@@ -597,6 +597,12 @@ type TreeItem interface { ChildAt(index int) TreeItem } +// HasChilder enables widgets like TreeView to determine if an item has any +// child, without enforcing to fully count all children. +type HasChilder interface { + HasChild() bool +} + // TreeModel provides widgets like TreeView with item data. type TreeModel interface { // LazyPopulation returns if the model prefers on-demand population. diff --git a/treeview.go b/treeview.go index 6e8b7ea1..7458e647 100644 --- a/treeview.go +++ b/treeview.go @@ -171,6 +171,7 @@ func (tv *TreeView) SetModel(model TreeModel) error { tv.itemInsertedEventHandlerHandle = model.ItemInserted().Attach(func(item TreeItem) { tv.SetSuspended(true) + defer tv.SetSuspended(false) var hInsertAfter win.HTREEITEM parent := item.Parent() @@ -187,8 +188,6 @@ func (tv *TreeView) SetModel(model TreeModel) error { if _, err := tv.insertItemAfter(item, hInsertAfter); err != nil { return } - - tv.SetSuspended(false) }) tv.itemRemovedEventHandlerHandle = model.ItemRemoved().Attach(func(item TreeItem) { @@ -587,7 +586,15 @@ func (tv *TreeView) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) u (*buf)[max-1] = 0 } if nmtvdi.Item.Mask&win.TVIF_CHILDREN != 0 { - nmtvdi.Item.CChildren = int32(item.ChildCount()) + if hc, ok := item.(HasChilder); ok { + if hc.HasChild() { + nmtvdi.Item.CChildren = 1 + } else { + nmtvdi.Item.CChildren = 0 + } + } else { + nmtvdi.Item.CChildren = int32(item.ChildCount()) + } } case win.TVN_ITEMEXPANDING: |