Modes.py 26 KB

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