Fix applying style of MSW wxHeaderCtrl and add tests for doing it to the
widgets sample.

See https://github.com/wxWidgets/wxWidgets/pull/1710
This commit is contained in:
Vadim Zeitlin
2020-01-19 17:49:40 +01:00
5 changed files with 54 additions and 54 deletions

View File

@@ -72,10 +72,6 @@ private:
// Events. // Events.
void OnSize(wxSizeEvent& event); void OnSize(wxSizeEvent& event);
// Style flag helper function.
long ApplyHeaderReorderFlagToStyle(long style);
// The native header control. // The native header control.
wxMSWHeaderCtrl* m_nativeControl; wxMSWHeaderCtrl* m_nativeControl;
friend class wxMSWHeaderCtrl; friend class wxMSWHeaderCtrl;

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),
GetColumnAlignmentFlag(i),
GetColumnStyleFlags(i));
if ( m_colSettings[i].chkWithBitmap->IsChecked() )
{
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(col1);
wxHeaderColumnSimple col2("Second", 200, GetColumnAlignmentFlag(1), GetColumnStyleFlags(1));
if ( m_colSettings[1].chkWithBitmap->IsChecked() )
{
col2.SetBitmap(wxArtProvider::GetIcon(wxART_QUESTION, wxART_BUTTON));
}
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();
} }

View File

@@ -992,8 +992,8 @@ void WidgetsFrame::OnToggleGlobalBusyCursor(wxCommandEvent& event)
void WidgetsFrame::OnToggleBusyCursor(wxCommandEvent& event) void WidgetsFrame::OnToggleBusyCursor(wxCommandEvent& event)
{ {
WidgetsPage::GetAttrs().m_cursor = *(event.IsChecked() ? wxHOURGLASS_CURSOR WidgetsPage::GetAttrs().m_cursor = (event.IsChecked() ? *wxHOURGLASS_CURSOR
: wxSTANDARD_CURSOR); : wxNullCursor);
CurrentPage()->SetUpWidget(); CurrentPage()->SetUpWidget();
} }
@@ -1359,10 +1359,7 @@ void WidgetsPage::SetUpWidget()
(*it)->Enable(GetAttrs().m_enabled); (*it)->Enable(GetAttrs().m_enabled);
(*it)->Show(GetAttrs().m_show); (*it)->Show(GetAttrs().m_show);
if ( GetAttrs().m_cursor.IsOk() ) (*it)->SetCursor(GetAttrs().m_cursor);
{
(*it)->SetCursor(GetAttrs().m_cursor);
}
(*it)->SetWindowVariant(GetAttrs().m_variant); (*it)->SetWindowVariant(GetAttrs().m_variant);

View File

@@ -97,7 +97,7 @@ struct WidgetAttributes
m_show = true; m_show = true;
m_dir = wxLayout_LeftToRight; m_dir = wxLayout_LeftToRight;
m_variant = wxWINDOW_VARIANT_NORMAL; m_variant = wxWINDOW_VARIANT_NORMAL;
m_cursor = *wxSTANDARD_CURSOR; m_cursor = wxNullCursor;
m_defaultFlags = wxBORDER_DEFAULT; m_defaultFlags = wxBORDER_DEFAULT;
} }

View File

@@ -1048,10 +1048,12 @@ bool wxHeaderCtrl::Create(wxWindow *parent,
wxID_ANY, wxID_ANY,
wxDefaultPosition, wxDefaultPosition,
wxDefaultSize, wxDefaultSize,
ApplyHeaderReorderFlagToStyle(wxNO_BORDER), wxNO_BORDER,
wxMSWHeaderCtrlNameStr) ) wxMSWHeaderCtrlNameStr) )
return false; return false;
SetWindowStyle(newStyle);
Bind(wxEVT_SIZE, &wxHeaderCtrl::OnSize, this); Bind(wxEVT_SIZE, &wxHeaderCtrl::OnSize, this);
return true; return true;
@@ -1136,16 +1138,18 @@ void wxHeaderCtrl::SetWindowStyleFlag(long style)
// Update the native control style. // Update the native control style.
long flags = m_nativeControl->GetWindowStyleFlag(); long flags = m_nativeControl->GetWindowStyleFlag();
flags = ApplyHeaderReorderFlagToStyle(flags);
m_nativeControl->SetWindowStyleFlag(flags);
}
long wxHeaderCtrl::ApplyHeaderReorderFlagToStyle(long style)
{
if ( HasFlag(wxHD_ALLOW_REORDER) ) if ( HasFlag(wxHD_ALLOW_REORDER) )
return style | wxHD_ALLOW_REORDER; flags |= wxHD_ALLOW_REORDER;
else
flags &= ~wxHD_ALLOW_REORDER;
return style & ~wxHD_ALLOW_REORDER; if ( HasFlag(wxHD_BITMAP_ON_RIGHT) )
flags |= wxHD_BITMAP_ON_RIGHT;
else
flags &= ~wxHD_BITMAP_ON_RIGHT;
m_nativeControl->SetWindowStyleFlag(flags);
} }
#endif // wxHAS_GENERIC_HEADERCTRL #endif // wxHAS_GENERIC_HEADERCTRL