00001 #ifndef QT2DDISPLAY_HPP
00002 #define QT2DDISPLAY_HPP
00003
00004 #include <QWidget>
00005 #include <QGraphicsScene>
00006 #include <QGraphicsView>
00007
00008 #include <QGraphicsRectItem>
00009 #include <QGraphicsPixmapItem>
00010
00011 #include <QPropertyAnimation>
00012
00013 #include "Renderer2D.hpp"
00014
00015 #include "Game/Boards/ChessBoard.hpp"
00016 #include "Game/Rules/ChessRules.hpp"
00017 #include "Game/Move.hpp"
00018 #include "Qt2DPiece.hpp"
00019
00020 #include "UI/PromotionDialog.hpp"
00021
00022
00023 class Qt2DDisplay : public QGraphicsView, public Renderer2D<ChessBoard>
00024 {
00025 Q_OBJECT
00026
00027 typedef Move<ChessBoard::Coords> CMove;
00028
00029 private:
00030
00031 QGraphicsScene m_scene;
00032 std::vector<Qt2DPiece*> m_pieces;
00033 std::vector<QGraphicsRectItem*> m_helpers;
00035 const ChessRules* m_pRules;
00037 std::map<int, std::pair<QString,QString> > m_piecesPixmap;
00039 int m_caseWidth;
00040 int m_caseHeight;
00044 void loadPieces();
00045
00048 void createBoard();
00049
00053 void clearScreen();
00054
00057 void clearPieces();
00058
00061 void boardChanged()
00062 {
00063 createBoard();
00064 }
00065
00068 Q_SIGNAL void gameUpdateSignal();
00069
00072 Q_SLOT void updateGame();
00073
00076 Q_SIGNAL void movePlayed(Move<ChessBoard::Coords>);
00077
00081 Q_SIGNAL void pieceMoved(CMove);
00082
00088 Q_SLOT void collectMove(QPointF start, QPointF end, int color);
00089
00093 Q_SLOT void movePiece(CMove move);
00094
00095 protected:
00096
00097 void resizeEvent(QResizeEvent *event);
00098
00099 public:
00100
00104 explicit Qt2DDisplay(QWidget* parent=NULL);
00105
00108 ~Qt2DDisplay();
00109
00113 void notify(const Move<ChessBoard::Coords> & move);
00114
00118 void displayPiece(const ChessBoard::Coords& position)
00119 {
00120 int pieceX = m_caseWidth * position.column;
00121 int pieceY = m_caseHeight * position.line;
00122
00123 const Piece& piece = m_pBoard->get(position.get());
00124 Qt2DPiece* pItem = NULL;
00125
00126 if ( !piece.isValid() )
00127 {
00128 return;
00129 }
00130
00131 if ( piece.color() == 0 )
00132 {
00133 pItem = new Qt2DPiece(m_piecesPixmap[piece.type()].first,piece.color());
00134 }
00135 else
00136 {
00137 pItem = new Qt2DPiece(m_piecesPixmap[piece.type()].second,piece.color());
00138 }
00139 connect(pItem,SIGNAL(pieceMoved(QPointF,QPointF,int)),this,SLOT(collectMove(QPointF,QPointF,int)));
00140 connect(pItem,SIGNAL(requestHelper(QPointF,int)),this,SLOT(displayHelper(QPointF,int)));
00141 connect(pItem,SIGNAL(stopHelper()),this,SLOT(stopHelper()));
00142
00143
00144 float scaleX = m_caseWidth/pItem->boundingRect().width();
00145 float scaleY = m_caseHeight/pItem->boundingRect().height();
00146 float scale = std::min(scaleX,scaleY);
00147
00148 pItem->setScale(scale);
00149
00150 m_scene.addItem(pItem);
00151
00152
00153 pItem->setPos(pieceX + (m_caseWidth-(scale*pItem->boundingRect().width()))/2.0f,
00154 pieceY + (m_caseHeight-(scale*pItem->boundingRect().height()))/2.0f);
00155
00156 m_pieces.push_back(pItem);
00157 }
00158
00159 void setBoard(const ChessBoard *pBoard);
00160
00164 void setRules(const ChessRules* pRules) { m_pRules = pRules; }
00165
00174 Q_SLOT void displayHelper(QPointF pos, int color);
00175
00179 Q_SLOT void stopHelper();
00180
00181 };
00182
00183 #endif