Add more columns to Header control in widgets sample

Show column settings horizontally.
Fix binding to header control events after it is recreated.
This commit is contained in:
Maarten Bent
2020-01-17 23:08:13 +01:00
parent fd9df06d35
commit a31cf55a8d

View File

@@ -48,6 +48,8 @@
// HeaderCtrlWidgetsPage // HeaderCtrlWidgetsPage
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
#define NUMBER_OF_COLUMNS 4
class HeaderCtrlWidgetsPage : public WidgetsPage class HeaderCtrlWidgetsPage : public WidgetsPage
{ {
public: public:
@@ -100,7 +102,7 @@ protected:
wxCheckBox *chkAllowHide; wxCheckBox *chkAllowHide;
wxCheckBox *chkWithBitmap; wxCheckBox *chkWithBitmap;
wxRadioBox *rbAlignments; wxRadioBox *rbAlignments;
} m_colSettings[2]; } m_colSettings[NUMBER_OF_COLUMNS];
private: private:
DECLARE_WIDGETS_PAGE(HeaderCtrlWidgetsPage) DECLARE_WIDGETS_PAGE(HeaderCtrlWidgetsPage)
@@ -116,8 +118,7 @@ private:
#define HEADER_CTRL_FAMILY GENERIC_CTRLS #define HEADER_CTRL_FAMILY GENERIC_CTRLS
#endif #endif
IMPLEMENT_WIDGETS_PAGE(HeaderCtrlWidgetsPage, IMPLEMENT_WIDGETS_PAGE(HeaderCtrlWidgetsPage, "Header", HEADER_CTRL_FAMILY);
"Header", HEADER_CTRL_FAMILY);
static const wxString gs_colAlignments[] = { "none", "left", "centre", "right" }; static const wxString gs_colAlignments[] = { "none", "left", "centre", "right" };
static const wxAlignment gs_colAlignFlags[] = { wxALIGN_NOT, wxALIGN_LEFT, wxALIGN_CENTRE, wxALIGN_RIGHT }; static const wxAlignment gs_colAlignFlags[] = { wxALIGN_NOT, wxALIGN_LEFT, wxALIGN_CENTRE, wxALIGN_RIGHT };
@@ -127,8 +128,8 @@ static const wxAlignment gs_colAlignFlags[] = { wxALIGN_NOT, wxALIGN_LEFT, wxALI
void HeaderCtrlWidgetsPage::CreateContent() void HeaderCtrlWidgetsPage::CreateContent()
{ {
// left pane // top pane
wxSizer *sizerLeft = new wxBoxSizer(wxVERTICAL); wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
// header style // header style
wxSizer *sizerHeader = new wxStaticBoxSizer(wxVERTICAL, this, "&Header style"); wxSizer *sizerHeader = new wxStaticBoxSizer(wxVERTICAL, this, "&Header style");
@@ -136,7 +137,11 @@ void HeaderCtrlWidgetsPage::CreateContent()
m_chkAllowHide = CreateCheckBoxAndAddToSizer(sizerHeader, "Alow &hide"); m_chkAllowHide = CreateCheckBoxAndAddToSizer(sizerHeader, "Alow &hide");
m_chkBitmapOnRight = CreateCheckBoxAndAddToSizer(sizerHeader, "&Bitmap on right"); m_chkBitmapOnRight = CreateCheckBoxAndAddToSizer(sizerHeader, "&Bitmap on right");
ResetHeaderStyle(); ResetHeaderStyle();
sizerLeft->Add(sizerHeader, wxSizerFlags().Expand());
sizerHeader->AddStretchSpacer();
wxButton* btnReset = new wxButton(this, wxID_ANY, "&Reset");
sizerHeader->Add(btnReset, wxSizerFlags().CenterHorizontal().Border());
sizerTop->Add(sizerHeader, wxSizerFlags().Expand());
// column flags // column flags
for ( int i = 0; i < (int)WXSIZEOF(m_colSettings); i++ ) for ( int i = 0; i < (int)WXSIZEOF(m_colSettings); i++ )
@@ -150,25 +155,22 @@ void HeaderCtrlWidgetsPage::CreateContent()
m_colSettings[i].rbAlignments = new wxRadioBox(this, wxID_ANY, "Alignment", m_colSettings[i].rbAlignments = new wxRadioBox(this, wxID_ANY, "Alignment",
wxDefaultPosition, wxDefaultSize, WXSIZEOF(gs_colAlignments), gs_colAlignments, wxDefaultPosition, wxDefaultSize, WXSIZEOF(gs_colAlignments), gs_colAlignments,
2, wxRA_SPECIFY_COLS); 2, wxRA_SPECIFY_COLS);
sizerCol->Add(m_colSettings[i].rbAlignments, wxSizerFlags().Expand().Border(wxALL, 5)); sizerCol->Add(m_colSettings[i].rbAlignments, wxSizerFlags().Expand().Border());
ResetColumnStyle(i); ResetColumnStyle(i);
sizerLeft->Add(sizerCol, wxSizerFlags().Expand().Border(wxTOP, 15)); sizerTop->AddSpacer(15);
sizerTop->Add(sizerCol, wxSizerFlags().Expand());
} }
sizerLeft->Add(5, 5, wxSizerFlags().Expand().Border(wxALL, 5)); // spacer // bottom pane
wxButton* btnReset = new wxButton(this, wxID_ANY, "&Reset");
sizerLeft->Add(btnReset, wxSizerFlags().CenterHorizontal().Border(wxALL, 15));
// right pane
m_sizerHeader = new wxStaticBoxSizer(wxVERTICAL, this, "Header"); m_sizerHeader = new wxStaticBoxSizer(wxVERTICAL, this, "Header");
RecreateWidget(); RecreateWidget();
// the 2 panes compose the window // the 2 panes compose the window
wxSizer* sizerTop = new wxBoxSizer(wxHORIZONTAL); wxSizer* sizerAll = new wxBoxSizer(wxVERTICAL);
sizerTop->Add(sizerLeft, wxSizerFlags().Expand().DoubleBorder()); sizerAll->Add(sizerTop, wxSizerFlags().Expand().Border());
sizerTop->Add(m_sizerHeader, wxSizerFlags(1).Expand().DoubleBorder()); sizerAll->Add(m_sizerHeader, wxSizerFlags(1).Expand().Border());
SetSizer(sizerTop); SetSizer(sizerAll);
// Bind event handlers // Bind event handlers
m_chkAllowReorder->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckOrRadioBox, this); m_chkAllowReorder->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckOrRadioBox, this);
@@ -185,10 +187,6 @@ void HeaderCtrlWidgetsPage::CreateContent()
} }
btnReset->Bind(wxEVT_BUTTON, &HeaderCtrlWidgetsPage::OnResetButton, this); btnReset->Bind(wxEVT_BUTTON, &HeaderCtrlWidgetsPage::OnResetButton, this);
btnReset->Bind(wxEVT_UPDATE_UI, &HeaderCtrlWidgetsPage::OnUpdateUIResetButton, this); btnReset->Bind(wxEVT_UPDATE_UI, &HeaderCtrlWidgetsPage::OnUpdateUIResetButton, this);
m_header->Bind(wxEVT_HEADER_RESIZING, &HeaderCtrlWidgetsPage::OnResizing, this);
m_header->Bind(wxEVT_HEADER_BEGIN_RESIZE, &HeaderCtrlWidgetsPage::OnBeginResize, this);
m_header->Bind(wxEVT_HEADER_END_RESIZE, &HeaderCtrlWidgetsPage::OnEndResize, this);
} }
void HeaderCtrlWidgetsPage::RecreateWidget() void HeaderCtrlWidgetsPage::RecreateWidget()
@@ -200,19 +198,24 @@ void HeaderCtrlWidgetsPage::RecreateWidget()
m_header = new wxHeaderCtrlSimple(this, wxID_ANY, m_header = new wxHeaderCtrlSimple(this, wxID_ANY,
wxDefaultPosition, wxDefaultSize, wxDefaultPosition, wxDefaultSize,
flags); flags);
wxASSERT(WXSIZEOF(m_colSettings) == 2);
wxHeaderColumnSimple col1("First", 100, GetColumnAlignmentFlag(0), GetColumnStyleFlags(0)); m_header->Bind(wxEVT_HEADER_RESIZING, &HeaderCtrlWidgetsPage::OnResizing, this);
if ( m_colSettings[0].chkWithBitmap->IsChecked() ) m_header->Bind(wxEVT_HEADER_BEGIN_RESIZE, &HeaderCtrlWidgetsPage::OnBeginResize, this);
m_header->Bind(wxEVT_HEADER_END_RESIZE, &HeaderCtrlWidgetsPage::OnEndResize, this);
for ( int i = 0; i < (int)WXSIZEOF(m_colSettings); i++ )
{ {
col1.SetBitmap(wxArtProvider::GetIcon(wxART_ERROR, wxART_BUTTON)); wxHeaderColumnSimple col(wxString::Format("Column %d", i + 1),
} FromDIP(100),
m_header->AppendColumn(col1); GetColumnAlignmentFlag(i),
wxHeaderColumnSimple col2("Second", 200, GetColumnAlignmentFlag(1), GetColumnStyleFlags(1)); GetColumnStyleFlags(i));
if ( m_colSettings[1].chkWithBitmap->IsChecked() ) if ( m_colSettings[i].chkWithBitmap->IsChecked() )
{ {
col2.SetBitmap(wxArtProvider::GetIcon(wxART_QUESTION, wxART_BUTTON)); const wxArtID icons[] = { wxART_ERROR, wxART_QUESTION, wxART_WARNING, wxART_INFORMATION };
col.SetBitmap(wxArtProvider::GetIcon(icons[i % WXSIZEOF(icons)], wxART_BUTTON));
}
m_header->AppendColumn(col);
} }
m_header->AppendColumn(col2);
m_sizerHeader->AddStretchSpacer(); m_sizerHeader->AddStretchSpacer();
m_sizerHeader->Add(m_header, wxSizerFlags().Expand()); m_sizerHeader->Add(m_header, wxSizerFlags().Expand());
@@ -310,19 +313,19 @@ void HeaderCtrlWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& evt)
void HeaderCtrlWidgetsPage::OnResizing(wxHeaderCtrlEvent& evt) void HeaderCtrlWidgetsPage::OnResizing(wxHeaderCtrlEvent& evt)
{ {
wxLogMessage("Column %i resizing, width = %i", evt.GetColumn(), evt.GetWidth()); wxLogMessage("Column %i resizing, width = %i", evt.GetColumn() + 1, evt.GetWidth());
evt.Skip(); evt.Skip();
} }
void HeaderCtrlWidgetsPage::OnBeginResize(wxHeaderCtrlEvent& evt) void HeaderCtrlWidgetsPage::OnBeginResize(wxHeaderCtrlEvent& evt)
{ {
wxLogMessage("Column %i resize began, width = %i", evt.GetColumn(), evt.GetWidth()); wxLogMessage("Column %i resize began, width = %i", evt.GetColumn() + 1, evt.GetWidth());
evt.Skip(); evt.Skip();
} }
void HeaderCtrlWidgetsPage::OnEndResize(wxHeaderCtrlEvent& evt) void HeaderCtrlWidgetsPage::OnEndResize(wxHeaderCtrlEvent& evt)
{ {
wxLogMessage("Column %i resize ended, width = %i", evt.GetColumn(), evt.GetWidth()); wxLogMessage("Column %i resize ended, width = %i", evt.GetColumn() + 1, evt.GetWidth());
evt.Skip(); evt.Skip();
} }