| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- #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
|