Several wxRadioBox-related improvements:

- Fix its minimum width calculation to take the title into account.
- Remove unused nor useful wxRA_LEFTTORIGHT and wxRA_TOPTOBOTTOM.
- Tidy up the radiobox page of the widgets sample.

See https://github.com/wxWidgets/wxWidgets/pull/1187
This commit is contained in:
Vadim Zeitlin
2019-01-28 01:17:34 +01:00
5 changed files with 46 additions and 105 deletions

View File

@@ -1568,9 +1568,8 @@ enum wxBorder
/* /*
* wxRadioBox style flags * wxRadioBox style flags
* These styles are not used in any port.
*/ */
/* should we number the items from left to right or from top to bottom in a 2d */
/* radiobox? */
#define wxRA_LEFTTORIGHT 0x0001 #define wxRA_LEFTTORIGHT 0x0001
#define wxRA_TOPTOBOTTOM 0x0002 #define wxRA_TOPTOBOTTOM 0x0002

View File

@@ -379,9 +379,8 @@ enum wxBorder
/* /*
* wxRadioBox style flags * wxRadioBox style flags
* These styles are not used in any port.
*/ */
/* should we number the items from left to right or from top to bottom in a 2d */
/* radiobox? */
#define wxRA_LEFTTORIGHT 0x0001 #define wxRA_LEFTTORIGHT 0x0001
#define wxRA_TOPTOBOTTOM 0x0002 #define wxRA_TOPTOBOTTOM 0x0002

View File

@@ -60,14 +60,6 @@ enum
RadioPage_Radio RadioPage_Radio
}; };
// layout direction radiobox selections
enum
{
RadioDir_Default,
RadioDir_LtoR,
RadioDir_TtoB
};
// default values for the number of radiobox items // default values for the number of radiobox items
static const unsigned int DEFAULT_NUM_ENTRIES = 12; static const unsigned int DEFAULT_NUM_ENTRIES = 12;
static const unsigned int DEFAULT_MAJOR_DIM = 3; static const unsigned int DEFAULT_MAJOR_DIM = 3;
@@ -123,7 +115,6 @@ protected:
wxCheckBox *m_chkSpecifyRows; wxCheckBox *m_chkSpecifyRows;
wxCheckBox *m_chkEnableItem; wxCheckBox *m_chkEnableItem;
wxCheckBox *m_chkShowItem; wxCheckBox *m_chkShowItem;
wxRadioBox *m_radioDir;
// the gauge itself and the sizer it is in // the gauge itself and the sizer it is in
wxRadioBox *m_radio; wxRadioBox *m_radio;
@@ -155,6 +146,7 @@ wxBEGIN_EVENT_TABLE(RadioWidgetsPage, WidgetsPage)
EVT_BUTTON(RadioPage_Selection, RadioWidgetsPage::OnButtonSelection) EVT_BUTTON(RadioPage_Selection, RadioWidgetsPage::OnButtonSelection)
EVT_BUTTON(RadioPage_Label, RadioWidgetsPage::OnButtonSetLabel) EVT_BUTTON(RadioPage_Label, RadioWidgetsPage::OnButtonSetLabel)
EVT_UPDATE_UI(RadioPage_Reset, RadioWidgetsPage::OnUpdateUIReset)
EVT_UPDATE_UI(RadioPage_Update, RadioWidgetsPage::OnUpdateUIUpdate) EVT_UPDATE_UI(RadioPage_Update, RadioWidgetsPage::OnUpdateUIUpdate)
EVT_UPDATE_UI(RadioPage_Selection, RadioWidgetsPage::OnUpdateUISelection) EVT_UPDATE_UI(RadioPage_Selection, RadioWidgetsPage::OnUpdateUISelection)
@@ -197,8 +189,7 @@ RadioWidgetsPage::RadioWidgetsPage(WidgetsBookCtrl *book,
m_textLabelBtns = m_textLabelBtns =
m_textLabel = (wxTextCtrl *)NULL; m_textLabel = (wxTextCtrl *)NULL;
m_radio = m_radio = (wxRadioBox *)NULL;
m_radioDir = (wxRadioBox *)NULL;
m_sizerRadio = (wxSizer *)NULL; m_sizerRadio = (wxSizer *)NULL;
} }
@@ -217,43 +208,25 @@ void RadioWidgetsPage::CreateContent()
"Major specifies &rows count" "Major specifies &rows count"
); );
static const wxString layoutDir[] =
{
"default",
"left to right",
"top to bottom"
};
m_radioDir = new wxRadioBox(this, wxID_ANY, "Numbering:",
wxDefaultPosition, wxDefaultSize,
WXSIZEOF(layoutDir), layoutDir,
1, wxRA_SPECIFY_COLS);
sizerLeft->Add(m_radioDir, 0, wxGROW | wxALL, 5);
// if it's not defined, we can't change the radiobox direction
#ifndef wxRA_LEFTTORIGHT
m_radioDir->Disable();
#endif // wxRA_LEFTTORIGHT
wxSizer *sizerRow; wxSizer *sizerRow;
sizerRow = CreateSizerWithTextAndLabel("&Major dimension:", sizerRow = CreateSizerWithTextAndLabel("&Major dimension:",
wxID_ANY, wxID_ANY,
&m_textMajorDim); &m_textMajorDim);
sizerLeft->Add(sizerRow, 0, wxGROW | wxALL, 5); sizerLeft->Add(sizerRow, wxSizerFlags().Expand().Border());
sizerRow = CreateSizerWithTextAndLabel("&Number of buttons:", sizerRow = CreateSizerWithTextAndLabel("&Number of buttons:",
wxID_ANY, wxID_ANY,
&m_textNumBtns); &m_textNumBtns);
sizerLeft->Add(sizerRow, 0, wxGROW | wxALL, 5); sizerLeft->Add(sizerRow, wxSizerFlags().Expand().Border());
wxButton *btn; wxButton *btn;
btn = new wxButton(this, RadioPage_Update, "&Update"); btn = new wxButton(this, RadioPage_Update, "&Update");
sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 5); sizerLeft->Add(btn, wxSizerFlags().CentreHorizontal().Border());
sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer sizerLeft->AddSpacer(5);
btn = new wxButton(this, RadioPage_Reset, "&Reset"); btn = new wxButton(this, RadioPage_Reset, "&Reset");
sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15); sizerLeft->Add(btn, wxSizerFlags().CentreHorizontal().Border(wxALL, 15));
// middle pane // middle pane
wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY, "&Change parameters"); wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY, "&Change parameters");
@@ -262,25 +235,25 @@ void RadioWidgetsPage::CreateContent()
sizerRow = CreateSizerWithTextAndLabel("Current selection:", sizerRow = CreateSizerWithTextAndLabel("Current selection:",
wxID_ANY, wxID_ANY,
&m_textCurSel); &m_textCurSel);
sizerMiddle->Add(sizerRow, 0, wxGROW | wxALL, 5); sizerMiddle->Add(sizerRow, wxSizerFlags().Expand().Border());
sizerRow = CreateSizerWithTextAndButton(RadioPage_Selection, sizerRow = CreateSizerWithTextAndButton(RadioPage_Selection,
"&Change selection:", "&Change selection:",
wxID_ANY, wxID_ANY,
&m_textSel); &m_textSel);
sizerMiddle->Add(sizerRow, 0, wxGROW | wxALL, 5); sizerMiddle->Add(sizerRow, wxSizerFlags().Expand().Border());
sizerRow = CreateSizerWithTextAndButton(RadioPage_Label, sizerRow = CreateSizerWithTextAndButton(RadioPage_Label,
"&Label for box:", "&Label for box:",
wxID_ANY, wxID_ANY,
&m_textLabel); &m_textLabel);
sizerMiddle->Add(sizerRow, 0, wxGROW | wxALL, 5); sizerMiddle->Add(sizerRow, wxSizerFlags().Expand().Border());
sizerRow = CreateSizerWithTextAndButton(RadioPage_LabelBtn, sizerRow = CreateSizerWithTextAndButton(RadioPage_LabelBtn,
"&Label for buttons:", "&Label for buttons:",
wxID_ANY, wxID_ANY,
&m_textLabelBtns); &m_textLabelBtns);
sizerMiddle->Add(sizerRow, 0, wxGROW | wxALL, 5); sizerMiddle->Add(sizerRow, wxSizerFlags().Expand().Border());
m_chkEnableItem = CreateCheckBoxAndAddToSizer(sizerMiddle, m_chkEnableItem = CreateCheckBoxAndAddToSizer(sizerMiddle,
"Disable &2nd item", "Disable &2nd item",
@@ -291,16 +264,18 @@ void RadioWidgetsPage::CreateContent()
// right pane // right pane
wxSizer *sizerRight = new wxBoxSizer(wxHORIZONTAL); wxSizer *sizerRight = new wxBoxSizer(wxHORIZONTAL);
sizerRight->SetMinSize(150, 0);
m_sizerRadio = sizerRight; // save it to modify it later m_sizerRadio = sizerRight; // save it to modify it later
Reset(); Reset();
CreateRadio(); CreateRadio();
// the 3 panes panes compose the window // the 3 panes panes compose the window
sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10); sizerTop->Add(sizerLeft,
sizerTop->Add(sizerMiddle, 1, wxGROW | wxALL, 10); wxSizerFlags(0).Expand().Border((wxALL & ~wxLEFT), 10));
sizerTop->Add(sizerRight, 0, wxGROW | (wxALL & ~wxRIGHT), 10); sizerTop->Add(sizerMiddle,
wxSizerFlags(1).Expand().Border(wxALL, 10));
sizerTop->Add(sizerRight,
wxSizerFlags(0).Expand().Border((wxALL & ~wxRIGHT), 10));
// final initializations // final initializations
SetSizer(sizerTop); SetSizer(sizerTop);
@@ -320,7 +295,6 @@ void RadioWidgetsPage::Reset()
m_chkSpecifyRows->SetValue(false); m_chkSpecifyRows->SetValue(false);
m_chkEnableItem->SetValue(true); m_chkEnableItem->SetValue(true);
m_chkShowItem->SetValue(true); m_chkShowItem->SetValue(true);
m_radioDir->SetSelection(RadioDir_Default);
} }
void RadioWidgetsPage::CreateRadio() void RadioWidgetsPage::CreateRadio()
@@ -357,13 +331,13 @@ void RadioWidgetsPage::CreateRadio()
majorDim = DEFAULT_MAJOR_DIM; majorDim = DEFAULT_MAJOR_DIM;
} }
wxString *items = new wxString[count]; wxArrayString items;
wxString labelBtn = m_textLabelBtns->GetValue(); wxString labelBtn = m_textLabelBtns->GetValue();
for ( size_t n = 0; n < count; n++ ) for ( size_t n = 0; n < count; n++ )
{ {
items[n] = wxString::Format("%s %lu", items.push_back(wxString::Format("%s %lu",
labelBtn, (unsigned long)n + 1); labelBtn, (unsigned long)n + 1));
} }
int flags = m_chkSpecifyRows->GetValue() ? wxRA_SPECIFY_ROWS int flags = m_chkSpecifyRows->GetValue() ? wxRA_SPECIFY_ROWS
@@ -371,45 +345,29 @@ void RadioWidgetsPage::CreateRadio()
flags |= GetAttrs().m_defaultFlags; flags |= GetAttrs().m_defaultFlags;
#ifdef wxRA_LEFTTORIGHT
switch ( m_radioDir->GetSelection() )
{
default:
wxFAIL_MSG( "unexpected wxRadioBox layout direction" );
wxFALLTHROUGH;
case RadioDir_Default:
break;
case RadioDir_LtoR:
flags |= wxRA_LEFTTORIGHT;
break;
case RadioDir_TtoB:
flags |= wxRA_TOPTOBOTTOM;
break;
}
#endif // wxRA_LEFTTORIGHT
m_radio = new wxRadioBox(this, RadioPage_Radio, m_radio = new wxRadioBox(this, RadioPage_Radio,
m_textLabel->GetValue(), m_textLabel->GetValue(),
wxDefaultPosition, wxDefaultSize, wxDefaultPosition, wxDefaultSize,
count, items, items,
majorDim, majorDim,
flags); flags);
delete [] items;
if ( sel >= 0 && (size_t)sel < count ) if ( sel >= 0 && (size_t)sel < count )
{ {
m_radio->SetSelection(sel); m_radio->SetSelection(sel);
} }
m_sizerRadio->Add(m_radio, 1, wxGROW); if ( count > TEST_BUTTON )
m_sizerRadio->Layout(); {
m_radio->Enable(TEST_BUTTON, m_chkEnableItem->IsChecked());
m_radio->Show(TEST_BUTTON, m_chkShowItem->IsChecked());
}
m_chkEnableItem->SetValue(true); m_sizerRadio->Add(m_radio, wxSizerFlags(1).Expand());
m_chkEnableItem->SetValue(true); Layout();
m_chkEnableItem->Enable(count > TEST_BUTTON);
m_chkShowItem->Enable(count > TEST_BUTTON);
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -516,12 +474,18 @@ void RadioWidgetsPage::OnUpdateUIReset(wxUpdateUIEvent& event)
void RadioWidgetsPage::OnUpdateUIEnableItem(wxUpdateUIEvent& event) void RadioWidgetsPage::OnUpdateUIEnableItem(wxUpdateUIEvent& event)
{ {
if ( m_radio->GetCount() <= TEST_BUTTON )
return;
event.SetText(m_radio->IsItemEnabled(TEST_BUTTON) ? "Disable &2nd item" event.SetText(m_radio->IsItemEnabled(TEST_BUTTON) ? "Disable &2nd item"
: "Enable &2nd item"); : "Enable &2nd item");
} }
void RadioWidgetsPage::OnUpdateUIShowItem(wxUpdateUIEvent& event) void RadioWidgetsPage::OnUpdateUIShowItem(wxUpdateUIEvent& event)
{ {
if ( m_radio->GetCount() <= TEST_BUTTON )
return;
event.SetText(m_radio->IsItemShown(TEST_BUTTON) ? "Hide 2nd &item" event.SetText(m_radio->IsItemShown(TEST_BUTTON) ? "Hide 2nd &item"
: "Show 2nd &item"); : "Show 2nd &item");
} }

View File

@@ -586,10 +586,9 @@ wxSize wxRadioBox::GetTotalButtonSize(const wxSize& sizeBtn) const
reinterpret_cast<wxWindow*>(const_cast<wxRadioBox*>(this))).y / 2; reinterpret_cast<wxWindow*>(const_cast<wxRadioBox*>(this))).y / 2;
// and also wide enough for its label // and also wide enough for its label
int widthLabel; int widthBox = wxStaticBox::DoGetBestSize().x;
GetTextExtent(GetLabelText(), &widthLabel, NULL); if ( widthBox > width )
if ( widthLabel > width ) width = widthBox;
width = widthLabel;
return wxSize(width, height); return wxSize(width, height);
} }

View File

@@ -140,28 +140,8 @@ bool wxRadioBox::Create(wxWindow *parent,
const wxValidator& wxVALIDATOR_PARAM(val), const wxValidator& wxVALIDATOR_PARAM(val),
const wxString& name) const wxString& name)
{ {
// for compatibility with the other ports which don't handle (yet?) if ( !(style & (wxRA_SPECIFY_ROWS | wxRA_SPECIFY_COLS)) )
// wxRA_LEFTTORIGHT and wxRA_TOPTOBOTTOM flags, we add them ourselves if style |= wxRA_SPECIFY_COLS;
// not specified
if ( !(style & (wxRA_LEFTTORIGHT | wxRA_TOPTOBOTTOM)) )
{
// horizontal radiobox use left to right layout
if ( style & wxRA_SPECIFY_COLS )
{
style |= wxRA_LEFTTORIGHT;
}
else if ( style & wxRA_SPECIFY_ROWS )
{
style |= wxRA_TOPTOBOTTOM;
}
else
{
wxFAIL_MSG( wxT("you must specify wxRA_XXX style!") );
// use default
style = wxRA_SPECIFY_COLS | wxRA_LEFTTORIGHT;
}
}
if ( !wxStaticBox::Create(parent, id, title, pos, size, style, name) ) if ( !wxStaticBox::Create(parent, id, title, pos, size, style, name) )
return false; return false;
@@ -447,7 +427,7 @@ void wxRadioBox::DoMoveWindow(int x0, int y0, int width, int height)
{ {
m_buttons[n]->SetSize(x, y, sizeBtn.x, sizeBtn.y); m_buttons[n]->SetSize(x, y, sizeBtn.x, sizeBtn.y);
if ( GetWindowStyle() & wxRA_TOPTOBOTTOM ) if ( GetWindowStyle() & wxRA_SPECIFY_ROWS )
{ {
// from top to bottom // from top to bottom
if ( (n + 1) % GetRowCount() ) if ( (n + 1) % GetRowCount() )
@@ -462,7 +442,7 @@ void wxRadioBox::DoMoveWindow(int x0, int y0, int width, int height)
y = y0; y = y0;
} }
} }
else // wxRA_LEFTTORIGHT: mirror the code above else // wxRA_SPECIFY_COLS: mirror the code above
{ {
// from left to right // from left to right
if ( (n + 1) % GetColumnCount() ) if ( (n + 1) % GetColumnCount() )