Case.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. from __future__ import division
  4. import os
  5. from PyQt4.QtCore import *
  6. from PyQt4.QtGui import *
  7. from outilsSvg import *
  8. from Terrain import Terrain
  9. import Modes
  10. class Case(QGraphicsPolygonItem):
  11. """objet graphique representant une case du plateau"""
  12. def __init__(self, plateau, parent=None):
  13. super(Case, self).__init__(parent)
  14. #plateau
  15. self.plateau = plateau
  16. #attributs
  17. self.x = 0
  18. self.y = 0
  19. self.altitude = 0
  20. self.terrain = Terrain() #terrain par defaut
  21. ## self.couleur = None #couleur du fond par defaut
  22. self.bordure = QColor(85, 85, 85, 85) #couleur de la bordure par defaut
  23. self.centreGraphique = None
  24. self.occupeePar = {} #objet: altitudes occupees (sous forme de tuple, ex: (0,1,2) pour une creature occupant les cases d'altitude 0, 1 et 2)
  25. self.cachesActifs = [] #liste des caches places par le MJ (cache le terrain, les decors, les pions aux joueurs...)
  26. self.cachesInactifs = []
  27. #effet sur la case
  28. self.effetActif = ""
  29. #polygones d'affichage
  30. self.polygoneEffet = None
  31. self.polygoneAffichageSpecial = None
  32. self.etiquetteAltitude = None
  33. self.polygoneCache = None
  34. def __getstate__(self):
  35. """selectionne les attributs qui seront sauvegardes"""
  36. state = {key:value for key, value in self.__dict__.items() if key in ["x", "y", "altitude","terrain","bordure","couleur", \
  37. "ombre", "effetActif", "cachesActifs", "cachesInactifs"]}
  38. return (state)
  39. def __setstate__(self, state):
  40. """recupere les attributs sauvegardes"""
  41. self.__dict__ = state
  42. ######## fonctions de base : geometrie, aspect graphique ######
  43. def creer(self, x, y, couleur = QColor(0, 255, 0, 80)):
  44. """creation du polygone et enregistrement des donnees geometriques"""
  45. self.x = x
  46. self.y = y
  47. self.terrain.couleur = couleur
  48. #creation de l'objet graphique sur le plateau
  49. self.creerGraphique()
  50. def creerGraphique(self):
  51. """cree les objets graphiques representant la case"""
  52. #reinitialisation des variables
  53. self.couleurEffet = {"brule":QColor("orange"), "glace":QColor("white"), "poison":QColor("green"), "eau":QColor("blue")}
  54. self.imgEffet = {"brule":"effFeu.jpg", "glace":"effGlace.jpg", "poison":"effPoison.png", "eau":"effEau.png"}
  55. #enregistrement des cases voisines:
  56. self.voisins = self.lstVoisins(self.x, self.y)
  57. self.occupeePar = {}
  58. #enregistrement du centre
  59. if self.plateau.formeCases == "H": #refPlateau
  60. k = 0
  61. if 1 == (self.x % 2): k = 0.5
  62. self.centreGraphique = QPointF(((self.x*0.866)+0.5773)*self.plateau.hCase, (self.y+k+0.5)*self.plateau.hCase)
  63. else:
  64. self.centreGraphique = QPointF((self.x+0.5)*self.plateau.hCase, (self.y+0.5)*self.plateau.hCase)
  65. #cree le polygone de la case
  66. self.setPolygon(self.polygone(self.x, self.y))
  67. self.plateau.addItem(self) #refPlateau
  68. #interactions graphiques:
  69. self.setFlag(QGraphicsItem.ItemIsFocusable)
  70. self.setAcceptHoverEvents(True)
  71. self.setAcceptDrops(True)
  72. self.setZValue(0)
  73. self.setFiltersChildEvents(True)
  74. # #pour afficher les coordonnees des cases:
  75. self.etiquette = None
  76. # self.afficherEtiquette("{}-{}".format(self.x,self.y))
  77. self.logoDep = LogoDep(self)
  78. self.logoDep.creer()
  79. #apparence initiale de la case
  80. self.majTerrain(self.terrain)
  81. #polygone utilise pour afficher la cible du curseur
  82. self.polygoneCible = QGraphicsPolygonItem(self.polygone(self.x, self.y), parent=self)
  83. self.polygoneCible.setVisible(False)
  84. self.polygoneCible.setAcceptHoverEvents(False)
  85. #cache
  86. self.polygoneCache = PolygoneCache(self)
  87. self.polygoneCache.creer()
  88. self.majCache()
  89. def recreer(self, plateau):
  90. ## self.plateau = plateau #refPlateau
  91. self.plateau = plateau
  92. super(Case, self).__init__()
  93. #polygones d'affichage
  94. self.polygoneEffet = None
  95. self.polygoneAffichageSpecial = None
  96. self.polygoneCache = None
  97. self.etiquetteAltitude = None
  98. self.creerGraphique()
  99. self.majTerrain(self.terrain)
  100. self.majAffichageSpecial("")
  101. self.majEffet(self.effetActif)
  102. def polygone(self, x, y):
  103. """renvoie l'objet graphique hexagone de la case"""
  104. polygone = QPolygonF()
  105. if self.plateau.formeCases == "H":
  106. #si x est impair sur un plateau a cases hexagonales, le y est augmente de 0.5
  107. if 1 == (x % 2):
  108. y += 0.5
  109. polygone << QPointF(((x*0.866)+0.2886)*self.plateau.hCase, y*self.plateau.hCase) \
  110. << QPointF(((x*0.866)+0.866)*self.plateau.hCase, y*self.plateau.hCase) \
  111. << QPointF(((x*0.866)+1.1547)*self.plateau.hCase, (y+0.5)*self.plateau.hCase) \
  112. << QPointF(((x*0.866)+0.866)*self.plateau.hCase, (y+1)*self.plateau.hCase) \
  113. << QPointF(((x*0.866)+0.2886)*self.plateau.hCase, (y+1)*self.plateau.hCase) \
  114. << QPointF( (x*0.866)*self.plateau.hCase, (y+0.5)*self.plateau.hCase)
  115. else:
  116. polygone << QPointF(x*self.plateau.hCase, y*self.plateau.hCase) \
  117. << QPointF((x+1)*self.plateau.hCase, y*self.plateau.hCase) \
  118. << QPointF((x+1)*self.plateau.hCase, (y+1)*self.plateau.hCase) \
  119. << QPointF(x*self.plateau.hCase, (y+1)*self.plateau.hCase)
  120. return polygone
  121. def lstVoisins(self, x, y):
  122. """renvoie la liste des cases voisines
  123. seulement cases existantes sur le plateau / seulement cases adjacentes (cas des cases carrees)"""
  124. voisins = []
  125. if self.plateau.formeCases == "H":
  126. if 1 == (x % 2):
  127. lst = [(x, y-1), (x+1, y), (x+1, y+1), (x, y+1), (x-1, y+1), (x-1, y)]
  128. else:
  129. lst = [(x, y-1), (x+1, y-1), (x+1, y), (x, y+1), (x-1, y), (x-1, y-1)]
  130. else:
  131. lst = [(x, y-1), (x+1, y-1), (x+1, y), (x+1, y+1), (x, y+1), (x-1, y+1), (x-1, y), (x-1, y-1)]
  132. for coord in lst:
  133. if (coord[0] >= 0 and coord[1] >= 0 and coord[0] < self.plateau.nbCasesX and coord[1] < self.plateau.nbCasesY):
  134. voisins.append(coord)
  135. return voisins
  136. def afficherEtiquette(self, txt):
  137. """affiche l'etiquette avec le texte demande"""
  138. if self.etiquette == None:
  139. self.etiquette = QGraphicsSimpleTextItem(QString().fromUtf8(str(txt)), parent=self)
  140. k = 0
  141. if 1 == (self.x % 2): k = 0.5
  142. if self.plateau.formeCases == "H":
  143. self.etiquette.setPos(QPointF(((self.x*0.866)+0.2886)*self.plateau.hCase, (self.y+k+0.5)*self.plateau.hCase))
  144. else:
  145. self.etiquette.setPos(QPointF(self.x*self.plateau.hCase, self.y*self.plateau.hCase))
  146. else:
  147. self.etiquette.setText(QString().fromUtf8(str(txt)))
  148. ########################
  149. ### deplacement
  150. def estFranchissable(self, z=0):
  151. """la case est-elle franchissable?"""
  152. retour = True
  153. if self.terrain.franchissable == False:
  154. retour = False
  155. else:
  156. if self.estOccupee(z) == True:
  157. retour = False
  158. return retour
  159. def coutDep(self):
  160. #a implementer, en fonction des
  161. #capacites de deplacement du pion actuellement selectionne
  162. return 1
  163. ### occupation
  164. def majOccupation(self, objet, nouveauZ = None):
  165. """met a jour l'occupation de la case par les pions, decors..."""
  166. if objet != None:
  167. if not objet in self.occupeePar and nouveauZ != None:
  168. #on ajoute l'objet a la liste des objets occupant la case ou on met a jour son altitude
  169. casesOccupees = []
  170. for i in range(0, objet.hauteur):
  171. casesOccupees.append(self.altitude + nouveauZ + i)
  172. self.occupeePar[objet] = casesOccupees
  173. elif objet in self.occupeePar and nouveauZ == None:
  174. #on supprime l'objet de la liste des objets occupant la case
  175. del self.occupeePar[objet]
  176. else:
  177. pass
  178. def estOccupee(self, z=0):
  179. """renvoie vrai si la case correspondant a la hauteur z est occupee"""
  180. retour = False
  181. for objet in self.occupeePar:
  182. if objet.hauteur > 0 and z in self.occupeePar[objet]:
  183. retour = True
  184. return retour
  185. def estOccupeePar(self, z=0):
  186. """si la case correspondant a la hauteur z est occupee, renvoie l'objet en question
  187. sinon renvoie None"""
  188. retour = None
  189. for objet in self.occupeePar:
  190. if objet.hauteur > 0 and z in self.occupeePar[objet]:
  191. retour = objet
  192. return retour
  193. def pionOccupant(self):
  194. """si un pion occupe cette case, le renvoie"""
  195. retour = None
  196. for objet in self.occupeePar:
  197. if objet.__class__.__name__ == "Combattant":
  198. retour = objet
  199. return retour
  200. #autres interaction de combat
  201. def estObstacleVision(self, hauteurObs):
  202. """renvoie vrai si la case et l'eventuel decor qui l'occupe bloquent le champ de
  203. vision d'un observateur situe a la hauteur precisee"""
  204. retour = False
  205. if self.altitude > hauteurObs:
  206. retour = True
  207. else:
  208. hauteurObstacle = 0
  209. for objet in self.occupeePar:
  210. if objet.hauteur > hauteurObstacle:
  211. hauteurObstacle = objet.hauteur
  212. if (self.altitude + hauteurObstacle) > hauteurObs:
  213. retour = True
  214. return retour
  215. ########## fonctions de maj ###########
  216. def majTerrain(self, terrain = Terrain()):
  217. """met a jour le terrain de la case"""
  218. self.terrain = terrain
  219. if self.terrain.imgTexture.estValide():
  220. self.setBrush(QBrush(QImage(self.terrain.imgTexture.chemin())))
  221. else:
  222. if self.terrain.couleur.isValid():
  223. self.setBrush(QBrush(self.terrain.couleur))
  224. pinceau = QPen()
  225. pinceau.setColor(self.couleurBordure())
  226. pinceau.setWidth(1)
  227. self.setPen(pinceau)
  228. def majAltitude(self, altitude):
  229. """met a jour l'altitude de la case"""
  230. self.altitude = altitude
  231. self.afficherEtiquette(altitude)
  232. def majAffichageDeplacement(self, cout, valide = True):
  233. """lorsque cette case est sur le chemin d'un pion,
  234. un disque blanc ou rouge apparait indiquant le
  235. cout du deplacement jusqua cette case
  236. un cout de 0 fait disparaitre ce symbole"""
  237. self.logoDep.afficher(cout, valide)
  238. def majEstCibleCurseur(self, actif, valide=True):
  239. """affiche la case comme etant la cible du curseur (lors d'une creation de pion, d'un deplacement...)"""
  240. if actif:
  241. pinceau = QPen()
  242. pinceau.setWidth(5)
  243. brush = QBrush()
  244. brush.setStyle(13)
  245. pinceau.setColor(self.couleurProj(valide))
  246. brush.setColor(self.couleurProj(valide))
  247. self.polygoneCible.setPen(pinceau)
  248. self.polygoneCible.setBrush(brush)
  249. self.setZValue(99)
  250. else:
  251. self.setZValue(0)
  252. self.polygoneCible.setVisible(actif)
  253. def majEffet(self, effet):
  254. """met a jour l'effet actif sur la case"""
  255. if self.polygoneEffet == None:
  256. #on cree le polygone utilise pour afficher les effets
  257. self.polygoneEffet = QGraphicsPolygonItem(self.polygone(self.x, self.y), parent=self)
  258. pinceau = QPen()
  259. pinceau.setColor(self.bordure)
  260. pinceau.setWidth(1)
  261. self.polygoneEffet.setPen(pinceau)
  262. self.polygoneEffet.setVisible(False)
  263. if len(effet) > 0 and effet != "aucun":
  264. #gradient de couleur
  265. gradient = QRadialGradient(self.centreGraphique, 0.5*self.plateau.hCase)
  266. couleur0 = QColor(0,0,0,0)
  267. couleur20 = self.couleurEffet[effet]
  268. couleur20.setAlpha(70)
  269. couleur10 = self.couleurEffet[effet]
  270. couleur10.setAlpha(255)
  271. gradient.setColorAt(0, couleur0)
  272. gradient.setColorAt(0.8, couleur0)
  273. gradient.setColorAt(0.95, couleur10)
  274. gradient.setColorAt(0.98, couleur20)
  275. gradient.setColorAt(1, couleur10)
  276. self.polygoneEffet.setBrush(gradient)
  277. self.polygoneEffet.setVisible(True)
  278. self.effetActif = effet
  279. else:
  280. self.polygoneEffet.setVisible(False)
  281. def majAffichageSpecial(self, affichage=""):
  282. """donne a la case l'aspect demande en rendant visible/invisible le polygone d'affichage special"""
  283. #polygone d'affichage special (altitude, tactique...)
  284. if self.polygoneAffichageSpecial == None:
  285. self.polygoneAffichageSpecial = QGraphicsPolygonItem(self.polygone(self.x, self.y), parent=self)
  286. pinceau = QPen()
  287. pinceau.setColor(self.bordure)
  288. pinceau.setWidth(1)
  289. self.polygoneAffichageSpecial.setPen(pinceau)
  290. if affichage != "altitude" and self.etiquetteAltitude:
  291. self.etiquetteAltitude.setVisible(False)
  292. if affichage == "tactique":
  293. if self.terrain.franchissable:
  294. self.polygoneAffichageSpecial.setBrush(QColor(255,255,255))
  295. else:
  296. self.polygoneAffichageSpecial.setBrush(QColor(50,50,50))
  297. self.polygoneAffichageSpecial.setVisible(True)
  298. elif affichage == "altitude":
  299. if self.etiquetteAltitude == None:
  300. self.etiquetteAltitude = QGraphicsSimpleTextItem("{}".format(self.altitude), parent=self)
  301. police = QFont("Georgia", 18)
  302. police.setItalic(True)
  303. self.etiquetteAltitude.setFont(police)
  304. self.etiquetteAltitude.setPos(QPointF(((self.x*0.866)+0.65)*self.plateau.hCase, (self.y+0.7)*self.plateau.hCase))
  305. if self.altitude >= 0:
  306. couleur = QColor("red").lighter(200-(5*self.altitude))
  307. else:
  308. couleur = QColor("purple").lighter(200+(5*self.altitude))
  309. self.polygoneAffichageSpecial.setBrush(couleur)
  310. self.polygoneAffichageSpecial.setZValue(5)
  311. self.polygoneAffichageSpecial.setVisible(True)
  312. self.etiquetteAltitude.setText(QString.fromUtf8("{}".format(self.altitude)))
  313. self.etiquetteAltitude.setVisible(True)
  314. self.etiquetteAltitude.setZValue(6)
  315. else:
  316. self.polygoneAffichageSpecial.setVisible(False)
  317. #caches
  318. def ajouterCache(self, idCache, actif = True):
  319. if actif:
  320. if not idCache in self.cachesActifs:
  321. self.cachesActifs.append(idCache)
  322. self.majCache()
  323. else:
  324. if not idCache in self.cachesInactifs:
  325. self.cachesInactifs.append(idCache)
  326. def supprimerCache(self, idCache):
  327. if idCache in self.cachesActifs:
  328. self.cachesActifs.remove(idCache)
  329. self.majCache()
  330. elif idCache in self.cachesInactifs:
  331. self.cachesInactifs.remove(idCache)
  332. def activerCache(self, idCache, actif = True):
  333. if actif:
  334. if idCache in self.cachesInactifs:
  335. self.cachesInactifs.remove(idCache)
  336. self.cachesActifs.append(idCache)
  337. self.majCache()
  338. else:
  339. if idCache in self.cachesActifs:
  340. self.cachesActifs.remove(idCache)
  341. self.cachesInactifs.append(idCache)
  342. self.majCache()
  343. def majCache(self):
  344. self.polygoneCache.setVisible((len(self.cachesActifs) > 0))
  345. if len(self.cachesActifs) > 0:
  346. self.polygoneCache.majTransparence()
  347. def estCachee(self):
  348. """une case cachee ne recoit plus aucun evenement souris ou clavier"""
  349. retour = (len(self.cachesActifs) > 0 and \
  350. not issubclass(self.plateau.modeActif.__class__, Modes.ModeBaseCp))
  351. return retour
  352. #fonctions secondaires
  353. def couleurDep(self):
  354. """renvoie une couleur secondaire utilisee pour les champs de deplacements"""
  355. luminositeActuelle = self.couleurEffective().lightness()
  356. if luminositeActuelle < 150:
  357. retour = QColor(210,255,255,100)
  358. else:
  359. retour = QColor(210,255,255,100)
  360. return retour
  361. def couleurProj(self, valide):
  362. """renvoie une couleur secondaire utilisee pour les projections de deplacement"""
  363. luminositeActuelle = self.couleurEffective().lightness()
  364. if valide:
  365. retour = QColor("white")
  366. else:
  367. retour = QColor("red")
  368. if luminositeActuelle > 220:
  369. retour = retour.darker(120)
  370. return retour
  371. def couleurBordure(self):
  372. """renvoie la couleur utilisee pour les bordures de la case"""
  373. luminositeActuelle = self.couleurEffective().lightness()
  374. if luminositeActuelle > 150:
  375. retour = QColor(85, 85, 85, 130)
  376. elif luminositeActuelle > 100 and luminositeActuelle <= 150:
  377. retour = QColor(10, 10, 10, 130)
  378. else:
  379. retour = QColor(255, 255, 255, 180)
  380. return retour
  381. def couleurEffective(self):
  382. """renvoie la couleur effective de la case (utile quand la texture est une image)"""
  383. texture = self.brush()
  384. if texture.textureImage().isNull():
  385. couleurFond = texture.color()
  386. else:
  387. couleurFond = self.couleurDominante(texture.textureImage())
  388. return couleurFond
  389. def couleurDominante(self, img):
  390. """retourne la couleur dominante d'une QImage"""
  391. r = 0
  392. v = 0
  393. b = 0
  394. for i in range(0, img.width()):
  395. for j in range(0, img.height()):
  396. pixel = img.pixel(i,j)
  397. r += qRed(pixel)
  398. v += qGreen(pixel)
  399. b += qBlue(pixel)
  400. nb_pix = img.width() * img.height()
  401. r_moy = int(r / nb_pix)
  402. v_moy = int(v / nb_pix)
  403. b_moy = int(b / nb_pix)
  404. return QColor(r_moy, v_moy, b_moy)
  405. ######### evenements souris et clavier #################
  406. def mousePressEvent(self, event):
  407. """evenement lors du clic souris"""
  408. super(Case, self).mousePressEvent(event)
  409. if event.button() == 1: #sur clic gauche
  410. accepte = self.plateau.caseCliquee(self.x, self.y) #refPlateau
  411. if accepte: event.accept()
  412. else:
  413. event.ignore()
  414. def hoverEnterEvent(self, event):
  415. """met a jour l'affichage de la case au survol de la souris, si un pion est selectionne"""
  416. super(Case, self).hoverEnterEvent(event)
  417. if not self.estCachee():
  418. self.plateau.caseSurvol(self.x, self.y)
  419. def hoverLeaveEvent(self, event):
  420. """met a jour l'affichage de la case au survol de la souris, si un pion est selectionne"""
  421. super(Case, self).hoverLeaveEvent(event)
  422. ########################
  423. class LogoDep(QGraphicsEllipseItem):
  424. """logo utilise pour afficher le chemin que va suivre le pion lors d'un deplacement"""
  425. def __init__(self, parent = None):
  426. super(LogoDep, self).__init__()
  427. self.parent = parent
  428. self.couleur = None
  429. self.txt = None
  430. def creer(self):
  431. hC = self.parent.plateau.hCase
  432. rect = QRectF()
  433. rayon = 0.4*hC
  434. rect.setTopLeft(QPointF(self.parent.centreGraphique.x() - rayon, self.parent.centreGraphique.y() - rayon))
  435. rect.setBottomRight(QPointF(self.parent.centreGraphique.x() + rayon, self.parent.centreGraphique.y() + rayon))
  436. self.setRect(rect)
  437. self.txt = QGraphicsTextItem(self)
  438. police = QFont("Georgia", 24)
  439. police.setBold(True)
  440. self.txt.setFont(police)
  441. self.txt.setParentItem(self)
  442. self.txt.setPos(QPointF(self.parent.centreGraphique.x() - rayon, self.parent.centreGraphique.y() - 0.6*rayon))
  443. self.txt.setTextWidth(2*rayon)
  444. self.txt.setPlainText(QString.fromUtf8(""))
  445. self.centrerTexte()
  446. self.setVisible(False)
  447. self.setAcceptHoverEvents(False)
  448. self.setParentItem(self.parent)
  449. def afficher(self, valeur, valide):
  450. """lorsque cette case est sur le chemin d'un pion,
  451. un disque blanc ou rouge apparait indiquant le
  452. mode de deplacement (icone: 'dep_simple', 'nage', 'escalade', 'vol')
  453. un cout de 0 fait disparaitre ce symbole"""
  454. if valeur > 0:
  455. #couleur
  456. if valide:
  457. couleur = QColor(255, 255, 220, 200)
  458. else:
  459. couleur = QColor(240, 60, 20, 200)
  460. self.setBrush(couleur)
  461. self.setPen(QPen(couleur))
  462. #txt
  463. self.txt.setPlainText(QString.fromUtf8(str(valeur)))
  464. self.centrerTexte()
  465. self.setVisible(True)
  466. else:
  467. self.setVisible(False)
  468. def centrerTexte(self):
  469. f = QTextBlockFormat()
  470. f.setAlignment(Qt.AlignCenter)
  471. cursor = self.txt.textCursor()
  472. cursor.select(QTextCursor.Document)
  473. cursor.mergeBlockFormat(f)
  474. cursor.clearSelection()
  475. self.txt.setTextCursor(cursor)
  476. class PolygoneCache(QGraphicsPolygonItem):
  477. def __init__(self, case, parent=None):
  478. """initialisation de la fenetre"""
  479. super(PolygoneCache, self).__init__(parent)
  480. self.case = case
  481. self.case.plateau.fenetre.connect(self.case.plateau.fenetre.ui.cbt_vue, SIGNAL("zoomChange(int)"), self.zoomChange)
  482. def creer(self):
  483. polygone = self.case.polygone(self.case.x, self.case.y)
  484. self.setPolygon(polygone)
  485. self.majTransparence()
  486. self.setTransformOriginPoint(self.case.centreGraphique)
  487. self.setZValue(100)
  488. self.setVisible(False)
  489. self.setScale(1.05)
  490. # self.setAcceptHoverEvents(True)
  491. # self.setAcceptDrops(True)
  492. self.case.plateau.addItem(self)
  493. def afficher(self, actif = True):
  494. self.setVisible(actif)
  495. def majTransparence(self):
  496. self.setBrush(QColor(0,0,0,self.transparence()))
  497. pinceau = QPen()
  498. pinceau.setBrush(QColor(0,0,0,self.transparence()))
  499. pinceau.setWidth(1)
  500. self.setPen(pinceau)
  501. def transparence(self):
  502. if issubclass(self.case.plateau.modeActif.__class__, Modes.ModeBaseCp):
  503. retour = 100
  504. else:
  505. retour = 255
  506. return retour
  507. def activerSurbrillance(self, actif):
  508. if actif:
  509. couleur = QColor(150,150,150,100)
  510. else:
  511. couleur = QColor(0,0,0,100)
  512. self.setBrush(couleur)
  513. def zoomChange(self, nbZoom):
  514. """le zoom sur la dmGraphicsView a change, on met a jour le scale de l'objet,
  515. on cherche a eviter un phenomene qui fait que lorsque le zoom est lointain,
  516. on devine les couleurs entre les polygones du cache, le rendant a moitie inutile"""
  517. s = (1 + 0.01*(10-nbZoom))
  518. self.setScale(s)
  519. def sceneEvent(self, event):
  520. """filtre les evenements souris et clavier
  521. si faux: l'evenement est bloque"""
  522. autorise = not self.case.estCachee()
  523. if not autorise:
  524. event.accept()
  525. else:
  526. event.ignore()
  527. return autorise
  528. # def hoverEnterEvent(self, event):
  529. # print "1"
  530. # if not self.case.estCachee():
  531. # print "2"
  532. # self.case.plateau.caseSurvol(self.case.x, self.case.y)
  533. # event.accept()