Cache.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. #
  32. self.creerEtiquette()
  33. self.plateau.gC.reinitialiser()
  34. def creerEtiquette(self):
  35. self.etiquette = EtiquetteCache(self)
  36. self.etiquette.creer()
  37. def retirer(self):
  38. """retire le cache du plateau apres confirmation"""
  39. #demande de confirmation
  40. if not dmConfirmer("Retirer le cache du plateau?"):
  41. return
  42. for coord in self._listeCases:
  43. self.plateau.cases[coord].retirerCache(self._idCache)
  44. self.plateau.removeItem(self.etiquette)
  45. del self.plateau.caches[self._idCache]
  46. self.plateau.gC.reinitialiser()
  47. class EtiquetteCache(QGraphicsTextItem):
  48. def __init__(self, cache, parent=None):
  49. self.cache = cache
  50. super(EtiquetteCache, self).__init__(parent)
  51. def creer(self):
  52. """cree et place l'etiquette avec le texte et a la position demandee"""
  53. self._txt = self.cache.nom()
  54. self.setPos(self.position())
  55. self.cache.plateau.addItem(self)
  56. self.setZValue(100)
  57. curseur = QCursor(Qt.ArrowCursor)
  58. self.setCursor(curseur)
  59. self.maj()
  60. def position(self):
  61. """calcule la position de l'etiquette:
  62. on cherche la case la plus proche du barycentre"""
  63. liste = self.cache.listeCases()
  64. totalX = 0 ; totalY = 0
  65. for x, y in liste:
  66. totalX += x ; totalY += y
  67. xc = totalX / len(liste) ; yc = totalY / len(liste)
  68. plusProche = None
  69. for x, y in liste:
  70. d2 = (x - xc)**2 + (y - yc)**2
  71. if not plusProche:
  72. plusProche = (d2, (x, y))
  73. else:
  74. if d2 < plusProche[0]: plusProche = (d2, (x, y))
  75. coord = plusProche[1]
  76. pos = self.cache.plateau.cases[coord].centreGraphique
  77. return pos
  78. def maj(self, survol = False):
  79. """met a jour l'apparence de l'etiquette slon qu'elle soit survolee ou non"""
  80. txt = self._txt
  81. if survol: txt += " [X]"
  82. self.setPlainText(QString.fromUtf8(txt))
  83. police = QFont("Verdana", 20)
  84. police.setBold(survol)
  85. self.setFont(police)
  86. self.setDefaultTextColor(QColor(249, 249, 249) if not survol else QColor(255, 50, 50))
  87. def hoverEnterEvent(self, event):
  88. self.maj(True)
  89. def hoverLeaveEvent(self, event):
  90. self.maj(False)
  91. def mousePressEvent(self, event):
  92. self.cache.retirer()