From: Julian Smart <julian@anthemion.co.uk> Date: Thu, 18 May 2006 09:33:17 +0000 (+0000) Subject: Fixed tree book controller sizing by invalidating size after first X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/7c3840677ce08269bc5dc14a1a811fe3952391d0 Fixed tree book controller sizing by invalidating size after first insertion, and also allowing full size calculation. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39207 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/treectrl.h b/include/wx/treectrl.h index c161d0d098..873d779059 100644 --- a/include/wx/treectrl.h +++ b/include/wx/treectrl.h @@ -42,6 +42,9 @@ public: // arbitrary default m_spacing = 18; + + // quick DoGetBestSize calculation + m_quickBestSize = true; } virtual ~wxTreeCtrlBase(); @@ -366,6 +369,10 @@ public: virtual bool ShouldInheritColours() const { return false; } + // hint whether to calculate best size quickly or accurately + void SetQuickBestSize(bool q) { m_quickBestSize = q; } + bool GetQuickBestSize() const { return m_quickBestSize; } + protected: virtual wxSize DoGetBestSize() const; @@ -402,6 +409,9 @@ protected: // spacing between left border and the text unsigned int m_spacing; + // whether full or quick calculation is done in DoGetBestSize + bool m_quickBestSize; + DECLARE_NO_COPY_CLASS(wxTreeCtrlBase) }; diff --git a/src/common/treebase.cpp b/src/common/treebase.cpp index a365ffc8b6..e38866e7d1 100644 --- a/src/common/treebase.cpp +++ b/src/common/treebase.cpp @@ -92,6 +92,27 @@ wxTreeCtrlBase::~wxTreeCtrlBase() delete m_imageListState; } +static void wxGetBestTreeSize(const wxTreeCtrlBase* treeCtrl, const wxTreeItemId& id, wxSize& size) +{ + wxRect rect; + + if ( treeCtrl->GetBoundingRect(id, rect, true) ) + { + 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; + } + + wxTreeItemIdValue cookie; + for ( wxTreeItemId item = treeCtrl->GetFirstChild(id, cookie); + item.IsOk(); + item = treeCtrl->GetNextChild(item, cookie) ) + { + wxGetBestTreeSize(treeCtrl, item, size); + } +} + wxSize wxTreeCtrlBase::DoGetBestSize() const { wxSize size; @@ -99,23 +120,29 @@ wxSize wxTreeCtrlBase::DoGetBestSize() const // this doesn't really compute the total bounding rectangle of all items // but a not too bad guess of it which has the advantage of not having to // examine all (potentially hundreds or thousands) items in the control - for ( wxTreeItemId item = GetRootItem(); - item.IsOk(); - item = GetLastChild(item) ) + + if (GetQuickBestSize()) { - wxRect rect; - - // last parameter is "true" to get only the dimensions of the text - // label, we don't want to get the entire item width as it's determined - // by the current size - if ( GetBoundingRect(item, rect, true) ) + for ( wxTreeItemId item = GetRootItem(); + item.IsOk(); + item = GetLastChild(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; + wxRect rect; + + // last parameter is "true" to get only the dimensions of the text + // label, we don't want to get the entire item width as it's determined + // by the current size + if ( GetBoundingRect(item, rect, true) ) + { + 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; + } } } + else + wxGetBestTreeSize(this, GetRootItem(), size); // need some minimal size even for empty tree if ( !size.x || !size.y ) diff --git a/src/generic/treebkg.cpp b/src/generic/treebkg.cpp index 3ca2946555..165422a705 100644 --- a/src/generic/treebkg.cpp +++ b/src/generic/treebkg.cpp @@ -105,6 +105,7 @@ wxTreebook::Create(wxWindow *parent, wxTR_HIDE_ROOT | wxTR_SINGLE ); + GetTreeCtrl()->SetQuickBestSize(false); // do full size calculation GetTreeCtrl()->AddRoot(wxEmptyString); // label doesn't matter, it's hidden #ifdef __WXMSW__ @@ -244,6 +245,8 @@ bool wxTreebook::DoInsertSubPage(size_t pagePos, wxTreeItemId newId = tree->AppendItem(parentId, text, imageId); + tree->InvalidateBestSize(); + if ( !newId.IsOk() ) { (void)wxBookCtrlBase::DoRemovePage(newPos);