X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2480be69b159027a3673eee1a4fc4e16287d058d..bed99c22560c0b308e2e70af7d0e615b312dd04b:/demos/life/dialogs.cpp diff --git a/demos/life/dialogs.cpp b/demos/life/dialogs.cpp index 9e01bbfad5..627f71ac6d 100644 --- a/demos/life/dialogs.cpp +++ b/demos/life/dialogs.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: dialogs.cpp +// Name: life/dialogs.cpp // Purpose: Life! dialogs // Author: Guillermo Rodriguez Garcia, // Modified by: @@ -10,36 +10,38 @@ ///////////////////////////////////////////////////////////////////////////// // ========================================================================== -// declarations +// headers, declarations, constants // ========================================================================== -// -------------------------------------------------------------------------- -// headers -// -------------------------------------------------------------------------- - -#ifdef __GNUG__ - #pragma implementation "dialogs.h" -#endif - -// for compilers that support precompilation, includes "wx/wx.h" +// For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ - #pragma hdrstop +#pragma hdrstop #endif -// for all others, include the necessary headers #ifndef WX_PRECOMP - #include "wx/wx.h" +#include "wx/wx.h" #endif #include "wx/statline.h" -#include "wx/spinctrl.h" +#include "wx/minifram.h" +#include "wx/settings.h" #include "dialogs.h" #include "life.h" #include "game.h" + +// -------------------------------------------------------------------------- +// resources +// -------------------------------------------------------------------------- + +#include "bitmaps/life.xpm" + +// sample configurations +#include "samples.inc" + // -------------------------------------------------------------------------- // constants // -------------------------------------------------------------------------- @@ -48,21 +50,14 @@ enum { // listbox in samples dialog - ID_LISTBOX = 2001 + ID_LISTBOX }; -// sample configurations -#include "samples.inc" - // -------------------------------------------------------------------------- -// event tables and other macros for wxWindows +// event tables and other macros for wxWidgets // -------------------------------------------------------------------------- // Event tables -BEGIN_EVENT_TABLE(LifeNewGameDialog, wxDialog) - EVT_BUTTON (wxID_OK, LifeNewGameDialog::OnOK) -END_EVENT_TABLE() - BEGIN_EVENT_TABLE(LifeSamplesDialog, wxDialog) EVT_LISTBOX (ID_LISTBOX, LifeSamplesDialog::OnListBox) END_EVENT_TABLE() @@ -72,141 +67,147 @@ END_EVENT_TABLE() // implementation // ========================================================================== -// -------------------------------------------------------------------------- -// LifeNewGameDialog -// -------------------------------------------------------------------------- - -LifeNewGameDialog::LifeNewGameDialog(wxWindow *parent, int *w, int *h) - : wxDialog(parent, -1, - _("New game"), - wxDefaultPosition, - wxDefaultSize, - wxDEFAULT_DIALOG_STYLE | wxDIALOG_MODAL) -{ - m_w = w; - m_h = h; - - // spin ctrls - m_spinctrlw = new wxSpinCtrl( this, -1 ); - m_spinctrlw->SetValue(*m_w); - m_spinctrlw->SetRange(LIFE_MIN, LIFE_MAX); - - m_spinctrlh = new wxSpinCtrl( this, -1 ); - m_spinctrlh->SetValue(*m_h); - m_spinctrlh->SetRange(LIFE_MIN, LIFE_MAX); - - // component layout - wxBoxSizer *inputsizer1 = new wxBoxSizer( wxHORIZONTAL ); - inputsizer1->Add( new wxStaticText(this, -1, _("Width")), 1, wxCENTRE | wxLEFT, 20); - inputsizer1->Add( m_spinctrlw, 2, wxCENTRE | wxLEFT | wxRIGHT, 20 ); - - wxBoxSizer *inputsizer2 = new wxBoxSizer( wxHORIZONTAL ); - inputsizer2->Add( new wxStaticText(this, -1, _("Height")), 1, wxCENTRE | wxLEFT, 20); - inputsizer2->Add( m_spinctrlh, 2, wxCENTRE | wxLEFT | wxRIGHT, 20 ); - - wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL ); - topsizer->Add( CreateTextSizer(_("Enter board dimensions")), 0, wxALL, 10 ); - topsizer->Add( new wxStaticLine(this, -1), 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 10); - topsizer->Add( inputsizer1, 1, wxGROW | wxLEFT | wxRIGHT, 5 ); - topsizer->Add( inputsizer2, 1, wxGROW | wxLEFT | wxRIGHT, 5 ); - topsizer->Add( new wxStaticLine(this, -1), 0, wxGROW | wxLEFT | wxRIGHT | wxTOP, 10); - topsizer->Add( CreateButtonSizer(wxOK | wxCANCEL), 0, wxCENTRE | wxALL, 10); - - // activate - SetSizer(topsizer); - SetAutoLayout(TRUE); - topsizer->SetSizeHints(this); - topsizer->Fit(this); - Centre(wxBOTH); -} - -void LifeNewGameDialog::OnOK(wxCommandEvent& WXUNUSED(event)) -{ - *m_w = m_spinctrlw->GetValue(); - *m_h = m_spinctrlh->GetValue(); - - EndModal(wxID_OK); -} - // -------------------------------------------------------------------------- // LifeSamplesDialog // -------------------------------------------------------------------------- LifeSamplesDialog::LifeSamplesDialog(wxWindow *parent) - : wxDialog(parent, -1, - _("Sample games"), - wxDefaultPosition, - wxDefaultSize, - wxDEFAULT_DIALOG_STYLE | wxDIALOG_MODAL) + : wxDialog(parent, wxID_ANY, _("Sample games"), + wxDefaultPosition, wxDefaultSize) { m_value = 0; - + + wxSize listSize = wxDefaultSize; + bool isPDA = wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA; + + // Screens are generally horizontal in orientation, + // but PDAs are generally vertical. + bool screenIsHorizontal = true; + if (isPDA && + wxSystemSettings::GetMetric(wxSYS_SCREEN_X) < wxSystemSettings::GetMetric(wxSYS_SCREEN_Y)) + { + listSize = wxSize(wxDefaultCoord, 50); + screenIsHorizontal = false; + } + // create and populate the list of available samples m_list = new wxListBox( this, ID_LISTBOX, wxDefaultPosition, - wxDefaultSize, + listSize, 0, NULL, wxLB_SINGLE | wxLB_NEEDED_SB | wxLB_HSCROLL ); - for (unsigned i = 0; i < (sizeof(g_shapes) / sizeof(LifeShape)); i++) - m_list->Append(g_shapes[i].m_name); + for (unsigned i = 0; i < (sizeof(g_patterns) / sizeof(LifePattern)); i++) + m_list->Append(g_patterns[i].m_name); // descriptions - wxStaticBox *statbox = new wxStaticBox( this, -1, _("Description")); - m_life = new Life( 16, 16 ); - m_life->SetShape(g_shapes[0]); - m_canvas = new LifeCanvas( this, m_life, FALSE ); - m_text = new wxTextCtrl( this, -1, - g_shapes[0].m_desc, + wxStaticBox *statbox = new wxStaticBox( this, wxID_ANY, _("Description")); + m_life = new Life(); + m_life->SetPattern(g_patterns[0]); + m_canvas = new LifeCanvas( this, m_life, false ); + m_text = new wxTextCtrl( this, wxID_ANY, + g_patterns[0].m_description, wxDefaultPosition, wxSize(300, 60), wxTE_MULTILINE | wxTE_READONLY); // layout components + wxStaticBoxSizer *sizer1 = new wxStaticBoxSizer( statbox, wxVERTICAL ); - sizer1->Add( m_canvas, 2, wxGROW | wxCENTRE | wxALL, 5); - sizer1->Add( m_text, 1, wxGROW | wxCENTRE | wxALL, 5 ); + sizer1->Add( m_canvas, 2, wxGROW | wxALL, 5); + sizer1->Add( m_text, 1, wxGROW | wxALL, 5 ); - wxBoxSizer *sizer2 = new wxBoxSizer( wxHORIZONTAL ); - sizer2->Add( m_list, 0, wxGROW | wxCENTRE | wxALL, 5 ); - sizer2->Add( sizer1, 1, wxGROW | wxCENTRE | wxALL, 5 ); + wxBoxSizer *sizer2 = new wxBoxSizer( screenIsHorizontal ? wxHORIZONTAL : wxVERTICAL ); + sizer2->Add( m_list, 0, wxGROW | wxALL, 5 ); + sizer2->Add( sizer1, 1, wxGROW | wxALL, 5 ); wxBoxSizer *sizer3 = new wxBoxSizer( wxVERTICAL ); - sizer3->Add( CreateTextSizer(_("Select one configuration")), 0, wxALL, 10 ); - sizer3->Add( new wxStaticLine(this, -1), 0, wxGROW | wxLEFT | wxRIGHT, 10 ); - sizer3->Add( sizer2, 1, wxGROW | wxCENTRE | wxALL, 5 ); - sizer3->Add( new wxStaticLine(this, -1), 0, wxGROW | wxLEFT | wxRIGHT, 10 ); - sizer3->Add( CreateButtonSizer(wxOK | wxCANCEL), 0, wxCENTRE | wxALL, 10 ); + sizer3->Add( CreateTextSizer(_("Select a configuration")), 0, wxALL|wxCENTRE, isPDA ? 2 : 10 ); +#if wxUSE_STATLINE + if (!isPDA) + sizer3->Add( new wxStaticLine(this, wxID_ANY), 0, wxGROW | wxLEFT | wxRIGHT, 10 ); +#endif // wxUSE_STATLINE + sizer3->Add( sizer2, 1, wxGROW | wxALL, 5 ); + + wxSizer *sizerBtns = CreateButtonSizer(wxOK|wxCANCEL); + if ( sizerBtns ) + { + sizer3->Add(sizerBtns, wxSizerFlags().Expand().Border()); + } // activate SetSizer(sizer3); - SetAutoLayout(TRUE); +#if !defined(__SMARTPHONE__) && !defined(__POCKETPC__) sizer3->SetSizeHints(this); sizer3->Fit(this); - Centre(wxBOTH); + Centre(wxBOTH | wxCENTRE_ON_SCREEN); +#endif } LifeSamplesDialog::~LifeSamplesDialog() { m_canvas->Destroy(); - delete m_life; } -int LifeSamplesDialog::GetValue() +const LifePattern& LifeSamplesDialog::GetPattern() { - return m_value; + return g_patterns[m_value]; } void LifeSamplesDialog::OnListBox(wxCommandEvent& event) { - if (event.GetSelection() != -1) + int sel = event.GetSelection(); + + if (sel != -1) { m_value = m_list->GetSelection(); - m_text->SetValue(g_shapes[ event.GetSelection() ].m_desc); - m_life->SetShape(g_shapes[ event.GetSelection() ]); - - m_canvas->DrawEverything(TRUE); // force redraw everything - m_canvas->Refresh(FALSE); // do not erase background + m_text->SetValue(g_patterns[ sel ].m_description); + m_life->SetPattern(g_patterns[ sel ]); + + // these values shouldn't be hardcoded... + if ((size_t)sel < (sizeof(g_patterns) / sizeof(LifePattern)) - 3) + m_canvas->SetCellSize(8); + else + m_canvas->SetCellSize(2); } } +// -------------------------------------------------------------------------- +// LifeAboutDialog +// -------------------------------------------------------------------------- + +LifeAboutDialog::LifeAboutDialog(wxWindow *parent) + : wxDialog(parent, wxID_ANY, _("About Life!"), + wxDefaultPosition, wxDefaultSize) +{ + // logo + wxStaticBitmap *sbmp = new wxStaticBitmap(this, wxID_ANY, wxBitmap(life_xpm)); + + // layout components + wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); + sizer->Add( sbmp, 0, wxCENTRE | wxALL, 10 ); +#if wxUSE_STATLINE + sizer->Add( new wxStaticLine(this, wxID_ANY), 0, wxGROW | wxLEFT | wxRIGHT, 5 ); +#endif // wxUSE_STATLINE + sizer->Add( CreateTextSizer(_("Life! version 2.2 for wxWidgets\n\n\ +(c) 2000 Guillermo Rodriguez Garcia\n\n\ +\n\n\ +Portions of the code are based in XLife;\n\ +XLife is (c) 1989 by Jon Bennett et al.")), + 0, wxCENTRE | wxRIGHT|wxLEFT|wxTOP, 20 ); + + // buttons if any + wxSizer *sizerBtns = CreateButtonSizer(wxOK); + if ( sizerBtns ) + { + sizer->Add(sizerBtns, wxSizerFlags().Expand().Border()); + } + + // activate + SetSizer(sizer); +#if !defined(__SMARTPHONE__) && !defined(__POCKETPC__) + sizer->SetSizeHints(this); + sizer->Fit(this); + Centre(wxBOTH | wxCENTRE_ON_SCREEN); +#endif +}