| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- #from __future__ import unicode_literals
- # -*- coding: utf-8 -*-
- from __future__ import division
- from PyQt4.QtCore import *
- from PyQt4.QtGui import *
- from Decor import Decor
- from Forme import Forme
- class PionDecor(QGraphicsItem):
- """pion du plateau de combat representant un decor"""
- def __init__(self, plateau, numero, parent=None):
- super(PionDecor, self).__init__(parent)
- #plateau
- self.plateau = plateau
- #attributs
- self.nom = "decor"
- self.numero = numero
- self.decor = Decor()
- self.position = (-1, -1)
- self.forme = Forme(self.plateau.formeCases)
- self.z = 0
- self.hauteur = 1 #hauteur de l'objet en cases
- self.pixGraphique = None
- self.largeurOriginale = 0
- self.hauteurOriginale = 0
- self.polygoneGraphique = None
- self.nbRotations = 0
- def __getstate__(self):
- state = {key:value for key, value in self.__dict__.items() if not key in ["plateau", "forme", "polygoneGraphique", "pixGraphique", "shadow"]}
- return (state)
- def __setstate__(self, state):
- self.__dict__ = state
- def paint(self, painter, option, widget = None):
- """reimplemente de QGraphicsItem"""
- pass
- def surbrillance(self, active):
- """active/desactive la surbrillance"""
- pass
- def txtId(self):
- return self.nom
- ########### fonctions graphiques et geometriques ##############
- def creer(self, posX, posY, decor, nbRotations):
- """place le pion decor sur le plateau"""
- self.decor = decor
- self.setFlag(QGraphicsItem.ItemHasNoContents) #inutile de peindre l'item
- self.setHandlesChildEvents(True)
-
- if len(self.decor.formeDef[self.plateau.formeCases]) > 0:
- self.forme.definirForme(self.decor.formeDef[self.plateau.formeCases])
- self.hauteur = self.decor.hauteur
-
- self.position = (posX, posY)
- self.majNbRotations(nbRotations)
- #aspect graphique
- self.majAspectGraphique()
- #ajout de l'objet graphique et placement
- self.plateau.addItem(self)
- def recreer(self, plateau):
- """recree l'objet graphique apres un chargement"""
- self.plateau = plateau
- super(PionDecor, self).__init__()
- self.setFlag(QGraphicsItem.ItemHasNoContents) #inutile de peindre l'item
- self.setHandlesChildEvents(True)
- self.polygoneGraphique = None
- self.pixGraphique = None
- self.forme = Forme(self.plateau.formeCases)
- if len(self.decor.formeDef[self.plateau.formeCases]) > 0:
- self.forme.definirForme(self.decor.formeDef[self.plateau.formeCases])
- #aspect graphique
- self.majAspectGraphique()
- #ajout de l'objet graphique et placement
- self.plateau.addItem(self)
-
- def majAspectGraphique(self):
- """met a jour l'aspect graphique du pion"""
- #creation de la forme
- if not self.polygoneGraphique:
- polygone = self.plateau.polygoneAgglo(self.forme.listeCases((0,0)))
- self.polygoneGraphique = QGraphicsPolygonItem()
- self.polygoneGraphique.setPolygon(polygone)
- self.polygoneGraphique.setAcceptHoverEvents(True)
- self.polygoneGraphique.setFlag(QGraphicsItem.ItemIsFocusable) #l'item peut recevoir des commandes souris/clavier
- self.polygoneGraphique.setParentItem(self)
- self.polygoneGraphique.setPos(QPointF(0,0))
- if self.plateau.formeCases == "H":
- self.polygoneGraphique.setTransformOriginPoint(QPointF(2*0.2886*self.plateau.hCase,0.5*self.plateau.hCase))
- else:
- self.polygoneGraphique.setTransformOriginPoint(QPointF(0.5*self.plateau.hCase,0.5*self.plateau.hCase))
-
- if self.plateau.formeCases == "H":
- angleRotation = 60
- positionGraphique = QPointF(self.position[0] * 0.866 * self.plateau.hCase, self.position[1] * self.plateau.hCase)
- else:
- angleRotation = 90
- positionGraphique = QPointF(self.position[0] * self.plateau.hCase, self.position[1] * self.plateau.hCase)
-
- self.polygoneGraphique.setRotation(self.nbRotations*angleRotation)
- self.setPos(positionGraphique)
- self.setZValue(10) #place au dessus des cases
-
- #interactions
- self.setFlag(QGraphicsItem.ItemIsFocusable)
- self.setAcceptHoverEvents(True) #accepte les evenements survol souris
- #bordure
- pinceau = QPen()
- #pinceau.setColor(self.decor.couleur.darker(130))
- pinceau.setColor(self.decor.couleur)
- pinceau.setWidth(10)
- self.polygoneGraphique.setPen(pinceau)
- #ombre
- self.shadow = QGraphicsDropShadowEffect()
- self.shadow.setColor(QColor(50, 50, 50))
- self.shadow.setXOffset(1)
- self.shadow.setYOffset(2)
- self.shadow.setBlurRadius(3)
- self.shadow.setEnabled(True)
- self.polygoneGraphique.setGraphicsEffect(self.shadow)
- #maj de l'image
- self.majImage()
- #fond
- if self.decor.couleur.isValid():
- self.polygoneGraphique.setBrush(self.decor.couleur)
- else:
- self.polygoneGraphique.setBrush(QColor(255, 0, 0, 100))
- #on met a jour l'occupation des cases
- for coord in self.forme.listeCases((self.position[0],self.position[1]), self.nbRotations):
- self.plateau.cases[coord].majOccupation(self, self.z)
- def majImage(self):
- """met a jour la taille, la position et l'orientation de l'image"""
- if len(self.decor.img["nom"]) > 0:
- pix = QPixmap(QString.fromUtf8("img\\"+self.decor.img["nom"]))
- if self.decor.img["masqueAuto"]:
- pix.setMask(pix.createHeuristicMask())
- if not pix.isNull():
- if not self.pixGraphique:
- self.pixGraphique = QGraphicsPixmapItem()
- self.pixGraphique.setZValue(10)
- if pix.height() >= pix.width():
- pix = pix.scaledToHeight(self.plateau.hCase*0.9, Qt.SmoothTransformation)
- else:
- pix = pix.scaledToWidth(self.plateau.hCase*0.9, Qt.SmoothTransformation)
- self.largeurOriginale = pix.width()
- self.hauteurOriginale = pix.height()
- pix = pix.scaled((self.decor.img["kx"]/10)*pix.width(), \
- (self.decor.img["ky"]/10)*pix.height(), \
- Qt.IgnoreAspectRatio, Qt.SmoothTransformation)
- self.pixGraphique.setPixmap(pix)
- deltaX = self.decor.img["dx"] + 0.5*(self.plateau.hCase*1.1544 - self.largeurOriginale)
- deltaY = self.decor.img["dy"] + 0.5*(self.plateau.hCase - self.hauteurOriginale)
- if self.decor.img["nom"] != self.decor.logo and self.decor.img["pivote"] == True:
- self.pixGraphique.setParentItem(self.polygoneGraphique)
- else:
- self.pixGraphique.setParentItem(self)
- self.pixGraphique.setRotation(self.decor.img["rotation"])
- self.pixGraphique.setPos(QPointF(deltaX, deltaY))
- def majNbRotations(self, nbRotations):
- self.nbRotations = nbRotations
- if self.plateau.formeCases == "H":
- rotationsTour = 6
- else:
- rotationsTour = 4
-
- if self.nbRotations >= 0:
- self.nbRotations = self.nbRotations % rotationsTour
- else:
- self.nbRotations = self.nbRotations % (-rotationsTour)
- def majPosition(self, position, nbRotations = 0):
- for coord in self.forme.listeCases((self.position[0],self.position[1]), self.nbRotations):
- self.plateau.cases[coord].majOccupation(self)
- self.position = position
- self.majNbRotations(nbRotations)
- self.majAspectGraphique()
-
- def afficheOmbreSelection(self, actif = False):
- if actif:
- self.shadow.setXOffset(3)
- self.shadow.setYOffset(3)
- else:
- self.shadow.setXOffset(1)
- self.shadow.setYOffset(2)
- def supprimer(self):
- """'deconnecte' les items enfants avant de supprimer du pion"""
- if self.pixGraphique != None:
- self.pixGraphique.prepareGeometryChange()
- self.pixGraphique.setParentItem(None)
- self.polygoneGraphique.prepareGeometryChange()
- self.polygoneGraphique.setParentItem(None)
- self.plateau.removeItem(self)
- self.plateau = None
- ##################
- ############### evenements clavier et souris ##############
- def boundingRect(self):
- return QRectF()
- def hoverEnterEvent(self, event):
- """evenement lors du survol de la souris (en entree)"""
- self.plateau.caseSurvol(self.plateau.cases[self.position])
- self.plateau.pionDecorSurvol(self.numero)
- def hoverLeaveEvent(self, event):
- """evenement lors du survol de la souris (en sortie)"""
- self.plateau.pionDecorSurvol(None)
- def mousePressEvent(self, event):
- """evenement lors du clic souris"""
- if event.button() == 1: #sur clic gauche
- #en mode creation, on peut selectionner le decor pour le deplacer ou le supprimer
- if self.plateau.modePrincipal == "creation":
- self.plateau.pionDecorSaisir(self.numero)
- event.accept()
- else:
- event.ignore()
-
-
- #######################
|