Modes.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  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 *
  9. from PyQt4.QtGui import *
  10. from EntreeSortie import EntreeSortie
  11. import Actions
  12. import regles
  13. from Pion import Pion
  14. from Combattant import Combattant
  15. from Decor import Decor
  16. import dmK
  17. from lib.EcranAltitude import EcranAltitude
  18. from Cache import Cache
  19. from commun import dmSaisie
  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. 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.png"
  244. self._focus = True
  245. def activerCurseur(self):
  246. super(ZonePlacement, self).activerCurseur()
  247. def activer(self, param = None):
  248. self.plateau.pinceau.majForme("rectP")
  249. self.plateau.pinceau.verrouillerForme(True)
  250. super(ZonePlacement, self).activer()
  251. def desactiver(self):
  252. self.plateau.pinceau.reinit()
  253. super(ZonePlacement, self).desactiver()
  254. def clic_case(self, coord):
  255. #demarre une operation de peinture des cases
  256. self.plateau.pinceau.demarrer(coord)
  257. return True
  258. def survolClic_case(self, coord):
  259. self.plateau.pinceau.maj(coord)
  260. return True
  261. def finClicGauche(self, coord):
  262. if self.plateau.pinceau.estActif():
  263. if len(self.plateau.pinceau.selection()) > 0:
  264. self.plateau.majZonePlacement(self.plateau.pinceau.selection())
  265. return True
  266. class PlacerCaches(ModeBaseCp):
  267. """mode de creation/ edition des caches"""
  268. def __init__(self, plateau):
  269. super(PlacerCaches, self).__init__(plateau)
  270. self._sourceCurseur = ":/interface/16/ressource/pinceau_16.png"
  271. self._focus = True
  272. self._numCache = None
  273. def activer(self, param = None):
  274. self._numCache = param
  275. self.plateau.pinceau.majForme("rectP")
  276. super(PlacerCaches, self).activer()
  277. def desactiver(self):
  278. self.plateau.pinceau.reinit()
  279. super(PlacerCaches, self).desactiver()
  280. def creerCache(self, listeCases, nom):
  281. """cree le cache avec le nom et la liste des cases en parametre"""
  282. #determination d'un nouvel id pour le cache
  283. idCache = 0
  284. if len(self.plateau.caches) > 0:
  285. idCache = max(self.plateau.caches) + 1
  286. #nom par defaut si besoin
  287. if not len(nom) >0:
  288. nom = "Cache {}".format(idCache + 1)
  289. #creation du cache
  290. cache = Cache(self.plateau, idCache)
  291. cache.creer(listeCases, nom)
  292. def clic_case(self, coord):
  293. #on peint la liste des cases qui sera cachee
  294. self.plateau.pinceau.demarrer(coord)
  295. return True
  296. def survolClic_case(self, coord):
  297. self.plateau.pinceau.maj(coord)
  298. return True
  299. def finClicGauche(self, coord):
  300. #si la liste de cases peintes est valide, on demande le nom du cache et on le cree
  301. accepte = False
  302. if self.plateau.pinceau.estActif():
  303. if len(self.plateau.pinceau.selection()) > 0:
  304. nom = dmSaisie("Entrez le nom du cache à créer:")
  305. self.creerCache(self.plateau.pinceau.selection(), nom)
  306. self.plateau.activerMode(StandardCp)
  307. accepte = True
  308. return accepte
  309. class EntreeSortieBase(ModeBaseCp):
  310. """mode de base de la gestion des entrees et sorties du plateau"""
  311. def __init__(self, plateau):
  312. super(EntreeSortieBase, self).__init__(plateau)
  313. self._sourceCurseur = ":/interface/16/ressource/pinceau_16.png"
  314. self._focus = True
  315. def activerCurseur(self):
  316. super(EntreeSortieBase, self).activerCurseur()
  317. def activer(self, param):
  318. self.es = param
  319. self.es.saisir()
  320. super(EntreeSortieBase, self).activer()
  321. def desactiver(self):
  322. if not self.es.estPositionne:
  323. self.es.prepareGeometryChange()
  324. self.es.plateau = None
  325. self.plateau.removeItem(self.es)
  326. if self.es in self.plateau.entreesSorties:
  327. self.plateau.entreesSorties.remove(self.es)
  328. super(EntreeSortieBase, self).desactiver()
  329. def mouvementSouris(self, event):
  330. accepte = False
  331. if event.buttons() != Qt.LeftButton:
  332. if not self.es.estPositionne:
  333. self.es.majProjection(event.scenePos())
  334. accepte = True
  335. return accepte
  336. def toucheClavier(self, event):
  337. accepte = False
  338. if event.key() == Qt.Key_Delete:
  339. self.es.supprimer()
  340. if self.es in self.plateau.entreesSorties:
  341. self.plateau.entreesSorties.remove(self.es)
  342. self.plateau.activerMode(StandardCp)
  343. accepte = True
  344. elif event.key() == Qt.Key_Right:
  345. self.es.nbRotations += 1
  346. self.es.majProjection()
  347. accepte = True
  348. elif event.key() == Qt.Key_Left:
  349. self.es.nbRotations -= 1
  350. self.es.majProjection()
  351. accepte = True
  352. return accepte
  353. class CreationEntreeSortie(EntreeSortieBase):
  354. """mode de creation des entrees / sorties"""
  355. def __init__(self, plateau):
  356. super(CreationEntreeSortie, self).__init__(plateau)
  357. def activer(self, typeES):
  358. self.plateau.fenetre.ui.cbt_vue.fitInView(self.plateau.sceneRect(), Qt.KeepAspectRatio)
  359. param = EntreeSortie(self.plateau, typeES)
  360. param.creerForme()
  361. super(CreationEntreeSortie, self).activer(param)
  362. def clicGauche(self, event):
  363. self.es.positionner()
  364. self.plateau.entreesSorties.append(self.es)
  365. self.plateau.activerMode(StandardCp)
  366. return True
  367. class EditionEntreeSortie(EntreeSortieBase):
  368. """mode d'edition des entrees / sorties"""
  369. def __init__(self, plateau):
  370. super(EditionEntreeSortie, self).__init__(plateau)
  371. def clicGauche(self, event):
  372. accepte = False
  373. if not event.isAccepted():
  374. self.es.positionner()
  375. self.plateau.activerMode(StandardCp)
  376. accepte = True
  377. return accepte
  378. class CreationPion(ModeBaseCp):
  379. """mode de creation de pions (combattant ou decor)"""
  380. def __init__(self, plateau):
  381. super(CreationPion, self).__init__(plateau)
  382. self._focus = True
  383. self._pion = None
  384. def activer(self, pion):
  385. self._pion = pion
  386. self.plateau.proj.creer(self._pion)
  387. super(CreationPion, self).activer()
  388. def desactiver(self):
  389. self.plateau.proj.desactiver()
  390. self._pion = None
  391. super(CreationPion, self).desactiver()
  392. def survol_case(self, coord):
  393. accepte = False
  394. if self._pion:
  395. self.plateau.proj.majCoord(coord)
  396. accepte = True
  397. return accepte
  398. def clic_case(self, coord):
  399. accepte = False
  400. if self._pion:
  401. if not self.plateau.cases[coord].estOccupee():
  402. if isinstance(self._pion, Combattant) and dmK.touchesEnfoncees() == ["maj"]:
  403. nouveauZ = self.plateau.dialogueVol(self._pion.z)
  404. self._pion.majZ(nouveauZ)
  405. self.plateau.creerPion(self._pion)
  406. accepte = True
  407. return accepte
  408. def toucheClavier(self, event):
  409. accepte = False
  410. if self._pion:
  411. if event.key() == Qt.Key_Right:
  412. self.plateau.proj.majRotation(1)
  413. accepte = True
  414. elif event.key() == Qt.Key_Left:
  415. self.plateau.proj.majRotation(-1)
  416. accepte = True
  417. return accepte
  418. class CreationPJ(CreationPion):
  419. """mode de creation de pions de joueurs"""
  420. def __init__(self, plateau):
  421. super(CreationPJ, self).__init__(plateau)
  422. def clic_case(self, coord):
  423. accepte = False
  424. if self._pion:
  425. if not self.plateau.cases[coord].estOccupee():
  426. if isinstance(self._pion, Combattant) and dmK.touchesEnfoncees() == ["maj"]:
  427. nouveauZ = self.plateau.dialogueVol(self._pion.z)
  428. self._pion.majZ(nouveauZ)
  429. self.plateau.creerPion(self._pion)
  430. self.plateau.majListePJ()
  431. accepte = True
  432. return accepte
  433. class SuppressionPion(ModeBaseCp):
  434. """mode de suppression de pions (combattant ou decor)"""
  435. def __init__(self, plateau):
  436. super(SuppressionPion, self).__init__(plateau)
  437. self._sourceCurseur = ":/interface/16/ressource/gomme_16.png"
  438. self._enSurbrillance = []
  439. self._focus = True
  440. self._cible = ""
  441. def activer(self, cible = Pion):
  442. #cible est le nom de la classe des objets a supprimer
  443. self._cible = cible
  444. super(SuppressionPion, self).activer()
  445. def desactiver(self):
  446. for num in self._enSurbrillance:
  447. if num >= 10000:
  448. if num in self.plateau.decors:
  449. self.plateau.decors[num].surbrillance(False)
  450. else:
  451. if num in self.plateau.combattants:
  452. self.plateau.combattants[num].surbrillance(False)
  453. super(SuppressionPion, self).desactiver()
  454. def clicGauche(self, event):
  455. """supprime le pion sous le clic. S'il y en a plusieurs,
  456. supprime le premier de la pile"""
  457. accepte = False
  458. num = None
  459. item = self.plateau.itemAt(event.scenePos())
  460. if isinstance(item.parentItem(), self._cible):
  461. num = item.parentItem().numero
  462. else:
  463. if item.parentItem() != None:
  464. if isinstance(item.parentItem().parentItem(), self._cible):
  465. num = item.parentItem().parentItem().numero
  466. if num:
  467. self.plateau.pionSupprimer(num)
  468. accepte = True
  469. return accepte
  470. def survol_combattant(self, num):
  471. accepte = False
  472. if self._cible == Combattant:
  473. self.plateau.combattants[num].surbrillance(True, 0.4)
  474. self._enSurbrillance.append(num)
  475. accepte = True
  476. return accepte
  477. def finSurvol_combattant(self, num):
  478. accepte = False
  479. if self._cible == Combattant:
  480. self.plateau.combattants[num].surbrillance(False)
  481. accepte = True
  482. return accepte
  483. def survol_decor(self, num):
  484. accepte = False
  485. if self._cible == Decor:
  486. self.plateau.decors[num].surbrillance(True, 0.4)
  487. self._enSurbrillance.append(num)
  488. accepte = True
  489. return accepte
  490. def finSurvol_decor(self, num):
  491. accepte = False
  492. if self._cible == Decor:
  493. self.plateau.decors[num].surbrillance(False)
  494. accepte = True
  495. return accepte
  496. class DeplacementPion(ModeBaseCp):
  497. """mode de deplacement de pions (combattant ou decor) en mode creation
  498. attention: different des actions de type deplacement qu'effectuent les pions en mode Combat"""
  499. def __init__(self, plateau):
  500. super(DeplacementPion, self).__init__(plateau)
  501. self._num = 0
  502. def activer(self, num):
  503. self._num = num
  504. if self._num < 10000:
  505. pion = self.plateau.combattants[self._num]
  506. else:
  507. pion = self.plateau.decors[self._num]
  508. self.plateau.proj.creer(pion)
  509. self.deplace = False
  510. super(DeplacementPion, self).activer()
  511. def desactiver(self):
  512. self.plateau.proj.desactiver()
  513. self._num = 0
  514. super(DeplacementPion, self).desactiver()
  515. def survol_case(self, coord):
  516. accepte = False
  517. if self._num > 0:
  518. self.plateau.proj.majCoord(coord)
  519. self.deplace = True
  520. accepte = True
  521. return accepte
  522. def clic_case(self, coord):
  523. accepte = False
  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