Cache - Copie.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. class Cache(QGraphicsPolygonItem):
  8. """cache place sur le plateau"""
  9. def __init__(self, plateau, numero, parent=None):
  10. """initialisation de la fenetre"""
  11. super (Cache, self).__init__(parent)
  12. self.plateau = plateau
  13. self.numero = numero
  14. self.nom = ""
  15. self.listeCases = []
  16. self._active = False
  17. self._etiquette = None
  18. def __getstate__(self):
  19. """selectionne les attributs qui seront sauvegardes"""
  20. self._active = False
  21. state = {key:value for key, value in self.__dict__.items() if key in ["numero", "nom", "listeCases", "_active"]}
  22. return (state)
  23. def __setstate__(self, state):
  24. """recupere les attributs sauvegardes"""
  25. self.__dict__ = state
  26. def recreer(self, plateau):
  27. super (Cache, self).__init__()
  28. self._etiquette = None
  29. self.plateau = plateau
  30. self.creer()
  31. def creer(self):
  32. """cree le cache sur la liste de cases en parametre"""
  33. self.setFlag(QGraphicsItem.ItemIsFocusable)
  34. self.setAcceptHoverEvents(True)
  35. self.setBrush(QColor(0,0,0,255))
  36. pinceau = QPen(QColor("black"))
  37. pinceau.setWidth(10)
  38. self.setPen(pinceau)
  39. self._etiquette = QGraphicsTextItem(QString.fromUtf8("{}- {}".format(self.numero, self.nom)))
  40. self._etiquette.setPos(self.mapFromScene(self.plateau.cases[self.coordCentre()].centreGraphique))
  41. police = QFont("Arial",30)
  42. police.setBold(True)
  43. self._etiquette.setFont(police)
  44. self._etiquette.setDefaultTextColor(QColor(50,50,50,180))
  45. self._etiquette.setParentItem(self)
  46. self.setPolygon(self.plateau.polygoneAgglo(self.listeCases))
  47. self.setZValue(100)
  48. self.plateau.addItem(self)
  49. self._active = True
  50. def majPolygone(self, listeCases):
  51. self.listeCases = listeCases
  52. self.setPolygon(self.plateau.polygoneAgglo(self.listeCases))
  53. self._etiquette.setPos(self.mapFromScene(self.plateau.cases[self.coordCentre()].centreGraphique))
  54. def majEtiquette(self):
  55. self._etiquette.setPlainText(QString().fromUtf8(self.nom))
  56. def modeChange(self, mode):
  57. if self._active:
  58. if issubclass(mode, Modes.ModeBaseCp):
  59. transparence = 130
  60. else:
  61. transparence = 255
  62. self.setBrush(QColor(0,0,0, transparence))
  63. def activer(self, actif):
  64. self._active = actif
  65. self.majAffichage()
  66. def actif(self):
  67. return self._active
  68. def majAffichage(self):
  69. self.setVisible(self._active)
  70. def coordCentre(self):
  71. """renvoie les coordonnees de la case la plus centrale de la liste"""
  72. xtot = 0
  73. ytot = 0
  74. for coord in self.listeCases:
  75. xtot += coord[0]
  76. ytot += coord[1]
  77. ecartMin = None
  78. coordRetenues = None
  79. for coord in self.listeCases:
  80. ecartX = abs(xtot - (coord[0] * len(self.listeCases)))
  81. ecartY = abs(ytot - (coord[1] * len(self.listeCases)))
  82. if not ecartMin or (ecartX + ecartY) < ecartMin:
  83. coordRetenues = coord
  84. ecartMin = ecartX + ecartY
  85. return coordRetenues
  86. def sceneEvent(self, event):
  87. """filtre les evenements souris et clavier
  88. si vrai: l'evenement est bloque"""
  89. retour = (not self.actif() or issubclass(self.plateau.modeActif.__class__, Modes.ModeBaseCp))
  90. if not retour:
  91. event.accept()
  92. else:
  93. event.ignore()
  94. return retour