3dmaze / mazewidget.cpp

/* Copyright (C) 2010 by Eric Waller 
  
   Build and display a maze in either 2-D or 3-D

   This program 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 3 of the License, or
   (at your option) any later version.
   
   This program 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.
   
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.

   ewwaller@gmail.com

   Revision History

   Date        Author      Description
   ---------   ----------  -----------
   2010.7.20   E Waller    Initial Release
*/

#include "mazewidget.h"
#include <QtGui>

//MazeWidget::MazeWidget(QWidget *parent):
//        QWidget(parent)
MazeWidget::MazeWidget(QWidget *parent):
  QWidget(parent)
{
  scale = 5;
  theMaze.CreateMaze(5,5);
  ShowSolution=false;
}

MazeWidget::~MazeWidget()
{
  
}

MazeEngine* MazeWidget::GetMazeEngine()
{
  return &theMaze;    
}

void MazeWidget::setShowSolution(bool theSolution)
{
  ShowSolution = theSolution;	//Change the state of showing the solution to the maze
  repaint();
}

void MazeWidget::DrawIt(QPainter* paint)
{
  // We have been directed by some event to draw the maze
  for ( int x =0; x < theMaze.GetXSize() ; x++)
    for ( int y=0 ; y < theMaze.GetYSize() ; y++)
      {
        
        // Check if we are drawing walls
        
        if ( theMaze.GetMapData(x,theMaze.GetYSize()-1-y) == theMaze.WALL )
          {
            // We are drawing walls Most of the area around walls are white (the walls are thin)
            paint->fillRect(x*scale , y*scale,scale,scale,Qt::white);
            // Check all four directions to see in which directions the wall extends
            for (int i=0 ; i<4 ; i++)
              {
                int  xLook=x+dx[i];
                int  yLook=y+dy[i];
                // Do not go out of bounds!
                if (!(xLook < 0 || xLook>theMaze.GetXSize()-1 || (theMaze.GetYSize()-1-yLook) <0 
                      || (theMaze.GetYSize()-1-yLook) > theMaze.GetYSize()-1))
                  if (theMaze.GetMapData(xLook, theMaze.GetYSize()-1-yLook) == theMaze.WALL)
                    {
                      // Is it a wall in that direction ? If so draw a wall
                      // from here to there
                      paint->setPen(Qt::black);
                      paint->drawLine (x*scale + scale/2, y*scale +scale/2,
                                       x*scale+(scale + dx[i]*scale)/2 ,
                                       y*scale+(scale+dy[i]*scale)/2);
                    }
              }
          }
        else
          {
            // Paths are white Unless the path is the solution and
            // the user wants to see it.
            
            QColor theColor=Qt::white;
            if (ShowSolution && theMaze.GetMapData(x,theMaze.GetYSize()-1-y)== theMaze.SOLUTION)
              theColor=Qt::red;
            paint->fillRect (x * scale, y * scale, scale, scale,theColor);
          }
      }
}
void MazeWidget::paintEvent( QPaintEvent * )
{
  QPainter paint( this );
  DrawIt( &paint );
}

void MazeWidget::printIt()
{
  QPrinter printer;
  QPrintDialog printDialog(&printer, this);
  
  if (printDialog.exec() == QDialog::Accepted)
    {
      QPainter paint;
      if( !paint.begin(&printer ) )
        return;
      DrawIt( &paint );
    }
}
void MazeWidget::Copy()
{
}

void MazeWidget::CreateMaze(int newXSize, int newYSize)
{
  resize(newXSize*scale,newYSize*scale);
  theMaze.CreateMaze(newXSize,newYSize);
  repaint();
  
}
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.