diff --git a/src/gtk/control.cpp b/src/gtk/control.cpp index 85e1e37af7..009f65333f 100644 --- a/src/gtk/control.cpp +++ b/src/gtk/control.cpp @@ -341,9 +341,21 @@ wxSize wxControl::GTKGetPreferredSize(GtkWidget* widget) const #ifdef __WXGTK3__ int w, h; gtk_widget_get_size_request(widget, &w, &h); + + // gtk_widget_get_preferred_size() just returns 0 if the control is hidden, + // so we have to temporarily show the widget before calling it to get + // something useful from it, if it's currently hidden. + // So workaround this case. + const bool wasHidden = !gtk_widget_get_visible(widget); + if ( wasHidden ) + gtk_widget_show(widget); + gtk_widget_set_size_request(widget, -1, -1); gtk_widget_get_preferred_size(widget, NULL, &req); gtk_widget_set_size_request(widget, w, h); + + if ( wasHidden ) + gtk_widget_hide(widget); #else GTK_WIDGET_GET_CLASS(widget)->size_request(widget, &req); #endif diff --git a/tests/controls/choicetest.cpp b/tests/controls/choicetest.cpp index f08cf515fe..e21fe76896 100644 --- a/tests/controls/choicetest.cpp +++ b/tests/controls/choicetest.cpp @@ -36,9 +36,11 @@ private: CPPUNIT_TEST_SUITE( ChoiceTestCase ); wxITEM_CONTAINER_TESTS(); CPPUNIT_TEST( Sort ); + CPPUNIT_TEST( GetBestSize ); CPPUNIT_TEST_SUITE_END(); void Sort(); + void GetBestSize(); wxChoice* m_choice; @@ -89,4 +91,33 @@ void ChoiceTestCase::Sort() #endif } +void ChoiceTestCase::GetBestSize() +{ + wxArrayString testitems; + testitems.Add("1"); + testitems.Add("11"); + m_choice->Append(testitems); + + SECTION("Normal best size") + { + // nothing to do here + } + + // Ensure that the hidden control return a valid best size too. + SECTION("Hidden best size") + { + m_choice->Hide(); + } + + wxYield(); + + m_choice->InvalidateBestSize(); + const wxSize bestSize = m_choice->GetBestSize(); + + CHECK(bestSize.GetWidth() > m_choice->FromDIP(30)); + CHECK(bestSize.GetWidth() < m_choice->FromDIP(120)); + CHECK(bestSize.GetHeight() > m_choice->FromDIP(15)); + CHECK(bestSize.GetHeight() < m_choice->FromDIP(35)); +} + #endif //wxUSE_CHOICE