Modes.py 26 KB

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