]> git.saurik.com Git - wxWidgets.git/commitdiff
fix tree control best size calculation: account for the images and the buttons
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 4 Nov 2006 11:42:41 +0000 (11:42 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 4 Nov 2006 11:42:41 +0000 (11:42 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43022 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/treebase.cpp

index bf992729d44a2538fef190dc122a63b8fbfd3770..e958ac733b7088d1ebf7c50c8fd149e4cf4ef0ff 100644 (file)
@@ -106,16 +106,14 @@ wxTreeCtrlBase::~wxTreeCtrlBase()
         delete m_imageListState;
 }
 
-static void wxGetBestTreeSize(const wxTreeCtrlBase* treeCtrl, const wxTreeItemId& id, wxSize& size)
+static void
+wxGetBestTreeSize(const wxTreeCtrlBase* treeCtrl, wxTreeItemId id, wxSize& size)
 {
     wxRect rect;
 
-    if ( treeCtrl->GetBoundingRect(id, rect, true) )
+    if ( treeCtrl->GetBoundingRect(id, rect, true /* just the item */) )
     {
-        if ( size.x < rect.x + rect.width )
-            size.x = rect.x + rect.width;
-        if ( size.y < rect.y + rect.height )
-            size.y = rect.y + rect.height;
+        size.IncTo(wxSize(rect.GetRight(), rect.GetBottom()));
     }
 
     wxTreeItemIdValue cookie;
@@ -155,9 +153,35 @@ wxSize wxTreeCtrlBase::DoGetBestSize() const
             }
         }
     }
-    else
+    else // use precise, if potentially slow, size computation method
+    {
+        // iterate over all items recursively
         wxGetBestTreeSize(this, GetRootItem(), size);
 
+        // but the above doesn't take into account the icon items nor the tree
+        // "+"/"-" buttons which have about the same size
+        wxCoord iconWidth, iconHeight;
+        if ( !m_imageListNormal ||
+                !m_imageListNormal->GetImageCount() ||
+                    !m_imageListNormal->GetSize(0, iconWidth, iconHeight) )
+        {
+            // FIXME: what is the default size of the tree buttons?
+            iconWidth =
+            iconHeight = 16;
+        }
+
+        // account for the icons if we have them
+        if ( m_imageListNormal )
+        {
+            // FIXME: and how to get the margin? better be large...
+            size.x += iconWidth + 10;
+        }
+
+        // and for the buttons always
+        if ( !HasFlag(wxTR_NO_BUTTONS) )
+            size.x += iconWidth;
+    }
+
     // need some minimal size even for empty tree
     if ( !size.x || !size.y )
         size = wxControl::DoGetBestSize();