from Logic import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtSvg import QSvgRenderer, QGraphicsSvgItem
class Theme:
'''Theme informations'''
def __init__(self, svg, colors, parent=None):
self.colors = colors
self.svgRenderer = QSvgRenderer(svg)
self.blockWidth = int(self.svgRenderer.boundsOnElement(self.colors[0]).width())
class GBoard(QGraphicsView):
'''Same interface as Board class -> allows to delay actions on actual logic (board) with animations if required'''
def __init__(self, nblines, nbcolumns, theme, parent=None):
self.blockWidth = theme.blockWidth
QGraphicsView.__init__(self, parent)
# self.setFixedSize(QSize(400, 500))
# self.setFixedSize(self.blockWidth*nbcolumns, self.blockWidth*nblines)
self.setFrameShape(QFrame.NoFrame)
self.renderer = theme.svgRenderer
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.scene = QGraphicsScene()
self.setScene(self.scene)
# self.fitInView(0, 0, self.blockWidth, self.blockWidth, Qt.KeepAspectRatio)
self.setSceneRect(0, -self.blockWidth*nblines, self.blockWidth*(nbcolumns+0.8), self.blockWidth*(nblines+0))
#The 0.8 above is mysterious...
# self._newItem(Coord(0, 0), "red")
# self._newItem(Coord(1, 0), "green")
# self._newItem(Coord(0, 1), "blue")
# self._newItem(Coord(1, 1), "blue")
# txt = QGraphicsTextItem("Toto")
# txt.setPos(0, 0)
# self.scene.addItem(txt)
self.show()
self.scale(0.4, 0.4)
# self.setMatrix(QMatrix(1, 0, 0, -1, 0, 0))
self.board = Board(nblines, nbcolumns, theme)
self.newPieceAction = NewPieceAction(self.board, theme)
self.moveAction = MoveAction(self.board)
self.rotateAction = RotateAction(self.board)
self.compressAction = CompressAction(self.board)
self.simplifyByFourAction = SimplifyByFourAction(self.board)
self.newPiece()
def redraw(self):
pass
def _newItem(self, coord, color):
temp = QGraphicsSvgItem()
temp.setSharedRenderer(self.renderer)
temp.setElementId(color)
# temp.setPos(coord.x*self.blockWidth, -(self.board.Vrange - coord.y - 1)*self.blockWidth)
temp.setPos(coord.x*self.blockWidth, -(coord.y + 1)*self.blockWidth)
self.scene.addItem(temp)
def newPiece(self):
for item in self.scene.items():
self.scene.removeItem(item)
# self.board.newPiece()
if self.newPieceAction.test():
self.newPieceAction.apply()
for block in self.board.currentPiece:
self._newItem(block.coord, block.type)
def switch(self):
pass
# self.board.switch()
def movePiece(self, way):
if self.moveAction.test(way):
if way == "right":
go = 1
elif way == "left":
go = -1
for item in self.scene.items():
item.moveBy(go*self.blockWidth, 0)
self.moveAction.apply()
def rotatePiece(self, way):
if self.rotateAction.test(way):
if way == "trigo":
go = -1
elif way == "antitrigo":
go = 1
for item in self.scene.items():
self.scene.removeItem(item)
self.rotateAction.apply()
for block in self.board.currentPiece:
self._newItem(block.coord, block.type)
def compress(self):
if self.compressAction.test():
self.compressAction.apply()
for item in self.scene.items():
self.scene.removeItem(item)
for block in (self.board + self.board.currentPiece):
self._newItem(block.coord, block.type)
class GBoardAnimation(object):
def __init__(self, action):
self.action = action
def start(self):
if self.action.test():
pass
def stop(self):
pass