From: Vadim Zeitlin Date: Sat, 22 Sep 2012 16:16:30 +0000 (+0000) Subject: Make wxWrapSizer demo in the layout sample more dynamic. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/73eb7ca93ff0fcbf989cf3c64182839c740688bc?ds=sidebyside 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 --- 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 ); - - row = new wxWrapSizer; - for (i = 0; i < 4; i++) - row->Add( new wxButton( this, -1, "Hello" ) ); - root->Add( row, 0, wxGROW ); + wxStaticBoxSizer *topSizer = new wxStaticBoxSizer( wxVERTICAL, this, "Wrapping check-boxes" ); + m_checkboxParent = topSizer->GetStaticBox(); + m_wrapSizer = new wxWrapSizer(wxHORIZONTAL); -#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 ); - - root->Add( ps_bottom, 1, wxEXPAND | wxALL, 5 ); -#endif + 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( 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