#from __future__ import unicode_literals # -*- coding: utf-8 -*- from PyQt4.QtCore import QString, Qt from PyQt4.QtGui import QGraphicsTextItem, QFont, QColor, QCursor from dialogues import dmConfirmer class Cache(object): """cache place sur le plateau""" def __init__(self, idCache, parent=None): self._idCache = idCache self._nom = "" self.etiquette = None self._listeCases = [] def __getstate__(self): state = {key:value for key, value in self.__dict__.items() if not key in ["plateau", "etiquette"]} return (state) def __setstate__(self, state): self.__dict__ = state def nom(self): return self._nom def listeCases(self): return self._listeCases def creer(self, plateau, listeCases, nom): self._nom = nom self._listeCases = listeCases self.ajouter(plateau) def ajouter(self, plateau): self.plateau = plateau self.plateau.caches[self._idCache] = self for coord in self._listeCases: self.plateau.cases[coord].ajouterCache(self._idCache) # self.creerEtiquette() self.plateau.gC.reinitialiser() def creerEtiquette(self): self.etiquette = EtiquetteCache(self) self.etiquette.creer() def retirer(self): """retire le cache du plateau apres confirmation""" #demande de confirmation if not dmConfirmer("Retirer le cache du plateau?"): return for coord in self._listeCases: self.plateau.cases[coord].retirerCache(self._idCache) self.plateau.removeItem(self.etiquette) del self.plateau.caches[self._idCache] self.plateau.gC.reinitialiser() class EtiquetteCache(QGraphicsTextItem): def __init__(self, cache, parent=None): self.cache = cache super(EtiquetteCache, self).__init__(parent) def creer(self): """cree et place l'etiquette avec le texte et a la position demandee""" self._txt = self.cache.nom() self.setPos(self.position()) self.cache.plateau.addItem(self) self.setZValue(100) curseur = QCursor(Qt.ArrowCursor) self.setCursor(curseur) self.maj() def position(self): """calcule la position de l'etiquette: on cherche la case la plus proche du barycentre""" liste = self.cache.listeCases() totalX = 0 ; totalY = 0 for x, y in liste: totalX += x ; totalY += y xc = totalX / len(liste) ; yc = totalY / len(liste) plusProche = None for x, y in liste: d2 = (x - xc)**2 + (y - yc)**2 if not plusProche: plusProche = (d2, (x, y)) else: if d2 < plusProche[0]: plusProche = (d2, (x, y)) coord = plusProche[1] pos = self.cache.plateau.cases[coord].centreGraphique return pos def maj(self, survol = False): """met a jour l'apparence de l'etiquette slon qu'elle soit survolee ou non""" txt = self._txt if survol: txt += " [X]" self.setPlainText(QString.fromUtf8(txt)) police = QFont("Verdana", 20) police.setBold(survol) self.setFont(police) self.setDefaultTextColor(QColor(249, 249, 249) if not survol else QColor(255, 50, 50)) def hoverEnterEvent(self, event): self.maj(True) def hoverLeaveEvent(self, event): self.maj(False) def mousePressEvent(self, event): self.cache.retirer()