#from __future__ import unicode_literals # -*- coding: utf-8 -*- from PyQt4.QtCore import QString, QPointF, Qt from PyQt4.QtGui import QGraphicsTextItem, QFont, QColor, QCursor from commun import dmConfirmer class Cache(): """cache place sur le plateau""" def __init__(self, plateau, idCache, parent=None): self.plateau = plateau self._idCache = idCache self._nom = "" self.etiquette = None self._listeCases = [] def nom(self): return self._nom def listeCases(self): return self._listeCases def creer(self, listeCases, nom): self._nom = nom self._listeCases = listeCases self.plateau.caches[self._idCache] = self for coord in self._listeCases: self.plateau.cases[coord].ajouterCache(self._idCache) for idCombattant in self.plateau.combattants: if self.plateau.combattants[idCombattant].position in self._listeCases: self.plateau.combattants[idCombattant].cacher(self._idCache) 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) for idCombattant in self.plateau.combattants: if self.plateau.combattants[idCombattant].position in self._listeCases: self.plateau.combattants[idCombattant].reveler(self._idCache) self.plateau.removeItem(self.etiquette) del self.plateau.caches[self._idCache] 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()