#from __future__ import unicode_literals # -*- coding: utf-8 -*- from __future__ import division import Modes from PyQt4.QtCore import * from PyQt4.QtGui import * class Cache(QGraphicsPolygonItem): """cache place sur le plateau""" def __init__(self, plateau, numero, parent=None): """initialisation de la fenetre""" super (Cache, self).__init__(parent) self.plateau = plateau self.numero = numero self.nom = "" self.listeCases = [] self._active = False self._etiquette = None def __getstate__(self): """selectionne les attributs qui seront sauvegardes""" self._active = False state = {key:value for key, value in self.__dict__.items() if key in ["numero", "nom", "listeCases", "_active"]} return (state) def __setstate__(self, state): """recupere les attributs sauvegardes""" self.__dict__ = state def recreer(self, plateau): super (Cache, self).__init__() self._etiquette = None self.plateau = plateau self.creer() def creer(self): """cree le cache sur la liste de cases en parametre""" self.setFlag(QGraphicsItem.ItemIsFocusable) self.setAcceptHoverEvents(True) self.setBrush(QColor(0,0,0,255)) pinceau = QPen(QColor("black")) pinceau.setWidth(10) self.setPen(pinceau) self._etiquette = QGraphicsTextItem(QString.fromUtf8("{}- {}".format(self.numero, self.nom))) self._etiquette.setPos(self.mapFromScene(self.plateau.cases[self.coordCentre()].centreGraphique)) police = QFont("Arial",30) police.setBold(True) self._etiquette.setFont(police) self._etiquette.setDefaultTextColor(QColor(50,50,50,180)) self._etiquette.setParentItem(self) self.setPolygon(self.plateau.polygoneAgglo(self.listeCases)) self.setZValue(100) self.plateau.addItem(self) self._active = True def majPolygone(self, listeCases): self.listeCases = listeCases self.setPolygon(self.plateau.polygoneAgglo(self.listeCases)) self._etiquette.setPos(self.mapFromScene(self.plateau.cases[self.coordCentre()].centreGraphique)) def majEtiquette(self): self._etiquette.setPlainText(QString().fromUtf8(self.nom)) def modeChange(self, mode): if self._active: if issubclass(mode, Modes.ModeBaseCp): transparence = 130 else: transparence = 255 self.setBrush(QColor(0,0,0, transparence)) def activer(self, actif): self._active = actif self.majAffichage() def actif(self): return self._active def majAffichage(self): self.setVisible(self._active) def coordCentre(self): """renvoie les coordonnees de la case la plus centrale de la liste""" xtot = 0 ytot = 0 for coord in self.listeCases: xtot += coord[0] ytot += coord[1] ecartMin = None coordRetenues = None for coord in self.listeCases: ecartX = abs(xtot - (coord[0] * len(self.listeCases))) ecartY = abs(ytot - (coord[1] * len(self.listeCases))) if not ecartMin or (ecartX + ecartY) < ecartMin: coordRetenues = coord ecartMin = ecartX + ecartY return coordRetenues def sceneEvent(self, event): """filtre les evenements souris et clavier si vrai: l'evenement est bloque""" retour = (not self.actif() or issubclass(self.plateau.modeActif.__class__, Modes.ModeBaseCp)) if not retour: event.accept() else: event.ignore() return retour