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
This commit is contained in:
@@ -42,6 +42,9 @@ public:
|
|||||||
|
|
||||||
// arbitrary default
|
// arbitrary default
|
||||||
m_spacing = 18;
|
m_spacing = 18;
|
||||||
|
|
||||||
|
// quick DoGetBestSize calculation
|
||||||
|
m_quickBestSize = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~wxTreeCtrlBase();
|
virtual ~wxTreeCtrlBase();
|
||||||
@@ -366,6 +369,10 @@ public:
|
|||||||
|
|
||||||
virtual bool ShouldInheritColours() const { return false; }
|
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:
|
protected:
|
||||||
virtual wxSize DoGetBestSize() const;
|
virtual wxSize DoGetBestSize() const;
|
||||||
|
|
||||||
@@ -402,6 +409,9 @@ protected:
|
|||||||
// spacing between left border and the text
|
// spacing between left border and the text
|
||||||
unsigned int m_spacing;
|
unsigned int m_spacing;
|
||||||
|
|
||||||
|
// whether full or quick calculation is done in DoGetBestSize
|
||||||
|
bool m_quickBestSize;
|
||||||
|
|
||||||
|
|
||||||
DECLARE_NO_COPY_CLASS(wxTreeCtrlBase)
|
DECLARE_NO_COPY_CLASS(wxTreeCtrlBase)
|
||||||
};
|
};
|
||||||
|
@@ -92,6 +92,27 @@ wxTreeCtrlBase::~wxTreeCtrlBase()
|
|||||||
delete m_imageListState;
|
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 wxTreeCtrlBase::DoGetBestSize() const
|
||||||
{
|
{
|
||||||
wxSize size;
|
wxSize size;
|
||||||
@@ -99,23 +120,29 @@ wxSize wxTreeCtrlBase::DoGetBestSize() const
|
|||||||
// this doesn't really compute the total bounding rectangle of all items
|
// 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
|
// 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
|
// examine all (potentially hundreds or thousands) items in the control
|
||||||
for ( wxTreeItemId item = GetRootItem();
|
|
||||||
item.IsOk();
|
if (GetQuickBestSize())
|
||||||
item = GetLastChild(item) )
|
|
||||||
{
|
{
|
||||||
wxRect rect;
|
for ( wxTreeItemId item = GetRootItem();
|
||||||
|
item.IsOk();
|
||||||
// last parameter is "true" to get only the dimensions of the text
|
item = GetLastChild(item) )
|
||||||
// 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 )
|
wxRect rect;
|
||||||
size.x = rect.x + rect.width;
|
|
||||||
if ( size.y < rect.y + rect.height )
|
// last parameter is "true" to get only the dimensions of the text
|
||||||
size.y = rect.y + rect.height;
|
// 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
|
// need some minimal size even for empty tree
|
||||||
if ( !size.x || !size.y )
|
if ( !size.x || !size.y )
|
||||||
|
@@ -105,6 +105,7 @@ wxTreebook::Create(wxWindow *parent,
|
|||||||
wxTR_HIDE_ROOT |
|
wxTR_HIDE_ROOT |
|
||||||
wxTR_SINGLE
|
wxTR_SINGLE
|
||||||
);
|
);
|
||||||
|
GetTreeCtrl()->SetQuickBestSize(false); // do full size calculation
|
||||||
GetTreeCtrl()->AddRoot(wxEmptyString); // label doesn't matter, it's hidden
|
GetTreeCtrl()->AddRoot(wxEmptyString); // label doesn't matter, it's hidden
|
||||||
|
|
||||||
#ifdef __WXMSW__
|
#ifdef __WXMSW__
|
||||||
@@ -244,6 +245,8 @@ bool wxTreebook::DoInsertSubPage(size_t pagePos,
|
|||||||
|
|
||||||
wxTreeItemId newId = tree->AppendItem(parentId, text, imageId);
|
wxTreeItemId newId = tree->AppendItem(parentId, text, imageId);
|
||||||
|
|
||||||
|
tree->InvalidateBestSize();
|
||||||
|
|
||||||
if ( !newId.IsOk() )
|
if ( !newId.IsOk() )
|
||||||
{
|
{
|
||||||
(void)wxBookCtrlBase::DoRemovePage(newPos);
|
(void)wxBookCtrlBase::DoRemovePage(newPos);
|
||||||
|
Reference in New Issue
Block a user