X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ee710d75b89a7b172389c67267c7737952f0ba5c..89b3361ec25cf1e6d255b14c7633d8375646e4fb:/demos/life/life.cpp diff --git a/demos/life/life.cpp b/demos/life/life.cpp index cd6c32d693..39d74b2d2f 100644 --- a/demos/life/life.cpp +++ b/demos/life/life.cpp @@ -13,10 +13,6 @@ // headers, declarations, constants // ========================================================================== -#ifdef __GNUG__ - #pragma implementation "life.h" -#endif - // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" @@ -31,6 +27,7 @@ #include "wx/statline.h" #include "wx/wfstream.h" #include "wx/filedlg.h" +#include "wx/stockitem.h" #include "life.h" #include "game.h" @@ -41,7 +38,7 @@ // resources // -------------------------------------------------------------------------- -#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__) +#ifndef wxHAS_IMAGES_IN_RESOURCES // application icon #include "mondrian.xpm" @@ -67,7 +64,7 @@ // -------------------------------------------------------------------------- // IDs for the controls and the menu commands. Exluding those already defined -// by wxWindows, such as wxID_NEW. +// by wxWidgets, such as wxID_NEW. enum { // timer @@ -84,14 +81,11 @@ enum ID_SOUTH, ID_EAST, ID_WEST, - ID_ZOOMIN, - ID_ZOOMOUT, ID_INFO, // game menu ID_START, ID_STEP, - ID_STOP, ID_TOPSPEED, // speed selection slider @@ -99,33 +93,35 @@ enum }; // -------------------------------------------------------------------------- -// event tables and other macros for wxWindows +// event tables and other macros for wxWidgets // -------------------------------------------------------------------------- // Event tables BEGIN_EVENT_TABLE(LifeFrame, wxFrame) - EVT_MENU (wxID_NEW, LifeFrame::OnMenu) - EVT_MENU (wxID_OPEN, LifeFrame::OnOpen) - EVT_MENU (ID_SAMPLES, LifeFrame::OnSamples) - EVT_MENU (wxID_ABOUT, LifeFrame::OnMenu) - EVT_MENU (wxID_EXIT, LifeFrame::OnMenu) - EVT_MENU (ID_SHOWNAV, LifeFrame::OnMenu) - EVT_MENU (ID_ORIGIN, LifeFrame::OnNavigate) - EVT_BUTTON (ID_CENTER, LifeFrame::OnNavigate) - EVT_BUTTON (ID_NORTH, LifeFrame::OnNavigate) - EVT_BUTTON (ID_SOUTH, LifeFrame::OnNavigate) - EVT_BUTTON (ID_EAST, LifeFrame::OnNavigate) - EVT_BUTTON (ID_WEST, LifeFrame::OnNavigate) - EVT_MENU (ID_ZOOMIN, LifeFrame::OnZoom) - EVT_MENU (ID_ZOOMOUT, LifeFrame::OnZoom) - EVT_MENU (ID_INFO, LifeFrame::OnMenu) - EVT_MENU (ID_START, LifeFrame::OnMenu) - EVT_MENU (ID_STEP, LifeFrame::OnMenu) - EVT_MENU (ID_STOP, LifeFrame::OnMenu) - EVT_MENU (ID_TOPSPEED, LifeFrame::OnMenu) - EVT_COMMAND_SCROLL (ID_SLIDER, LifeFrame::OnSlider) - EVT_TIMER (ID_TIMER, LifeFrame::OnTimer) - EVT_CLOSE ( LifeFrame::OnClose) + EVT_MENU (wxID_NEW, LifeFrame::OnMenu) +#if wxUSE_FILEDLG + EVT_MENU (wxID_OPEN, LifeFrame::OnOpen) +#endif + EVT_MENU (ID_SAMPLES, LifeFrame::OnSamples) + EVT_MENU (wxID_ABOUT, LifeFrame::OnMenu) + EVT_MENU (wxID_EXIT, LifeFrame::OnMenu) + EVT_MENU (ID_SHOWNAV, LifeFrame::OnMenu) + EVT_MENU (ID_ORIGIN, LifeFrame::OnNavigate) + EVT_BUTTON (ID_CENTER, LifeFrame::OnNavigate) + EVT_BUTTON (ID_NORTH, LifeFrame::OnNavigate) + EVT_BUTTON (ID_SOUTH, LifeFrame::OnNavigate) + EVT_BUTTON (ID_EAST, LifeFrame::OnNavigate) + EVT_BUTTON (ID_WEST, LifeFrame::OnNavigate) + EVT_MENU (wxID_ZOOM_IN, LifeFrame::OnZoom) + EVT_MENU (wxID_ZOOM_OUT,LifeFrame::OnZoom) + EVT_MENU (ID_INFO, LifeFrame::OnMenu) + EVT_MENU (ID_START, LifeFrame::OnMenu) + EVT_MENU (ID_STEP, LifeFrame::OnMenu) + EVT_MENU (wxID_STOP, LifeFrame::OnMenu) + EVT_MENU (ID_TOPSPEED, LifeFrame::OnMenu) + EVT_COMMAND_SCROLL (ID_SLIDER, LifeFrame::OnSlider) + EVT_TIMER (ID_TIMER, LifeFrame::OnTimer) + EVT_CLOSE ( LifeFrame::OnClose) END_EVENT_TABLE() BEGIN_EVENT_TABLE(LifeNavigator, wxMiniFrame) @@ -154,7 +150,7 @@ IMPLEMENT_APP(LifeApp) // some shortcuts #define ADD_TOOL(id, bmp, tooltip, help) \ - toolBar->AddTool(id, bmp, wxNullBitmap, false, -1, -1, (wxObject *)0, tooltip, help) + toolBar->AddTool(id, wxEmptyString, bmp, wxNullBitmap, wxITEM_NORMAL, tooltip, help) // -------------------------------------------------------------------------- @@ -167,9 +163,8 @@ bool LifeApp::OnInit() // create the main application window LifeFrame *frame = new LifeFrame(); - // show it and tell the application that it's our main window + // show it frame->Show(true); - SetTopWindow(frame); // just for Motif #ifdef __WXMOTIF__ @@ -185,8 +180,9 @@ bool LifeApp::OnInit() // -------------------------------------------------------------------------- // frame constructor -LifeFrame::LifeFrame() : wxFrame( (wxFrame *) NULL, wxID_ANY, - _("Life!"), wxPoint(200, 200) ) +LifeFrame::LifeFrame() : + wxFrame( (wxFrame *) NULL, wxID_ANY, _("Life!"), wxDefaultPosition ), + m_navigator(NULL) { // frame icon SetIcon(wxICON(mondrian)); @@ -197,15 +193,20 @@ LifeFrame::LifeFrame() : wxFrame( (wxFrame *) NULL, wxID_ANY, wxMenu *menuGame = new wxMenu(wxMENU_TEAROFF); wxMenu *menuHelp = new wxMenu(wxMENU_TEAROFF); - menuFile->Append(wxID_NEW, _("&New"), _("Start a new game")); - menuFile->Append(wxID_OPEN, _("&Open..."), _("Open an existing Life pattern")); + menuFile->Append(wxID_NEW, wxEmptyString, _("Start a new game")); +#if wxUSE_FILEDLG + menuFile->Append(wxID_OPEN, wxEmptyString, _("Open an existing Life pattern")); +#endif menuFile->Append(ID_SAMPLES, _("&Sample game..."), _("Select a sample configuration")); +#if ! (defined(__SMARTPHONE__) || defined(__POCKETPC__)) menuFile->AppendSeparator(); - menuFile->Append(wxID_EXIT, _("E&xit\tAlt-X"), _("Quit this program")); + menuFile->Append(wxID_EXIT); menuView->Append(ID_SHOWNAV, _("Navigation &toolbox"), _("Show or hide toolbox"), wxITEM_CHECK); menuView->Check(ID_SHOWNAV, true); menuView->AppendSeparator(); +#endif + menuView->Append(ID_ORIGIN, _("&Absolute origin"), _("Go to (0, 0)")); menuView->Append(ID_CENTER, _("&Center of mass"), _("Find center of mass")); menuView->Append(ID_NORTH, _("&North"), _("Find northernmost cell")); @@ -213,14 +214,14 @@ LifeFrame::LifeFrame() : wxFrame( (wxFrame *) NULL, wxID_ANY, menuView->Append(ID_EAST, _("&East"), _("Find easternmost cell")); menuView->Append(ID_WEST, _("&West"), _("Find westernmost cell")); menuView->AppendSeparator(); - menuView->Append(ID_ZOOMIN, _("Zoom &in\tCtrl-I"), _("Zoom in")); - menuView->Append(ID_ZOOMOUT, _("Zoom &out\tCtrl-O"), _("Zoom out")); + menuView->Append(wxID_ZOOM_IN, wxEmptyString, _("Zoom in")); + menuView->Append(wxID_ZOOM_OUT, wxEmptyString, _("Zoom out")); menuView->Append(ID_INFO, _("&Description\tCtrl-D"), _("View pattern description")); menuGame->Append(ID_START, _("&Start\tCtrl-S"), _("Start")); menuGame->Append(ID_STEP, _("&Next\tCtrl-N"), _("Single step")); - menuGame->Append(ID_STOP, _("S&top\tCtrl-T"), _("Stop")); - menuGame->Enable(ID_STOP, false); + menuGame->Append(wxID_STOP, wxEmptyString, _("Stop")); + menuGame->Enable(wxID_STOP, false); menuGame->AppendSeparator(); menuGame->Append(ID_TOPSPEED, _("T&op speed!"), _("Go as fast as possible")); @@ -248,22 +249,29 @@ LifeFrame::LifeFrame() : wxFrame( (wxFrame *) NULL, wxID_ANY, toolBar->SetMargins(5, 5); toolBar->SetToolBitmapSize(wxSize(16, 16)); - ADD_TOOL(wxID_NEW, tbBitmaps[0], _("New"), _("Start a new game")); - ADD_TOOL(wxID_OPEN, tbBitmaps[1], _("Open"), _("Open an existing Life pattern")); + ADD_TOOL(wxID_NEW, tbBitmaps[0], wxGetStockLabel(wxID_NEW, wxSTOCK_NOFLAGS), _("Start a new game")); +#ifndef __POCKETPC__ +#if wxUSE_FILEDLG + ADD_TOOL(wxID_OPEN, tbBitmaps[1], wxGetStockLabel(wxID_OPEN, wxSTOCK_NOFLAGS), _("Open an existing Life pattern")); +#endif // wxUSE_FILEDLG + toolBar->AddSeparator(); - ADD_TOOL(ID_ZOOMIN, tbBitmaps[2], _("Zoom in"), _("Zoom in")); - ADD_TOOL(ID_ZOOMOUT, tbBitmaps[3], _("Zoom out"), _("Zoom out")); + ADD_TOOL(wxID_ZOOM_IN, tbBitmaps[2], wxGetStockLabel(wxID_ZOOM_IN, wxSTOCK_NOFLAGS), _("Zoom in")); + ADD_TOOL(wxID_ZOOM_OUT, tbBitmaps[3], wxGetStockLabel(wxID_ZOOM_OUT, wxSTOCK_NOFLAGS), _("Zoom out")); ADD_TOOL(ID_INFO, tbBitmaps[4], _("Description"), _("Show description")); toolBar->AddSeparator(); +#endif // __POCKETPC__ ADD_TOOL(ID_START, tbBitmaps[5], _("Start"), _("Start")); - ADD_TOOL(ID_STOP, tbBitmaps[6], _("Stop"), _("Stop")); + ADD_TOOL(wxID_STOP, tbBitmaps[6], _("Stop"), _("Stop")); toolBar->Realize(); - toolBar->EnableTool(ID_STOP, false); // must be after Realize() ! + toolBar->EnableTool(wxID_STOP, false); // must be after Realize() ! +#if wxUSE_STATUSBAR // status bar CreateStatusBar(2); SetStatusText(_("Welcome to Life!")); +#endif // wxUSE_STATUSBAR // game and timer m_life = new Life(); @@ -294,7 +302,7 @@ LifeFrame::LifeFrame() : wxFrame( (wxFrame *) NULL, wxID_ANY, wxSlider *slider = new wxSlider(panel2, ID_SLIDER, 5, 1, 10, wxDefaultPosition, - wxSize(200, -1), + wxSize(200, wxDefaultCoord), wxSL_HORIZONTAL | wxSL_AUTOTICKS); UpdateInfoText(); @@ -304,9 +312,13 @@ LifeFrame::LifeFrame() : wxFrame( (wxFrame *) NULL, wxID_ANY, wxBoxSizer *sizer2 = new wxBoxSizer(wxVERTICAL); wxBoxSizer *sizer3 = new wxBoxSizer(wxVERTICAL); +#if wxUSE_STATLINE sizer1->Add( new wxStaticLine(panel1, wxID_ANY), 0, wxGROW ); +#endif // wxUSE_STATLINE sizer1->Add( m_canvas, 1, wxGROW | wxALL, 2 ); +#if wxUSE_STATLINE sizer1->Add( new wxStaticLine(panel1, wxID_ANY), 0, wxGROW ); +#endif // wxUSE_STATLINE panel1->SetSizer( sizer1 ); sizer1->Fit( panel1 ); @@ -319,13 +331,17 @@ LifeFrame::LifeFrame() : wxFrame( (wxFrame *) NULL, wxID_ANY, sizer3->Add( panel1, 1, wxGROW ); sizer3->Add( panel2, 0, wxGROW ); SetSizer( sizer3 ); + +#ifndef __WXWINCE__ sizer3->Fit( this ); // set minimum frame size sizer3->SetSizeHints( this ); - // navigator frame + // navigator frame - not appropriate for small devices m_navigator = new LifeNavigator(this); +#endif + } LifeFrame::~LifeFrame() @@ -337,10 +353,10 @@ void LifeFrame::UpdateInfoText() { wxString msg; - msg.Printf(_(" Generation: %u (T: %u ms), Population: %u "), + msg.Printf(_(" Generation: %lu (T: %lu ms), Population: %lu "), m_tics, m_topspeed? 0 : m_interval, - m_life->GetNumCells()); + static_cast(m_life->GetNumCells())); m_text->SetLabel(msg); } @@ -351,18 +367,18 @@ void LifeFrame::UpdateUI() { // start / stop GetToolBar()->EnableTool(ID_START, !m_running); - GetToolBar()->EnableTool(ID_STOP, m_running); + GetToolBar()->EnableTool(wxID_STOP, m_running); GetMenuBar()->Enable(ID_START, !m_running); GetMenuBar()->Enable(ID_STEP, !m_running); - GetMenuBar()->Enable(ID_STOP, m_running); + GetMenuBar()->Enable(wxID_STOP, m_running); GetMenuBar()->Enable(ID_TOPSPEED, !m_topspeed); // zooming int cellsize = m_canvas->GetCellSize(); - GetToolBar()->EnableTool(ID_ZOOMIN, cellsize < 32); - GetToolBar()->EnableTool(ID_ZOOMOUT, cellsize > 1); - GetMenuBar()->Enable(ID_ZOOMIN, cellsize < 32); - GetMenuBar()->Enable(ID_ZOOMOUT, cellsize > 1); + GetToolBar()->EnableTool(wxID_ZOOM_IN, cellsize < 32); + GetToolBar()->EnableTool(wxID_ZOOM_OUT, cellsize > 1); + GetMenuBar()->Enable(wxID_ZOOM_IN, cellsize < 32); + GetMenuBar()->Enable(wxID_ZOOM_OUT, cellsize > 1); } // Event handlers ----------------------------------------------------------- @@ -397,14 +413,15 @@ void LifeFrame::OnMenu(wxCommandEvent& event) case ID_SHOWNAV: { bool checked = GetMenuBar()->GetMenu(1)->IsChecked(ID_SHOWNAV); - m_navigator->Show(checked); + if (m_navigator) + m_navigator->Show(checked); break; } case ID_INFO: { wxString desc = m_life->GetDescription(); - if ( desc.IsEmpty() ) + if ( desc.empty() ) desc = _("Not available"); // should we make the description editable here? @@ -414,7 +431,7 @@ void LifeFrame::OnMenu(wxCommandEvent& event) } case ID_START : OnStart(); break; case ID_STEP : OnStep(); break; - case ID_STOP : OnStop(); break; + case wxID_STOP : OnStop(); break; case ID_TOPSPEED: { m_running = true; @@ -430,6 +447,7 @@ void LifeFrame::OnMenu(wxCommandEvent& event) } } +#if wxUSE_FILEDLG void LifeFrame::OnOpen(wxCommandEvent& WXUNUSED(event)) { wxFileDialog filedlg(this, @@ -437,7 +455,7 @@ void LifeFrame::OnOpen(wxCommandEvent& WXUNUSED(event)) wxEmptyString, wxEmptyString, _("Life patterns (*.lif)|*.lif|All files (*.*)|*.*"), - wxOPEN | wxFILE_MUST_EXIST); + wxFD_OPEN | wxFD_FILE_MUST_EXIST); if (filedlg.ShowModal() == wxID_OK) { @@ -459,6 +477,7 @@ void LifeFrame::OnOpen(wxCommandEvent& WXUNUSED(event)) } } } +#endif void LifeFrame::OnSamples(wxCommandEvent& WXUNUSED(event)) { @@ -487,12 +506,12 @@ void LifeFrame::OnZoom(wxCommandEvent& event) { int cellsize = m_canvas->GetCellSize(); - if ((event.GetId() == ID_ZOOMIN) && cellsize < 32) + if ((event.GetId() == wxID_ZOOM_IN) && cellsize < 32) { m_canvas->SetCellSize(cellsize * 2); UpdateUI(); } - else if ((event.GetId() == ID_ZOOMOUT) && cellsize > 1) + else if ((event.GetId() == wxID_ZOOM_OUT) && cellsize > 1) { m_canvas->SetCellSize(cellsize / 2); UpdateUI(); @@ -673,7 +692,13 @@ void LifeNavigator::OnClose(wxCloseEvent& event) // canvas constructor LifeCanvas::LifeCanvas(wxWindow *parent, Life *life, bool interactive) : wxWindow(parent, wxID_ANY, wxDefaultPosition, wxSize(100, 100), - wxSUNKEN_BORDER|wxFULL_REPAINT_ON_RESIZE) + wxFULL_REPAINT_ON_RESIZE | wxHSCROLL | wxVSCROLL +#if !defined(__SMARTPHONE__) && !defined(__POCKETPC__) + |wxSUNKEN_BORDER +#else + |wxSIMPLE_BORDER +#endif + ) { m_life = life; m_interactive = interactive; @@ -745,9 +770,7 @@ void LifeCanvas::DrawCell(wxInt32 i, wxInt32 j, bool alive) dc.SetPen(alive? *wxBLACK_PEN : *wxWHITE_PEN); dc.SetBrush(alive? *wxBLACK_BRUSH : *wxWHITE_BRUSH); - dc.BeginDrawing(); DrawCell(i, j, dc); - dc.EndDrawing(); } void LifeCanvas::DrawCell(wxInt32 i, wxInt32 j, wxDC &dc) @@ -784,8 +807,6 @@ void LifeCanvas::DrawChanged() m_viewportY + m_viewportH, true); - dc.BeginDrawing(); - if (m_cellsize == 1) { dc.SetPen(*wxBLACK_PEN); @@ -804,7 +825,6 @@ void LifeCanvas::DrawChanged() for (size_t m = 0; m < ncells; m++) DrawCell(cells[m].i, cells[m].j, dc); } - dc.EndDrawing(); } // event handlers @@ -833,7 +853,6 @@ void LifeCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) bool done = m_life->FindMore(&cells, &ncells); // erase all damaged cells and draw the grid - dc.BeginDrawing(); dc.SetBrush(*wxWHITE_BRUSH); if (m_cellsize <= 2) @@ -871,8 +890,6 @@ void LifeCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) // last set for (size_t m = 0; m < ncells; m++) DrawCell(cells[m].i, cells[m].j, dc); - - dc.EndDrawing(); } void LifeCanvas::OnMouse(wxMouseEvent& event) @@ -884,10 +901,12 @@ void LifeCanvas::OnMouse(wxMouseEvent& event) wxInt32 i = XToCell( event.GetX() ); wxInt32 j = YToCell( event.GetY() ); +#if wxUSE_STATUSBAR // set statusbar text wxString msg; msg.Printf(_("Cell: (%d, %d)"), i, j); ((LifeFrame *) wxGetApp().GetTopWindow())->SetStatusText(msg, 1); +#endif // wxUSE_STATUSBAR // NOTE that wxMouseEvent::LeftDown() and wxMouseEvent::LeftIsDown() // have different semantics. The first one is used to signal that the @@ -923,7 +942,6 @@ void LifeCanvas::OnMouse(wxMouseEvent& event) wxClientDC dc(this); dc.SetPen(alive? *wxBLACK_PEN : *wxWHITE_PEN); dc.SetBrush(alive? *wxBLACK_BRUSH : *wxWHITE_BRUSH); - dc.BeginDrawing(); // draw a line of cells using Bresenham's algorithm wxInt32 d, ii, jj, di, ai, si, dj, aj, sj; @@ -979,8 +997,6 @@ void LifeCanvas::OnMouse(wxMouseEvent& event) DrawCell(ii, jj, dc); m_mi = ii; m_mj = jj; - - dc.EndDrawing(); } ((LifeFrame *) wxGetApp().GetTopWindow())->UpdateInfoText(); @@ -1017,7 +1033,7 @@ void LifeCanvas::OnSize(wxSizeEvent& event) void LifeCanvas::OnScroll(wxScrollWinEvent& event) { - WXTYPE type = event.GetEventType(); + WXTYPE type = (WXTYPE)event.GetEventType(); int pos = event.GetPosition(); int orient = event.GetOrientation(); @@ -1108,5 +1124,3 @@ void LifeCanvas::OnEraseBackground(wxEraseEvent& WXUNUSED(event)) { // do nothing. I just don't want the background to be erased, you know. } - -