Modes.py 26 KB

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