From 73eb7ca93ff0fcbf989cf3c64182839c740688bc Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 22 Sep 2012 16:16:30 +0000 Subject: [PATCH] Make wxWrapSizer demo in the layout sample more dynamic. Allow adding checkboxes to and removing them from the wrap sizer to demonstrate how it adjusts to its contents dynamically. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72536 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- samples/layout/layout.cpp | 82 ++++++++++++++++++++++++++------------- samples/layout/layout.h | 11 ++++++ 2 files changed, 65 insertions(+), 28 deletions(-) diff --git a/samples/layout/layout.cpp b/samples/layout/layout.cpp index 41952f55bd..68c11ca289 100644 --- a/samples/layout/layout.cpp +++ b/samples/layout/layout.cpp @@ -681,54 +681,80 @@ MyNestedSizerFrame::MyNestedSizerFrame(const wxString &title, int x, int y ) // MyWrapSizerFrame // ---------------------------------------------------------------------------- +BEGIN_EVENT_TABLE(MyWrapSizerFrame, wxFrame) + EVT_MENU(wxID_ADD, MyWrapSizerFrame::OnAddCheckbox) + EVT_MENU(wxID_REMOVE, MyWrapSizerFrame::OnRemoveCheckbox) +END_EVENT_TABLE() MyWrapSizerFrame::MyWrapSizerFrame(const wxString &title, int x, int y ) : wxFrame( NULL, wxID_ANY, title, wxPoint(x, y), wxSize(200,-1) ) { wxMenu *menu = new wxMenu; - menu->Append(wxID_ABOUT, "Do nothing"); + menu->Append(wxID_ADD, "&Add a checkbox\tCtrl-+"); + menu->Append(wxID_REMOVE, "&Remove a checkbox\tCtrl--"); wxMenuBar *menu_bar = new wxMenuBar; - menu_bar->Append(menu, "&File"); + menu_bar->Append(menu, "&Wrap sizer"); SetMenuBar( menu_bar ); wxBoxSizer *root = new wxBoxSizer( wxVERTICAL ); -#if 0 - wxSizer *row = new wxWrapSizer; - int i; - for (i = 0; i < 4; i++) - row->Add( new wxButton( this, -1, "Hello" ), 0, wxALL, 10 ); - root->Add( row, 0, wxGROW ); + wxStaticBoxSizer *topSizer = new wxStaticBoxSizer( wxVERTICAL, this, "Wrapping check-boxes" ); + m_checkboxParent = topSizer->GetStaticBox(); + m_wrapSizer = new wxWrapSizer(wxHORIZONTAL); - row = new wxWrapSizer; - for (i = 0; i < 4; i++) - row->Add( new wxButton( this, -1, "Hello" ) ); - root->Add( row, 0, wxGROW ); - -#else // A number of checkboxes inside a wrap sizer - wxSizer *ps_mid = new wxStaticBoxSizer( wxVERTICAL, this, "Wrapping check-boxes" ); - wxSizer *ps_mid_wrap = new wxWrapSizer(wxHORIZONTAL); - ps_mid->Add( ps_mid_wrap, 100, wxEXPAND ); - for( int ix=0; ix<6; ix++ ) - ps_mid_wrap->Add( new wxCheckBox(this,wxID_ANY,wxString::Format("Option %d",ix+1)), 0, wxALIGN_CENTRE|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - root->Add( ps_mid, 0, wxEXPAND | wxALL, 5 ); + for( int i = 0; i < 6; i++ ) + DoAddCheckbox(); + + topSizer->Add( m_wrapSizer, wxSizerFlags(1).Expand()); + root->Add( topSizer, wxSizerFlags().Expand().Border()); // A shaped item inside a box sizer - wxSizer *ps_bottom = new wxStaticBoxSizer( wxVERTICAL, this, "With wxSHAPED item" ); - wxSizer *ps_bottom_box = new wxBoxSizer(wxHORIZONTAL); - ps_bottom->Add( ps_bottom_box, 100, wxEXPAND ); - ps_bottom_box->Add( new wxListBox(this,wxID_ANY,wxPoint(0,0),wxSize(70,70)), 0, wxEXPAND|wxSHAPED ); - ps_bottom_box->Add( 10,10 ); - ps_bottom_box->Add( new wxCheckBox(this,wxID_ANY,"A much longer option..."), 100, 0, 5 ); + wxSizer *bottomSizer = new wxStaticBoxSizer( wxVERTICAL, this, "With wxSHAPED item" ); + wxSizer *horzBoxSizer = new wxBoxSizer(wxHORIZONTAL); + bottomSizer->Add( horzBoxSizer, 100, wxEXPAND ); + horzBoxSizer->Add( new wxListBox(this,wxID_ANY,wxPoint(0,0),wxSize(70,70)), 0, wxEXPAND|wxSHAPED ); + horzBoxSizer->Add( 10,10 ); + horzBoxSizer->Add( new wxCheckBox(this,wxID_ANY,"A much longer option..."), 100, 0, 5 ); - root->Add( ps_bottom, 1, wxEXPAND | wxALL, 5 ); -#endif + root->Add( bottomSizer, 1, wxEXPAND | wxALL, 5 ); // Set sizer for window SetSizerAndFit( root ); } +void MyWrapSizerFrame::DoAddCheckbox() +{ + m_wrapSizer->Add(new wxCheckBox + ( + m_checkboxParent, + wxID_ANY, + wxString::Format + ( + "Option %d", + (int)m_wrapSizer->GetItemCount() + 1 + ) + ), + wxSizerFlags().Centre().Border()); +} + +void MyWrapSizerFrame::OnAddCheckbox(wxCommandEvent& WXUNUSED(event)) +{ + DoAddCheckbox(); + Layout(); +} + +void MyWrapSizerFrame::OnRemoveCheckbox(wxCommandEvent& WXUNUSED(event)) +{ + if ( m_wrapSizer->IsEmpty() ) + { + wxLogStatus(this, "No more checkboxes to remove."); + return; + } + + delete m_wrapSizer->GetItem(m_wrapSizer->GetItemCount() - 1)->GetWindow(); + Layout(); +} diff --git a/samples/layout/layout.h b/samples/layout/layout.h index 4b9edcad45..d932a00503 100644 --- a/samples/layout/layout.h +++ b/samples/layout/layout.h @@ -133,6 +133,17 @@ class MyWrapSizerFrame: public wxFrame { public: MyWrapSizerFrame(const wxString &title, int x, int y ); + +private: + void OnAddCheckbox(wxCommandEvent& event); + void OnRemoveCheckbox(wxCommandEvent& event); + + void DoAddCheckbox(); + + wxWindow* m_checkboxParent; + wxSizer* m_wrapSizer; + + DECLARE_EVENT_TABLE() }; // controls and menu constants