Cache.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. from PyQt4.QtCore import QString, Qt
  4. from PyQt4.QtGui import QGraphicsTextItem, QFont, QColor, QCursor
  5. from dialogues import dmConfirmer
  6. class Cache(object):
  7. """cache place sur le plateau"""
  8. def __init__(self, idCache, parent=None):
  9. self._idCache = idCache
  10. self._nom = ""
  11. self.etiquette = None
  12. self._listeCases = []
  13. def __getstate__(self):
  14. state = {key:value for key, value in self.__dict__.items() if not key in ["plateau", "etiquette"]}
  15. return (state)
  16. def __setstate__(self, state):
  17. self.__dict__ = state
  18. def nom(self):
  19. return self._nom
  20. def listeCases(self):
  21. return self._listeCases
  22. def creer(self, plateau, listeCases, nom):
  23. self._nom = nom
  24. self._listeCases = listeCases
  25. self.ajouter(plateau)
  26. def ajouter(self, plateau):
  27. self.plateau = plateau
  28. self.plateau.caches[self._idCache] = self
  29. for coord in self._listeCases:
  30. self.plateau.cases[coord].ajouterCache(self._idCache)
  31. for idCombattant in self.plateau.combattants:
  32. if self.plateau.combattants[idCombattant].position in self._listeCases:
  33. self.plateau.combattants[idCombattant].cacher(self._idCache)
  34. self.creerEtiquette()
  35. def creerEtiquette(self):
  36. self.etiquette = EtiquetteCache(self)
  37. self.etiquette.creer()
  38. def retirer(self):
  39. """retire le cache du plateau apres confirmation"""
  40. #demande de confirmation
  41. if not dmConfirmer("Retirer le cache du plateau?"):
  42. return
  43. for coord in self._listeCases:
  44. self.plateau.cases[coord].retirerCache(self._idCache)
  45. for idCombattant in self.plateau.combattants:
  46. if self.plateau.combattants[idCombattant].position in self._listeCases:
  47. self.plateau.combattants[idCombattant].reveler(self._idCache)
  48. self.plateau.removeItem(self.etiquette)
  49. del self.plateau.caches[self._idCache]
  50. class EtiquetteCache(QGraphicsTextItem):
  51. def __init__(self, cache, parent=None):
  52. self.cache = cache
  53. super(EtiquetteCache, self).__init__(parent)
  54. def creer(self):
  55. """cree et place l'etiquette avec le texte et a la position demandee"""
  56. self._txt = self.cache.nom()
  57. self.setPos(self.position())
  58. self.cache.plateau.addItem(self)
  59. self.setZValue(100)
  60. curseur = QCursor(Qt.ArrowCursor)
  61. self.setCursor(curseur)
  62. self.maj()
  63. def position(self):
  64. """calcule la position de l'etiquette:
  65. on cherche la case la plus proche du barycentre"""
  66. liste = self.cache.listeCases()
  67. totalX = 0 ; totalY = 0
  68. for x, y in liste:
  69. totalX += x ; totalY += y
  70. xc = totalX / len(liste) ; yc = totalY / len(liste)
  71. plusProche = None
  72. for x, y in liste:
  73. d2 = (x - xc)**2 + (y - yc)**2
  74. if not plusProche:
  75. plusProche = (d2, (x, y))
  76. else:
  77. if d2 < plusProche[0]: plusProche = (d2, (x, y))
  78. coord = plusProche[1]
  79. pos = self.cache.plateau.cases[coord].centreGraphique
  80. return pos
  81. def maj(self, survol = False):
  82. """met a jour l'apparence de l'etiquette slon qu'elle soit survolee ou non"""
  83. txt = self._txt
  84. if survol: txt += " [X]"
  85. self.setPlainText(QString.fromUtf8(txt))
  86. police = QFont("Verdana", 20)
  87. police.setBold(survol)
  88. self.setFont(police)
  89. self.setDefaultTextColor(QColor(249, 249, 249) if not survol else QColor(255, 50, 50))
  90. def hoverEnterEvent(self, event):
  91. self.maj(True)
  92. def hoverLeaveEvent(self, event):
  93. self.maj(False)
  94. def mousePressEvent(self, event):
  95. self.cache.retirer()