eliot-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Eliot-dev] eliot/wxwin auxframes.cc configdb.cc configdb.h...


From: eliot-dev
Subject: [Eliot-dev] eliot/wxwin auxframes.cc configdb.cc configdb.h...
Date: Mon, 26 Dec 2005 15:02:26 +0000

CVSROOT:        /cvsroot/eliot
Module name:    eliot
Branch:         
Changes by:     Antoine Fraboulet <address@hidden>      05/12/26 15:02:26

Modified files:
        wxwin          : auxframes.cc configdb.cc configdb.h gfxboard.cc 
                         gfxboard.h 

Log message:
        - new gfxboard class drawing with tiles

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/eliot/eliot/wxwin/auxframes.cc.diff?tr1=1.15&tr2=1.16&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/eliot/eliot/wxwin/configdb.cc.diff?tr1=1.6&tr2=1.7&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/eliot/eliot/wxwin/configdb.h.diff?tr1=1.5&tr2=1.6&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/eliot/eliot/wxwin/gfxboard.cc.diff?tr1=1.7&tr2=1.8&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/eliot/eliot/wxwin/gfxboard.h.diff?tr1=1.5&tr2=1.6&r1=text&r2=text

Patches:
Index: eliot/wxwin/auxframes.cc
diff -u eliot/wxwin/auxframes.cc:1.15 eliot/wxwin/auxframes.cc:1.16
--- eliot/wxwin/auxframes.cc:1.15       Sat Nov  5 17:33:06 2005
+++ eliot/wxwin/auxframes.cc    Mon Dec 26 15:02:26 2005
@@ -122,9 +122,9 @@
 BoardFrame::Refresh(refresh_t force)
 {
     if (force == REFRESH)
-        board->Refresh(BOARD_REFRESH);
+        board->Refresh(GfxBoard::BOARD_REFRESH);
     else
-        board->Refresh(BOARD_FORCE_REFRESH);
+        board->Refresh(GfxBoard::BOARD_FORCE_REFRESH);
 }
 
 /****************************************************************/
Index: eliot/wxwin/configdb.cc
diff -u eliot/wxwin/configdb.cc:1.6 eliot/wxwin/configdb.cc:1.7
--- eliot/wxwin/configdb.cc:1.6 Fri Nov  4 20:00:06 2005
+++ eliot/wxwin/configdb.cc     Mon Dec 26 15:02:26 2005
@@ -1,13 +1,14 @@
 /* Eliot                                                                     */
 /* Copyright (C) 1999  Antoine Fraboulet                                     */
-/* address@hidden                                                 */
 /*                                                                           */
-/* This program is free software; you can redistribute it and/or modify      */
+/* This file is part of Eliot.                                               */
+/*                                                                           */
+/* Eliot is free software; you can redistribute it and/or modify             */
 /* it under the terms of the GNU General Public License as published by      */
 /* the Free Software Foundation; either version 2 of the License, or         */
 /* (at your option) any later version.                                       */
 /*                                                                           */
-/* This program is distributed in the hope that it will be useful,           */
+/* Eliot is distributed in the hope that it will be useful,                  */
 /* but WITHOUT ANY WARRANTY; without even the implied warranty of            */
 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             */
 /* GNU General Public License for more details.                              */
@@ -16,6 +17,13 @@
 /* along with this program; if not, write to the Free Software               */
 /* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
*/
 
+/**
+ *  \file   configdb.cc
+ *  \brief  Access to Eliot persistant configuration data
+ *  \author Antoine Fraboulet
+ *  \date   2002
+ */
+
 #include <iostream>
 #include "ewx.h"
 #include "configdb.h"
@@ -456,7 +464,12 @@
 void ConfigDB::setFontDefault()
 {
   wxFont fsys;
+
+#ifdef WXWIN24
   fsys = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
+#else
+  fsys = wxSystemSettingsNative::GetFont(wxSYS_DEFAULT_GUI_FONT);
+#endif
 
   setFont(BOARDFONT ,fsys);
   setFont(LISTFONT  ,fsys);
@@ -502,6 +515,10 @@
 #define BACKDEF    wxColour(255,255,255)
 #define LETTDEF    wxColour(  0,  0,  0)
 #define TSTLETTDEF wxColour(  0,  0,  0)
+#define TILEDEF    wxColour(0xff,0xeb,0xcd)
+//#define TSTTILEDEF wxColour(0xff,0xe4,0xb5)
+//#define TSTTILEDEF wxColour(0x46,0x82,0xb4)
+#define TSTTILEDEF wxColour(0xbd,0xb7,0x7b)
 
 void ConfigDB::setColourDefault()
 {
@@ -512,6 +529,8 @@
   setColour(wxString(BCOLOURLX3),LX3DEF);
   setColour(wxString(BCOLOURBACKGROUND),BACKDEF);
   setColour(wxString(BCOLOURLETTERS),LETTDEF);
+  setColour(wxString(BTILEBACKGROUND),TILEDEF);
+  setColour(wxString(BTSTTILEBACKGROUND),TSTTILEDEF);
 }
 
 void
@@ -767,6 +786,20 @@
   return Read(key,(bool)FALSE);
 }
 
+void ConfigDB::setDrawTile(bool val)
+{
+  wxString key;
+  key = wxString(BDRAWBACKGROUND);
+  Write(key,val);
+}
+
+bool ConfigDB::getDrawTile()
+{
+  wxString key;
+  key = wxString(BDRAWBACKGROUND);
+  return Read(key,(bool)TRUE);
+}
+
 ////////////////////////////////////////////////////////
 //
 //
@@ -787,4 +820,3 @@
 
   Write(wxString(INIT),1L);
 }
-
Index: eliot/wxwin/configdb.h
diff -u eliot/wxwin/configdb.h:1.5 eliot/wxwin/configdb.h:1.6
--- eliot/wxwin/configdb.h:1.5  Fri Nov  4 20:00:06 2005
+++ eliot/wxwin/configdb.h      Mon Dec 26 15:02:26 2005
@@ -1,13 +1,14 @@
 /* Eliot                                                                     */
 /* Copyright (C) 1999  Antoine Fraboulet                                     */
-/* address@hidden                                                 */
 /*                                                                           */
-/* This program is free software; you can redistribute it and/or modify      */
+/* This file is part of Eliot.                                               */
+/*                                                                           */
+/* Eliot is free software; you can redistribute it and/or modify             */
 /* it under the terms of the GNU General Public License as published by      */
 /* the Free Software Foundation; either version 2 of the License, or         */
 /* (at your option) any later version.                                       */
 /*                                                                           */
-/* This program is distributed in the hope that it will be useful,           */
+/* Eliot is distributed in the hope that it will be useful,                  */
 /* but WITHOUT ANY WARRANTY; without even the implied warranty of            */
 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             */
 /* GNU General Public License for more details.                              */
@@ -16,7 +17,12 @@
 /* along with this program; if not, write to the Free Software               */
 /* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
*/
 
-// -*-C++-*-
+/**
+ *  \file   configdb.h
+ *  \brief  Access to Eliot persistant configuration data
+ *  \author Antoine Fraboulet
+ *  \date   2002
+ */
 
 #ifndef _CONFIGDB_H
 #define _CONFIGDB_H
@@ -30,19 +36,23 @@
 
 #define BUTTON_FONT wxFont(8,wxDEFAULT,wxNORMAL,wxNORMAL)
 
-#define BOARD             "Board"
-#define BCOLOURLINES      wxT(BOARD"/Lines")
-#define BCOLOURWX2        wxT(BOARD"/Wx2")
-#define BCOLOURWX3        wxT(BOARD"/Wx3")
-#define BCOLOURLX2        wxT(BOARD"/Lx2")
-#define BCOLOURLX3        wxT(BOARD"/Lx3")
-#define BCOLOURBACKGROUND wxT(BOARD"/Background")
-#define BCOLOURLETTERS    wxT(BOARD"/Letters")
-#define BCOLOURTSTLETTERS wxT(BOARD"/TstLetters")
-#define BOARDFONT         wxT(BOARD"/Font")
+#define BOARD              "Board"
+#define BCOLOURLINES       wxT(BOARD"/Lines")
+#define BCOLOURWX2         wxT(BOARD"/Wx2")
+#define BCOLOURWX3         wxT(BOARD"/Wx3")
+#define BCOLOURLX2         wxT(BOARD"/Lx2")
+#define BCOLOURLX3         wxT(BOARD"/Lx3")
+#define BCOLOURBACKGROUND  wxT(BOARD"/Background")
+#define BCOLOURLETTERS     wxT(BOARD"/Letters")
+#define BCOLOURTSTLETTERS  wxT(BOARD"/TstLetters")
+#define BOARDFONT          wxT(BOARD"/Font")
+
+#define BDRAWBACKGROUND    wxT(BOARD"/DrawTile")
+#define BTILEBACKGROUND    wxT(BOARD"/TileBG")
+#define BTSTTILEBACKGROUND wxT(BOARD"/TstTileBG")
 
-#define LIST              "List"
-#define LISTFONT          wxT(LIST"/Font")
+#define LIST               "List"
+#define LISTFONT           wxT(LIST"/Font")
 
 #define PRINT             "Print"
 #define PHEADER           PRINT"/Header"
@@ -58,6 +68,8 @@
 #define FRAMERACC         wxT(FRAME"Racc")
 #define FRAMEBENJ         wxT(FRAME"Benj")
 #define FRAMEBAG          wxT(FRAME"Bag")
+#define FRAMEGAME         wxT(FRAME"Game")
+#define FRAMERESULT       wxT(FRAME"Result")
 
 enum Justif { LEFT, CENTER, RIGHT };
 
@@ -160,11 +172,15 @@
   void setFrameShow(wxString,int);
   void setFrameDefault();
 
-  void setJokerPlus1(bool);
   void setRackChecking(bool);
-  bool getJokerPlus1();
   bool getRackChecking();
 
+  void setJokerPlus1(bool);
+  bool getJokerPlus1();
+
+  void setDrawTile(bool);
+  bool getDrawTile();
+
   float getPrintLineScale();
   void setPrintLineScale(float);
 
Index: eliot/wxwin/gfxboard.cc
diff -u eliot/wxwin/gfxboard.cc:1.7 eliot/wxwin/gfxboard.cc:1.8
--- eliot/wxwin/gfxboard.cc:1.7 Fri Nov  4 23:26:04 2005
+++ eliot/wxwin/gfxboard.cc     Mon Dec 26 15:02:26 2005
@@ -1,13 +1,14 @@
 /* Eliot                                                                     */
 /* Copyright (C) 1999  Antoine Fraboulet                                     */
-/* address@hidden                                                 */
 /*                                                                           */
-/* This program is free software; you can redistribute it and/or modify      */
+/* This file is part of Eliot.                                               */
+/*                                                                           */
+/* Eliot is free software; you can redistribute it and/or modify             */
 /* it under the terms of the GNU General Public License as published by      */
 /* the Free Software Foundation; either version 2 of the License, or         */
 /* (at your option) any later version.                                       */
 /*                                                                           */
-/* This program is distributed in the hope that it will be useful,           */
+/* Eliot is distributed in the hope that it will be useful,                  */
 /* but WITHOUT ANY WARRANTY; without even the implied warranty of            */
 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             */
 /* GNU General Public License for more details.                              */
@@ -16,6 +17,13 @@
 /* along with this program; if not, write to the Free Software               */
 /* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
*/
 
+/**
+ *  \file   gfxboard.cc
+ *  \brief  Game board graphical view
+ *  \author Antoine Fraboulet
+ *  \date   2002
+ */
+
 #include <string.h>
 #include <math.h>
 #include <ctype.h>
@@ -28,313 +36,423 @@
 #include "configdb.h"
 #include "gfxboard.h"
 
+#ifdef DEBUG_
+#   define GFXDEBUG(x) x
+#else
+#   define GFXDEBUG(x)
+#endif
 
 BEGIN_EVENT_TABLE(GfxBoard, wxWindow)
-  EVT_PAINT(GfxBoard::OnPaint)
-  EVT_SIZE(GfxBoard::OnSize)
+    EVT_PAINT(GfxBoard::OnPaint)
+    EVT_SIZE(GfxBoard::OnSize)
 END_EVENT_TABLE()
 
+#define LINE_WIDTH 1
+#define BOARD_SIZE (BOARD_DIM + 2)
 
-#define LINE_WIDTH 2
-#define BOARD_SIZE 17
-
+    /* ************************************************** */
+    /* ************************************************** */
 
 GfxBoard::GfxBoard(wxFrame *parent, Game &iGame) :
-    wxWindow(parent, -1), m_game(iGame)
+       wxWindow(parent, wxWindowID(-1), wxDefaultPosition, wxDefaultSize,
+                wxNO_BORDER | wxFULL_REPAINT_ON_RESIZE, wxT("gfxboard")),
+       m_game(iGame)
 {
-    bmp = NULL;
-    board_size = 0;
-    tile_size = 0;
-    memset(paintedboard_char,0,sizeof(paintedboard_char));
-    memset(paintedboard_attr,0,sizeof(paintedboard_attr));
+    bmp          = NULL;
+    board_size   = 0;
+    tile_size    = 0;
+#if defined(MSW_RESIZE_BUG)
+    just_resized = false;
+#endif
+    for(int i=0; i<BOARD_DIM; i++)
+       {
+           for(int j=0; j < BOARD_DIM; j++)
+               {
+                   paintedboard_char[i][j] = wxT(' ');
+                   paintedboard_attr[i][j] = 0;
+               }
+       }
 }
 
+    /* ************************************************** */
+    /* ************************************************** */
 
 GfxBoard::~GfxBoard(void)
 {
     if (bmp)
-    {
-        delete bmp;
-    }
+       {
+           delete bmp;
+           bmp = NULL;
+       }
 }
 
+/**
+ * Make new dimensions available for the next OnPaint
+ * event. The BMP is deleted if it exists.
+ */
 
 void
 GfxBoard::OnSize(wxSizeEvent& e)
 {
-  size = GetClientSize();
+    GFXDEBUG(std::cerr << "On size : ");
 
-  board_size = size.GetWidth() < size.GetHeight() ?
-    size.GetWidth() : size.GetHeight();
+    wxSize cs = GetClientSize();
+    board_size = cs.GetWidth() < cs.GetHeight() ? cs.GetWidth() : 
cs.GetHeight();
+    tile_size  = (int)((float)board_size / (float)(BOARD_SIZE)) - LINE_WIDTH;
 
-  tile_size = (int)((float)board_size / (float)(BOARD_SIZE)) - LINE_WIDTH;
+    GFXDEBUG(std::cerr << "(" << cs.GetWidth() << "," << cs.GetHeight() << 
")");
+    GFXDEBUG(std::cerr << " tile size " << tile_size << endl);
 
-  TopLeft  = wxPoint((size.GetWidth()  - (board_size - tile_size/2)) / 2,
-                    (size.GetHeight() - (board_size - tile_size/2)) / 2);
+    TopLeft  = wxPoint((cs.GetWidth()  - (board_size - tile_size/2)) / 2,
+                      (cs.GetHeight() - (board_size - tile_size/2)) / 2);
 
-  if (bmp)
-    {
-      delete bmp;
-      bmp = NULL;
-    }
+#if defined(MSW_RESIZE_BUG)
+    just_resized = true;
+#endif
+
+    if (bmp)
+       {
+           delete bmp;
+           bmp = NULL;
+       }
 }
 
+/**
+ * Creates a BMP in memory and draws the board inside
+ */
 
 void
 GfxBoard::CreateBMP()
 {
+    GFXDEBUG(std::cerr << "Create BMP ");
     if (!bmp)
-    {
-        wxSize bs = GetClientSize();
-        bmp=new wxBitmap(bs.x,bs.y);
-        if (bmp)
-        {
-            wxMemoryDC memDC;
-            memDC.SelectObject(* bmp);
-            DrawBoard(&memDC);
-            memDC.SelectObject(wxNullBitmap);
-        }
-    }
+       {
+           wxSize bs = GetClientSize();
+           bmp=new wxBitmap(bs.x,bs.y);
+           GFXDEBUG(std::cerr << " new bmp (" << bs.x << "," << bs.y << ")");
+           if (bmp)
+               {
+                   wxMemoryDC memDC;
+                   memDC.SelectObject(* bmp);
+                   DrawBoard(&memDC);
+                   memDC.SelectObject(wxNullBitmap);
+               }
+       }
+    GFXDEBUG(std::cerr << endl);
 }
 
 
+/**
+ * Update the full BMP and copy only the requested area
+ * to the ClientDC
+ */
+
+void
+GfxBoard::RefreshSquare(wxRect &r)
+{
+    wxClientDC dc(this);
+
+    if (bmp)
+       {
+           int vX,vY,vW,vH;
+           wxMemoryDC memDC;
+           memDC.SelectObject(* bmp);
+           DrawBoard(&memDC);
+           vX = r.x;
+           vY = r.y;
+           vW = r.width;
+           vH = r.height;
+           GFXDEBUG(std::cerr << " refresh (" << vX << "," << vY << "," << vW 
<< "," << vH << ") ");
+           dc.Blit(vX,vY,vW,vH,&memDC,vX,vY,wxCOPY);
+           memDC.SelectObject(wxNullBitmap);
+       }
+    else
+       {
+           DrawBoard(&dc);
+       }
+}
+
+/**
+ * Force a full refresh of the board
+ */
+
+void
+GfxBoard::Refresh(board_refresh_t WXUNUSED(force))
+{
+    wxSize cs = GetClientSize();
+    board_size = cs.GetWidth() < cs.GetHeight() ? cs.GetWidth() : 
cs.GetHeight();
+    tile_size  = (int)((float)board_size / (float)(BOARD_SIZE)) - LINE_WIDTH;
+    wxRect r (0,0,cs.GetWidth(),cs.GetHeight());
+    RefreshSquare(r);
+}
+
+/**
+ * Window manager OnPaint event handler.
+ */
+
 void
 GfxBoard::OnPaint(wxPaintEvent&)
 {
-  wxPaintDC dc(this);
+    wxPaintDC dc(this);
+
+    CreateBMP();
 
-  CreateBMP();
+    GFXDEBUG(std::cerr << "OnPaint : ");
+
+    if (bmp)
+       {
+#if defined(MSW_RESIZE_BUG)
+           Refresh(BOARD_FORCE_REFRESH);
+           if (just_resized == true)
+               {
+                   just_resized = false;
+               }
+#else
+           // we keep that code for wxgtk
+           // it does not work under wxmsw, don't know why
+           // all the onsize/repaint should be checked ... later
+           int vX,vY,vW,vH;
+           wxMemoryDC memDC;
+           memDC.SelectObject(* bmp);
+           wxRegionIterator upd(GetUpdateRegion());
+           while (upd)
+               {
+                   vX = upd.GetX();
+                   vY = upd.GetY();
+                   vW = upd.GetW();
+                   vH = upd.GetH();
+                   GFXDEBUG(std::cerr << "+(" << vX << "," << vY << "," << vW 
<< "," << vH << ")");
+                   dc.Blit(vX,vY,vW,vH,&memDC,vX,vY,wxCOPY);
+                   upd ++ ;
+               }
+           memDC.SelectObject(wxNullBitmap);
+#endif
+       }
+    else
+       {
+           GFXDEBUG(std::cerr << " call to DrawBoard ");
+           DrawBoard(&dc);
+       }
 
-  if (bmp)
-    {
-      int vX,vY,vW,vH;
-      wxMemoryDC memDC;
-      memDC.SelectObject(* bmp);
-      wxRegionIterator upd(GetUpdateRegion());
-
-      while (upd)
-       {
-         vX = upd.GetX();
-         vY = upd.GetY();
-         vW = upd.GetW();
-         vH = upd.GetH();
-         dc.Blit(vX,vY,vW,vH,&memDC,vX,vY,wxCOPY);
-         upd ++ ;
-       }
-
-      memDC.SelectObject(wxNullBitmap);
-    }
-  else
-    {
-      DrawBoard(&dc);
-    }
+    GFXDEBUG(std::cerr << "End of OnPaint" << endl);
 }
 
 
 void
-GfxBoard::Refresh(board_refresh_t force)
+GfxBoard::DrawTileBack(wxDC* dc, int top, int left, int size, bool testtile)
 {
-  wxClientDC dc(this);
+    //    void DrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, 
wxCoord height, double radius = 20)
+    wxBrush oldbrush = dc->GetBrush();
+    wxColour colBackground;
 
-  CreateBMP();
+    if (testtile)
+       {
+           colBackground = config.getColour(wxString(BTSTTILEBACKGROUND));
+       }
+    else
+       {
+           colBackground = config.getColour(wxString(BTILEBACKGROUND));
+       }
 
-  if (force == BOARD_FORCE_REFRESH)
-    {
-      if (bmp)
-       {
-         wxMemoryDC memDC;
-         memDC.SelectObject(* bmp);
-         DrawBoard(&memDC);
-         dc.Blit(0,0,board_size,board_size,&memDC,0,0,wxCOPY);
-         memDC.SelectObject(wxNullBitmap);
-       }
-      else
-       {
-         DrawBoard(&dc);
-       }
-      return;
-    }
-
-  if (bmp)
-    {
-      int vX,vY,vW,vH;
-      wxMemoryDC memDC;
-      memDC.SelectObject(* bmp);
-
-      DrawBoard(&memDC);
-      vX = (tile_size + LINE_WIDTH) * left;
-      vY = (tile_size + LINE_WIDTH) * top;
-      vW = (tile_size + 2*LINE_WIDTH) * (right - left + LINE_WIDTH);
-      vH = (tile_size + 2*LINE_WIDTH) * (bottom - top + LINE_WIDTH);
-
-      dc.Blit(vX,vY,vW,vH,&memDC,vX,vY,wxCOPY);
-
-      memDC.SelectObject(wxNullBitmap);
-    }
-  else
-    {
-      DrawBoard(&dc);
-    }
+    wxBrush *BackgroundBrush = 
wxTheBrushList->FindOrCreateBrush(colBackground, wxSOLID);
+    dc->SetBrush(* BackgroundBrush);
+    dc->DrawRoundedRectangle(left,top,size,size,std::max(2,size/6));
+    dc->SetBrush(oldbrush);
 }
 
+/**
+ * Draw a tile to the wxDC object.
+ */
+
+#define TILE_LEFT(col) (col*(tile_size+LINE_WIDTH) + TopLeft.x)
+#define TILE_TOP(row) (row*(tile_size+LINE_WIDTH) + TopLeft.y)
+
+/*
+   TODO
+   - ajuster avec une LINE_SIZE differente
+   - calculer la taille de la police
+*/
+
+/*    TILE_LEFT
+      |
+      |  TILE_LEFT + LINE_WIDTH
+      |  |
+      +++++++++-- TILE_TOP
+      +++++++++
+      +++++++++
+      +++   +++-------------- TILE_TOP + LINE_WIDTH
+      +++   +++ | = tile_size
+      +++   +++--
+      +++++++++--
+      +++++++++ | = LINE_WIDTH
+      +++++++++--
+      | |
+      |_|
+       |
+       LINE_WIDTH
+*/
 
 void
-GfxBoard::DrawTile(wxDC *dc, wxString& wxs, int row, int column)
+GfxBoard::DrawTile(wxDC *dc, wxString& wxs, int row, int column, bool 
testtile, bool drawtileback)
 {
-  int l;
-  char c = 0;
-  wxCoord width, height;
-  wxCoord posx, posy;
-
-  // redraw borders
-  if (row && column)
-    dc->DrawRectangle(column*(tile_size+LINE_WIDTH) + TopLeft.x,
-                     row*(tile_size+LINE_WIDTH)    + TopLeft.y,
-                     tile_size + 2*LINE_WIDTH,
-                     tile_size + 2*LINE_WIDTH);
-
-  //   const char* ptr = wxs.mb_str();
-  //   if (wxs.Len() && isalnum(*ptr))
-  //     {
-
-  const char* ptr = (const char*)wxs.c_str();
-  l = strlen(ptr);
-  if (ptr)
-    c = *ptr;
-
-  if (l > 0 && isalnum(c))
-    {
-      // we got a letter (or 2 chars for coordinates > 9)
-      dc->GetTextExtent(wxs,&width,&height);
-      posx = TopLeft.x + column*(tile_size+LINE_WIDTH) + LINE_WIDTH +
-       (tile_size - width) / 2;
-      posy = TopLeft.y +    row*(tile_size+LINE_WIDTH) + LINE_WIDTH +
-       (tile_size - height) / 2;
-      dc->DrawText(wxs,posx,posy);
-    }
+    wxColour colour;
+    wxCoord width, height;
+    wxCoord posx, posy;
+    wxCoord left,top;
+    // redraw borders
+    left = TILE_LEFT(column);
+    top  = TILE_TOP(row);
+
+    if (wxs.length() > 0 && *wxs.GetData())
+       {
+           // we got a letter (or 2 chars for coordinates > 9)
+           // draw plastic tile
+           if (drawtileback)
+               {
+                   DrawTileBack(dc,
+                                top  + LINE_WIDTH,
+                                left + LINE_WIDTH,
+                                tile_size, testtile);
+               }
+           // draw letter
+           if (testtile)
+               {
+                   colour = config.getColour(wxString(BCOLOURTSTLETTERS));
+               }
+           else
+               {
+                   colour = config.getColour(wxString(BCOLOURLETTERS));
+               }
+
+           dc->SetTextForeground(colour);
+           dc->GetTextExtent(wxs,&width,&height);
+           posx = left + LINE_WIDTH + (tile_size - width) / 2;
+           posy = top  + LINE_WIDTH + (tile_size - height) / 2;
+           dc->DrawText(wxs,posx,posy);
+       }
 }
 
+/**
+ * Draw the complete board in the wxDC.
+ */
 
 void
 GfxBoard::DrawBoard(wxDC *dc)
 {
-  wxString wxs;
-  int attr;
-  int row,column;
-
-  left = BOARD_MAX;
-  right = BOARD_MIN;
-  top = BOARD_MAX;
-  bottom = BOARD_MIN;
-
-  wxFont font = config.getFont(BOARDFONT);
-
-  wxColour colLines       = config.getColour(wxString(BCOLOURLINES));
-  wxColour colLetters     = config.getColour(wxString(BCOLOURLETTERS));
-  wxColour colTestLetters = config.getColour(wxString(BCOLOURTSTLETTERS));
-  wxColour colBackground  = config.getColour(wxString(BCOLOURBACKGROUND));
-  wxColour colWx3         = config.getColour(wxString(BCOLOURWX3));
-  wxColour colWx2         = config.getColour(wxString(BCOLOURWX2));
-  wxColour colLx3         = config.getColour(wxString(BCOLOURLX3));
-  wxColour colLx2         = config.getColour(wxString(BCOLOURLX2));
-
-  wxPen   *LinesPen = wxThePenList->FindOrCreatePen(colLines, 1, wxSOLID);
-  wxBrush *BackgroundBrush = wxTheBrushList->FindOrCreateBrush(colBackground,
-                                                              wxSOLID);
-
-  wxBrush *Wx3Brush = wxTheBrushList->FindOrCreateBrush(colWx3, wxSOLID);
-  wxBrush *Wx2Brush = wxTheBrushList->FindOrCreateBrush(colWx2, wxSOLID);
-  wxBrush *Lx3Brush = wxTheBrushList->FindOrCreateBrush(colLx3, wxSOLID);
-  wxBrush *Lx2Brush = wxTheBrushList->FindOrCreateBrush(colLx2, wxSOLID);
-
-  dc->SetFont(font);
-  LinesPen->SetWidth(LINE_WIDTH);
-  dc->SetPen(* LinesPen);
-  dc->SetBrush(* BackgroundBrush);
-
-  // background rectangle (entire frame)
-  wxSize bs = GetClientSize();
-  dc->DrawRectangle(0,0,bs.x,bs.y);
-
-  // lines
-  //  dc->DrawRectangle(TopLeft.x,TopLeft.y,board_size - tile_size/2, 
board_size - tile_size/2);
-  for(row=BOARD_MIN; row < BOARD_MAX; row++)
-    {
-      // vertical
-      dc->DrawLine(TopLeft.x + (row+1)*(tile_size+LINE_WIDTH),
-                  TopLeft.y + tile_size + LINE_WIDTH,
-                  TopLeft.x + (row+1)*(tile_size+LINE_WIDTH),
-                  TopLeft.y + BOARD_MAX * (tile_size+LINE_WIDTH));
-      // horizontal row <-> line
-      dc->DrawLine(TopLeft.x + tile_size+LINE_WIDTH,
-                  TopLeft.y + (row+1)*(tile_size+LINE_WIDTH),
-                  TopLeft.x + BOARD_MAX * (tile_size+LINE_WIDTH),
-                  TopLeft.y + (row+1)*(tile_size+LINE_WIDTH));
-    }
-
-  // 1 2 3 4 5 ...
-  // A B C D
-  for(row=BOARD_MIN; row <= BOARD_MAX; row++)
-    {
-      wxs.Printf(wxT("%d"), row);
-      DrawTile(dc, wxs, 0, row);
-      wxs.Printf(wxT("%c"), row + 'A' - 1);
-      DrawTile(dc, wxs, row, 0);
-    }
+    Board board;
+
+    wxString wxs;
+    int row,column;
+
+    wxFont   font            = config.getFont(BOARDFONT);
+    wxColour colForeground   = config.getColour(wxString(BCOLOURLINES));
+    wxColour colBackground   = config.getColour(wxString(BCOLOURBACKGROUND));
 
-    dc->SetTextForeground(colLetters);
+    wxBrush *BackgroundBrush = 
wxTheBrushList->FindOrCreateBrush(colBackground, wxSOLID);
+    wxPen   *LinesPen        = wxThePenList->FindOrCreatePen(colForeground, 
LINE_WIDTH, wxSOLID);
+
+    dc->SetFont (font);
+    dc->SetPen  (* LinesPen);
+    dc->SetBrush(* BackgroundBrush);
+
+    // background rectangle (entire frame)
+    wxSize bs = GetClientSize();
+    dc->DrawRectangle(0,0,bs.x,bs.y);
+
+    // lines
+    for(row=BOARD_MIN; row < BOARD_MAX; row++)
+       {
+           // vertical
+           dc->DrawLine(TILE_LEFT(row+1),
+                        TILE_TOP(1),
+                        TILE_LEFT(row+1),
+                        TILE_TOP(BOARD_MAX));
+           // horizontal row <-> line
+           dc->DrawLine(TILE_LEFT(1),
+                        TILE_TOP(row+1),
+                        TILE_LEFT(BOARD_MAX),
+                        TILE_TOP(row+1));
+       }
+
+    // 1 2 3 4 5 ...
+    // A B C D ...
+    for(row=BOARD_MIN; row <= BOARD_MAX; row++)
+       {
+           wxs.Printf(wxT("%d"), row);
+           DrawTile(dc, wxs, 0, row);
+           wxs.Printf(wxT("%c"), row + 'A' - 1);
+           DrawTile(dc, wxs, row, 0);
+       }
+
+    // Board Background
+    wxColour colWx3         = config.getColour(wxString(BCOLOURWX3));
+    wxColour colWx2         = config.getColour(wxString(BCOLOURWX2));
+    wxColour colLx3         = config.getColour(wxString(BCOLOURLX3));
+    wxColour colLx2         = config.getColour(wxString(BCOLOURLX2));
+
+    wxBrush *Wx3Brush = wxTheBrushList->FindOrCreateBrush(colWx3, wxSOLID);
+    wxBrush *Wx2Brush = wxTheBrushList->FindOrCreateBrush(colWx2, wxSOLID);
+    wxBrush *Lx3Brush = wxTheBrushList->FindOrCreateBrush(colLx3, wxSOLID);
+    wxBrush *Lx2Brush = wxTheBrushList->FindOrCreateBrush(colLx2, wxSOLID);
+
+    board = m_game.getBoard();
+    for(row=BOARD_MIN; row <= BOARD_MAX; row++)
+       {
+           for (column = BOARD_MIN; column <= BOARD_MAX; column++)
+               {
+                   if (board.getLetterMultiplier(row, column) == 2)
+                       {
+                           dc->SetBrush(*Lx2Brush);
+                       }
+                   else if (board.getLetterMultiplier(row, column) == 3)
+                       {
+                           dc->SetBrush(*Lx3Brush);
+                       }
+                   else if (board.getWordMultiplier(row, column) == 2)
+                       {
+                           dc->SetBrush(*Wx2Brush);
+                       }
+                   else if (board.getWordMultiplier(row, column) == 3)
+                       {
+                           dc->SetBrush(*Wx3Brush);
+                       }
+                   else
+                       {
+                           dc->SetBrush(*BackgroundBrush);
+                       }
+
+                   if (row && column)
+                       {
+                           dc->DrawRectangle(TILE_LEFT(column), TILE_TOP(row),
+                                             tile_size + 2*LINE_WIDTH,
+                                             tile_size + 2*LINE_WIDTH);
+                       }
+               }
+       }
+
+    // Tiles
+    LinesPen->SetWidth(1);
+    dc->SetPen  (* LinesPen);
+    bool drawtiles = config.getDrawTile();
     for(row=BOARD_MIN; row <= BOARD_MAX; row++)
-    {
-        for (column = BOARD_MIN; column <= BOARD_MAX; column++)
-        {
-            if (m_game.getBoard().getLetterMultiplier(row, column) == 2)
-            {
-                dc->SetBrush(*Lx2Brush);
-                dc->SetTextBackground(colLx2);
-            }
-            else if (m_game.getBoard().getLetterMultiplier(row, column) == 3)
-            {
-                dc->SetBrush(*Lx3Brush);
-                dc->SetTextBackground(colLx3);
-            }
-            else if (m_game.getBoard().getWordMultiplier(row, column) == 2)
-            {
-                dc->SetBrush(*Wx2Brush);
-                dc->SetTextBackground(colWx2);
-            }
-            else if (m_game.getBoard().getWordMultiplier(row, column) == 3)
-            {
-                dc->SetBrush(*Wx3Brush);
-                dc->SetTextBackground(colWx3);
-            }
-
-            wxs = wxString((wxChar)m_game.getBoard().getChar(row, column));
-            attr = m_game.getBoard().getCharAttr(row, column);
-            if ((paintedboard_char[row - BOARD_MIN][column - BOARD_MIN] != 
wxs.GetChar(0)) ||
-                (paintedboard_attr[row - BOARD_MIN][column - BOARD_MIN] != 
attr))
-            {
-                top = top < row ? top : row;
-                bottom = bottom > row ? bottom : row;
-                left = left < column ? left : column;
-                right = right > column ? right : column;
-                paintedboard_char[row - BOARD_MIN][column - BOARD_MIN] = 
wxs.GetChar(0);
-                paintedboard_attr[row - BOARD_MIN][column - BOARD_MIN] = attr;
-            }
-
-            if (attr & ATTR_TEST)
-            {
-                dc->SetTextForeground(colTestLetters);
-                DrawTile(dc,wxs,row,column);
-                dc->SetTextForeground(colLetters);
-            }
-            else
-            {
-                DrawTile(dc,wxs,row,column);
-            }
-            dc->SetBrush(* BackgroundBrush);
-            dc->SetTextBackground(colBackground);
-        }
-    }
+       {
+           for (column = BOARD_MIN; column <= BOARD_MAX; column++)
+               {
+                   int attr = board.getCharAttr(row, column);
+                   wxs  = wxString((wxChar)board.getChar(row, column));
+
+                   paintedboard_char[row - BOARD_MIN][column - BOARD_MIN] = 
*wxs.GetData();
+                   paintedboard_attr[row - BOARD_MIN][column - BOARD_MIN] = 
attr;
+
+                   DrawTile(dc,wxs,row,column,attr & ATTR_TEST,drawtiles);
+               }
+       }
 
     dc->SetFont(wxNullFont);
 }
+
+
+/// Local Variables:
+/// mode: hs-minor
+/// c-basic-offset: 4
+/// End:
Index: eliot/wxwin/gfxboard.h
diff -u eliot/wxwin/gfxboard.h:1.5 eliot/wxwin/gfxboard.h:1.6
--- eliot/wxwin/gfxboard.h:1.5  Fri Nov  4 20:00:06 2005
+++ eliot/wxwin/gfxboard.h      Mon Dec 26 15:02:26 2005
@@ -1,13 +1,14 @@
 /* Eliot                                                                     */
 /* Copyright (C) 1999  Antoine Fraboulet                                     */
-/* address@hidden                                                 */
 /*                                                                           */
-/* This program is free software; you can redistribute it and/or modify      */
+/* This file is part of Eliot.                                               */
+/*                                                                           */
+/* Eliot is free software; you can redistribute it and/or modify             */
 /* it under the terms of the GNU General Public License as published by      */
 /* the Free Software Foundation; either version 2 of the License, or         */
 /* (at your option) any later version.                                       */
 /*                                                                           */
-/* This program is distributed in the hope that it will be useful,           */
+/* Eliot is distributed in the hope that it will be useful,                  */
 /* but WITHOUT ANY WARRANTY; without even the implied warranty of            */
 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             */
 /* GNU General Public License for more details.                              */
@@ -17,7 +18,7 @@
 /* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
*/
 
 /**
- *  \file gfxboard.h
+ *  \file   gfxboard.h
  *  \brief  Game board graphical view
  *  \author Antoine Fraboulet
  *  \date   2002
@@ -26,45 +27,89 @@
 #ifndef _GFXBOARD_H
 #define _GFXBOARD_H
 
-/*
-  paintedboard_char is the matrix of played tiles
-  paintedboard_attr is the matrix of special attributes for tiles, for
-    instance it can store if a tile is a test tile (placed but not played).
+/**
+ * gfxboard is a wxWindow widget that draws a Scrabble board
  */
 
-typedef enum {
-  BOARD_REFRESH,
-  BOARD_FORCE_REFRESH
-} board_refresh_t;
-
-
 class GfxBoard : public wxWindow
 {
-private:
-     Game &m_game;
-     int top,bottom,left,right;
-     char paintedboard_char[BOARD_DIM][BOARD_DIM];
-     char paintedboard_attr[BOARD_DIM][BOARD_DIM];
-     int board_size;
-     int tile_size;
-     wxPoint TopLeft;
-     wxSize size;
-     wxBitmap *bmp;
-     void CreateBMP();
-     void DrawTile(wxDC*,wxString&,int,int);
-     void DrawBoard(wxDC*);
-
-     ConfigDB config;
-public:
-     GfxBoard(wxFrame*, Game&);
-     ~GfxBoard(void);
-
-     void Refresh(board_refresh_t force = BOARD_REFRESH);
-     void OnPaint(wxPaintEvent& event);
-     void OnSize(wxSizeEvent& event);
-     DECLARE_EVENT_TABLE()
+ private:
+    /**
+     * reference on the played game
+     */
+    Game &m_game;
+
+    /**
+     * paintedboard_char is the matrix of played tiles
+     */
+    wxChar paintedboard_char[BOARD_DIM][BOARD_DIM];
+
+    /**
+     * paintedboard_attr is the matrix of special attributes for tiles, for
+     * instance it can store if a tile is a test tile (placed but not played).
+     */
+    char   paintedboard_attr[BOARD_DIM][BOARD_DIM];
+
+    /**
+     * size in pixels for the board.
+     * board_size = min(width,height)
+     */
+    int board_size;
+
+    /**
+     * tile_size = size in pixels of a tile
+     */
+    int tile_size;
+
+    /**
+     * there is a bug when doing an OnSize under windows : the window
+     * has to be fully refreshed (UpdateRegion does not seem to work).
+     */
+#if defined(MSW_RESIZE_BUG)
+    bool just_resized;
+#endif
+
+    /**
+     * top left point used to draw the lines, used to keep the board
+     * centered horizontally and vertically
+     */
+    wxPoint  TopLeft;
+
+    /**
+     * Board bitmap, created by CreateBMP
+     */
+    wxBitmap *bmp;
+
+    void CreateBMP();
+    void DrawTileBack(wxDC*,int,int,int, bool testtile);
+    void DrawTile(wxDC*,wxString&,int,int,bool testtile = false, bool 
drawtileback = false);
+    void DrawBoard(wxDC*);
+    void RefreshSquare(wxRect&);
+
+    ConfigDB config;
+
+ public:
+
+    GfxBoard(wxFrame* parent, Game& game);
+    ~GfxBoard(void);
+
+    void OnPaint (wxPaintEvent& event);
+    void OnSize  (wxSizeEvent&  event);
+
+    typedef enum {
+       BOARD_REFRESH,
+       BOARD_FORCE_REFRESH
+    } board_refresh_t;
+
+    void Refresh (board_refresh_t force = BOARD_REFRESH);
+
+    DECLARE_EVENT_TABLE()
 };
 
 #endif
 
-
+
+/// Local Variables:
+/// mode: hs-minor
+/// c-basic-offset: 4
+/// End:




reply via email to

[Prev in Thread] Current Thread [Next in Thread]