1///////////////////////////////////////////////////////////////////////////// 2// Name: life.h 3// Purpose: The game of Life, created by J. H. Conway 4// Author: Guillermo Rodriguez Garcia, <guille@iies.es> 5// Modified by: 6// Created: Jan/2000 7// RCS-ID: $Id: life.h 41020 2006-09-05 20:47:48Z VZ $ 8// Copyright: (c) 2000, Guillermo Rodriguez Garcia 9// Licence: wxWindows licence 10///////////////////////////////////////////////////////////////////////////// 11 12#ifndef _LIFE_APP_H_ 13#define _LIFE_APP_H_ 14 15// for compilers that support precompilation, includes "wx/wx.h" 16#include "wx/wxprec.h" 17 18#ifdef __BORLANDC__ 19 #pragma hdrstop 20#endif 21 22// for all others, include the necessary headers 23#ifndef WX_PRECOMP 24 #include "wx/wx.h" 25#endif 26 27#include "wx/minifram.h" 28 29#include "game.h" 30 31 32// -------------------------------------------------------------------------- 33// LifeCanvas 34// -------------------------------------------------------------------------- 35 36// Note that in LifeCanvas, all cell coordinates are 37// named i, j, while screen coordinates are named x, y. 38 39class LifeCanvas : public wxWindow 40{ 41public: 42 // ctor and dtor 43 LifeCanvas(wxWindow* parent, Life* life, bool interactive = true); 44 virtual ~LifeCanvas(); 45 46 // view management 47 int GetCellSize() const { return m_cellsize; }; 48 void SetCellSize(int cellsize); 49 void Recenter(wxInt32 i, wxInt32 j); 50 51 // drawing 52 void DrawChanged(); 53 void DrawCell(wxInt32 i, wxInt32 j, bool alive); 54 55private: 56 // any class wishing to process wxWidgets events must use this macro 57 DECLARE_EVENT_TABLE() 58 59 // draw a cell (parametrized by DC) 60 void DrawCell(wxInt32 i, wxInt32 j, wxDC &dc); 61 62 // event handlers 63 void OnPaint(wxPaintEvent& event); 64 void OnMouse(wxMouseEvent& event); 65 void OnSize(wxSizeEvent& event); 66 void OnScroll(wxScrollWinEvent& event); 67 void OnEraseBackground(wxEraseEvent& event); 68 69 // conversion between cell and screen coordinates 70 inline wxInt32 XToCell(wxCoord x) const { return (x / m_cellsize) + m_viewportX; }; 71 inline wxInt32 YToCell(wxCoord y) const { return (y / m_cellsize) + m_viewportY; }; 72 inline wxCoord CellToX(wxInt32 i) const { return (i - m_viewportX) * m_cellsize; }; 73 inline wxCoord CellToY(wxInt32 j) const { return (j - m_viewportY) * m_cellsize; }; 74 75 // what is the user doing? 76 enum MouseStatus 77 { 78 MOUSE_NOACTION, 79 MOUSE_DRAWING, 80 MOUSE_ERASING 81 }; 82 83 Life *m_life; // Life object 84 int m_cellsize; // current cell size, in pixels 85 bool m_interactive; // is this canvas interactive? 86 MouseStatus m_status; // what is the user doing? 87 wxInt32 m_viewportX; // first visible cell (x coord) 88 wxInt32 m_viewportY; // first visible cell (y coord) 89 wxInt32 m_viewportW; // number of visible cells (w) 90 wxInt32 m_viewportH; // number of visible cells (h) 91 int m_thumbX; // horiz. scrollbar thumb position 92 int m_thumbY; // vert. scrollbar thumb position 93 wxInt32 m_mi, m_mj; // last mouse position 94}; 95 96 97// -------------------------------------------------------------------------- 98// LifeNavigator 99// -------------------------------------------------------------------------- 100 101class LifeNavigator : public wxMiniFrame 102{ 103public: 104 // ctor 105 LifeNavigator(wxWindow *parent); 106 107private: 108 // any class wishing to process wxWidgets events must use this macro 109 DECLARE_EVENT_TABLE() 110 111 // event handlers 112 void OnClose(wxCloseEvent& event); 113}; 114 115 116// -------------------------------------------------------------------------- 117// LifeFrame 118// -------------------------------------------------------------------------- 119 120class LifeFrame : public wxFrame 121{ 122public: 123 // ctor and dtor 124 LifeFrame(); 125 virtual ~LifeFrame(); 126 127 // member functions 128 void UpdateInfoText(); 129 void UpdateUI(); 130 131private: 132 // any class wishing to process wxWidgets events must use this macro 133 DECLARE_EVENT_TABLE() 134 135 // event handlers 136 void OnMenu(wxCommandEvent& event); 137 void OnOpen(wxCommandEvent& event); 138 void OnSamples(wxCommandEvent& event); 139 void OnNavigate(wxCommandEvent& event); 140 void OnZoom(wxCommandEvent& event); 141 void OnSlider(wxScrollEvent& event); 142 void OnTimer(wxTimerEvent& event); 143 void OnClose(wxCloseEvent& event); 144 145 // event handler helpers 146 void OnStart(); 147 void OnStop(); 148 void OnStep(); 149 150 Life *m_life; 151 LifeCanvas *m_canvas; 152 LifeNavigator *m_navigator; 153 wxStaticText *m_text; 154 wxTimer *m_timer; 155 bool m_running; 156 bool m_topspeed; 157 long m_interval; 158 long m_tics; 159}; 160 161 162// -------------------------------------------------------------------------- 163// LifeApp 164// -------------------------------------------------------------------------- 165 166class LifeApp : public wxApp 167{ 168public: 169 virtual bool OnInit(); 170}; 171 172#endif // _LIFE_APP_H_ 173