X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2480be69b159027a3673eee1a4fc4e16287d058d..efb35bebfacaffbf68123be0bff79d7bf0d2dee2:/demos/life/life.h?ds=sidebyside diff --git a/demos/life/life.h b/demos/life/life.h index 946e84838a..dd36aebe39 100644 --- a/demos/life/life.h +++ b/demos/life/life.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: life.h -// Purpose: The game of life, created by J. H. Conway +// Purpose: The game of Life, created by J. H. Conway // Author: Guillermo Rodriguez Garcia, // Modified by: // Created: Jan/2000 @@ -12,52 +12,55 @@ #ifndef _LIFE_APP_H_ #define _LIFE_APP_H_ -#ifdef __GNUG__ - #pragma interface "life.h" -#endif - -// for compilers that support precompilation, includes "wx/wx.h" -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - -// for all others, include the necessary headers -#ifndef WX_PRECOMP - #include "wx/wx.h" -#endif +#include "wx/minifram.h" #include "game.h" + // -------------------------------------------------------------------------- // LifeCanvas // -------------------------------------------------------------------------- -class LifeCanvas : public wxScrolledWindow +// Note that in LifeCanvas, all cell coordinates are +// named i, j, while screen coordinates are named x, y. + +class LifeCanvas : public wxWindow { public: // ctor and dtor - LifeCanvas(wxWindow* parent, Life* life, bool interactive = TRUE); - ~LifeCanvas(); + LifeCanvas(wxWindow* parent, Life* life, bool interactive = true); + virtual ~LifeCanvas(); - // member functions - void Reset(); - void DrawEverything(bool force = FALSE); - void DrawCell(Cell c); - void DrawCell(Cell c, wxDC &dc); - inline int CellToCoord(int i) const { return (i * m_cellsize); }; - inline int CoordToCell(int x) const { return ((x >= 0)? (x / m_cellsize) : -1); }; + // view management + int GetCellSize() const { return m_cellsize; }; + void SetCellSize(int cellsize); + void Recenter(wxInt32 i, wxInt32 j); + + // drawing + void DrawChanged(); + void DrawCell(wxInt32 i, wxInt32 j, bool alive); + +private: + // any class wishing to process wxWidgets events must use this macro + DECLARE_EVENT_TABLE() + + // draw a cell (parametrized by DC) + void DrawCell(wxInt32 i, wxInt32 j, wxDC &dc); // event handlers void OnPaint(wxPaintEvent& event); void OnMouse(wxMouseEvent& event); void OnSize(wxSizeEvent& event); + void OnScroll(wxScrollWinEvent& event); + void OnEraseBackground(wxEraseEvent& event); -private: - // any class wishing to process wxWindows events must use this macro - DECLARE_EVENT_TABLE() + // conversion between cell and screen coordinates + inline wxInt32 XToCell(wxCoord x) const { return (x / m_cellsize) + m_viewportX; }; + inline wxInt32 YToCell(wxCoord y) const { return (y / m_cellsize) + m_viewportY; }; + inline wxCoord CellToX(wxInt32 i) const { return (i - m_viewportX) * m_cellsize; }; + inline wxCoord CellToY(wxInt32 j) const { return (j - m_viewportY) * m_cellsize; }; + // what is the user doing? enum MouseStatus { MOUSE_NOACTION, @@ -65,28 +68,39 @@ private: MOUSE_ERASING }; - Life *m_life; - wxBitmap *m_bmp; - int m_height; - int m_width; - int m_cellsize; - wxCoord m_xoffset; - wxCoord m_yoffset; - MouseStatus m_status; - bool m_interactive; + Life *m_life; // Life object + int m_cellsize; // current cell size, in pixels + bool m_interactive; // is this canvas interactive? + MouseStatus m_status; // what is the user doing? + wxInt32 m_viewportX; // first visible cell (x coord) + wxInt32 m_viewportY; // first visible cell (y coord) + wxInt32 m_viewportW; // number of visible cells (w) + wxInt32 m_viewportH; // number of visible cells (h) + int m_thumbX; // horiz. scrollbar thumb position + int m_thumbY; // vert. scrollbar thumb position + wxInt32 m_mi, m_mj; // last mouse position }; + // -------------------------------------------------------------------------- -// LifeTimer +// LifeNavigator // -------------------------------------------------------------------------- -// Life timer -class LifeTimer : public wxTimer +class LifeNavigator : public wxMiniFrame { public: - void Notify(); + // ctor + LifeNavigator(wxWindow *parent); + +private: + // any class wishing to process wxWidgets events must use this macro + DECLARE_EVENT_TABLE() + + // event handlers + void OnClose(wxCloseEvent& event); }; + // -------------------------------------------------------------------------- // LifeFrame // -------------------------------------------------------------------------- @@ -96,33 +110,43 @@ class LifeFrame : public wxFrame public: // ctor and dtor LifeFrame(); - ~LifeFrame(); + virtual ~LifeFrame(); // member functions void UpdateInfoText(); + void UpdateUI(); + +private: + // any class wishing to process wxWidgets events must use this macro + DECLARE_EVENT_TABLE() // event handlers void OnMenu(wxCommandEvent& event); - void OnNewGame(wxCommandEvent& event); + void OnOpen(wxCommandEvent& event); void OnSamples(wxCommandEvent& event); - void OnStart(); - void OnStop(); - void OnTimer(); + void OnNavigate(wxCommandEvent& event); + void OnZoom(wxCommandEvent& event); void OnSlider(wxScrollEvent& event); + void OnTimer(wxTimerEvent& event); + void OnClose(wxCloseEvent& event); -private: - // any class wishing to process wxWindows events must use this macro - DECLARE_EVENT_TABLE() - - Life *m_life; - LifeTimer *m_timer; - LifeCanvas *m_canvas; - wxStaticText *m_text; - bool m_running; - long m_interval; - long m_tics; + // event handler helpers + void OnStart(); + void OnStop(); + void OnStep(); + + Life *m_life; + LifeCanvas *m_canvas; + LifeNavigator *m_navigator; + wxStaticText *m_text; + wxTimer *m_timer; + bool m_running; + bool m_topspeed; + long m_interval; + long m_tics; }; + // -------------------------------------------------------------------------- // LifeApp // --------------------------------------------------------------------------