Modes.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. """les modes d'interaction permettent l'interaction
  4. entre l'interface (l'utilisateur) et le plateau de combat.
  5. Un seul mode ne peut etre actif a la fois
  6. Cette classe doit permettre de recevoir les commandes de l'utilisateur
  7. de maniere a produire un resultat unique (cases peintes, pion deplace...)"""
  8. from PyQt4.QtCore import Qt
  9. from PyQt4.QtGui import QPixmap, QCursor
  10. import Actions
  11. from Cache import Cache
  12. from Combattant import Combattant
  13. from Decor import Decor
  14. from EntreeSortie import EntreeSortie
  15. from Pion import Pion
  16. from dialogues import dmSaisie
  17. import dmK
  18. from lib.EcranAltitude import EcranAltitude
  19. import regles
  20. class ModeBase(object):
  21. """mode de base: tous les modes heritent de cette classe"""
  22. def __init__(self, plateau):
  23. self.plateau = plateau
  24. #le mode est il active
  25. self._actif = False
  26. #le dragmode est il active sur la QGraphicsView
  27. self._activerDragMode = 0
  28. #curseur de la QGraphicsView
  29. self._sourceCurseur = ""
  30. #met le focus sur la QGraphicsView a l'activation
  31. self._focus = False
  32. def nom(self):
  33. return self.__class__.__name__
  34. def activer(self, param = None):
  35. """active le mode"""
  36. self.activerCurseur()
  37. if self._focus:
  38. self.plateau.fenetre.ui.cbt_vue.setFocus()
  39. self._actif = True
  40. def desactiver(self):
  41. """desactive le mode"""
  42. self.desactiverCurseur()
  43. self.plateau.fenetre.ui.cbt_vue.setDragMode(1)
  44. self._actif = False
  45. def reinit(self):
  46. """remet les variables a 0 et reactive le mode"""
  47. pass
  48. def activerCurseur(self):
  49. self.plateau.fenetre.ui.cbt_vue.setDragMode(self._activerDragMode)
  50. curseurPix = QPixmap(self._sourceCurseur)
  51. if not curseurPix.isNull():
  52. curseur = QCursor(curseurPix, 0, curseurPix.height())
  53. self.plateau.fenetre.ui.cbt_vue.setCursor(curseur)
  54. def desactiverCurseur(self):
  55. self.plateau.fenetre.ui.cbt_vue.setCursor(QCursor(Qt.ArrowCursor))
  56. ### gestion des evenements souris
  57. # clic gauche
  58. def clic_combattant(self, num):
  59. return False
  60. def clic_decor(self, num):
  61. return False
  62. def clic_case(self, coord):
  63. return False
  64. def clic_es(self, es):
  65. #clic sur une entree/sortie
  66. return False
  67. #double clic gauche
  68. def doubleClic_combattant(self, num):
  69. return False
  70. def doubleClic_decor(self, num):
  71. return False
  72. def doubleClic_case(self, coord):
  73. return False
  74. #survol de la souris (entree)
  75. def survol_combattant(self, num):
  76. return False
  77. def survol_decor(self, num):
  78. return False
  79. def survol_case(self, coord):
  80. return False
  81. #survol de la souris (sortie)
  82. def finSurvol_combattant(self, num):
  83. return False
  84. def finSurvol_decor(self, num):
  85. return False
  86. def finSurvol_case(self, coord):
  87. return False
  88. #survol de la souris avec clic gauche enfonce (entree)
  89. def survolClic_combattant(self, event):
  90. return False
  91. def survolClic_decor(self, event):
  92. return False
  93. def survolClic_case(self, coord):
  94. return False
  95. #autre
  96. def clicGauche(self, event):
  97. return False
  98. def finClicGauche(self, event):
  99. return False
  100. def mouvementSouris(self, event):
  101. return False
  102. def toucheClavier(self, event):
  103. return False
  104. def clicDroit(self, event):
  105. return False
  106. class ModeBaseCp(ModeBase):
  107. """mode servant de base a tous les modes lies a la creation de plateau"""
  108. def __init__(self, plateau):
  109. super(ModeBaseCp, self).__init__(plateau)
  110. self.type = "cp"
  111. def activer(self, param = None):
  112. self.plateau.fenetre.ui.cbt_modeCreation.setChecked(True)
  113. super(ModeBaseCp, self).activer(param)
  114. def desactiver(self):
  115. self.plateau.fenetre.ui.cbt_modeCreation.setChecked(False)
  116. super(ModeBaseCp, self).desactiver()
  117. def clicDroit(self, event):
  118. self.plateau.activerMode(StandardCp)
  119. return True
  120. class ModeBasePi(ModeBase):
  121. """mode servant de base a tous les modes lies aux actions des combattants"""
  122. def __init__(self, plateau):
  123. super(ModeBasePi, self).__init__(plateau)
  124. self.type = "pi"
  125. def activer(self, param = None):
  126. self.plateau.fenetre.ui.cbt_modeCombat.setChecked(True)
  127. super(ModeBasePi, self).activer(param)
  128. def desactiver(self):
  129. self.plateau.fenetre.ui.cbt_modeCombat.setChecked(False)
  130. super(ModeBasePi, self).desactiver()
  131. def clicDroit(self, event):
  132. self.plateau.activerMode(StandardPi)
  133. return True
  134. ### --------------------------------------- ####
  135. class StandardCp(ModeBaseCp):
  136. """mode standard en creation de plateau"""
  137. def __init__(self, plateau):
  138. super(StandardCp, self).__init__(plateau)
  139. self._sourceCurseur = ""
  140. self._focus = False
  141. self._activerDragMode = True
  142. def activer(self, param):
  143. """active le mode"""
  144. self.plateau.fenetre.ui.cbt_panneauDroite.setCurrentIndex(1)
  145. self.plateau.majCaches()
  146. super(StandardCp, self).activer()
  147. def clic_combattant(self, num):
  148. self.plateau.activerMode(DeplacementPion, num)
  149. return True
  150. def clic_decor(self, num):
  151. self.plateau.activerMode(DeplacementPion, num)
  152. return True
  153. def clic_es(self, es):
  154. self.plateau.activerMode(EditionEntreeSortie, es)
  155. return True
  156. class MajCases(ModeBaseCp):
  157. """mode de mise a jour des cases (terrain, couleur, effet special)"""
  158. def __init__(self, plateau):
  159. super(MajCases, self).__init__(plateau)
  160. self._sourceCurseur = ":/interface/16/ressource/pinceau_16.png"
  161. self._focus = True
  162. self._param = None #parametre avec lequel on mettra a jour la case
  163. self._caseSurvolee = None
  164. def activer(self, param):
  165. """active le mode"""
  166. self.majParam(param)
  167. super(MajCases, self).activer()
  168. def desactiver(self):
  169. """desactive le mode"""
  170. if self.plateau.pinceau: self.plateau.pinceau.reinit()
  171. super(MajCases, self).desactiver()
  172. def majParam(self, param):
  173. self._param = param
  174. def param(self):
  175. return self._param
  176. def clic_case(self, coord):
  177. #demarre une operation de peinture des cases
  178. self.plateau.pinceau.demarrer(coord)
  179. return True
  180. def survolClic_case(self, coord):
  181. accepte = False
  182. if coord != self._caseSurvolee:
  183. self.plateau.pinceau.maj(coord)
  184. accepte = True
  185. return accepte
  186. def finClicGauche(self, event):
  187. accepte = False
  188. altitude = 0
  189. if self.plateau.fenetre.ui.cp_gererAlt.isChecked() or dmK.touchesEnfoncees() == ["maj"]:
  190. altitude = self.saisieAltitude()
  191. if self.plateau.pinceau.estActif():
  192. for coord in self.plateau.pinceau.selection():
  193. self.plateau.cases[coord].majTerrain(self._param)
  194. self.plateau.cases[coord].majAltitude(altitude)
  195. self.plateau.pinceau.reinit()
  196. self.reinit()
  197. accepte = True
  198. return accepte
  199. def toucheClavier(self, event):
  200. accepte = False
  201. if event.key() == Qt.Key_Up:
  202. self.plateau.fenetre.ui.epaisseurPinceau.setValue(self.plateau.fenetre.ui.epaisseurPinceau.value()+1)
  203. accepte = True
  204. elif event.key() == Qt.Key_Down:
  205. self.plateau.fenetre.ui.epaisseurPinceau.setValue(self.plateau.fenetre.ui.epaisseurPinceau.value()-1)
  206. accepte = True
  207. return accepte
  208. def saisieAltitude(self):
  209. """affiche la fenetre de dialogue de saisie de l'altitude et renvoie la valeur saisie"""
  210. ecran = EcranAltitude()
  211. ecran.show()
  212. ecran.exec_()
  213. retour = ecran.resultat()
  214. return retour
  215. class MajCasesEffet(MajCases):
  216. """mode de mise a jour des cases (effets speciaux)"""
  217. def __init__(self, plateau):
  218. super(MajCasesEffet, self).__init__(plateau)
  219. self._sourceCurseur = ":/interface/16/ressource/pinceau_16.png"
  220. def finClicGauche(self, event):
  221. accepte = False
  222. if self.plateau.pinceau.estActif():
  223. for coord in self.plateau.pinceau.selection():
  224. self.plateau.cases[coord].majEffet(self._param)
  225. self.plateau.pinceau.reinit()
  226. self.reinit()
  227. accepte = True
  228. return accepte
  229. class Pipette(ModeBaseCp):
  230. """mode pipette: on preleve la couleur ou le terrain d'une case"""
  231. def __init__(self, plateau):
  232. super(Pipette, self).__init__(plateau)
  233. self._sourceCurseur = ":/interface/16/ressource/seringue_16.png"
  234. def activerCurseur(self):
  235. super(Pipette, self).activerCurseur()
  236. def clic_case(self, coord):
  237. self.plateau.activerMode(MajCases, self.plateau.cases[coord].terrain)
  238. return True
  239. class ZonePlacement(ModeBaseCp):
  240. """mode de definition de la/les zones de placement des joueurs"""
  241. def __init__(self, plateau):
  242. super(ZonePlacement, self).__init__(plateau)
  243. self._sourceCurseur = ":/interface/16/ressource/pinceau_16.png"
  244. self._focus = True
  245. def activer(self, param = None):
  246. self.plateau.pinceau.majForme("rectP")
  247. self.plateau.pinceau.verrouillerForme(True)
  248. super(ZonePlacement, self).activer()
  249. def desactiver(self):
  250. self.plateau.pinceau.reinit()
  251. super(ZonePlacement, self).desactiver()
  252. def clic_case(self, coord):
  253. #demarre une operation de peinture des cases
  254. self.plateau.pinceau.demarrer(coord)
  255. return True
  256. def survolClic_case(self, coord):
  257. self.plateau.pinceau.maj(coord)
  258. return True
  259. def finClicGauche(self, coord):
  260. if self.plateau.pinceau.estActif():
  261. if len(self.plateau.pinceau.selection()) > 0:
  262. self.plateau.majZonePlacement(self.plateau.pinceau.selection())
  263. self.plateau.activerMode(StandardCp)
  264. return True
  265. class PlacerCaches(ModeBaseCp):
  266. """mode de creation/ edition des caches"""
  267. def __init__(self, plateau):
  268. super(PlacerCaches, self).__init__(plateau)
  269. self._sourceCurseur = ":/interface/16/ressource/pinceau_16.png"
  270. self._focus = True
  271. self._numCache = None
  272. def activer(self, param = None):
  273. self._numCache = param
  274. self.plateau.pinceau.majForme("rectP")
  275. super(PlacerCaches, self).activer()
  276. def desactiver(self):
  277. self.plateau.pinceau.reinit()
  278. super(PlacerCaches, self).desactiver()
  279. def creerCache(self, listeCases, nom):
  280. """cree le cache avec le nom et la liste des cases en parametre"""
  281. #determination d'un nouvel id pour le cache
  282. idCache = 0
  283. if len(self.plateau.caches) > 0:
  284. idCache = max(self.plateau.caches) + 1
  285. #nom par defaut si besoin
  286. if not len(nom) > 0:
  287. nom = "Cache {}".format(idCache + 1)
  288. #creation du cache
  289. cache = Cache(idCache)
  290. cache.creer(self.plateau, listeCases, nom)
  291. def clic_case(self, coord):
  292. #on peint la liste des cases qui sera cachee
  293. self.plateau.pinceau.demarrer(coord)
  294. return True
  295. def survolClic_case(self, coord):
  296. self.plateau.pinceau.maj(coord)
  297. return True
  298. def finClicGauche(self, coord):
  299. #si la liste de cases peintes est valide, on demande le nom du cache et on le cree
  300. accepte = False
  301. if self.plateau.pinceau.estActif():
  302. if len(self.plateau.pinceau.selection()) > 0:
  303. nom = dmSaisie("Entrez le nom du cache à créer:")
  304. self.creerCache(self.plateau.pinceau.selection(), nom)
  305. self.plateau.activerMode(StandardCp)
  306. accepte = True
  307. return accepte
  308. class EntreeSortieBase(ModeBaseCp):
  309. """mode de base de la gestion des entrees et sorties du plateau"""
  310. def __init__(self, plateau):
  311. super(EntreeSortieBase, self).__init__(plateau)
  312. self._sourceCurseur = ":/interface/16/ressource/pinceau_16.png"
  313. self._focus = True
  314. def activerCurseur(self):
  315. super(EntreeSortieBase, self).activerCurseur()
  316. def activer(self, param):
  317. self.es = param
  318. self.es.saisir()
  319. super(EntreeSortieBase, self).activer()
  320. def desactiver(self):
  321. if not self.es.estPositionne:
  322. self.es.prepareGeometryChange()
  323. self.es.plateau = None
  324. self.plateau.removeItem(self.es)
  325. if self.es in self.plateau.entreesSorties:
  326. self.plateau.entreesSorties.remove(self.es)
  327. super(EntreeSortieBase, self).desactiver()
  328. def mouvementSouris(self, event):
  329. accepte = False
  330. if event.buttons() != Qt.LeftButton:
  331. if not self.es.estPositionne:
  332. self.es.majProjection(event.scenePos())
  333. accepte = True
  334. return accepte
  335. def toucheClavier(self, event):
  336. accepte = False
  337. if event.key() == Qt.Key_Delete:
  338. self.es.supprimer()
  339. if self.es in self.plateau.entreesSorties:
  340. self.plateau.entreesSorties.remove(self.es)
  341. self.plateau.activerMode(StandardCp)
  342. accepte = True
  343. elif event.key() == Qt.Key_Right:
  344. self.es.nbRotations += 1
  345. self.es.majProjection()
  346. accepte = True
  347. elif event.key() == Qt.Key_Left:
  348. self.es.nbRotations -= 1
  349. self.es.majProjection()
  350. accepte = True
  351. return accepte
  352. class CreationEntreeSortie(EntreeSortieBase):
  353. """mode de creation des entrees / sorties"""
  354. def __init__(self, plateau):
  355. super(CreationEntreeSortie, self).__init__(plateau)
  356. def activer(self, typeES):
  357. self.plateau.fenetre.ui.cbt_vue.fitInView(self.plateau.sceneRect(), Qt.KeepAspectRatio)
  358. param = EntreeSortie(self.plateau, typeES)
  359. param.creerForme()
  360. super(CreationEntreeSortie, self).activer(param)
  361. def clicGauche(self, event):
  362. self.es.positionner()
  363. self.plateau.entreesSorties.append(self.es)
  364. self.plateau.activerMode(StandardCp)
  365. return True
  366. class EditionEntreeSortie(EntreeSortieBase):
  367. """mode d'edition des entrees / sorties"""
  368. def __init__(self, plateau):
  369. super(EditionEntreeSortie, self).__init__(plateau)
  370. def clicGauche(self, event):
  371. accepte = False
  372. if not event.isAccepted():
  373. self.es.positionner()
  374. self.plateau.activerMode(StandardCp)
  375. accepte = True
  376. return accepte
  377. class CreationPion(ModeBaseCp):
  378. """mode de creation de pions (combattant ou decor)"""
  379. def __init__(self, plateau):
  380. super(CreationPion, self).__init__(plateau)
  381. self._focus = True
  382. self._pion = None
  383. def activer(self, pion):
  384. self._pion = pion
  385. self.plateau.proj.creer(self._pion)
  386. super(CreationPion, self).activer()
  387. def desactiver(self):
  388. self.plateau.proj.desactiver()
  389. self._pion = None
  390. super(CreationPion, self).desactiver()
  391. def survol_case(self, coord):
  392. accepte = False
  393. if self._pion:
  394. self.plateau.proj.majCoord(coord)
  395. accepte = True
  396. return accepte
  397. def clic_case(self, coord):
  398. accepte = False
  399. if self._pion:
  400. if not self.plateau.cases[coord].estOccupee():
  401. if isinstance(self._pion, Combattant) and dmK.touchesEnfoncees() == ["maj"]:
  402. nouveauZ = self.plateau.dialogueVol(self._pion.z)
  403. self._pion.majZ(nouveauZ)
  404. self.plateau.creerPion(self._pion)
  405. accepte = True
  406. return accepte
  407. def toucheClavier(self, event):
  408. accepte = False
  409. if self._pion:
  410. if event.key() == Qt.Key_Right:
  411. self.plateau.proj.majRotation(1)
  412. accepte = True
  413. elif event.key() == Qt.Key_Left:
  414. self.plateau.proj.majRotation(-1)
  415. accepte = True
  416. return accepte
  417. class CreationPJ(CreationPion):
  418. """mode de creation de pions de joueurs"""
  419. def __init__(self, plateau):
  420. super(CreationPJ, self).__init__(plateau)
  421. def clic_case(self, coord):
  422. accepte = False
  423. if self._pion:
  424. if not self.plateau.cases[coord].estOccupee():
  425. if isinstance(self._pion, Combattant) and dmK.touchesEnfoncees() == ["maj"]:
  426. nouveauZ = self.plateau.dialogueVol(self._pion.z)
  427. self._pion.majZ(nouveauZ)
  428. self.plateau.creerPion(self._pion)
  429. self.plateau.majListePJ()
  430. accepte = True
  431. return accepte
  432. class SuppressionPion(ModeBaseCp):
  433. """mode de suppression de pions (combattant ou decor)"""
  434. def __init__(self, plateau):
  435. super(SuppressionPion, self).__init__(plateau)
  436. self._sourceCurseur = ":/interface/16/ressource/gomme_16.png"
  437. self._enSurbrillance = []
  438. self._focus = True
  439. self._cible = ""
  440. def activer(self, cible = Pion):
  441. #cible est le nom de la classe des objets a supprimer
  442. self._cible = cible
  443. super(SuppressionPion, self).activer()
  444. def desactiver(self):
  445. for num in self._enSurbrillance:
  446. if num >= 10000:
  447. if num in self.plateau.decors:
  448. self.plateau.decors[num].surbrillance(False)
  449. else:
  450. if num in self.plateau.combattants:
  451. self.plateau.combattants[num].surbrillance(False)
  452. super(SuppressionPion, self).desactiver()
  453. def clicGauche(self, event):
  454. """supprime le pion sous le clic. S'il y en a plusieurs,
  455. supprime le premier de la pile"""
  456. accepte = False
  457. num = None
  458. item = self.plateau.itemAt(event.scenePos())
  459. if isinstance(item.parentItem(), self._cible):
  460. num = item.parentItem().numero
  461. else:
  462. if item.parentItem() != None:
  463. if isinstance(item.parentItem().parentItem(), self._cible):
  464. num = item.parentItem().parentItem().numero
  465. if num:
  466. self.plateau.pionSupprimer(num)
  467. accepte = True
  468. return accepte
  469. def survol_combattant(self, num):
  470. accepte = False
  471. if self._cible == Combattant:
  472. self.plateau.combattants[num].surbrillance(True, 0.4)
  473. self._enSurbrillance.append(num)
  474. accepte = True
  475. return accepte
  476. def finSurvol_combattant(self, num):
  477. accepte = False
  478. if self._cible == Combattant:
  479. self.plateau.combattants[num].surbrillance(False)
  480. accepte = True
  481. return accepte
  482. def survol_decor(self, num):
  483. accepte = False
  484. if self._cible == Decor:
  485. self.plateau.decors[num].surbrillance(True, 0.4)
  486. self._enSurbrillance.append(num)
  487. accepte = True
  488. return accepte
  489. def finSurvol_decor(self, num):
  490. accepte = False
  491. if self._cible == Decor:
  492. self.plateau.decors[num].surbrillance(False)
  493. accepte = True
  494. return accepte
  495. class DeplacementPion(ModeBaseCp):
  496. """mode de deplacement de pions (combattant ou decor) en mode creation
  497. attention: different des actions de type deplacement qu'effectuent les pions en mode Combat"""
  498. def __init__(self, plateau):
  499. super(DeplacementPion, self).__init__(plateau)
  500. self._num = 0
  501. def activer(self, num):
  502. self._num = num
  503. if self._num < 10000:
  504. pion = self.plateau.combattants[self._num]
  505. else:
  506. pion = self.plateau.decors[self._num]
  507. self.plateau.proj.creer(pion)
  508. self.deplace = False
  509. super(DeplacementPion, self).activer()
  510. def desactiver(self):
  511. self.plateau.proj.desactiver()
  512. self._num = 0
  513. super(DeplacementPion, self).desactiver()
  514. def survol_case(self, coord):
  515. accepte = False
  516. if self._num > 0:
  517. self.plateau.proj.majCoord(coord)
  518. self.deplace = True
  519. accepte = True
  520. return accepte
  521. def clic_case(self, coord):
  522. accepte = False
  523. if self.plateau.cases[coord].occupeeParCombattant(): return
  524. if self._num > 0:
  525. if self.deplace:
  526. if self._num < 10000:
  527. pion = self.plateau.combattants[self._num]
  528. if dmK.touchesEnfoncees() == ["maj"]:
  529. nouveauZ = self.plateau.dialogueVol(pion.z)
  530. pion.majZ(nouveauZ)
  531. else:
  532. pion = self.plateau.decors[self._num]
  533. pion.majPosition(self.plateau.proj.coord(), self.plateau.proj.nbRotations())
  534. accepte = True
  535. return accepte
  536. def toucheClavier(self, event):
  537. accepte = False
  538. if self._num > 0:
  539. if event.key() == Qt.Key_Right:
  540. self.plateau.proj.majRotation(1)
  541. self.deplace = True
  542. accepte = True
  543. elif event.key() == Qt.Key_Left:
  544. self.plateau.proj.majRotation(-1)
  545. self.deplace = True
  546. accepte = True
  547. return accepte
  548. #-----------------------------------------------
  549. #-----------------------------------------------
  550. class StandardPi(ModeBasePi):
  551. """mode standard de la manipulation de pion en combat"""
  552. def __init__(self, plateau):
  553. super(StandardPi, self).__init__(plateau)
  554. self._focus = False
  555. self._activerDragMode = True
  556. def activer(self, num):
  557. self.plateau.fenetre.ui.cbt_panneauDroite.setCurrentIndex(3)
  558. self.plateau.majCaches()
  559. super(StandardPi, self).activer()
  560. def clic_combattant(self, num):
  561. self.plateau.activerMode(PionSelectionne, num)
  562. return True
  563. def clic_decor(self, num):
  564. self.plateau.activerMode(PionSelectionne, num)
  565. return True
  566. def nouvelleAction(self, action):
  567. pass
  568. class PionSelectionne(ModeBasePi):
  569. """mode active a la selection d'un pion combattant"""
  570. def __init__(self, plateau):
  571. super(PionSelectionne, self).__init__(plateau)
  572. self._focus = True
  573. self._num = None
  574. self._action = None
  575. def pion(self):
  576. """retourne la ref du pion actuellement selectionne"""
  577. retour = None
  578. if self._num in self.plateau.combattants:
  579. retour = self.plateau.combattants[self._num]
  580. elif self._num in self.plateau.decors:
  581. retour = self.plateau.decors[self._num]
  582. return retour
  583. def activer(self, num):
  584. self._num = num
  585. self.plateau.fenetre.ui.cbt_panneauDroite.setCurrentIndex(2)
  586. self.pion().afficheOmbreSelection(True)
  587. self.plateau.majPanneauPi()
  588. super(PionSelectionne, self).activer()
  589. def desactiver(self):
  590. if self._action:
  591. self._action.desactiver()
  592. self._action = None
  593. self.pion().afficheOmbreSelection(False)
  594. self._num = None
  595. self.plateau.majPanneauPi()
  596. super(PionSelectionne, self).desactiver()
  597. def nouvelleAction(self, action):
  598. if self._action:
  599. self._action.desactiver()
  600. self._action = None
  601. self._action = action()
  602. self._action.activer(self.plateau, self._num)
  603. def action(self):
  604. return self._action
  605. def survol_case(self, coord):
  606. accepte = False
  607. if self._action:
  608. self._action.majCoordCible(coord)
  609. accepte = True
  610. return accepte
  611. def clic_case(self, coord):
  612. accepte = False
  613. if self._action:
  614. self._action.valider()
  615. if not self._action.enCours(): self._action = None
  616. accepte = True
  617. return accepte
  618. def clicDroit(self, event):
  619. accepte = False
  620. if self._action != None:
  621. self._action.desactiver()
  622. self._action = None
  623. accepte = True
  624. else:
  625. accepte = super(PionSelectionne, self).clicDroit(event)
  626. return accepte
  627. def toucheClavier(self, event):
  628. accepte = False
  629. if self._num > 0:
  630. if event.key() == Qt.Key_Right:
  631. self._action.pivoter(1)
  632. accepte = True
  633. elif event.key() == Qt.Key_Left:
  634. self._action.pivoter(-1)
  635. accepte = True
  636. return accepte