]> git.saurik.com Git - wxWidgets.git/blobdiff - demos/life/life.h
Added wxFileHistory demo
[wxWidgets.git] / demos / life / life.h
index 946e84838a25445793a742101429bec9bda29f11..75cd4d23a1dc9e6deb39621ec01c794dc7d34cf6 100644 (file)
@@ -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, <guille@iies.es>
 // Modified by:
 // Created:     Jan/2000
     #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();
 
-    // 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 wxWindows 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 +84,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 wxWindows events must use this macro
+    DECLARE_EVENT_TABLE()
+
+    // event handlers
+    void OnClose(wxCloseEvent& event);
 };
 
+
 // --------------------------------------------------------------------------
 // LifeFrame
 // --------------------------------------------------------------------------
@@ -100,29 +130,39 @@ public:
 
     // member functions
     void UpdateInfoText();
+    void UpdateUI();
+
+private:
+    // any class wishing to process wxWindows 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
 // --------------------------------------------------------------------------