From: Vadim Zeitlin Date: Wed, 27 Mar 2013 23:10:15 +0000 (+0000) Subject: Fix display of empty wxStaticBoxSizers. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/49cfad613b496a2827574417195feee7b57660ca Fix display of empty wxStaticBoxSizers. wxStaticBoxSizer should be considered shown if its static box is shown, even if it has no elements (or all of them are hidden). Closes #14698. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73729 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/sizer.h b/include/wx/sizer.h index 7e01ff8ad9..29facff1e2 100644 --- a/include/wx/sizer.h +++ b/include/wx/sizer.h @@ -715,6 +715,10 @@ public: void Show(bool show) { ShowItems(show); } + // This is the ShowItems() counterpart and returns true if any of the sizer + // items are shown. + virtual bool AreAnyItemsShown() const; + protected: wxSize m_size; wxSize m_minSize; @@ -1033,6 +1037,7 @@ public: // override to hide/show the static box as well virtual void ShowItems (bool show); + virtual bool AreAnyItemsShown() const; virtual bool Detach( wxWindow *window ); virtual bool Detach( wxSizer *sizer ) { return wxBoxSizer::Detach(sizer); } diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index 5f4a0a6ad1..37f31766a3 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -602,20 +602,10 @@ bool wxSizerItem::IsShown() const return m_window->IsShown(); case Item_Sizer: - { // arbitrarily decide that if at least one of our elements is // shown, so are we (this arbitrariness is the reason for // deprecating this function) - for ( wxSizerItemList::compatibility_iterator - node = m_sizer->GetChildren().GetFirst(); - node; - node = node->GetNext() ) - { - if ( node->GetData()->IsShown() ) - return true; - } - return false; - } + return m_sizer->AreAnyItemsShown(); case Item_Spacer: return m_spacer->IsShown(); @@ -1290,6 +1280,19 @@ void wxSizer::ShowItems( bool show ) } } +bool wxSizer::AreAnyItemsShown() const +{ + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + if ( node->GetData()->IsShown() ) + return true; + node = node->GetNext(); + } + + return false; +} + bool wxSizer::IsShown( wxWindow *window ) const { wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); @@ -2541,6 +2544,16 @@ void wxStaticBoxSizer::ShowItems( bool show ) wxBoxSizer::ShowItems( show ); } +bool wxStaticBoxSizer::AreAnyItemsShown() const +{ + // We don't need to check the status of our child items: if the box is + // shown, this sizer should be considered shown even if all its elements + // are hidden (or, more prosaically, there are no elements at all). And, + // conversely, if the box is hidden then all our items, which are its + // children, are hidden too. + return m_staticBox->IsShown(); +} + bool wxStaticBoxSizer::Detach( wxWindow *window ) { // avoid deleting m_staticBox in our dtor if it's being detached from the