Modes.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  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. class ModeBase(object):
  19. """mode de base: tous les modes heritent de cette classe"""
  20. def __init__(self, plateau):
  21. self.plateau = plateau
  22. #le mode est il active
  23. self._actif = False
  24. #le dragmode est il active sur la QGraphicsView
  25. self._activerDragMode = 0
  26. #curseur de la QGraphicsView
  27. self._sourceCurseur = ""
  28. #met le focus sur la QGraphicsView a l'activation
  29. self._focus = False
  30. def nom(self):
  31. return self.__class__.__name__
  32. def activer(self, param = None):
  33. """active le mode"""
  34. self.activerCurseur()
  35. if self._focus:
  36. self.plateau.fenetre.ui.cbt_vue.setFocus()
  37. self._actif = True
  38. def desactiver(self):
  39. """desactive le mode"""
  40. self.desactiverCurseur()
  41. self.plateau.fenetre.ui.cbt_vue.setDragMode(1)
  42. self._actif = False
  43. def reinit(self):
  44. """remet les variables a 0 et reactive le mode"""
  45. pass
  46. def activerCurseur(self):
  47. self.plateau.fenetre.ui.cbt_vue.setDragMode(self._activerDragMode)
  48. curseurPix = QPixmap(self._sourceCurseur)
  49. if not curseurPix.isNull():
  50. curseur = QCursor(curseurPix, 0, curseurPix.height())
  51. self.plateau.fenetre.ui.cbt_vue.setCursor(curseur)
  52. def desactiverCurseur(self):
  53. self.plateau.fenetre.ui.cbt_vue.setCursor(QCursor(Qt.ArrowCursor))
  54. ### gestion des evenements souris
  55. # clic gauche
  56. def clic_combattant(self, num):
  57. return False
  58. def clic_decor(self, num):
  59. return False
  60. def clic_case(self, coord):
  61. return False
  62. def clic_es(self, es):
  63. #clic sur une entree/sortie
  64. return False
  65. #double clic gauche
  66. def doubleClic_combattant(self, num):
  67. return False
  68. def doubleClic_decor(self, num):
  69. return False
  70. def doubleClic_case(self, coord):
  71. return False
  72. #survol de la souris (entree)
  73. def survol_combattant(self, num):
  74. return False
  75. def survol_decor(self, num):
  76. return False
  77. def survol_case(self, coord):
  78. return False
  79. #survol de la souris (sortie)
  80. def finSurvol_combattant(self, num):
  81. return False
  82. def finSurvol_decor(self, num):
  83. return False
  84. def finSurvol_case(self, coord):
  85. return False
  86. #survol de la souris avec clic gauche enfonce (entree)
  87. def survolClic_combattant(self, event):
  88. return False
  89. def survolClic_decor(self, event):
  90. return False
  91. def survolClic_case(self, coord):
  92. return False
  93. #autre
  94. def clicGauche(self, event):
  95. return False
  96. def finClicGauche(self, event):
  97. return False
  98. def mouvementSouris(self, event):
  99. return False
  100. def toucheClavier(self, event):
  101. return False
  102. def clicDroit(self, event):
  103. return False
  104. class ModeBaseCp(ModeBase):
  105. """mode servant de base a tous les modes lies a la creation de plateau"""
  106. def __init__(self, plateau):
  107. super(ModeBaseCp, self).__init__(plateau)
  108. self.type = "cp"
  109. def activer(self, param = None):
  110. self.plateau.fenetre.ui.cbt_modeCreation.setChecked(True)
  111. super(ModeBaseCp, self).activer(param)
  112. def desactiver(self):
  113. self.plateau.fenetre.ui.cbt_modeCreation.setChecked(False)
  114. super(ModeBaseCp, self).desactiver()
  115. def clicDroit(self, event):
  116. self.plateau.activerMode(StandardCp)
  117. return True
  118. class ModeBasePi(ModeBase):
  119. """mode servant de base a tous les modes lies aux actions des combattants"""
  120. def __init__(self, plateau):
  121. super(ModeBasePi, self).__init__(plateau)
  122. self.type = "pi"
  123. def activer(self, param = None):
  124. self.plateau.fenetre.ui.cbt_modeCombat.setChecked(True)
  125. super(ModeBasePi, self).activer(param)
  126. def desactiver(self):
  127. self.plateau.fenetre.ui.cbt_modeCombat.setChecked(False)
  128. super(ModeBasePi, self).desactiver()
  129. def clicDroit(self, event):
  130. self.plateau.activerMode(StandardPi)
  131. return True
  132. ### --------------------------------------- ####
  133. class StandardCp(ModeBaseCp):
  134. """mode standard en creation de plateau"""
  135. def __init__(self, plateau):
  136. super(StandardCp, self).__init__(plateau)
  137. self._sourceCurseur = ""
  138. self._focus = False
  139. self._activerDragMode = True
  140. def activer(self, param):
  141. """active le mode"""
  142. self.plateau.fenetre.ui.cbt_panneauDroite.setCurrentIndex(1)
  143. if len(self.plateau.caches) > 0:
  144. for coord in self.plateau.cases:
  145. self.plateau.cases[coord].majCache()
  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 EditerCaches(ModeBaseCp):
  267. """mode de creation/ edition des caches"""
  268. def __init__(self, plateau):
  269. super(EditerCaches, 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(EditerCaches, self).activer()
  277. def desactiver(self):
  278. self.plateau.pinceau.reinit()
  279. super(EditerCaches, self).desactiver()
  280. def clic_case(self, coord):
  281. self.plateau.pinceau.demarrer(coord)
  282. return True
  283. def survolClic_case(self, coord):
  284. self.plateau.pinceau.maj(coord)
  285. return True
  286. def finClicGauche(self, coord):
  287. accepte = False
  288. if self.plateau.pinceau.estActif():
  289. if len(self.plateau.pinceau.selection()) > 0:
  290. if self._numCache != None:
  291. self.plateau.editerFormeCache(self._numCache, self.plateau.pinceau.selection())
  292. else:
  293. self.plateau.nouveauCache(self.plateau.pinceau.selection())
  294. self.plateau.activerMode(StandardCp)
  295. accepte = True
  296. return accepte
  297. class EntreeSortieBase(ModeBaseCp):
  298. """mode de base de la gestion des entrees et sorties du plateau"""
  299. def __init__(self, plateau):
  300. super(EntreeSortieBase, self).__init__(plateau)
  301. self._sourceCurseur = ":/interface/16/ressource/pinceau_16.png"
  302. self._focus = True
  303. def activerCurseur(self):
  304. super(EntreeSortieBase, self).activerCurseur()
  305. def activer(self, param):
  306. self.es = param
  307. self.es.saisir()
  308. super(EntreeSortieBase, self).activer()
  309. def desactiver(self):
  310. if not self.es.estPositionne:
  311. self.es.prepareGeometryChange()
  312. self.es.plateau = None
  313. self.plateau.removeItem(self.es)
  314. if self.es in self.plateau.entreesSorties:
  315. self.plateau.entreesSorties.remove(self.es)
  316. super(EntreeSortieBase, self).desactiver()
  317. def mouvementSouris(self, event):
  318. accepte = False
  319. if event.buttons() != Qt.LeftButton:
  320. if not self.es.estPositionne:
  321. self.es.majProjection(event.scenePos())
  322. accepte = True
  323. return accepte
  324. def toucheClavier(self, event):
  325. accepte = False
  326. if event.key() == Qt.Key_Delete:
  327. self.es.supprimer()
  328. if self.es in self.plateau.entreesSorties:
  329. self.plateau.entreesSorties.remove(self.es)
  330. self.plateau.activerMode(StandardCp)
  331. accepte = True
  332. elif event.key() == Qt.Key_Right:
  333. self.es.nbRotations += 1
  334. self.es.majProjection()
  335. accepte = True
  336. elif event.key() == Qt.Key_Left:
  337. self.es.nbRotations -= 1
  338. self.es.majProjection()
  339. accepte = True
  340. return accepte
  341. class CreationEntreeSortie(EntreeSortieBase):
  342. """mode de creation des entrees / sorties"""
  343. def __init__(self, plateau):
  344. super(CreationEntreeSortie, self).__init__(plateau)
  345. def activer(self, typeES):
  346. self.plateau.fenetre.ui.cbt_vue.fitInView(self.plateau.sceneRect(), Qt.KeepAspectRatio)
  347. param = EntreeSortie(self.plateau, typeES)
  348. param.creerForme()
  349. super(CreationEntreeSortie, self).activer(param)
  350. def clicGauche(self, event):
  351. self.es.positionner()
  352. self.plateau.entreesSorties.append(self.es)
  353. self.plateau.activerMode(StandardCp)
  354. return True
  355. class EditionEntreeSortie(EntreeSortieBase):
  356. """mode d'edition des entrees / sorties"""
  357. def __init__(self, plateau):
  358. super(EditionEntreeSortie, self).__init__(plateau)
  359. def clicGauche(self, event):
  360. accepte = False
  361. if not event.isAccepted():
  362. self.es.positionner()
  363. self.plateau.activerMode(StandardCp)
  364. accepte = True
  365. return accepte
  366. class CreationPion(ModeBaseCp):
  367. """mode de creation de pions (combattant ou decor)"""
  368. def __init__(self, plateau):
  369. super(CreationPion, self).__init__(plateau)
  370. self._focus = True
  371. self._pion = None
  372. def activer(self, pion):
  373. self._pion = pion
  374. self.plateau.proj.creer(self._pion)
  375. super(CreationPion, self).activer()
  376. def desactiver(self):
  377. self.plateau.proj.desactiver()
  378. self._pion = None
  379. super(CreationPion, self).desactiver()
  380. def survol_case(self, coord):
  381. accepte = False
  382. if self._pion:
  383. self.plateau.proj.majCoord(coord)
  384. accepte = True
  385. return accepte
  386. def clic_case(self, coord):
  387. accepte = False
  388. if self._pion:
  389. if not self.plateau.cases[coord].estOccupee():
  390. if isinstance(self._pion, Combattant) and dmK.touchesEnfoncees() == ["maj"]:
  391. nouveauZ = self.plateau.dialogueVol(self._pion.z)
  392. self._pion.majZ(nouveauZ)
  393. self.plateau.creerPion(self._pion)
  394. accepte = True
  395. return accepte
  396. def toucheClavier(self, event):
  397. accepte = False
  398. if self._pion:
  399. if event.key() == Qt.Key_Right:
  400. self.plateau.proj.majRotation(1)
  401. accepte = True
  402. elif event.key() == Qt.Key_Left:
  403. self.plateau.proj.majRotation(-1)
  404. accepte = True
  405. return accepte
  406. class SuppressionPion(ModeBaseCp):
  407. """mode de suppression de pions (combattant ou decor)"""
  408. def __init__(self, plateau):
  409. super(SuppressionPion, self).__init__(plateau)
  410. self._sourceCurseur = ":/interface/16/ressource/gomme_16.png"
  411. self._enSurbrillance = []
  412. self._focus = True
  413. self._cible = ""
  414. def activer(self, cible = Pion):
  415. #cible est le nom de la classe des objets a supprimer
  416. self._cible = cible
  417. super(SuppressionPion, self).activer()
  418. def desactiver(self):
  419. for num in self._enSurbrillance:
  420. if num >= 10000:
  421. if num in self.plateau.decors:
  422. self.plateau.decors[num].surbrillance(False)
  423. else:
  424. if num in self.plateau.combattants:
  425. self.plateau.combattants[num].surbrillance(False)
  426. super(SuppressionPion, self).desactiver()
  427. def clicGauche(self, event):
  428. """supprime le pion sous le clic. S'il y en a plusieurs,
  429. supprime le premier de la pile"""
  430. accepte = False
  431. num = None
  432. item = self.plateau.itemAt(event.scenePos())
  433. if isinstance(item.parentItem(), self._cible):
  434. num = item.parentItem().numero
  435. else:
  436. if item.parentItem() != None:
  437. if isinstance(item.parentItem().parentItem(), self._cible):
  438. num = item.parentItem().parentItem().numero
  439. if num:
  440. self.plateau.pionSupprimer(num)
  441. accepte = True
  442. return accepte
  443. def survol_combattant(self, num):
  444. accepte = False
  445. if self._cible == Combattant:
  446. self.plateau.combattants[num].surbrillance(True, 0.4)
  447. self._enSurbrillance.append(num)
  448. accepte = True
  449. return accepte
  450. def finSurvol_combattant(self, num):
  451. accepte = False
  452. if self._cible == Combattant:
  453. self.plateau.combattants[num].surbrillance(False)
  454. accepte = True
  455. return accepte
  456. def survol_decor(self, num):
  457. accepte = False
  458. if self._cible == Decor:
  459. self.plateau.decors[num].surbrillance(True, 0.4)
  460. self._enSurbrillance.append(num)
  461. accepte = True
  462. return accepte
  463. def finSurvol_decor(self, num):
  464. accepte = False
  465. if self._cible == Decor:
  466. self.plateau.decors[num].surbrillance(False)
  467. accepte = True
  468. return accepte
  469. class DeplacementPion(ModeBaseCp):
  470. """mode de deplacement de pions (combattant ou decor) en mode creation
  471. attention: different des actions de type deplacement qu'effectuent les pions en mode Combat"""
  472. def __init__(self, plateau):
  473. super(DeplacementPion, self).__init__(plateau)
  474. self._num = 0
  475. def activer(self, num):
  476. self._num = num
  477. if self._num < 10000:
  478. pion = self.plateau.combattants[self._num]
  479. else:
  480. pion = self.plateau.decors[self._num]
  481. self.plateau.proj.creer(pion)
  482. self.deplace = False
  483. super(DeplacementPion, self).activer()
  484. def desactiver(self):
  485. self.plateau.proj.desactiver()
  486. self._num = 0
  487. super(DeplacementPion, self).desactiver()
  488. def survol_case(self, coord):
  489. accepte = False
  490. if self._num > 0:
  491. self.plateau.proj.majCoord(coord)
  492. self.deplace = True
  493. accepte = True
  494. return accepte
  495. def clic_case(self, coord):
  496. accepte = False
  497. if self._num > 0:
  498. if self.deplace:
  499. if self._num < 10000:
  500. pion = self.plateau.combattants[self._num]
  501. if dmK.touchesEnfoncees() == ["maj"]:
  502. nouveauZ = self.plateau.dialogueVol(pion.z)
  503. pion.majZ(nouveauZ)
  504. else:
  505. pion = self.plateau.decors[self._num]
  506. pion.majPosition(self.plateau.proj.coord(), self.plateau.proj.nbRotations())
  507. accepte = True
  508. return accepte
  509. def toucheClavier(self, event):
  510. accepte = False
  511. if self._num > 0:
  512. if event.key() == Qt.Key_Right:
  513. self.plateau.proj.majRotation(1)
  514. self.deplace = True
  515. accepte = True
  516. elif event.key() == Qt.Key_Left:
  517. self.plateau.proj.majRotation(-1)
  518. self.deplace = True
  519. accepte = True
  520. return accepte
  521. #-----------------------------------------------
  522. #-----------------------------------------------
  523. class StandardPi(ModeBasePi):
  524. """mode standard de la manipulation de pion en combat"""
  525. def __init__(self, plateau):
  526. super(StandardPi, self).__init__(plateau)
  527. self._focus = False
  528. self._activerDragMode = True
  529. def activer(self, num):
  530. self.plateau.fenetre.ui.cbt_panneauDroite.setCurrentIndex(3)
  531. if len(self.plateau.caches) > 0:
  532. for coord in self.plateau.cases:
  533. self.plateau.cases[coord].majCache()
  534. super(StandardPi, self).activer()
  535. def clic_combattant(self, num):
  536. self.plateau.activerMode(PionSelectionne, num)
  537. return True
  538. def clic_decor(self, num):
  539. self.plateau.activerMode(PionSelectionne, num)
  540. return True
  541. def nouvelleAction(self, action):
  542. pass
  543. class PionSelectionne(ModeBasePi):
  544. """mode active a la selection d'un pion combattant"""
  545. def __init__(self, plateau):
  546. super(PionSelectionne, self).__init__(plateau)
  547. self._focus = True
  548. self._num = None
  549. self._action = None
  550. def pion(self):
  551. """retourne la ref du pion actuellement selectionne"""
  552. retour = None
  553. if self._num in self.plateau.combattants:
  554. retour = self.plateau.combattants[self._num]
  555. elif self._num in self.plateau.decors:
  556. retour = self.plateau.decors[self._num]
  557. return retour
  558. def activer(self, num):
  559. self._num = num
  560. self.plateau.fenetre.ui.cbt_panneauDroite.setCurrentIndex(2)
  561. self.pion().afficheOmbreSelection(True)
  562. self.plateau.majPanneauPi()
  563. super(PionSelectionne, self).activer()
  564. def desactiver(self):
  565. if self._action:
  566. self._action.desactiver()
  567. self._action = None
  568. self.pion().afficheOmbreSelection(False)
  569. self._num = None
  570. self.plateau.majPanneauPi()
  571. super(PionSelectionne, self).desactiver()
  572. def nouvelleAction(self, action):
  573. if self._action:
  574. self._action.desactiver()
  575. self._action = None
  576. self._action = action()
  577. self._action.activer(self.plateau, self._num)
  578. def action(self):
  579. return self._action
  580. def survol_case(self, coord):
  581. accepte = False
  582. if self._action:
  583. self._action.majCoordCible(coord)
  584. accepte = True
  585. return accepte
  586. def clic_case(self, coord):
  587. accepte = False
  588. if self._action:
  589. self._action.valider()
  590. if not self._action.enCours(): self._action = None
  591. accepte = True
  592. return accepte
  593. def clicDroit(self, event):
  594. accepte = False
  595. if self._action != None:
  596. self._action.desactiver()
  597. self._action = None
  598. accepte = True
  599. else:
  600. accepte = super(PionSelectionne, self).clicDroit(event)
  601. return accepte
  602. def toucheClavier(self, event):
  603. accepte = False
  604. if self._num > 0:
  605. if event.key() == Qt.Key_Right:
  606. self._action.pivoter(1)
  607. accepte = True
  608. elif event.key() == Qt.Key_Left:
  609. self._action.pivoter(-1)
  610. accepte = True
  611. return accepte