Case.py 24 KB

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