Modes.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. """les modes d'interaction permettent l'interaction
  2. entre l'interface (l'utilisateur) et le plateau de combat.
  3. Un seul mode ne peut etre actif a la fois
  4. Cette classe doit permettre de recevoir les commandes de l'utilisateur
  5. de maniere a produire un resultat unique (cases peintes, pion deplace...)"""
  6. from PyQt4.QtCore import *
  7. from PyQt4.QtGui import *
  8. from EntreeSortie import EntreeSortie
  9. class ModeBase(object):
  10. """mode de base: tous les modes heritent de cette classe"""
  11. def __init__(self, plateau):
  12. self.plateau = plateau
  13. #le mode est il active
  14. self._actif = False
  15. #le dragmode est il active sur la QGraphicsView
  16. self._activerDragMode = 0
  17. #curseur de la QGraphicsView
  18. self._sourceCurseur = ""
  19. #met le focus sur la QGraphicsView a l'activation
  20. self._focus = False
  21. def nom(self):
  22. return self.__class__.__name__
  23. def activer(self, param = None):
  24. """active le mode"""
  25. self.activerCurseur()
  26. if self._focus:
  27. self.plateau.fenetre.ui.cbt_vue.setFocus()
  28. self._actif = True
  29. def desactiver(self):
  30. """desactive le mode"""
  31. self.desactiverCurseur()
  32. self.plateau.fenetre.ui.cbt_vue.setDragMode(1)
  33. self._actif = False
  34. def reinit(self):
  35. """remet les variables a 0 et reactive le mode"""
  36. pass
  37. def activerCurseur(self):
  38. self.plateau.fenetre.ui.cbt_vue.setDragMode(self._activerDragMode)
  39. curseurPix = QPixmap(self._sourceCurseur)
  40. if not curseurPix.isNull():
  41. curseurPinceau = QCursor(curseurPix, 0, curseurPix.height())
  42. self.plateau.fenetre.ui.cbt_vue.setCursor(curseurPinceau)
  43. def desactiverCurseur(self):
  44. self.plateau.fenetre.ui.cbt_vue.setCursor(QCursor(Qt.ArrowCursor))
  45. ### gestion des evenements souris
  46. # clic gauche
  47. def clic_combattant(self, num):
  48. pass
  49. def clic_decor(self, num):
  50. pass
  51. def clic_case(self, coord):
  52. pass
  53. #double clic gauche
  54. def doubleClic_combattant(self, num):
  55. pass
  56. def doubleClic_decor(self, num):
  57. pass
  58. def doubleClic_case(self, coord):
  59. pass
  60. #survol de la souris (entree)
  61. def survol_combattant(self, num):
  62. pass
  63. def survol_decor(self, num):
  64. pass
  65. def survol_case(self, coord):
  66. pass
  67. #survol de la souris (sortie)
  68. def finSurvol_combattant(self, num):
  69. pass
  70. def finSurvol_decor(self, num):
  71. pass
  72. def finSurvol_case(self, coord):
  73. pass
  74. #survol de la souris avec clic gauche enfonce (entree)
  75. def survolClic_combattant(self, event):
  76. pass
  77. def survolClic_decor(self, event):
  78. pass
  79. def survolClic_case(self, coord):
  80. pass
  81. #autre
  82. def clicGauche(self, event):
  83. pass
  84. def finClicGauche(self, event):
  85. pass
  86. def mouvementSouris(self, event):
  87. pass
  88. def toucheClavier(self, event):
  89. pass
  90. class ModeBaseCp(ModeBase):
  91. """mode servant de base a tous les modes lies a la creation de plateau"""
  92. def __init__(self, plateau):
  93. super(ModeBaseCp, self).__init__(plateau)
  94. self.type = "cp"
  95. class ModeBasePi(ModeBase):
  96. """mode servant de base a tous les modes lies aux actions des combattants"""
  97. def __init__(self, plateau):
  98. super(ModeBasePi, self).__init__(plateau)
  99. self.type = "pi"
  100. ### --------------------------------------- ####
  101. class StandardCp(ModeBaseCp):
  102. """mode standard en creation de plateau"""
  103. def __init__(self, plateau):
  104. super(StandardCp, self).__init__(plateau)
  105. self._sourceCurseur = ""
  106. self._focus = False
  107. self._activerDragMode = True
  108. def clic_pion(self, num):
  109. pass
  110. #doit selectionner le pion
  111. class MajCases(ModeBaseCp):
  112. """mode de mise a jour des cases (terrain, couleur, effet special)"""
  113. def __init__(self, plateau):
  114. super(MajCases, self).__init__(plateau)
  115. self._sourceCurseur = "img\\curseurPinceau.png"
  116. self._focus = True
  117. self._param = None #parametre avec lequel on mettra a jour la case
  118. def activer(self, param):
  119. """active le mode"""
  120. self.majParam(param)
  121. super(MajCases, self).activer()
  122. def desactiver(self):
  123. """desactive le mode"""
  124. self.plateau.pinceau.reinit()
  125. super(MajCases, self).desactiver()
  126. def majParam(self, param):
  127. self._param = param
  128. def param(self):
  129. return self._param
  130. def clic_case(self, coord):
  131. #demarre une operation de peinture des cases
  132. self.plateau.pinceau.demarrer(coord)
  133. def survolClic_case(self, coord):
  134. self.plateau.pinceau.maj(coord)
  135. def finClicGauche(self, event):
  136. if self.plateau.pinceau.estActif():
  137. for coord in self.plateau.pinceau.selection():
  138. if self._param.__class__.__name__ == "Terrain":
  139. self.plateau.cases[coord].majTerrain(self._param)
  140. elif self._param.__class__.__name__ == "QColor":
  141. if self._param.isValid():
  142. self.plateau.cases[coord].majTerrain(None)
  143. self.plateau.cases[coord].majCouleur(self._param)
  144. elif self._param.__class__.__name__ == "EffetCase":
  145. self.plateau.cases[coord].majEffet(self._param)
  146. self.plateau.pinceau.reinit()
  147. self.reinit()
  148. def toucheClavier(self, event):
  149. if event.key() == Qt.Key_Up:
  150. self.plateau.fenetre.ui.epaisseurPinceau.setValue(self.plateau.fenetre.ui.epaisseurPinceau.value()+1)
  151. elif event.key() == Qt.Key_Down:
  152. self.plateau.fenetre.ui.epaisseurPinceau.setValue(self.plateau.fenetre.ui.epaisseurPinceau.value()-1)
  153. class Pipette(ModeBaseCp):
  154. """mode pipette: on preleve la couleur ou le terrain d'une case"""
  155. def __init__(self, plateau):
  156. super(Pipette, self).__init__(plateau)
  157. self._sourceCurseur = "img\\curseurSeringue.png"
  158. def activerCurseur(self):
  159. super(Pipette, self).activerCurseur()
  160. def clic_case(self, coord):
  161. if len(case.terrain.nom) > 0:
  162. param = case.terrain
  163. else:
  164. param = case.couleur
  165. self.plateau.activerMode(Modes.CaseMaj, param)
  166. class ZonePlacement(ModeBaseCp):
  167. """mode de definition de la/les zones de placement des joueurs"""
  168. def __init__(self, plateau):
  169. super(ZonePlacement, self).__init__(plateau)
  170. self._sourceCurseur = "img\\curseurPinceau.png"
  171. self._focus = True
  172. def activerCurseur(self):
  173. super(ZonePlacement, self).activerCurseur()
  174. def activer(self, param = None):
  175. self.plateau.pinceau.majForme("rectP")
  176. self.plateau.pinceau.verrouillerForme(True)
  177. super(ZonePlacement, self).activer()
  178. def desactiver(self):
  179. self.plateau.pinceau.reinit()
  180. super(ZonePlacement, self).desactiver()
  181. def clic_case(self, coord):
  182. #demarre une operation de peinture des cases
  183. self.plateau.pinceau.demarrer(coord)
  184. def survolClic_case(self, coord):
  185. self.plateau.pinceau.maj(coord)
  186. def finClicGauche(self, coord):
  187. if self.plateau.pinceau.estActif():
  188. if len(self.plateau.pinceau.selection()) > 0:
  189. self.plateau.majZonePlacement(self.plateau.pinceau.selection())
  190. class EntreesSorties(ModeBaseCp):
  191. """mode de definition deentrees et sorties du plateau"""
  192. def __init__(self, plateau):
  193. super(EntreesSorties, self).__init__(plateau)
  194. self._sourceCurseur = "img\\curseurPinceau.png"
  195. self._focus = True
  196. def activerCurseur(self):
  197. super(EntreesSorties, self).activerCurseur()
  198. def activer(self, param):
  199. self.es = param
  200. self.es.creerForme()
  201. super(EntreesSorties, self).activer()
  202. def desactiver(self):
  203. if not self.es.estPositionne:
  204. self.es.prepareGeometryChange()
  205. self.es.plateau = None
  206. self.plateau.removeItem(self.es)
  207. super(EntreesSorties, self).desactiver()
  208. def mouvementSouris(self, event):
  209. if event.buttons() != Qt.LeftButton:
  210. if not self.es.estPositionne:
  211. self.es.majProjection(event.scenePos())
  212. def clicGauche(self, event):
  213. if not event.isAccepted():
  214. self.es.positionner()
  215. self.plateau.entreesSorties.append(self.es)
  216. self.desactiver()
  217. def toucheClavier(self, event):
  218. if event.key() == Qt.Key_Delete:
  219. #supprimer l'es
  220. self.desactiver()
  221. elif event.key() == Qt.Key_Right:
  222. self.es.nbRotations += 1
  223. self.es.majProjection()
  224. elif event.key() == Qt.Key_Left:
  225. self.es.nbRotations -= 1
  226. self.es.majProjection()
  227. class CreationPion(ModeBaseCp):
  228. """mode de creation de pions (combattant ou decor)"""
  229. def __init__(self, plateau):
  230. super(CreationPion, self).__init__(plateau)
  231. self._focus = True
  232. self._pion = None
  233. def activer(self, pion):
  234. self._pion = pion
  235. self.plateau.proj.creer(self._pion)
  236. super(CreationPion, self).activer()
  237. def desactiver(self):
  238. self.plateau.proj.desactiver()
  239. self._pion = None
  240. super(CreationPion, self).desactiver()
  241. def survol_case(self, coord):
  242. if self._pion:
  243. self.plateau.proj.majCoord(coord)
  244. def clic_case(self, coord):
  245. if self._pion:
  246. self.plateau.creerPion(self._pion)
  247. def toucheClavier(self, event):
  248. if self._pion:
  249. if event.key() == Qt.Key_Right:
  250. self.plateau.proj.majRotation(1)
  251. elif event.key() == Qt.Key_Left:
  252. self.plateau.proj.majRotation(-1)
  253. class SuppressionPion(ModeBaseCp):
  254. """mode de suppression de pions (combattant ou decor)"""
  255. def __init__(self, plateau):
  256. super(SuppressionPion, self).__init__(plateau)
  257. self._sourceCurseur = "img\\gomme.png"
  258. self._focus = True
  259. def clicGauche(self, event):
  260. """supprime le pion sous le clic. S'il y en a plusieurs,
  261. supprime le premier de la pile"""
  262. item = self.plateau.itemAt(event.scenePos())
  263. if item.parentItem().__class__.__name__ in ["Combattant", "Decor"]:
  264. self.plateau.pionSupprimer(item.parentItem().numero)
  265. class DeplacementPion(ModeBaseCp):
  266. """mode de deplacement de pions (combattant ou decor) en mode creation
  267. attention: different des actions de type deplacement qu'effectuent les pions en mode Combat"""
  268. def __init__(self, plateau):
  269. super(DeplacementPion, self).__init__(plateau)
  270. self._num = 0
  271. def activer(self, num):
  272. self._num = num
  273. if self._num < 10000:
  274. pion = self.plateau.combattants[self._num]
  275. else:
  276. pion = self.plateau.decors[self._num]
  277. self.plateau.proj.creer(pion)
  278. self.deplace = False
  279. super(DeplacementPion, self).activer()
  280. def desactiver(self):
  281. self.plateau.proj.desactiver()
  282. self._num = 0
  283. super(DeplacementPion, self).desactiver()
  284. def survol_case(self, coord):
  285. if self._num > 0:
  286. self.plateau.proj.majCoord(coord)
  287. self.deplace = True
  288. def clic_case(self, coord):
  289. if self._num > 0:
  290. if self.deplace:
  291. if self._num < 10000:
  292. pion = self.plateau.combattants[self._num]
  293. else:
  294. pion = self.plateau.decors[self._num]
  295. pion.majPosition(self.plateau.proj.coord(), self.plateau.proj.nbRotations())
  296. def toucheClavier(self, event):
  297. if self._num > 0:
  298. if event.key() == Qt.Key_Right:
  299. self.plateau.proj.majRotation(1)
  300. self.deplace = True
  301. elif event.key() == Qt.Key_Left:
  302. self.plateau.proj.majRotation(-1)
  303. self.deplace = True
  304. #-----------------------------------------------
  305. #-----------------------------------------------
  306. class StandardPi(ModeBasePi):
  307. """mode standard de la manipulation de pion en combat"""
  308. def __init__(self, plateau):
  309. super(StandardPi, self).__init__(plateau)
  310. self._focus = False
  311. self._activerDragMode = True
  312. def clic_pion(self, num):
  313. pass
  314. #doit selectionner le pion