]> git.saurik.com Git - wxWidgets.git/commitdiff
Implement GetSizeFromTextSize() for wxSpinCtrl.
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 20 Nov 2012 12:49:53 +0000 (12:49 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 20 Nov 2012 12:49:53 +0000 (12:49 +0000)
Implement it for the native MSW and GTK versions and the generic one used in
the other ports and also for wxSpinCtrlDouble under MSW.

Also test this function in the spin page of the widgets sample.

Closes #14840.

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

include/wx/generic/spinctlg.h
include/wx/gtk/spinctrl.h
include/wx/msw/spinctrl.h
samples/widgets/spinbtn.cpp
samples/widgets/widgets.cpp
src/generic/spinctlg.cpp
src/gtk/spinctrl.cpp
src/msw/spinctrl.cpp

index 8ceedf767ac267a3672ac4d73edc9523950503f0..f5f52a56bb3d430ae565383222b9a2c528d2fc04 100644 (file)
@@ -108,6 +108,7 @@ public:
 protected:
     // override the base class virtuals involved into geometry calculations
     virtual wxSize DoGetBestSize() const;
 protected:
     // override the base class virtuals involved into geometry calculations
     virtual wxSize DoGetBestSize() const;
+    virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const;
     virtual void DoMoveWindow(int x, int y, int width, int height);
 
 #ifdef __WXMSW__
     virtual void DoMoveWindow(int x, int y, int width, int height);
 
 #ifdef __WXMSW__
index 5e50fd8a8023153c80de893675eea47f0588eb73..8890030a4b9b6598b208b8b03e59403ef3102b34 100644 (file)
@@ -73,6 +73,7 @@ protected:
     void GtkEnableEvents() const;
 
     virtual wxSize DoGetBestSize() const;
     void GtkEnableEvents() const;
 
     virtual wxSize DoGetBestSize() const;
+    virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const;
     virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const;
 
     // Widgets that use the style->base colour for the BG colour should
     virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const;
 
     // Widgets that use the style->base colour for the BG colour should
index dd74f556490ef69d92f1c3e46550b2ba9d5c4665..a9163a39016a0d1515cb32275d03ac4fb91aeff5 100644 (file)
@@ -116,6 +116,7 @@ protected:
     virtual void DoGetPosition(int *x, int *y) const;
     virtual void DoMoveWindow(int x, int y, int width, int height);
     virtual wxSize DoGetBestSize() const;
     virtual void DoGetPosition(int *x, int *y) const;
     virtual void DoMoveWindow(int x, int y, int width, int height);
     virtual wxSize DoGetBestSize() const;
+    virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const;
     virtual void DoGetSize(int *width, int *height) const;
     virtual void DoGetClientSize(int *x, int *y) const;
 #if wxUSE_TOOLTIPS
     virtual void DoGetSize(int *width, int *height) const;
     virtual void DoGetClientSize(int *x, int *y) const;
 #if wxUSE_TOOLTIPS
index b037345b02720acabffd0762f02eb19ce633680a..2c039ee2795f50f0f6e7bdd261dec53b9a7d7dff 100644 (file)
@@ -460,6 +460,19 @@ void SpinBtnWidgetsPage::OnButtonSetMinAndMax(wxCommandEvent& WXUNUSED(event))
 
     m_min = minNew;
     m_max = maxNew;
 
     m_min = minNew;
     m_max = maxNew;
+    wxString smax('9', m_textMax->GetValue().length());
+    wxSize
+      size = m_spinctrl->GetSizeFromTextSize(m_spinctrl->GetTextExtent(smax));
+
+    m_spinctrl->SetMinSize(size);
+    m_spinctrl->SetSize(size);
+
+    smax += ".0";
+    size = m_spinctrldbl->GetSizeFromTextSize(
+                m_spinctrldbl->GetTextExtent(smax)
+            );
+    m_spinctrldbl->SetMinSize(size);
+    m_spinctrldbl->SetSize(size);
 
     m_spinbtn->SetRange(minNew, maxNew);
     m_spinctrl->SetRange(minNew, maxNew);
 
     m_spinbtn->SetRange(minNew, maxNew);
     m_spinctrl->SetRange(minNew, maxNew);
index ca970c9c552befbe4be3bc2174debea6d58c24cf..9d08c992c312c933056d8c56e3a920ae5377a357 100644 (file)
@@ -875,6 +875,10 @@ void WidgetsFrame::OnSetFont(wxCommandEvent& WXUNUSED(event))
         (*it)->SetFont(m_font);
         (*it)->Refresh();
     }
         (*it)->SetFont(m_font);
         (*it)->Refresh();
     }
+
+    // The best size of the widget could have changed after changing its font,
+    // so re-layout to show it correctly.
+    page->Layout();
 #else
     wxLogMessage(wxT("Font selection dialog not available in current build."));
 #endif
 #else
     wxLogMessage(wxT("Font selection dialog not available in current build."));
 #endif
index 0041895fd34547dc8fa00dda4f9273d916d2cebf..f5495046f25fd681dd3703bc726d71d2c3f2e53e 100644 (file)
@@ -283,10 +283,26 @@ wxWindowList wxSpinCtrlGenericBase::GetCompositeWindowParts() const
 
 wxSize wxSpinCtrlGenericBase::DoGetBestSize() const
 {
 
 wxSize wxSpinCtrlGenericBase::DoGetBestSize() const
 {
-    wxSize sizeBtn  = m_spinButton->GetBestSize(),
-           sizeText = m_textCtrl->GetBestSize();
+    return DoGetSizeFromTextSize(m_textCtrl->GetBestSize().x, -1);
+}
+
+wxSize wxSpinCtrlGenericBase::DoGetSizeFromTextSize(int xlen, int ylen) const
+{
+    wxSize sizeBtn  = m_spinButton->GetBestSize();
+    wxSize totalS( m_textCtrl->GetBestSize() );
+
+    wxSize tsize(xlen + sizeBtn.x + MARGIN, totalS.y);
+#if defined(__WXMSW__)
+    tsize.IncBy(0.4 * totalS.y + 4, 0);
+#elif defined(__WXGTK__)
+    tsize.IncBy(totalS.y + 10, 0);
+#endif // MSW GTK
+
+    // Check if the user requested a non-standard height.
+    if ( ylen > 0 )
+        tsize.IncBy(0, ylen - GetCharHeight());
 
 
-    return wxSize(sizeBtn.x + sizeText.x + MARGIN, sizeText.y);
+    return tsize;
 }
 
 void wxSpinCtrlGenericBase::DoMoveWindow(int x, int y, int width, int height)
 }
 
 void wxSpinCtrlGenericBase::DoMoveWindow(int x, int y, int width, int height)
index e7b798197a07cefff7eef76f1273c86432d7563d..9bfe5a9b0bcbe4d8aea5b3691868d3e53124f721 100644 (file)
@@ -337,10 +337,39 @@ GdkWindow *wxSpinCtrlGTKBase::GTKGetWindow(wxArrayGdkWindows& windows) const
 
 wxSize wxSpinCtrlGTKBase::DoGetBestSize() const
 {
 
 wxSize wxSpinCtrlGTKBase::DoGetBestSize() const
 {
-    wxSize ret( wxControl::DoGetBestSize() );
-    wxSize best(95, ret.y); // FIXME: 95?
-    CacheBestSize(best);
-    return best;
+    return DoGetSizeFromTextSize(95); // TODO: 95 is completely arbitrary
+}
+
+wxSize wxSpinCtrlGTKBase::DoGetSizeFromTextSize(int xlen, int ylen) const
+{
+    wxASSERT_MSG( m_widget, wxS("GetSizeFromTextSize called before creation") );
+
+    // Set an as small as possible size for the control, so preferred sizes
+    // return "natural" sizes, not taking into account the previous ones (which
+    // seems to be GTK+3 behaviour)
+    gtk_widget_set_size_request(m_widget, 0, 0);
+
+    // Both Gtk+2 and Gtk+3 use current value/range to measure control's width.
+    // So, we can't ask Gtk+ for its width. Instead, we used hardcoded values.
+
+    // Returned height is OK
+    wxSize totalS = GTKGetPreferredSize(m_widget);
+
+#if GTK_CHECK_VERSION(3,4,0)
+    // two buttons in horizontal
+    totalS.x = 46 + 15; // margins included
+#else
+    // two small buttons in vertical
+    totalS.x = GetFont().GetPixelSize().y + 13; // margins included
+#endif
+
+    wxSize tsize(xlen + totalS.x, totalS.y);
+
+    // Check if the user requested a non-standard height.
+    if ( ylen > 0 )
+        tsize.IncBy(0, ylen - GetCharHeight());
+
+    return tsize;
 }
 
 // static
 }
 
 // static
index ea503b4c41f2f4483258d79d3452ecbf3350f4c0..4625a25b4914556010ee83db975037e498621764 100644 (file)
@@ -717,26 +717,29 @@ bool wxSpinCtrl::MSWOnNotify(int WXUNUSED(idCtrl), WXLPARAM lParam, WXLPARAM *re
 // ----------------------------------------------------------------------------
 
 wxSize wxSpinCtrl::DoGetBestSize() const
 // ----------------------------------------------------------------------------
 
 wxSize wxSpinCtrl::DoGetBestSize() const
+{
+    return DoGetSizeFromTextSize(DEFAULT_ITEM_WIDTH);
+}
+
+wxSize wxSpinCtrl::DoGetSizeFromTextSize(int xlen, int ylen) const
 {
     wxSize sizeBtn = wxSpinButton::DoGetBestSize();
 {
     wxSize sizeBtn = wxSpinButton::DoGetBestSize();
-    sizeBtn.x += DEFAULT_ITEM_WIDTH + MARGIN_BETWEEN;
 
     int y;
     wxGetCharSize(GetHWND(), NULL, &y, GetFont());
 
     int y;
     wxGetCharSize(GetHWND(), NULL, &y, GetFont());
-    y = EDIT_HEIGHT_FROM_CHAR_HEIGHT(y);
-
     // JACS: we should always use the height calculated
     // from above, because otherwise we'll get a spin control
     // that's too big. So never use the height calculated
     // from wxSpinButton::DoGetBestSize().
 
     // JACS: we should always use the height calculated
     // from above, because otherwise we'll get a spin control
     // that's too big. So never use the height calculated
     // from wxSpinButton::DoGetBestSize().
 
-    // if ( sizeBtn.y < y )
-    {
-        // make the text tall enough
-        sizeBtn.y = y;
-    }
+    wxSize tsize(xlen + sizeBtn.x + MARGIN_BETWEEN + 0.3 * y + 10,
+                 EDIT_HEIGHT_FROM_CHAR_HEIGHT(y));
+
+    // Check if the user requested a non-standard height.
+    if ( ylen > 0 )
+        tsize.IncBy(0, ylen - y);
 
 
-    return sizeBtn;
+    return tsize;
 }
 
 void wxSpinCtrl::DoMoveWindow(int x, int y, int width, int height)
 }
 
 void wxSpinCtrl::DoMoveWindow(int x, int y, int width, int height)