EcranEditionCombattant.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. from __future__ import division
  4. from PyQt4.QtCore import *
  5. from PyQt4.QtGui import *
  6. from Combattant import Combattant
  7. from ui.ecran_editionCombattant import Ui_editionCombattant
  8. from outilsSvg import *
  9. from VueEditionForme import VueEditionForme
  10. from EcranEditionAttaques import EcranEditionAttaques
  11. import regles
  12. class EcranEditionCombattant(QDialog):
  13. """interface de creation/edition de terrains"""
  14. def __init__(self, combattant=None, parent=None):
  15. """initialisation de la fenetre"""
  16. super (EcranEditionCombattant, self).__init__()
  17. self.pixGraphique = None
  18. self.id = None
  19. self.createWidgets()
  20. if combattant == None:
  21. self.combattant = Combattant()
  22. else:
  23. self.combattant = combattant
  24. self.ouverture()
  25. def nouvelIdCombattant(self):
  26. """renvoie un identifiant pour un nouveau terrain"""
  27. dicoSvg = afficheSvg("lib\\biblio\\Combattant")
  28. nouvelId = 1
  29. while str(nouvelId) in dicoSvg.keys():
  30. nouvelId += 1
  31. return str(nouvelId)
  32. def formeCases(self):
  33. retour = ""
  34. if self.ui.edc_casesHexa.isChecked():
  35. retour = "H"
  36. else:
  37. retour = "C"
  38. return retour
  39. def createWidgets(self):
  40. """construction de l'interface"""
  41. #construction de l'interface
  42. self.ui = Ui_editionCombattant()
  43. self.ui.setupUi(self)
  44. self.connect(self.ui.edp_nom, SIGNAL("textEdited(QString)"), self.majActivationEnregistrer)
  45. self.connect(self.ui.edp_nom, SIGNAL("textEdited(QString)"), self.majApercuTexte)
  46. self.connect(self.ui.edp_enregistrer, SIGNAL("clicked()"), self.enregistrer)
  47. self.connect(self.ui.edp_annuler, SIGNAL("clicked()"), self.annuler)
  48. self.connect(self.ui.edp_couleur, SIGNAL("clicked()"), self.selectionCouleur)
  49. self.connect(self.ui.edp_image, SIGNAL("clicked()"), self.selectionImage)
  50. self.connect(self.ui.edp_aideForme, SIGNAL("clicked()"), self.afficherAideForme)
  51. self.vueForme = VueEditionForme(self, self.formeCases)
  52. self.vueForme.creer()
  53. self.ui.listeAttributs.setColumnWidth(0, (0.4*self.ui.listeAttributs.width()))
  54. self.ui.listeAttributs.setColumnWidth(1, (0.4*self.ui.listeAttributs.width()))
  55. self.connect(self.ui.listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee, Qt.UniqueConnection)
  56. ## self.ui.listeInventaireCombattant.setColumnWidth(0, (0.2*self.ui.listeInventaireCombattant.width()))
  57. ## self.ui.listeInventaireCombattant.setColumnWidth(1, (0.8*self.ui.listeInventaireCombattant.width()))
  58. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("clicked()"), self.listeInventaireCelluleModifiee)
  59. ## self.connect(self.ui.supprimerInventaireCombattant, SIGNAL("clicked()"), self.supprimerLigneListeInventaire)
  60. ## self.connect(self.ui.ajouterInventaireCombattant, SIGNAL("clicked()"), self.ajouterLigneListeInventaire)
  61. def ouverture(self):
  62. """premier affichage: on met a jour les champs"""
  63. #identifiant
  64. if not self.id:
  65. self.id = self.nouvelIdCombattant()
  66. #page_nom
  67. self.ui.edc_nom.majTexte(self.combattant.nom)
  68. self.ui.edc_logo.chargerImage(self.combattant.logo)
  69. self.vueForme.majForme(self.combattant.formeDef[self.formeCases()])
  70. self.majApercuImage()
  71. self.majApercuTexte()
  72. #page deplacements
  73. self.ui.edc_taille.setValue(self.combattant.taille)
  74. self.ui.edc_depMarche.setValue(self.combattant.depMarche)
  75. self.ui.edc_depNage.setValue(self.combattant.depNage)
  76. self.ui.edc_depEscalade.setValue(self.combattant.depEscalade)
  77. self.ui.edc_depVol.setValue(self.combattant.depVol)
  78. self.ui.edc_saut.setValue(self.combattant.saut)
  79. #page attributs
  80. self.majListeAttributs()
  81. #page attaques
  82. tabAttaques = self.ui.pages.widget(3)
  83. editionAttaques = EcranEditionAttaques(self.combattant)
  84. editionAttaques.setParent(tabAttaques)
  85. #page inventaire
  86. #self.majListeInventaire()
  87. #page_notes
  88. for detail in self.combattant.details:
  89. widget = self.ui.findchild(DmLineEdit, "edc_detail_{}".format(detail))
  90. if widget:
  91. widget.majTexte(self.combattant.details[detail])
  92. self.ui.edc_notes.setText(self.combattant.notes)
  93. def majActivationEnregistrer(self, txt):
  94. """verifie la validite des saisies"""
  95. self.ui.edc_enregistrer.setEnabled(len(self.ui.edc_nom.texte()) > 0)
  96. def majListeAttributs(self):
  97. """met a jour la liste des attributs de la Combattant"""
  98. self.disconnect(self.ui.listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee)
  99. #on vide la liste
  100. while self.ui.listeAttributs.rowCount() > 0:
  101. self.ui.listeAttributs.removeRow(0)
  102. #attributs issus des regles utilisees
  103. ordre = regles.ordreAttributs()
  104. for elt in ordre:
  105. ligne = ordre.index(elt)
  106. self.ui.listeAttributs.insertRow(ligne)
  107. if regles.attribut(elt).combatSeulement == True: self.ui.listeAttributs.setRowHidden(ligne, True)
  108. item = QTableWidgetItem(QString.fromUtf8(elt))
  109. item.setFlags(Qt.NoItemFlags)
  110. self.ui.listeAttributs.setItem(ligne, 0, item)
  111. self.ui.listeAttributs.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(str(self.combattant.listeAttributs[elt]))))
  112. self.connect(self.ui.listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee)
  113. def listeAttributCelluleModifiee(self, ligne, colonne):
  114. """une cellule de la liste des attributs a ete modifiee"""
  115. if colonne != 1:
  116. pass
  117. else:
  118. attribut = regles.ordreAttributs()[(ligne)]
  119. nouvelleVal = str(self.ui.listeAttributs.item(ligne, 1).text().toUtf8())
  120. valVerifiee = regles.listeControle()[attribut].controler(nouvelleVal)
  121. if valVerifiee != None:
  122. self.combattant.listeAttributs[attribut] = valVerifiee
  123. else:
  124. self.ui.listeAttributs.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(str(self.combattant.listeAttributs[attribut]))))
  125. ## def majListeInventaire(self):
  126. ## """met a jour la liste de l'inventaire de la Combattant"""
  127. ## self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  128. ##
  129. ## #on vide la liste
  130. ## while self.ui.listeInventaireCombattant.rowCount() > 0:
  131. ## self.ui.listeInventaireCombattant.removeRow(0)
  132. ## ligne = 0
  133. ## #attributs issus des regles utilisees
  134. ## for objet in self.combattant.inventaire:
  135. ## self.ui.listeInventaireCombattant.insertRow(ligne)
  136. ## self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8(self.combattant.inventaire[objet])))
  137. ## self.ui.listeInventaireCombattant.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(objet)))
  138. ## ligne += 1
  139. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  140. ##
  141. ## def listeInventaireCelluleModifiee(self, ligne, colonne):
  142. ## """une cellule de la liste des attributs a ete modifiee"""
  143. ## nouvelleVal = str(self.ui.listeInventaireCombattant.item(ligne, colonne).text().toUtf8())
  144. ## val = None
  145. ## if colonne == 0:
  146. ## try:
  147. ## nbre = int(nouvelleVal)
  148. ## except:
  149. ## nbre = -1
  150. ## if nbre >= 0: val = str(nbre)
  151. ## else:
  152. ## val = str(nouvelleVal)
  153. ## if val in self.combattant.inventaire or len(val) == 0:
  154. ## print("cet objet existe deja ou a un nom invalide")
  155. ## val = None
  156. ##
  157. ## if colonne == 0:
  158. ## if val != None:
  159. ## self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())] = val
  160. ## else:
  161. ## self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8(\
  162. ## str(self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())]))))
  163. ## else:
  164. ## txt = str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())
  165. ## if txt in self.combattant.inventaire:
  166. ## del self.combattant.inventaire[txt]
  167. ## if val != None:
  168. ## self.combattant.inventaire[val] = txt
  169. ## else:
  170. ## self.ui.listeInventaireCombattant.removeRow(ligne)
  171. ##
  172. ## def ajouterLigneListeInventaire(self, objet=""):
  173. ## num = -1
  174. ## for i in range(0, self.ui.listeInventaireCombattant.rowCount()): #si un objet de la liste a deja un nom vide, on ne cree pas de nouvelle ligne
  175. ## if len(str(self.ui.listeInventaireCombattant.item(i, 0).text().toUtf8())) == 0:
  176. ## num = i
  177. ## break
  178. ## if num < 0:
  179. ## self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  180. ## ligne = self.ui.listeInventaireCombattant.rowCount()
  181. ## self.ui.listeInventaireCombattant.insertRow(ligne)
  182. ## self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8("0")))
  183. ## self.ui.listeInventaireCombattant.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(objet)))
  184. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  185. ## else:
  186. ## self.ui.listeInventaireCombattant.setCurrentRow(num)
  187. ##
  188. ## def supprimerLigneListeInventaire(self):
  189. ## self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  190. ## ligne = self.ui.listeInventaireCombattant.currentRow()
  191. ## del self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())]
  192. ## self.ui.listeInventaireCombattant.removeRow(ligne)
  193. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  194. def majApercuImage(self):
  195. """met a jour l'image sur l'apercu du pion"""
  196. if self.ui.imgAfficherCombattant.isChecked():
  197. if len(str(self.ui.imgTextureCombattant.text().toUtf8())) > 0:
  198. img = str(self.ui.imgTextureCombattant.text().toUtf8())
  199. self.vueForme.majImage(img, self.ui.imgTailleXCombattant.value() \
  200. , self.ui.imgTailleYCombattant.value() \
  201. , self.ui.imgPosXCombattant.value() \
  202. , self.ui.imgPosYCombattant.value() \
  203. , self.ui.imgRotationCombattant.value() \
  204. , self.ui.imgPivoteCombattant.isChecked() \
  205. , self.ui.imgMasqueCombattant.isChecked() )
  206. else:
  207. img = str(self.ui.imgLogoCombattant.text().toUtf8())
  208. self.vueForme.majImage(img)
  209. else:
  210. img = ""
  211. self.vueForme.majImage(img)
  212. def majApercuTexte(self):
  213. """met a jour l'etiquette sur l'apercu du pion"""
  214. if self.ui.txtAfficherCombattant.isChecked():
  215. txt = str(self.ui.nomCombattant.text().toUtf8())
  216. else:
  217. txt = "Pion"
  218. self.vueForme.majTexte(txt, self.ui.txtTaillePoliceCombattant.value() \
  219. , self.ui.txtGrasCombattant.isChecked() \
  220. , self.ui.txtPosXCombattant.value() \
  221. , self.ui.txtPosYCombattant.value() \
  222. , self.ui.txtRotationCombattant.value())
  223. def reinitImage(self):
  224. self.ui.imgTailleXCombattant.setValue(10)
  225. self.ui.imgTailleYCombattant.setValue(10)
  226. self.ui.imgPosXCombattant.setValue(0)
  227. self.ui.imgPosYCombattant.setValue(0)
  228. self.ui.imgRotationCombattant.setValue(0)
  229. self.ui.imgPivoteCombattant.setChecked(False)
  230. self.ui.imgMasqueCombattant.setChecked(False)
  231. self.majApercuImage()
  232. def reinitTexte(self):
  233. self.ui.txtTaillePoliceCombattant.setValue(21)
  234. self.ui.txtGrasCombattant.setCheckState(0)
  235. self.ui.txtPosXCombattant.setValue(0)
  236. self.ui.txtPosYCombattant.setValue(0)
  237. self.ui.txtRotationCombattant.setValue(0)
  238. self.majApercuTexte()
  239. def selectionCouleur(self):
  240. """selectionne la couleur dans la boite de dialogue dediee"""
  241. couleur = QColorDialog(self).getColor(QColor("white"), self)
  242. if couleur.isValid():
  243. nomCouleur = couleur.name()
  244. self.combattant.couleur = couleur
  245. def enregistrer(self):
  246. """enregistre le terrain cree/edite"""
  247. #page nom
  248. self.combattant.id = self.id
  249. self.combattant.nom = self.ui.edc_nom.texte()
  250. self.combattant.logo = self.ui.edc_logo.image()
  251. self.combattant.img = self.vueForme.image()
  252. self.combattant.etiquette = self.vueForme.etiquette()
  253. self.combattant.formeDef["H"] = self.vueForme.formeDef("H")
  254. self.combattant.formeDef["C"] = self.vueForme.formeDef("C")
  255. #page dep
  256. self.combattant.taille = self.ui.edc_taille.value()
  257. self.combattant.depMarche = self.ui.edc_depMarche.value()
  258. self.combattant.depNage = self.ui.edc_depNage.value()
  259. self.combattant.depEscalade = self.ui.edc_depEscalade.value()
  260. self.combattant.depVol = self.ui.edc_depVol.value()
  261. self.combattant.saut = self.ui.edc_saut.value()
  262. #page attributs
  263. #dans listeAttributCelluleModifiee
  264. #page attaque
  265. #dans EcranEditionAttaque
  266. #page inventaire
  267. #a voir...
  268. #page notes
  269. for detail in self.combattant.details:
  270. widget = self.ui.findchild(DmLineEdit, "edc_detail_{}".format(detail))
  271. if widget:
  272. txt = widget.texte()
  273. if len(txt) > 0:
  274. self.combattant.details[detail] = txt
  275. self.combattant.notes = str(self.ui.notesCombattant.toPlainText())
  276. enregistrer(self.combattant.id, self.combattant, "lib\\biblio\\combattant")
  277. self.combattant = None
  278. self.done(1)
  279. ## def supprimer(self):
  280. ## """supprimer l'enregistrement de ce terrain"""
  281. ## supprSvg("lib\\biblio\\combattant", self.combattant.id)
  282. ## self.done(1)
  283. def annuler(self):
  284. """annule la creation/edition"""
  285. self.combattant = None
  286. self.done(0)