]> git.saurik.com Git - wxWidgets.git/commitdiff
Don't make buttons with images too wide in wxMSW.
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 14 Feb 2011 22:12:10 +0000 (22:12 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 14 Feb 2011 22:12:10 +0000 (22:12 +0000)
We used to increase the button size to the standard size first and then add
the extra padding the buttons with images. This resulted in too much padding
for the buttons with short text labels and images.

Instead, add the padding for the image first and only then increase the button
size to the standard one if still needed.

See #12924.

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

include/wx/msw/private/button.h
src/msw/button.cpp

index a6f2e68a9320f5f497c6734e343d01769fa5a272..a6c9b64374dfc4a5905dc726be363ca4fbfacd92 100644 (file)
@@ -47,15 +47,29 @@ enum
     Size_AuthNeeded = 1
 };
 
-// common implementation of wxButton and wxToggleButton::DoGetBestSize()
-// (implemented in src/msw/button.cpp)
-wxSize ComputeBestSize(wxControl *btn, int flags = 0);
+// NB: All the functions below are implemented in src/msw/button.cpp
 
-// compute the button size (as if wxBU_EXACTFIT were specified, i.e. without
+// Compute the button size (as if wxBU_EXACTFIT were specified, i.e. without
 // adjusting it to be of default size if it's smaller) for the given label size
 WXDLLIMPEXP_CORE wxSize
 GetFittingSize(wxWindow *win, const wxSize& sizeLabel, int flags = 0);
 
+// Compute the button size (as if wxBU_EXACTFIT were specified) by computing
+// its label size and then calling GetFittingSize().
+wxSize ComputeBestFittingSize(wxControl *btn, int flags = 0);
+
+// Increase the size passed as parameter to be at least the standard button
+// size if the control doesn't have wxBU_EXACTFIT style and also cache it as
+// the best size and return its value -- this is used in DoGetBestSize()
+// implementation.
+wxSize IncreaseToStdSizeAndCache(wxControl *btn, const wxSize& size);
+
+// helper of wxToggleButton::DoGetBestSize()
+inline wxSize ComputeBestSize(wxControl *btn, int flags = 0)
+{
+    return IncreaseToStdSizeAndCache(btn, ComputeBestFittingSize(btn, flags));
+}
+
 } // namespace wxMSWButton
 
 #endif // _WX_MSW_PRIVATE_BUTTON_H_
index 6323ec0bc9cea0e3af626fc2d8977756fed5fd03..55e66816a5b0333d77ed45f22282ab3a99f21ddf 100644 (file)
@@ -397,14 +397,19 @@ wxSize wxMSWButton::GetFittingSize(wxWindow *win,
     return sizeBtn;
 }
 
-wxSize wxMSWButton::ComputeBestSize(wxControl *btn, int flags)
+wxSize wxMSWButton::ComputeBestFittingSize(wxControl *btn, int flags)
 {
     wxClientDC dc(btn);
 
     wxSize sizeBtn;
     dc.GetMultiLineTextExtent(btn->GetLabelText(), &sizeBtn.x, &sizeBtn.y);
 
-    sizeBtn = GetFittingSize(btn, sizeBtn, flags);
+    return GetFittingSize(btn, sizeBtn, flags);
+}
+
+wxSize wxMSWButton::IncreaseToStdSizeAndCache(wxControl *btn, const wxSize& size)
+{
+    wxSize sizeBtn(size);
 
     // all buttons have at least the standard size unless the user explicitly
     // wants them to be of smaller size and used wxBU_EXACTFIT style when
@@ -595,6 +600,8 @@ void wxButton::AdjustForBitmapSize(wxSize &size) const
 
 wxSize wxButton::DoGetBestSize() const
 {
+    wxButton * const self = const_cast<wxButton *>(this);
+
     wxSize size;
 
     // account for the text part if we have it or if we don't have any image at
@@ -606,19 +613,13 @@ wxSize wxButton::DoGetBestSize() const
         if ( GetAuthNeeded() )
             flags |= wxMSWButton::Size_AuthNeeded;
 
-        size = wxMSWButton::ComputeBestSize(const_cast<wxButton *>(this), flags);
+        size = wxMSWButton::ComputeBestFittingSize(self, flags);
     }
 
     if ( m_imageData )
-    {
         AdjustForBitmapSize(size);
 
-        // The best size has changed so even if it had been already cached by
-        // ComputeBestSize() call above we still need to update it.
-        CacheBestSize(size);
-    }
-
-    return size;
+    return wxMSWButton::IncreaseToStdSizeAndCache(self, size);
 }
 
 /* static */