Modes.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  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 activer(self, param = None):
  22. """active le mode"""
  23. self.activerCurseur()
  24. if self._focus:
  25. self.plateau.fenetre.ui.cbt_vue.setFocus()
  26. self._actif = True
  27. def desactiver(self):
  28. """desactive le mode"""
  29. self.desactiverCurseur()
  30. self.plateau.fenetre.ui.cbt_vue.setDragMode(1)
  31. self._actif = False
  32. def reinit(self):
  33. """remet les variables a 0 et reactive le mode"""
  34. pass
  35. def activerCurseur(self):
  36. self.plateau.fenetre.ui.cbt_vue.setDragMode(self._activerDragMode)
  37. curseurPix = QPixmap(self._sourceCurseur)
  38. curseurPinceau = QCursor(curseurPix, 0, curseurPix.height())
  39. self.plateau.fenetre.ui.cbt_vue.setCursor(curseurPinceau)
  40. def desactiverCurseur(self):
  41. self.plateau.fenetre.ui.cbt_vue.setCursor(QCursor(Qt.ArrowCursor))
  42. ### gestion des evenements souris
  43. # clic gauche
  44. def clic_combattant(self, num):
  45. pass
  46. def clic_decor(self, num):
  47. pass
  48. def clic_case(self, coord):
  49. pass
  50. #double clic gauche
  51. def doubleClic_combattant(self, num):
  52. pass
  53. def doubleClic_decor(self, num):
  54. pass
  55. def doubleClic_case(self, coord):
  56. pass
  57. #survol de la souris (entree)
  58. def survol_combattant(self, num):
  59. pass
  60. def survol_decor(self, num):
  61. pass
  62. def survol_case(self, coord):
  63. pass
  64. #survol de la souris (sortie)
  65. def finSurvol_combattant(self, num):
  66. pass
  67. def finSurvol_decor(self, num):
  68. pass
  69. def finSurvol_case(self, coord):
  70. pass
  71. #survol de la souris avec clic gauche enfonce (entree)
  72. def survolClic_combattant(self, event):
  73. pass
  74. def survolClic_decor(self, event):
  75. pass
  76. def survolClic_case(self, coord):
  77. pass
  78. #autre
  79. def clicGauche(self, event):
  80. pass
  81. def finClicGauche(self, event):
  82. pass
  83. def mouvementSouris(self, event):
  84. pass
  85. def toucheClavier(self, event):
  86. pass
  87. ### --------------------------------------- ####
  88. class Standard(ModeBase):
  89. """mode standard"""
  90. def __init__(self, plateau):
  91. super(Standard, self).__init__(plateau)
  92. self._sourceCurseur = ""
  93. self._focus = False
  94. self._activerDragMode = True
  95. def clic_pion(self, num):
  96. pass
  97. #doit selectionner le pion
  98. class MajCases(ModeBase):
  99. """mode de mise a jour des cases (terrain, couleur, effet special)"""
  100. def __init__(self, plateau):
  101. super(MajCases, self).__init__(plateau)
  102. self._sourceCurseur = "img\\curseurPinceau.png"
  103. self._focus = True
  104. self._param = None #parametre avec lequel on mettra a jour la case
  105. def activer(self, param):
  106. """active le mode"""
  107. self.majParam(param)
  108. super(MajCases, self).activer()
  109. def desactiver(self):
  110. """desactive le mode"""
  111. self.plateau.pinceau.reinit()
  112. super(MajCases, self).desactiver()
  113. def majParam(self, param):
  114. self._param = param
  115. def param(self):
  116. return self._param
  117. def clic_case(self, coord):
  118. #demarre une operation de peinture des cases
  119. self.plateau.pinceau.demarrer(coord)
  120. def survolClic_case(self, coord):
  121. self.plateau.pinceau.maj(coord)
  122. def finClicGauche(self, event):
  123. if self.plateau.pinceau.estActif():
  124. for coord in self.plateau.pinceau.selection():
  125. if self._param.__class__.__name__ == "Terrain":
  126. self.plateau.cases[coord].majTerrain(self._param)
  127. elif self._param.__class__.__name__ == "QColor":
  128. if self._param.isValid():
  129. self.plateau.cases[coord].majTerrain(None)
  130. self.plateau.cases[coord].majCouleur(self._param)
  131. elif self._param.__class__.__name__ == "EffetCase":
  132. self.plateau.cases[coord].majEffet(self._param)
  133. self.plateau.pinceau.reinit()
  134. self.reinit()
  135. def toucheClavier(self, event):
  136. if event.key() == Qt.Key_Up:
  137. self.plateau.fenetre.ui.epaisseurPinceau.setValue(self.plateau.fenetre.ui.epaisseurPinceau.value()+1)
  138. elif event.key() == Qt.Key_Down:
  139. self.plateau.fenetre.ui.epaisseurPinceau.setValue(self.plateau.fenetre.ui.epaisseurPinceau.value()-1)
  140. class Pipette(ModeBase):
  141. """mode pipette: on preleve la couleur ou le terrain d'une case"""
  142. def __init__(self, plateau):
  143. super(ZonePlacement, self).__init__(plateau)
  144. self._sourceCurseur = "img\\curseurSeringue.png"
  145. def activerCurseur(self):
  146. super(Pipette, self).activerCurseur()
  147. def clic_case(self, coord):
  148. if len(case.terrain.nom) > 0:
  149. param = case.terrain
  150. else:
  151. param = case.couleur
  152. self.plateau.activerMode(Modes.CaseMaj, param)
  153. class ZonePlacement(ModeBase):
  154. """mode de definition de la/les zones de placement des joueurs"""
  155. def __init__(self, plateau):
  156. super(ZonePlacement, self).__init__(plateau)
  157. self._sourceCurseur = "img\\curseurPinceau.png"
  158. self._focus = True
  159. def activerCurseur(self):
  160. super(ZonePlacement, self).activerCurseur()
  161. def activer(self, param = None):
  162. self.plateau.pinceau.majForme("rectP")
  163. self.plateau.pinceau.verrouillerForme(True)
  164. super(ZonePlacement, self).activer()
  165. def desactiver(self):
  166. self.plateau.pinceau.reinit()
  167. super(ZonePlacement, self).desactiver()
  168. def clic_case(self, coord):
  169. #demarre une operation de peinture des cases
  170. self.plateau.pinceau.demarrer(coord)
  171. def survolClic_case(self, coord):
  172. self.plateau.pinceau.maj(coord)
  173. def finClicGauche(self, coord):
  174. if self.plateau.pinceau.estActif():
  175. if len(self.plateau.pinceau.selection()) > 0:
  176. self.plateau.majZonePlacement(self.plateau.pinceau.selection())
  177. class EntreesSorties(ModeBase):
  178. """mode de definition deentrees et sorties du plateau"""
  179. def __init__(self, plateau):
  180. super(EntreesSorties, self).__init__(plateau)
  181. self._sourceCurseur = "img\\curseurPinceau.png"
  182. self._focus = True
  183. def activerCurseur(self):
  184. super(EntreesSorties, self).activerCurseur()
  185. def activer(self, param):
  186. self.es = param
  187. self.es.creerForme()
  188. super(EntreesSorties, self).activer()
  189. def desactiver(self):
  190. if not self.es.estPositionne:
  191. self.es.prepareGeometryChange()
  192. self.es.plateau = None
  193. self.plateau.removeItem(self.es)
  194. super(EntreesSorties, self).desactiver()
  195. def mouvementSouris(self, event):
  196. if event.buttons() != Qt.LeftButton:
  197. if not self.es.estPositionne:
  198. self.es.majProjection(event.scenePos())
  199. def clicGauche(self, event):
  200. if not event.isAccepted():
  201. self.es.positionner()
  202. self.plateau.entreesSorties.append(self.es)
  203. self.desactiver()
  204. def toucheClavier(self, event):
  205. if event.key() == Qt.Key_Delete:
  206. #supprimer l'es
  207. self.desactiver()
  208. elif event.key() == Qt.Key_Right:
  209. self.es.nbRotations += 1
  210. self.es.majProjection()
  211. elif event.key() == Qt.Key_Left:
  212. self.es.nbRotations -= 1
  213. self.es.majProjection()
  214. class CreationPion(ModeBase):
  215. """mode de creation de pions (combattant ou decor)"""
  216. def __init__(self, plateau):
  217. super(CreationPion, self).__init__(plateau)
  218. self._focus = True
  219. self._pion = None
  220. def activer(self, pion):
  221. self._pion = pion
  222. self.plateau.proj.creer(self._pion)
  223. super(CreationPion, self).activer()
  224. def desactiver(self):
  225. self.plateau.proj.desactiver()
  226. self._pion = None
  227. super(CreationPion, self).desactiver()
  228. def survol_case(self, coord):
  229. if self._pion:
  230. self.plateau.proj.majCoord(coord)
  231. def clic_case(self, coord):
  232. if self._pion:
  233. self.plateau.creerPion(self._pion)
  234. def toucheClavier(self, event):
  235. if self._pion:
  236. if event.key() == Qt.Key_Right:
  237. self.plateau.proj.majRotation(1)
  238. elif event.key() == Qt.Key_Left:
  239. self.plateau.proj.majRotation(-1)