#from __future__ import unicode_literals # -*- coding: utf-8 -*- from __future__ import division import Modes from PyQt4.QtCore import * from PyQt4.QtGui import * from Case import Case class Cache(QGraphicsItem): """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 self._listePolygones = [] 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._listePolygones = [] self.creer() def creer(self): """cree le cache sur la liste de cases en parametre""" self.setFlag(QGraphicsItem.ItemIsFocusable) self.setAcceptHoverEvents(True) self._etiquette = QGraphicsTextItem(QString.fromUtf8("{}".format(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(255, 255, 255, 200)) self._etiquette.setParentItem(self) self._etiquette.setZValue(10) for coord in self.listeCases: self.ajouterPolygone(Case(self.plateau).polygone(coord[0], coord[1])) self.setZValue(100) self.setFlag(QGraphicsItem.ItemHasNoContents) self.setHandlesChildEvents(True) self.plateau.addItem(self) self._active = True def ajouterPolygone(self, polygone): polygoneGraphique = PolygoneCache(self) polygoneGraphique.creer(polygone) polygoneGraphique.setParentItem(self) self._listePolygones.append(polygoneGraphique) def majForme(self, listeCases): for polygone in self._listePolygones: polygone.setParentItem(None) self._listePolygones = [] self.listeCases = listeCases for coord in self.listeCases: self.ajouterPolygone(Case(self.plateau).polygone(coord[0], coord[1])) 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 = 100 else: transparence = 255 for polygone in self._listePolygones: polygone.majTransparence(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 def boundingRect(self): return QRectF() class PolygoneCache(QGraphicsPolygonItem): def __init__(self, cache, parent=None): """initialisation de la fenetre""" super (PolygoneCache, self).__init__(parent) self.cache = cache self.setAcceptHoverEvents(True) def creer(self, polygone): self.setPolygon(polygone) self.majTransparence(255) self.setParentItem(self) def majTransparence(self, transparence): self.setBrush(QColor(0,0,0,transparence)) pinceau = QPen() pinceau.setBrush(QColor(0,0,0,transparence)) pinceau.setWidth(1) self.setPen(pinceau)