Modes.py 24 KB

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