dmtableattaques_-_Copie.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. from PyQt4.QtCore import *
  4. from PyQt4.QtGui import *
  5. from lib.Actions import *
  6. import lib.regles as regles
  7. from dm import *
  8. #dans une DmTableAttaques, les 10 premieres colonnes sont reservees aux donnees de base
  9. #le reste des colonnes sert aux donnees complementaires issues des regles
  10. colonnesBase= ["numAttaque","Type","Nom","Portee","Forme","Rayon"]
  11. largeurColonnesBase = {"numAttaque": 0, "Type": 70, "Nom": 100, "Portee": 60, "Forme": 80,"Rayon": 60}
  12. class DmTableAttaques(DmTableWidget):
  13. """interface d'edition des attaques du combattant"""
  14. def __init__(self, parent=None):
  15. super (DmTableAttaques, self).__init__()
  16. self.combattant = None
  17. self.construire()
  18. def construire(self):
  19. """cree les colonnes de la table"""
  20. #colonnes de base: celles qui ne dependent pas des regles utilisees
  21. for i in range(0, 10):
  22. self.insertColumn(i)
  23. #on cache les colonnes qui ne seront pas utilisees
  24. self.setColumnHidden(i, (i >= len(colonnesBase)))
  25. if i < len(colonnesBase):
  26. #la largeur est geree par une variable globale
  27. self.setHorizontalHeaderItem(i, QTableWidgetItem(colonnesBase[i]))
  28. if colonnesBase[i] in largeurColonnesBase:
  29. largeur = largeurColonnesBase[colonnesBase[i]]
  30. else:
  31. largeur = 60
  32. if largeur > 0:
  33. self.setColumnWidth(i, largeur)
  34. else:
  35. self.setColumnHidden(i, True)
  36. ## self.cellWidget(index, self.posColonne("Type")).setEnabled(False)
  37. #on ajoute maintenant les colonnes issues des regles
  38. ordre = regles.ordreAttributsAttaques()
  39. for elt in ordre:
  40. numCol = 10 + ordre.index(elt)
  41. self.insertColumn(numCol)
  42. self.setHorizontalHeaderItem(numCol, QTableWidgetItem(QString.fromUtf8(elt)))
  43. self.setColumnWidth(numCol, 45)
  44. self.setColumnHidden(numCol, False)
  45. self.connect(self, SIGNAL("cellChanged(int, int)"), self.celluleModifiee)
  46. def siCombattant(fonction):
  47. """decorateur: si combattant"""
  48. def _siCombattant(self, *args):
  49. def fVide(*args):
  50. pass
  51. retour = fVide
  52. if self.combattant:
  53. retour = fonction
  54. retour(self)
  55. return _siCombattant
  56. def charger(self, combattant):
  57. self.combattant = combattant
  58. self.maj()
  59. self.nouvelle()
  60. @siCombattant
  61. def maj(self):
  62. """met a jour le contenu de la table des donnees"""
  63. self.vider()
  64. self.majEnCours = True
  65. index = 0
  66. for attaque in self.combattant.attaques:
  67. self.insertRow(int(index))
  68. #liste deroulante des types d'attaque
  69. ## #num de l'attaque
  70. ## self.setItem(int(index), 0, QTableWidgetItem(QString.fromUtf8(str(index))))
  71. donneesAttaque = {"NumAttaque": index, "Nom": attaque.nom, "Portee": attaque.portee}
  72. self.majLigne(index, donneesAttaque) #[Qt.NoItemFlags, Qt.ItemIsSelectable]
  73. #met a jour l'index en cours de la liste deroulante des types d'attaque
  74. widget = self.listeTypesAttaques()
  75. widget.allerA(attaque.typeAtt())
  76. self.setCellWidget(int(index), self.posColonne("Type"), widget)
  77. ## self.setCellWidget(int(index), self.posColonne("Type"), self.listeTypesAttaques())
  78. ## self.cellWidget(index, self.posColonne("Type")).allerA(attaque.typ)
  79. self.afficherDonneesAttaqueZone(index, (attaque.typ == "zone"))
  80. ### parametres supplementaires (issus des regles)
  81. self.majLigne(index, attaque.attributs)
  82. ## for elt in attaque.attributs:
  83. ## col = 10 + regles.ordreAttributsAttaques().index(elt)
  84. ## self.setItem(index, col , QTableWidgetItem(QString.fromUtf8(str(attaque.attributs[elt]))))
  85. index += 1
  86. self.majEnCours = False
  87. def posColonne(self, nom):
  88. """renvoie la position de la colonne demandee"""
  89. retour = None
  90. if nom in colonnesBase:
  91. retour = colonnesBase.index(nom)
  92. elif nom in regles.ordreAttributsAttaques():
  93. retour = 10 + regles.ordreAttributsAttaques().index(nom)
  94. return retour
  95. @siCombattant
  96. def celluleModifiee(self, ligne, colonne):
  97. """une cellule de la table a ete modifiee par l'utilisateur"""
  98. if not self.majEnCours:
  99. numAttaque = int(self.val(ligne, 0))
  100. attaque = self.combattant.attaques[numAttaque]
  101. if colonne < len(colonnesBase):
  102. if colonne == self.posColonne("Nom"):
  103. #maj du nom de l'attaque
  104. nom = self.texte(ligne, colonne)
  105. if not len(nom) > 0:
  106. nom = "Att. {}".format(numAttaque)
  107. attaque.nom = nom
  108. elif colonne == self.posColonne("Type"):
  109. #maj du type de l'attaque
  110. typ = str(self.cellWidget(ligne, colonne).valeurActuelle().toString())
  111. attaque.typ = typ
  112. self.afficherDonneesAttaqueZone(ligne, (typ == "zone"))
  113. elif colonne == self.posColonne("Forme"):
  114. #maj de la forme de l'attaque
  115. forme = str(self.cellWidget(ligne, colonne).valeurActuelle().toString())
  116. attaque.formeZone = forme
  117. elif colonne == self.posColonne("Portee"):
  118. #maj de la portee de l'attaque
  119. #doit etre de type numerique
  120. try:
  121. portee = int(self.data(ligne, colonne))
  122. if portee < 1000:
  123. attaque.portee = portee
  124. else:
  125. self.majEnt(ligne, colonne, attaque.portee)
  126. except:
  127. #sinon, on restaure l'ancienne valeur
  128. self.majEnt(ligne, colonne, attaque.portee)
  129. elif colonne == self.posColonne("Rayon"):
  130. #doit etre de type numerique
  131. try:
  132. rayon = int(self.data(ligne, colonne))
  133. if rayon < 100:
  134. self.combattant.attaques[numAttaque].rayon = rayon
  135. else:
  136. self.majEnt(ligne, colonne, attaque.rayon)
  137. except:
  138. self.majEnt(ligne, colonne, attaque.rayon)
  139. elif colonne >= 10:
  140. #colonnes issues des regles
  141. index = colonne - 10
  142. attribut = regles.ordreAttributsAttaques()[index]
  143. valeurAttribut = regles.listeControleAttaques()[attribut].controler(str(self.data(ligne, colonne).toString()))
  144. if valeurAttribut != None:
  145. attaque.attributs[attribut] = valeurAttribut
  146. else:
  147. self.majData(ligne, colonne, attaque.attributs[attribut])
  148. @siCombattant
  149. def nouvelle(self):
  150. """ajoute une ligne a la table et une attaque au pion"""
  151. self.combattant.attaques.append(Cac())
  152. self.maj()
  153. @siCombattant
  154. def supprimer(self):
  155. """supprime l'attaque selectionnee de la liste des attaques du pion"""
  156. select = self.ligneSelectionnee()
  157. if select:
  158. numAttaque = int(self.data(sel,0))
  159. reponse = QMessageBox.question(self, 'Message',
  160. "Etes vous sûr de vouloir supprimer cette attaque?", QMessageBox.Yes |
  161. QMessageBox.No, QMessageBox.No)
  162. if reponse == QMessageBox.Yes:
  163. del self.combattant.attaques[numAttaque]
  164. self.maj()
  165. def majTypeAttaque(self):
  166. """une des liste de type a ete modifiee, on met a jour toute la colonne (en attendant mieux :( )"""
  167. colonne = self.posColonne("Type")
  168. for i in range(0, self.rowCount()):
  169. if str(self.cellWidget(i, colonne).itemData(\
  170. self.cellWidget(i, colonne).currentIndex())) != \
  171. self.combattant.attaques[int(self.item(i, 0).text().toUtf8())].typ:
  172. self.celluleModifiee(i, colonne)
  173. def majFormeZone(self):
  174. """une des liste de type a ete modifiee, on met a jour toute la colonne (en attendant mieux :( )"""
  175. colonne = self.posColonne("Forme")
  176. for i in range(0, self.rowCount()):
  177. if self.cellWidget(i, colonne).__class__.__name__ == "QComboBox":
  178. if str(self.cellWidget(i, colonne).itemData(\
  179. self.cellWidget(i, colonne).currentIndex())) != \
  180. self.combattant.attaques[int(self.item(i, 0).text().toUtf8())].formeZone:
  181. self.celluleModifiee(i, colonne)
  182. def listeTypesAttaques(self):
  183. """retourne la DmComboBox qui apparait dans la colonne Type d'attaque"""
  184. liste = DmComboBox()
  185. liste.addItem(QIcon("img\\curseurEpee.png"), QString.fromUtf8("C.à.C"), "cac")
  186. liste.addItem(QIcon("img\\arc.png"), QString.fromUtf8("Dist."), "dist")
  187. liste.addItem(QIcon("img\\baguette.png"), QString.fromUtf8("Zone"), "zone")
  188. self.connect(liste, SIGNAL("currentIndexChanged(int)"), self.majTypeAttaque)
  189. return liste
  190. def listeFormesZone(self):
  191. """retourne la QComboBox qui apparait dans la colonne forme de zone"""
  192. liste = QComboBox()
  193. liste.addItem(QIcon("img\\formeLigne.png"), QString.fromUtf8("Ligne"), "ligne")
  194. liste.addItem(QIcon("img\\formeEllipsePlein.png"), QString.fromUtf8("Disque"), "disque")
  195. liste.addItem(QIcon("img\\cone.png"), QString.fromUtf8("Cone"), "cone")
  196. self.connect(liste, SIGNAL("currentIndexChanged(int)"), self.majFormeZone)
  197. return liste
  198. @siCombattant
  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:
  203. numAttaque = int(self.data(ligne, 0))
  204. attaque = self.combattant.attaques[numAttaque]
  205. if self.cellWidget(ligne, self.posColonne("Forme")) == None:
  206. self.setCellWidget(ligne, self.posColonne("Forme"), self.listeFormesZone())
  207. if attaque.formeZone in ["ligne", "disque", "cone"]:
  208. self.cellWidget(ligne, self.posColonne("Forme")).allerA(attaque.formeZone)
  209. item = QTableWidgetItem()
  210. item.setData(0, attaque.rayon)
  211. item.setBackgroundColor(QColor("white"))
  212. self.setItem(ligne, self.posColonne("Rayon"), item)
  213. else:
  214. if self.cellWidget(ligne, self.posColonne("Forme")) != None:
  215. self.removeCellWidget(ligne, self.posColonne("Forme"))
  216. item = QTableWidgetItem(QString.fromUtf8(""))
  217. item.setFlags(Qt.NoItemFlags)
  218. item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
  219. item.setBackgroundColor(QColor(200,200,200))
  220. self.setItem(ligne, self.posColonne("Forme"), item)
  221. item = QTableWidgetItem(QString.fromUtf8(""))
  222. item.setFlags(Qt.NoItemFlags)
  223. item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
  224. item.setBackgroundColor(QColor(200,200,200))
  225. self.setItem(ligne, self.posColonne("Rayon"), item)
  226. self.majEnCours = False