| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- #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()
-
-
-
-
-
|