EcranEditionAttaques.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. from PyQt4.QtCore import *
  4. from PyQt4.QtGui import *
  5. from ui.ecran_editionAttaques import Ui_editionAttaques
  6. from Attaque import Attaque
  7. import regles
  8. class EcranEditionAttaques(QFrame):
  9. """interface d'edition des attaques du combattant"""
  10. def __init__(self, combattant, parent=None):
  11. """initialisation de la fenetre"""
  12. super (EcranEditionAttaques, self).__init__()
  13. self.combattant = combattant
  14. self.colonnesBase = {}
  15. self.createWidgets()
  16. self.majEnCours = False
  17. def createWidgets(self):
  18. """construction de l'interface"""
  19. #construction de l'interface
  20. self.ui = Ui_editionAttaques()
  21. self.ui.setupUi(self)
  22. self.connect(self.ui.nouvelleAttaque, SIGNAL("clicked()"), self.nouvelleAttaque)
  23. self.connect(self.ui.supprimerAttaque, SIGNAL("clicked()"), self.supprimerAttaque)
  24. ## self.connect(SIGNAL("majTypeAttaque()"), self.majTypeAttaque)
  25. self.initListe()
  26. self.majListe()
  27. self.connect(self.ui.editionListeAttaques, SIGNAL("cellChanged(int, int)"), self.celluleModifiee)
  28. def initListe(self):
  29. """formate la table des donnees"""
  30. #mise en forme des colonnes
  31. #colonnes de base: celles qui ne dependent pas des regles utilisees
  32. self.colonnesBase = ["numAttaque","Type","Nom","Portee","Forme","Rayon"]
  33. largeurColonnesBase = {"numAttaque": 0, "Type": 70, "Nom": 100, "Portee": 60, "Forme": 80,"Rayon": 60}
  34. for i in range(0, 10):
  35. self.ui.editionListeAttaques.insertColumn(i)
  36. self.ui.editionListeAttaques.setColumnHidden(i, (i >= len(self.colonnesBase)))
  37. if i < len(self.colonnesBase):
  38. self.ui.editionListeAttaques.setHorizontalHeaderItem(i, QTableWidgetItem(self.colonnesBase[i]))
  39. if self.colonnesBase[i] in largeurColonnesBase:
  40. largeur = largeurColonnesBase[self.colonnesBase[i]]
  41. else:
  42. largeur = 60
  43. if largeur > 0:
  44. self.ui.editionListeAttaques.setColumnWidth(i, largeur)
  45. else:
  46. self.ui.editionListeAttaques.setColumnHidden(i, True)
  47. ordre = regles.ordreAttributsAttaques()
  48. for elt in ordre:
  49. numCol = 10 + ordre.index(elt)
  50. self.ui.editionListeAttaques.insertColumn(numCol)
  51. self.ui.editionListeAttaques.setHorizontalHeaderItem(numCol, QTableWidgetItem(QString.fromUtf8(elt)))
  52. self.ui.editionListeAttaques.setColumnWidth(numCol, 45)
  53. self.ui.editionListeAttaques.setColumnHidden(numCol, False)
  54. def majListe(self):
  55. """met a jour le contenu de la table des donnees"""
  56. self.majEnCours = True
  57. while self.ui.editionListeAttaques.rowCount() > 0:
  58. self.ui.editionListeAttaques.removeRow(0)
  59. index = 0
  60. for numAttaque in range(0, len(self.combattant.attaques)):
  61. self.ui.editionListeAttaques.insertRow(int(index))
  62. #liste deroulante des types d'attaque
  63. self.ui.editionListeAttaques.setCellWidget(int(index), self.colonnesBase.index("Type"), self.listeTypesAttaques())
  64. #num du pion (0):
  65. self.ui.editionListeAttaques.setItem(int(index),0,QTableWidgetItem(QString.fromUtf8(str(numAttaque))))
  66. self.majDonneesAttaque(numAttaque)
  67. index += 1
  68. self.majEnCours = False
  69. def majDonneesAttaque(self, numAttaque):
  70. """met a jour les donnees de l'attaque"""
  71. index = None
  72. for i in range(0, self.ui.editionListeAttaques.rowCount()):
  73. if int(self.ui.editionListeAttaques.item(i, 0).text().toUtf8()) == numAttaque:
  74. index = i
  75. break
  76. if index != None:
  77. ### parametres de base
  78. #Type d'attaque
  79. item = QTableWidgetItem()
  80. item.setFlags(Qt.NoItemFlags)
  81. item.setFlags(Qt.ItemIsSelectable)
  82. if self.combattant.attaques[numAttaque].typ in ["cac", "dist", "zone"]:
  83. self.ui.editionListeAttaques.cellWidget(index, self.colonnesBase.index("Type")).setCurrentIndex(\
  84. self.ui.editionListeAttaques.cellWidget(index, self.colonnesBase.index("Type")).findData(QVariant(self.combattant.attaques[numAttaque].typ)))
  85. self.afficherDonneesAttaqueZone(index, (self.combattant.attaques[numAttaque].typ == "zone"))
  86. #Nom de l'attaque
  87. self.ui.editionListeAttaques.setItem(index, self.colonnesBase.index("Nom"), QTableWidgetItem(QString.fromUtf8(self.combattant.attaques[numAttaque].nom)))
  88. #Portee
  89. self.ui.editionListeAttaques.setItem(index, self.colonnesBase.index("Portee"), QTableWidgetItem(QString.fromUtf8(str(self.combattant.attaques[numAttaque].portee))))
  90. ### parametres supplementaires (issus des regles)
  91. for elt in self.combattant.attaques[numAttaque].attributs:
  92. col = 10 + regles.ordreAttributsAttaques().index(elt)
  93. self.ui.editionListeAttaques.setItem(index, col , QTableWidgetItem(QString.fromUtf8(str(self.combattant.attaques[numAttaque].attributs[elt]))))
  94. else:
  95. print ("Attaque {} introuvable, impossible de maj".format(numPion))
  96. def celluleModifiee(self, ligne, colonne):
  97. """une cellule de la table a ete modifiee"""
  98. if not self.majEnCours:
  99. numAttaque = int(self.ui.editionListeAttaques.item(ligne, 0).text().toUtf8())
  100. if colonne < len(self.colonnesBase):
  101. if colonne == self.colonnesBase.index("Nom"):
  102. nom = str(self.ui.editionListeAttaques.item(ligne, colonne).text().toUtf8())
  103. if not len(nom) > 0:
  104. nom = "Att. {}".format(numAttaque)
  105. self.combattant.attaques[numAttaque].nom = nom
  106. elif colonne == self.colonnesBase.index("Type"):
  107. typ = str(self.ui.editionListeAttaques.cellWidget(ligne, colonne).itemData(\
  108. self.ui.editionListeAttaques.cellWidget(ligne, colonne).currentIndex()).toString())
  109. self.combattant.attaques[numAttaque].typ = typ
  110. self.afficherDonneesAttaqueZone(ligne, (typ == "zone"))
  111. elif colonne == self.colonnesBase.index("Forme"):
  112. forme = str(self.ui.editionListeAttaques.cellWidget(ligne, colonne).itemData(\
  113. self.ui.editionListeAttaques.cellWidget(ligne, colonne).currentIndex()).toString())
  114. self.combattant.attaques[numAttaque].formeZone = forme
  115. elif colonne == self.colonnesBase.index("Portee"):
  116. #doit etre de type numerique
  117. try:
  118. portee = int(str(self.ui.editionListeAttaques.item(ligne, colonne).text().toUtf8()))
  119. valide = True
  120. except:
  121. valide = False
  122. if valide:
  123. self.combattant.attaques[numAttaque].portee = portee
  124. else:
  125. self.ui.editionListeAttaques.item(ligne, colonne).setText(QString.fromUtf8(self.combattant.attaques[numAttaque].portee))
  126. elif colonne == self.colonnesBase.index("Rayon"):
  127. #doit etre de type numerique
  128. try:
  129. rayon = int(str(self.ui.editionListeAttaques.item(ligne, colonne).text().toUtf8()))
  130. valide = True
  131. except:
  132. valide = False
  133. if valide:
  134. self.combattant.attaques[numAttaque].rayon = rayon
  135. else:
  136. self.ui.editionListeAttaques.item(ligne, colonne).setText(QString.fromUtf8(str(self.combattant.attaques[numAttaque].rayon)))
  137. elif colonne >= 10:
  138. self.majEnCours = True
  139. index = colonne - 10
  140. attribut = regles.ordreAttributsAttaques()[index]
  141. valeurAttribut = regles.listeControleAttaques()[attribut].controler(str(self.ui.editionListeAttaques.item(ligne, colonne).text().toUtf8()))
  142. if valeurAttribut != None:
  143. self.combattant.attaques[numAttaque].attributs[attribut] = valeurAttribut
  144. else:
  145. self.ui.editionListeAttaques.item(ligne, colonne).setText(QString.fromUtf8(str(self.combattant.attaques[numAttaque].attributs[attribut])))
  146. self.majEnCours = False
  147. def majTypeAttaque(self):
  148. """une des liste de type a ete modifiee, on met a jour toute la colonne (en attendant mieux :( )"""
  149. colonne = self.colonnesBase.index("Type")
  150. for i in range(0, self.ui.editionListeAttaques.rowCount()):
  151. if str(self.ui.editionListeAttaques.cellWidget(i, colonne).itemData(\
  152. self.ui.editionListeAttaques.cellWidget(i, colonne).currentIndex())) != \
  153. self.combattant.attaques[int(self.ui.editionListeAttaques.item(i, 0).text().toUtf8())].typ:
  154. self.celluleModifiee(i, colonne)
  155. def majFormeZone(self):
  156. """une des liste de type a ete modifiee, on met a jour toute la colonne (en attendant mieux :( )"""
  157. colonne = self.colonnesBase.index("Forme")
  158. for i in range(0, self.ui.editionListeAttaques.rowCount()):
  159. if self.ui.editionListeAttaques.cellWidget(i, colonne).__class__.__name__ == "QComboBox":
  160. if str(self.ui.editionListeAttaques.cellWidget(i, colonne).itemData(\
  161. self.ui.editionListeAttaques.cellWidget(i, colonne).currentIndex())) != \
  162. self.combattant.attaques[int(self.ui.editionListeAttaques.item(i, 0).text().toUtf8())].formeZone:
  163. self.celluleModifiee(i, colonne)
  164. def nouvelleAttaque(self):
  165. """ajoute une ligne a la table et une attaque au pion"""
  166. self.combattant.attaques.append(Attaque())
  167. self.majListe()
  168. def supprimerAttaque(self):
  169. """supprime l'attaque selectionnee de la liste des attaques du pion"""
  170. numAttaque = None
  171. for i in range(0, self.ui.editionListeAttaques.rowCount()):
  172. if self.ui.editionListeAttaques.item(i,0).isSelected():
  173. numAttaque = int(self.ui.editionListeAttaques.item(i,0).text().toUtf8())
  174. if numAttaque != None:
  175. reponse = QMessageBox.question(self, 'Message',
  176. "Etes vous sûr de vouloir supprimer cette attaque?", QMessageBox.Yes |
  177. QMessageBox.No, QMessageBox.No)
  178. if reponse == QMessageBox.Yes:
  179. del self.combattant.attaques[numAttaque]
  180. self.majListe()
  181. else:
  182. print "pas d'attaque selectionnee"
  183. def listeTypesAttaques(self):
  184. """retourne la QComboBox qui apparait dans la colonne Type d'attaque"""
  185. liste = QComboBox()
  186. liste.addItem(QIcon("img\\curseurEpee.png"), QString.fromUtf8("C.à.C"), "cac")
  187. liste.addItem(QIcon("img\\arc.png"), QString.fromUtf8("Dist."), "dist")
  188. liste.addItem(QIcon("img\\baguette.png"), QString.fromUtf8("Zone"), "zone")
  189. self.connect(liste, SIGNAL("currentIndexChanged(int)"), self.majTypeAttaque)
  190. return liste
  191. def listeFormesZone(self):
  192. """retourne la QComboBox qui apparait dans la colonne forme de zone"""
  193. liste = QComboBox()
  194. liste.addItem(QIcon("img\\formeLigne.png"), QString.fromUtf8("Ligne"), "ligne")
  195. liste.addItem(QIcon("img\\formeEllipsePlein.png"), QString.fromUtf8("Disque"), "disque")
  196. liste.addItem(QIcon("img\\cone.png"), QString.fromUtf8("Cone"), "cone")
  197. self.connect(liste, SIGNAL("currentIndexChanged(int)"), self.majFormeZone)
  198. return liste
  199. def afficherDonneesAttaqueZone(self, ligne, afficher):
  200. """rend modifiables ou non les donnees de base liees aux attaques de zone et modifie l'affichage en consequence"""
  201. self.majEnCours = True
  202. if afficher == True:
  203. numAttaque = int(self.ui.editionListeAttaques.item(ligne, 0).text().toUtf8())
  204. if self.ui.editionListeAttaques.cellWidget(ligne, self.colonnesBase.index("Forme")) == None:
  205. self.ui.editionListeAttaques.setCellWidget(ligne, self.colonnesBase.index("Forme"), self.listeFormesZone())
  206. if self.combattant.attaques[numAttaque].formeZone in ["ligne", "disque", "cone"]:
  207. self.ui.editionListeAttaques.cellWidget(ligne, self.colonnesBase.index("Forme")).setCurrentIndex(\
  208. self.ui.editionListeAttaques.cellWidget(ligne, self.colonnesBase.index("Forme")).findData(QVariant(self.combattant.attaques[numAttaque].formeZone)))
  209. item = QTableWidgetItem(QString.fromUtf8(str(self.combattant.attaques[numAttaque].rayon)))
  210. item.setBackgroundColor(QColor("white"))
  211. self.ui.editionListeAttaques.setItem(ligne, self.colonnesBase.index("Rayon"), item)
  212. else:
  213. if self.ui.editionListeAttaques.cellWidget(ligne, self.colonnesBase.index("Forme")) != None:
  214. self.ui.editionListeAttaques.removeCellWidget(ligne, self.colonnesBase.index("Forme"))
  215. item = QTableWidgetItem(QString.fromUtf8(""))
  216. item.setFlags(Qt.NoItemFlags)
  217. item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
  218. item.setBackgroundColor(QColor(200,200,200))
  219. self.ui.editionListeAttaques.setItem(ligne, self.colonnesBase.index("Forme"), item)
  220. item = QTableWidgetItem(QString.fromUtf8(""))
  221. item.setFlags(Qt.NoItemFlags)
  222. item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
  223. item.setBackgroundColor(QColor(200,200,200))
  224. self.ui.editionListeAttaques.setItem(ligne, self.colonnesBase.index("Rayon"), item)
  225. self.majEnCours = False