Cache.py 3.8 KB

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