Creating a button with wxID_HELP and a non-empty label used to always show
this label, even if it was just a standard "Help" or "&Help". This didn't work
at all as the help buttons under OS X are too small to show any label.
To fix this, use normal buttons, not help ones, if a really custom label is
used to ensure that it can be seen. And to still use the correct help buttons
in as many cases as possible, ignore the standard "Help" label and its
variants and don't show it at all.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65258
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
The preferred way to create standard buttons is to use default value of
@a label. If no label is supplied and @a id is one of standard IDs from
- @ref page_stockitems "this list", a standard label will be used.
+ @ref page_stockitems "this list", a standard label will be used. In
+ other words, if you use a predefined @c wxID_XXX constant, just omit
+ the label completely rather than specifying it. In particular, help
+ buttons (the ones with @a id of @c wxID_HELP) under Mac OS X can't
+ display any label at all and while wxButton will detect if the standard
+ "Help" label is used and ignore it, using any other label will prevent
+ the button from correctly appearing as a help button and so should be
+ avoided.
+
In addition to that, the button will be decorated with stock icons under GTK+ 2.
#include "wx/panel.h"
#include "wx/toplevel.h"
#include "wx/dcclient.h"
+ #include "wx/stattext.h"
#endif
#include "wx/stockitem.h"
#include "wx/osx/private.h"
+namespace
+{
+
+// Returns true only if the id is wxID_HELP and the label is "Help" or empty.
+bool IsHelpButtonWithStandardLabel(wxWindowID id, const wxString& label)
+{
+ if ( id != wxID_HELP )
+ return false;
+
+ if ( label.empty() )
+ return true;
+
+ const wxString labelText = wxStaticText::GetLabelText(label);
+ return labelText == "Help" || labelText == _("Help");
+}
+
+} // anonymous namespace
+
IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl)
BEGIN_EVENT_TABLE(wxButton, wxControl)
bool wxButton::Create(wxWindow *parent,
wxWindowID id,
- const wxString& lbl,
+ const wxString& labelOrig,
const wxPoint& pos,
const wxSize& size,
long style,
validator, name);
}
- wxString label(lbl);
- if (label.empty() && wxIsStockID(id) && !(id == wxID_HELP))
- label = wxGetStockLabel(id);
+ wxString label;
+
+ // Ignore the standard label for help buttons if possible, they use "?"
+ // label under Mac which looks better.
+ if ( !IsHelpButtonWithStandardLabel(id, labelOrig) )
+ {
+ label = labelOrig.empty() && wxIsStockID(id) ? wxGetStockLabel(id)
+ : labelOrig;
+ }
m_macIsUserPane = false ;
void wxButton::SetLabel(const wxString& label)
{
- if ( GetId() == wxID_HELP || HasFlag(wxBU_NOTEXT) )
+ if ( IsHelpButtonWithStandardLabel(GetId(), label) )
+ {
+ // ignore the standard label for the help buttons, it's not used
+ return;
+ }
+
+ if ( HasFlag(wxBU_NOTEXT) )
{
// just store the label internally but don't really use it for the
// button
wxSize wxButton::DoGetBestSize() const
{
- if ( GetId() == wxID_HELP )
+ // We only use help button bezel if we don't have any (non standard) label
+ // to display in the button. Otherwise even wxID_HELP buttons look like
+ // normal push buttons.
+ if ( GetId() == wxID_HELP && GetLabel().empty() )
return wxSize( 23 , 23 ) ;
wxRect r ;
wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer,
wxWindowMac* WXUNUSED(parent),
wxWindowID id,
- const wxString& WXUNUSED(label),
+ const wxString& label,
const wxPoint& pos,
const wxSize& size,
long WXUNUSED(style),
NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
wxNSButton* v = [[wxNSButton alloc] initWithFrame:r];
- if ( id == wxID_HELP )
+ // We can't display a custom label inside a button with help bezel style so
+ // we only use it if we are using the default label. wxButton itself checks
+ // if the label is just "Help" in which case it discards it and passes us
+ // an empty string.
+ if ( id == wxID_HELP && label.empty() )
{
[v setBezelStyle:NSHelpButtonBezelStyle];
}