]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix wxComboCtrlBase::DoGetSizeFromTextSize() performance regression.
authorVáclav Slavík <vslavik@fastmail.fm>
Wed, 14 Aug 2013 15:47:21 +0000 (15:47 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Wed, 14 Aug 2013 15:47:21 +0000 (15:47 +0000)
r72935 introduced code that created a temporary wxComboBox control to
take measurements. This is very expensive in MSW and adds noticeable
delay when creating more than a few controls.

Replace with equivalent wxMSW code that computes the height in the same
way other wxMSW controls do.

The wxGTK version cannot be eliminated in the same way, so at least add
some basic caching there. It's much less of a problem, because GTK+
controls creation is much cheaper than MSW one.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74658 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/combocmn.cpp

index d76166d771876eeced23451be3b04943d55ba6c9..82d16579609d4571ecf5fdb19d9b0b3fe4bc02ff 100644 (file)
 
 #include "wx/combo.h"
 
+#ifdef __WXMSW__
+#include "wx/msw/private.h"
+#endif
+
 #if wxUSE_COMBOBOX
 #include "wx/combobox.h"
 extern WXDLLEXPORT_DATA(const char) wxComboBoxNameStr[] = "comboBox";
@@ -1370,15 +1374,31 @@ wxSize wxComboCtrlBase::DoGetSizeFromTextSize(int xlen, int ylen) const
 
     int fhei;
 
-#if wxUSE_COMBOBOX && (defined(__WXMSW__) || defined(__WXGTK__)) \
-        && !defined(__WXUNIVERSAL__)
-    wxComboBox* cb = new wxComboBox;
-    cb->Hide();
-    cb->Create(const_cast<wxComboCtrlBase*>(this), wxID_ANY);
+#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
+    fhei = EDIT_HEIGHT_FROM_CHAR_HEIGHT(GetCharHeight());
+#elif defined(__WXGTK__) && !defined(__WXUNIVERSAL__)
+    // Control creation is not entirely cheap, so cache the heights to
+    // avoid repeatedly creating dummy controls:
+    static wxString s_last_font;
+    static int s_last_fhei = -1;
+    wxString fontdesc;
     if ( m_font.IsOk() )
-        cb->SetFont(m_font);
-    fhei = cb->GetBestSize().y;
-    cb->Destroy();
+        fontdesc = m_font.GetNativeFontInfoDesc();
+    if ( s_last_fhei != -1 && fontdesc == s_last_font )
+    {
+        fhei = s_last_fhei;
+    }
+    else
+    {
+        wxComboBox* cb = new wxComboBox;
+        cb->Hide();
+        cb->Create(const_cast<wxComboCtrlBase*>(this), wxID_ANY);
+        if ( m_font.IsOk() )
+            cb->SetFont(m_font);
+        s_last_font = fontdesc;
+        s_last_fhei = fhei = cb->GetBestSize().y;
+        cb->Destroy();
+    }
 #else
     if ( m_font.IsOk() )
         fhei = (m_font.GetPointSize()*2) + 5;