Cache.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. from __future__ import division
  4. import Modes
  5. from PyQt4.QtCore import *
  6. from PyQt4.QtGui import *
  7. from Case import Case
  8. class Cache(QGraphicsItem):
  9. """cache place sur le plateau"""
  10. def __init__(self, plateau, numero, parent=None):
  11. """initialisation de la fenetre"""
  12. super (Cache, self).__init__(parent)
  13. self.plateau = plateau
  14. self.numero = numero
  15. self.nom = ""
  16. self._actif = False
  17. self.listeCases = []
  18. self._etiquette = None
  19. self._listePolygones = []
  20. def __getstate__(self):
  21. """selectionne les attributs qui seront sauvegardes"""
  22. self._actif = False
  23. state = {key:value for key, value in self.__dict__.items() if key in ["numero", "nom", "listeCases", "_actif"]}
  24. return (state)
  25. def __setstate__(self, state):
  26. """recupere les attributs sauvegardes"""
  27. self.__dict__ = state
  28. def recreer(self, plateau):
  29. super (Cache, self).__init__()
  30. self._etiquette = None
  31. self.plateau = plateau
  32. self._listePolygones = []
  33. self.creer()
  34. def creer(self):
  35. """cree le cache sur la liste de cases en parametre"""
  36. self.setFlag(QGraphicsItem.ItemIsFocusable)
  37. self.setAcceptHoverEvents(True)
  38. self._etiquette = QGraphicsTextItem(QString.fromUtf8("{}".format(self.nom)))
  39. self._etiquette.setPos(self.mapFromScene(self.plateau.cases[self.coordCentre()].centreGraphique))
  40. police = QFont("Arial",30)
  41. police.setBold(True)
  42. self._etiquette.setFont(police)
  43. self._etiquette.setDefaultTextColor(QColor(255, 255, 255, 200))
  44. self._etiquette.setParentItem(self)
  45. self._etiquette.setZValue(10)
  46. for coord in self.listeCases:
  47. self.ajouterPolygone(Case(self.plateau).polygone(coord[0], coord[1]))
  48. self.setZValue(100)
  49. self.setFlag(QGraphicsItem.ItemHasNoContents)
  50. self.setHandlesChildEvents(True)
  51. self.plateau.addItem(self)
  52. self._actif = True
  53. def ajouterPolygone(self, polygone):
  54. polygoneGraphique = PolygoneCache(self)
  55. polygoneGraphique.creer(polygone)
  56. polygoneGraphique.setParentItem(self)
  57. self._listePolygones.append(polygoneGraphique)
  58. def majForme(self, listeCases):
  59. for polygone in self._listePolygones:
  60. polygone.setParentItem(None)
  61. self._listePolygones = []
  62. self.listeCases = listeCases
  63. for coord in self.listeCases:
  64. self.ajouterPolygone(Case(self.plateau).polygone(coord[0], coord[1]))
  65. self._etiquette.setPos(self.mapFromScene(self.plateau.cases[self.coordCentre()].centreGraphique))
  66. def majEtiquette(self):
  67. self._etiquette.setPlainText(QString().fromUtf8(self.nom))
  68. def modeChange(self, mode):
  69. if self._actif:
  70. if issubclass(mode, Modes.ModeBaseCp):
  71. transparence = 100
  72. else:
  73. transparence = 255
  74. for polygone in self._listePolygones:
  75. polygone.majTransparence(transparence)
  76. def activer(self, actif):
  77. self._actif = actif
  78. self.majAffichage()
  79. def actif(self):
  80. return self._actif
  81. def majAffichage(self):
  82. self.setVisible(self._actif)
  83. def coordCentre(self):
  84. """renvoie les coordonnees de la case la plus centrale de la liste"""
  85. xtot = 0
  86. ytot = 0
  87. for coord in self.listeCases:
  88. xtot += coord[0]
  89. ytot += coord[1]
  90. ecartMin = None
  91. coordRetenues = None
  92. for coord in self.listeCases:
  93. ecartX = abs(xtot - (coord[0] * len(self.listeCases)))
  94. ecartY = abs(ytot - (coord[1] * len(self.listeCases)))
  95. if not ecartMin or (ecartX + ecartY) < ecartMin:
  96. coordRetenues = coord
  97. ecartMin = ecartX + ecartY
  98. return coordRetenues
  99. def sceneEvent(self, event):
  100. """filtre les evenements souris et clavier
  101. si vrai: l'evenement est bloque"""
  102. retour = (not self.actif() or issubclass(self.plateau.modeActif.__class__, Modes.ModeBaseCp))
  103. if not retour:
  104. event.accept()
  105. else:
  106. event.ignore()
  107. return retour
  108. def boundingRect(self):
  109. return QRectF()
  110. class PolygoneCache(QGraphicsPolygonItem):
  111. def __init__(self, cache, parent=None):
  112. """initialisation de la fenetre"""
  113. super (PolygoneCache, self).__init__(parent)
  114. self.cache = cache
  115. self.setAcceptHoverEvents(True)
  116. def creer(self, polygone):
  117. self.setPolygon(polygone)
  118. self.majTransparence(255)
  119. def majTransparence(self, transparence):
  120. self.setBrush(QColor(0,0,0,transparence))
  121. pinceau = QPen()
  122. pinceau.setBrush(QColor(0,0,0,transparence))
  123. pinceau.setWidth(10)
  124. self.setPen(pinceau)