EcranEditionCombattant.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  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_edc_fenetre
  8. from outilsSvg import *
  9. from VueEditionForme import VueEditionForme
  10. import regles
  11. import Actions
  12. import ui.dm as dm
  13. class EcranEditionCombattant(QDialog):
  14. """interface de creation/edition de terrains"""
  15. def __init__(self, combattant=None, parent=None):
  16. """initialisation de la fenetre"""
  17. super (EcranEditionCombattant, self).__init__()
  18. self.pixGraphique = 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_edc_fenetre()
  43. self.ui.setupUi(self)
  44. self.connect(self.ui.edc_nom, SIGNAL("textEdited(QString)"), self.majActivationEnregistrer)
  45. self.connect(self.ui.edc_nom, SIGNAL("textEdited(QString)"), self.majEtiquetteVueForme)
  46. self.connect(self.ui.edc_enregistrer, SIGNAL("clicked()"), self.enregistrer)
  47. self.connect(self.ui.edc_annuler, SIGNAL("clicked()"), self.annuler)
  48. self.connect(self.ui.edc_casesHexa, SIGNAL("clicked()"), self.majFormeCases)
  49. self.connect(self.ui.edc_casesCarrees, SIGNAL("clicked()"), self.majFormeCases)
  50. self.connect(self.ui.edc_couleur, SIGNAL("clicked()"), self.selectionCouleur)
  51. self.connect(self.ui.edc_image, SIGNAL("clicked()"), self.selectionImage)
  52. ## self.connect(self.ui.edc_aideForme, SIGNAL("clicked()"), self.afficherAideForme)
  53. self.connect(self.ui.edc_logo, SIGNAL("imageModifiee()"), self.logoModifie)
  54. self.vueForme = VueEditionForme(self)
  55. self.ui.edc_listeAttributs.setColumnWidth(0, (0.4*self.ui.edc_listeAttributs.width()))
  56. self.ui.edc_listeAttributs.setColumnWidth(1, (0.4*self.ui.edc_listeAttributs.width()))
  57. self.connect(self.ui.edc_listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee, Qt.UniqueConnection)
  58. self.connect(self.ui.edc_attaque_ajouter, SIGNAL("clicked()"), self.nouvelleAttaque)
  59. self.connect(self.ui.edc_attaque_supprimer, SIGNAL("clicked()"), self.supprimerAttaque)
  60. ## self.ui.listeInventaireCombattant.setColumnWidth(0, (0.2*self.ui.listeInventaireCombattant.width()))
  61. ## self.ui.listeInventaireCombattant.setColumnWidth(1, (0.8*self.ui.listeInventaireCombattant.width()))
  62. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("clicked()"), self.listeInventaireCelluleModifiee)
  63. ## self.connect(self.ui.supprimerInventaireCombattant, SIGNAL("clicked()"), self.supprimerLigneListeInventaire)
  64. ## self.connect(self.ui.ajouterInventaireCombattant, SIGNAL("clicked()"), self.ajouterLigneListeInventaire)
  65. def ouverture(self):
  66. """premier affichage: on met a jour les champs"""
  67. #page_nom
  68. self.ui.edc_nom.majTexte(self.combattant.nom)
  69. if self.combattant.logo:
  70. self.ui.edc_logo.chargerImage(self.combattant.logo)
  71. else:
  72. self.ui.edc_logo.majTexte("Choisissez \nun fichier\nimage")
  73. self.vueForme.creer(self.formeCases())
  74. self.vueForme.majCouleur(self.combattant.couleur)
  75. self.vueForme.chargerFormeDef(self.combattant.formeDef[self.formeCases()])
  76. self.vueForme.chargerImageDef(self.combattant.img)
  77. self.vueForme.chargerEtiquetteDef(self.combattant.etiquette)
  78. #page deplacements
  79. self.ui.edc_taille.setValue(self.combattant.taille)
  80. self.ui.edc_depMarche.setValue(self.combattant.depMarche)
  81. self.ui.edc_depNage.setValue(self.combattant.depNage)
  82. self.ui.edc_depEscalade.setValue(self.combattant.depEscalade)
  83. self.ui.edc_depVol.setValue(self.combattant.depVol)
  84. self.ui.edc_saut.setValue(self.combattant.saut)
  85. #page attributs
  86. self.majListeAttributs()
  87. #page attaques
  88. print "charge", self.combattant.attaques
  89. self.ui.edc_attaque_panneau.construire(self)
  90. self.ui.edc_attaque_liste.charger(self, self.combattant.attaques)
  91. #page inventaire
  92. #self.majListeInventaire()
  93. #page_notes
  94. for detail in self.combattant.details:
  95. widget = self.ui.edc_pages.findChild(dm.DmLineEdit, "edc_detail_{}".format(detail))
  96. if widget:
  97. widget.majTexte(self.combattant.details[detail])
  98. self.ui.edc_notes.setText(QString.fromUtf8(self.combattant.notes))
  99. #autre
  100. self.majActivationEnregistrer()
  101. def majActivationEnregistrer(self):
  102. """verifie la validite des saisies"""
  103. self.ui.edc_enregistrer.setEnabled(len(self.ui.edc_nom.texte()) > 0)
  104. def majListeAttributs(self):
  105. """met a jour la liste des attributs de la Combattant"""
  106. self.disconnect(self.ui.edc_listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee)
  107. #on vide la liste
  108. while self.ui.edc_listeAttributs.rowCount() > 0:
  109. self.ui.edc_listeAttributs.removeRow(0)
  110. #attributs issus des regles utilisees
  111. ordre = regles.ordreAttributs()
  112. for elt in ordre:
  113. ligne = ordre.index(elt)
  114. self.ui.edc_listeAttributs.insertRow(ligne)
  115. if regles.attribut(elt).combatSeulement == True: self.ui.edc_listeAttributs.setRowHidden(ligne, True)
  116. item = QTableWidgetItem(QString.fromUtf8(elt))
  117. item.setFlags(Qt.NoItemFlags)
  118. self.ui.edc_listeAttributs.setItem(ligne, 0, item)
  119. self.ui.edc_listeAttributs.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(str(self.combattant.listeAttributs[elt]))))
  120. self.connect(self.ui.edc_listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee)
  121. def listeAttributCelluleModifiee(self, ligne, colonne):
  122. """une cellule de la liste des attributs a ete modifiee"""
  123. if colonne != 1:
  124. pass
  125. else:
  126. attribut = regles.ordreAttributs()[(ligne)]
  127. nouvelleVal = str(self.ui.edc_listeAttributs.item(ligne, 1).text().toUtf8())
  128. valVerifiee = regles.listeControle()[attribut].controler(nouvelleVal)
  129. if valVerifiee != None:
  130. self.combattant.listeAttributs[attribut] = valVerifiee
  131. else:
  132. self.ui.edc_listeAttributs.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(str(self.combattant.listeAttributs[attribut]))))
  133. def majFormeCases(self):
  134. if self.vueForme.formeCases() != self.formeCases():
  135. #on enregistre la def de forme, d'image et d'etiquette en cours
  136. self.combattant.formeDef[self.vueForme.formeCases()] = self.vueForme.formeDef()
  137. self.combattant.img = self.vueForme.imageDef()
  138. self.combattant.etiquette = self.vueForme.etiquetteDef()
  139. #on recree la scene avec la nouvelle forme de cases
  140. self.vueForme.vider()
  141. self.vueForme.creer(self.formeCases())
  142. #on charge les def correspondantes a la nouvelle forme
  143. self.vueForme.chargerFormeDef(self.combattant.formeDef[self.formeCases()])
  144. self.vueForme.chargerImageDef(self.combattant.img)
  145. self.vueForme.chargerEtiquetteDef(self.combattant.etiquette)
  146. def majEtiquetteVueForme(self):
  147. self.combattant.etiquette.txt = self.ui.edc_nom.texte()
  148. self.vueForme.chargerEtiquetteDef(self.combattant.etiquette)
  149. def logoModifie(self):
  150. if not len(self.combattant.img.nomFichier) > 0:
  151. #si pas d'image attribuee au pion, on utilise le logo pour le pion
  152. self.vueForme.nouvelleImageDef(self.ui.edc_logo.image())
  153. def selectionImage(self):
  154. """selectionne le fichier image dans la boite de dialogue dediee"""
  155. fichier = QFileDialog.getOpenFileName(self,
  156. "Selectionnez une image",
  157. "\\img",
  158. "Images (*.png *.jpg)")
  159. if len(fichier) > 0:
  160. pix = QPixmap(fichier)
  161. if not pix.isNull():
  162. self.vueForme.nouvelleImageDef(fichier)
  163. else:
  164. dial = QMessageBox(self)
  165. dial.setText("Format non reconnu")
  166. dial.setWindowTitle("Erreur")
  167. dial.setStandardButtons(QMessageBox.Ok)
  168. dial.exec_()
  169. def selectionCouleur(self):
  170. """selectionne la couleur dans la boite de dialogue dediee"""
  171. couleur = QColorDialog(self).getColor(QColor("white"), self)
  172. if couleur.isValid():
  173. nomCouleur = couleur.name()
  174. self.combattant.couleur = couleur
  175. self.vueForme.majCouleur(couleur)
  176. def nouvelleAttaque(self):
  177. """ajoute une nouvelle ligne a la liste des attaques"""
  178. self.ui.edc_attaque_liste.nouvelle()
  179. def supprimerAttaque(self):
  180. """supprime la ligne selectionnee de la liste des attaques"""
  181. if self.ui.edc_attaque_liste.ligneSelectionnee():
  182. self.ui.edc_attaque_panneau.reinit()
  183. self.ui.edc_attaque_liste.supprimer()
  184. def enregistrer(self):
  185. """enregistre le terrain cree/edite"""
  186. #identifiant
  187. if not self.combattant.id:
  188. self.combattant.id = self.nouvelIdCombattant()
  189. #page nom
  190. self.combattant.nom = self.ui.edc_nom.texte()
  191. self.combattant.logo = self.ui.edc_logo.image()
  192. self.combattant.formeDef[self.vueForme.formeCases()] = self.vueForme.formeDef()
  193. self.combattant.img = self.vueForme.imageDef()
  194. self.combattant.etiquette = self.vueForme.etiquetteDef()
  195. #page dep
  196. self.combattant.taille = self.ui.edc_taille.value()
  197. self.combattant.depMarche = self.ui.edc_depMarche.value()
  198. self.combattant.depNage = self.ui.edc_depNage.value()
  199. self.combattant.depEscalade = self.ui.edc_depEscalade.value()
  200. self.combattant.depVol = self.ui.edc_depVol.value()
  201. self.combattant.saut = self.ui.edc_saut.value()
  202. #page attributs
  203. #dans listeAttributCelluleModifiee
  204. #page attaque
  205. print "svg", self.ui.edc_attaque_liste.listeAttaques()
  206. self.combattant.attaques = self.ui.edc_attaque_liste.listeAttaques()
  207. #page inventaire
  208. #a voir...
  209. #page notes
  210. listeWidget = self.ui.edc_pages.findChildren(dm.DmLineEdit)
  211. for widget in listeWidget:
  212. detail = str(widget.objectName()).replace("edc_detail_","")
  213. txt = widget.texte()
  214. if len(txt) > 0:
  215. self.combattant.details[detail] = txt
  216. self.combattant.notes = str(self.ui.edc_notes.toPlainText().toUtf8())
  217. enregistrer(self.combattant.id, self.combattant, "lib\\biblio\\combattant")
  218. self.combattant = None
  219. self.done(1)
  220. ## def supprimer(self):
  221. ## """supprimer l'enregistrement de ce terrain"""
  222. ## supprSvg("lib\\biblio\\combattant", self.combattant.id)
  223. ## self.done(1)
  224. def annuler(self):
  225. """annule la creation/edition"""
  226. self.combattant = None
  227. self.done(0)
  228. ## def majListeInventaire(self):
  229. ## """met a jour la liste de l'inventaire de la Combattant"""
  230. ## self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  231. ##
  232. ## #on vide la liste
  233. ## while self.ui.listeInventaireCombattant.rowCount() > 0:
  234. ## self.ui.listeInventaireCombattant.removeRow(0)
  235. ## ligne = 0
  236. ## #attributs issus des regles utilisees
  237. ## for objet in self.combattant.inventaire:
  238. ## self.ui.listeInventaireCombattant.insertRow(ligne)
  239. ## self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8(self.combattant.inventaire[objet])))
  240. ## self.ui.listeInventaireCombattant.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(objet)))
  241. ## ligne += 1
  242. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  243. ##
  244. ## def listeInventaireCelluleModifiee(self, ligne, colonne):
  245. ## """une cellule de la liste des attributs a ete modifiee"""
  246. ## nouvelleVal = str(self.ui.listeInventaireCombattant.item(ligne, colonne).text().toUtf8())
  247. ## val = None
  248. ## if colonne == 0:
  249. ## try:
  250. ## nbre = int(nouvelleVal)
  251. ## except:
  252. ## nbre = -1
  253. ## if nbre >= 0: val = str(nbre)
  254. ## else:
  255. ## val = str(nouvelleVal)
  256. ## if val in self.combattant.inventaire or len(val) == 0:
  257. ## print("cet objet existe deja ou a un nom invalide")
  258. ## val = None
  259. ##
  260. ## if colonne == 0:
  261. ## if val != None:
  262. ## self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())] = val
  263. ## else:
  264. ## self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8(\
  265. ## str(self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())]))))
  266. ## else:
  267. ## txt = str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())
  268. ## if txt in self.combattant.inventaire:
  269. ## del self.combattant.inventaire[txt]
  270. ## if val != None:
  271. ## self.combattant.inventaire[val] = txt
  272. ## else:
  273. ## self.ui.listeInventaireCombattant.removeRow(ligne)
  274. ##
  275. ## def ajouterLigneListeInventaire(self, objet=""):
  276. ## num = -1
  277. ## 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
  278. ## if len(str(self.ui.listeInventaireCombattant.item(i, 0).text().toUtf8())) == 0:
  279. ## num = i
  280. ## break
  281. ## if num < 0:
  282. ## self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  283. ## ligne = self.ui.listeInventaireCombattant.rowCount()
  284. ## self.ui.listeInventaireCombattant.insertRow(ligne)
  285. ## self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8("0")))
  286. ## self.ui.listeInventaireCombattant.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(objet)))
  287. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  288. ## else:
  289. ## self.ui.listeInventaireCombattant.setCurrentRow(num)
  290. ##
  291. ## def supprimerLigneListeInventaire(self):
  292. ## self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  293. ## ligne = self.ui.listeInventaireCombattant.currentRow()
  294. ## del self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())]
  295. ## self.ui.listeInventaireCombattant.removeRow(ligne)
  296. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)