EcranEditionCombattant.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  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, formeCases = "H", parent=None):
  15. """initialisation de la fenetre"""
  16. super (EcranEditionCombattant, self).__init__()
  17. self.pixGraphique = None
  18. self.formeCases = formeCases
  19. self.createWidgets()
  20. if combattant == None:
  21. self.combattant = Combattant()
  22. self.accesCreation()
  23. else:
  24. self.combattant = combattant
  25. self.accesEdition()
  26. self.majAffichage("")
  27. self.afficheListeAttaques()
  28. self.majListeAttributs()
  29. ## self.majListeInventaire()
  30. def createWidgets(self):
  31. """construction de l'interface"""
  32. #construction de l'interface
  33. self.ui = Ui_editionCombattant()
  34. self.ui.setupUi(self)
  35. self.connect(self.ui.enregistrerCombattant, SIGNAL("clicked()"), self.enregistrer)
  36. self.connect(self.ui.annulerCombattant, SIGNAL("clicked()"), self.annuler)
  37. self.connect(self.ui.supprimerCombattant, SIGNAL("clicked()"), self.supprimer)
  38. self.connect(self.ui.idCombattant, SIGNAL("textEdited(QString)"), self.majAffichage)
  39. self.connect(self.ui.nomCombattant, SIGNAL("textEdited(QString)"), self.majAffichage)
  40. self.connect(self.ui.couleurCombattant, SIGNAL("clicked()"), self.selectionCouleur)
  41. self.connect(self.ui.imgTextureCombattant, SIGNAL("textEdited(QString)"), self.majApercuImage)
  42. self.connect(self.ui.imgLogoCombattant, SIGNAL("textEdited(QString)"), self.majApercuImage)
  43. self.connect(self.ui.imgAfficherCombattant, SIGNAL("stateChanged(int)"), self.majApercuImage)
  44. self.connect(self.ui.imgPivoteCombattant, SIGNAL("stateChanged(int)"), self.majApercuImage)
  45. self.connect(self.ui.imgMasqueCombattant, SIGNAL("stateChanged(int)"), self.majApercuImage)
  46. self.connect(self.ui.imgTailleXCombattant, SIGNAL("valueChanged(int)"), self.majApercuImage)
  47. self.connect(self.ui.imgTailleYCombattant, SIGNAL("valueChanged(int)"), self.majApercuImage)
  48. self.connect(self.ui.imgPosXCombattant, SIGNAL("valueChanged(int)"), self.majApercuImage)
  49. self.connect(self.ui.imgPosYCombattant, SIGNAL("valueChanged(int)"), self.majApercuImage)
  50. self.connect(self.ui.imgRotationCombattant, SIGNAL("valueChanged(int)"), self.majApercuImage)
  51. self.connect(self.ui.imgReinitCombattant, SIGNAL("clicked()"), self.reinitImage)
  52. self.connect(self.ui.nomCombattant, SIGNAL("textEdited(QString)"), self.majApercuTexte)
  53. self.connect(self.ui.txtAfficherCombattant, SIGNAL("stateChanged(int)"), self.majApercuTexte)
  54. self.connect(self.ui.txtTaillePoliceCombattant, SIGNAL("valueChanged(int)"), self.majApercuTexte)
  55. self.connect(self.ui.txtGrasCombattant, SIGNAL("stateChanged(int)"), self.majApercuTexte)
  56. self.connect(self.ui.txtPosXCombattant, SIGNAL("valueChanged(int)"), self.majApercuTexte)
  57. self.connect(self.ui.txtPosYCombattant, SIGNAL("valueChanged(int)"), self.majApercuTexte)
  58. self.connect(self.ui.txtRotationCombattant, SIGNAL("valueChanged(int)"), self.majApercuTexte)
  59. self.connect(self.ui.txtReinitCombattant, SIGNAL("clicked()"), self.reinitTexte)
  60. self.vueForme = VueEditionForme(self, self.formeCases)
  61. self.vueForme.creer()
  62. self.ui.listeAttributs.setColumnWidth(0, (0.4*self.ui.listeAttributs.width()))
  63. self.ui.listeAttributs.setColumnWidth(1, (0.4*self.ui.listeAttributs.width()))
  64. self.connect(self.ui.listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee, Qt.UniqueConnection)
  65. ## self.ui.listeInventaireCombattant.setColumnWidth(0, (0.2*self.ui.listeInventaireCombattant.width()))
  66. ## self.ui.listeInventaireCombattant.setColumnWidth(1, (0.8*self.ui.listeInventaireCombattant.width()))
  67. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("clicked()"), self.listeInventaireCelluleModifiee)
  68. ## self.connect(self.ui.supprimerInventaireCombattant, SIGNAL("clicked()"), self.supprimerLigneListeInventaire)
  69. ## self.connect(self.ui.ajouterInventaireCombattant, SIGNAL("clicked()"), self.ajouterLigneListeInventaire)
  70. def accesEdition(self):
  71. """ouverture en mode edition"""
  72. self.ui.idCombattant.setEnabled(True)
  73. self.ui.idCombattant.setText(QString.fromUtf8(str(self.combattant.id)))
  74. self.ui.nomCombattant.setText(QString.fromUtf8(str(self.combattant.nom)))
  75. self.ui.notesCombattant.setText(QString.fromUtf8(str(self.combattant.notes)))
  76. if self.combattant.couleur.isValid():
  77. self.ui.affichageCouleurCombattant.setStyleSheet("QLabel {backGround:%s}" %(self.combattant.couleur.name()))
  78. self.ui.imgLogoCombattant.setText(QString.fromUtf8(str(self.combattant.logo)))
  79. self.ui.imgTextureCombattant.setText(QString.fromUtf8(str(self.combattant.img.nom)))
  80. self.ui.imgTailleXCombattant.setValue(self.combattant.img.kx)
  81. self.ui.imgTailleYCombattant.setValue(self.combattant.img.ky)
  82. self.ui.imgPosXCombattant.setValue(self.combattant.img.dx)
  83. self.ui.imgPosYCombattant.setValue(self.combattant.img.dy)
  84. self.ui.imgRotationCombattant.setValue(self.combattant.img.rotation)
  85. self.ui.imgPivoteCombattant.setChecked(self.combattant.img.pivote)
  86. self.ui.imgMasqueCombattant.setChecked(self.combattant.img.masqueAuto)
  87. self.ui.txtTaillePoliceCombattant.setValue(self.combattant.etiquette.taille_police)
  88. self.ui.txtGrasCombattant.setChecked(self.combattant.etiquette.gras)
  89. self.ui.txtPosXCombattant.setValue(self.combattant.etiquette.dx)
  90. self.ui.txtPosYCombattant.setValue(self.combattant.etiquette.dy)
  91. self.ui.txtRotationCombattant.setValue(self.combattant.etiquette.rotation)
  92. self.ui.deplacementCombattant.setValue(self.combattant.deplacement)
  93. self.ui.hauteurCombattant.setValue(self.combattant.hauteur)
  94. self.ui.volCombattant.setChecked(self.combattant.vol)
  95. self.vueForme.majForme(self.combattant.formeDef[self.formeCases])
  96. self.ui.supprimerCombattant.setEnabled(True)
  97. self.ui.idCombattant.setEnabled(False)
  98. self.majApercuImage()
  99. self.majApercuTexte()
  100. def accesCreation(self):
  101. """ouverture en mode creation"""
  102. self.ui.idCombattant.setEnabled(True)
  103. self.ui.idCombattant.setText(QString.fromUtf8(str(self.nouvelIdCombattant())))
  104. self.ui.idCombattant.setEnabled(False)
  105. self.majApercuImage()
  106. self.majApercuTexte()
  107. def majAffichage(self, txt):
  108. """verifie la validite des saisies"""
  109. self.ui.enregistrerCombattant.setEnabled(len(self.ui.idCombattant.text().toUtf8()) > 0 and len(self.ui.nomCombattant.text().toUtf8()) > 0)
  110. def afficheListeAttaques(self):
  111. """insere la frame d'edition des attaques"""
  112. tabAttaques = self.ui.ongletsCreation.widget(1)
  113. editionAttaques = EcranEditionAttaques(self.combattant)
  114. editionAttaques.setParent(tabAttaques)
  115. def majListeAttributs(self):
  116. """met a jour la liste des attributs de la Combattant"""
  117. """met a jour la liste des attributs dans le panneau de combat"""
  118. self.disconnect(self.ui.listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee)
  119. #on vide la liste
  120. while self.ui.listeAttributs.rowCount() > 0:
  121. self.ui.listeAttributs.removeRow(0)
  122. #attributs issus des regles utilisees
  123. ordre = regles.ordreAttributs()
  124. for elt in ordre:
  125. ligne = ordre.index(elt)
  126. self.ui.listeAttributs.insertRow(ligne)
  127. if regles.attribut(elt).combatSeulement == True: self.ui.listeAttributs.setRowHidden(ligne, True)
  128. item = QTableWidgetItem(QString.fromUtf8(elt))
  129. item.setFlags(Qt.NoItemFlags)
  130. self.ui.listeAttributs.setItem(ligne, 0, item)
  131. self.ui.listeAttributs.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(str(self.combattant.lstCaracCombattant[elt]))))
  132. self.connect(self.ui.listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee)
  133. def listeAttributCelluleModifiee(self, ligne, colonne):
  134. """une cellule de la liste des attributs a ete modifiee"""
  135. if colonne != 1:
  136. pass
  137. else:
  138. attribut = regles.ordreAttributs()[(ligne)]
  139. nouvelleVal = str(self.ui.listeAttributs.item(ligne, 1).text().toUtf8())
  140. valVerifiee = regles.listeControle()[attribut].controler(nouvelleVal)
  141. if valVerifiee != None:
  142. self.combattant.lstCaracCombattant[attribut] = valVerifiee
  143. else:
  144. self.ui.listeAttributs.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(str(self.combattant.lstCaracCombattant[attribut]))))
  145. ## def majListeInventaire(self):
  146. ## """met a jour la liste de l'inventaire de la Combattant"""
  147. ## self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  148. ##
  149. ## #on vide la liste
  150. ## while self.ui.listeInventaireCombattant.rowCount() > 0:
  151. ## self.ui.listeInventaireCombattant.removeRow(0)
  152. ## ligne = 0
  153. ## #attributs issus des regles utilisees
  154. ## for objet in self.combattant.inventaire:
  155. ## self.ui.listeInventaireCombattant.insertRow(ligne)
  156. ## self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8(self.combattant.inventaire[objet])))
  157. ## self.ui.listeInventaireCombattant.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(objet)))
  158. ## ligne += 1
  159. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  160. ##
  161. ## def listeInventaireCelluleModifiee(self, ligne, colonne):
  162. ## """une cellule de la liste des attributs a ete modifiee"""
  163. ## nouvelleVal = str(self.ui.listeInventaireCombattant.item(ligne, colonne).text().toUtf8())
  164. ## val = None
  165. ## if colonne == 0:
  166. ## try:
  167. ## nbre = int(nouvelleVal)
  168. ## except:
  169. ## nbre = -1
  170. ## if nbre >= 0: val = str(nbre)
  171. ## else:
  172. ## val = str(nouvelleVal)
  173. ## if val in self.combattant.inventaire or len(val) == 0:
  174. ## print("cet objet existe deja ou a un nom invalide")
  175. ## val = None
  176. ##
  177. ## if colonne == 0:
  178. ## if val != None:
  179. ## self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())] = val
  180. ## else:
  181. ## self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8(\
  182. ## str(self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())]))))
  183. ## else:
  184. ## txt = str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())
  185. ## if txt in self.combattant.inventaire:
  186. ## del self.combattant.inventaire[txt]
  187. ## if val != None:
  188. ## self.combattant.inventaire[val] = txt
  189. ## else:
  190. ## self.ui.listeInventaireCombattant.removeRow(ligne)
  191. ##
  192. ## def ajouterLigneListeInventaire(self, objet=""):
  193. ## num = -1
  194. ## 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
  195. ## if len(str(self.ui.listeInventaireCombattant.item(i, 0).text().toUtf8())) == 0:
  196. ## num = i
  197. ## break
  198. ## if num < 0:
  199. ## self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  200. ## ligne = self.ui.listeInventaireCombattant.rowCount()
  201. ## self.ui.listeInventaireCombattant.insertRow(ligne)
  202. ## self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8("0")))
  203. ## self.ui.listeInventaireCombattant.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(objet)))
  204. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  205. ## else:
  206. ## self.ui.listeInventaireCombattant.setCurrentRow(num)
  207. ##
  208. ## def supprimerLigneListeInventaire(self):
  209. ## self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  210. ## ligne = self.ui.listeInventaireCombattant.currentRow()
  211. ## del self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())]
  212. ## self.ui.listeInventaireCombattant.removeRow(ligne)
  213. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  214. def majApercuImage(self):
  215. """met a jour l'image sur l'apercu du pion"""
  216. if self.ui.imgAfficherCombattant.isChecked():
  217. if len(str(self.ui.imgTextureCombattant.text().toUtf8())) > 0:
  218. img = str(self.ui.imgTextureCombattant.text().toUtf8())
  219. self.vueForme.majImage(img, self.ui.imgTailleXCombattant.value() \
  220. , self.ui.imgTailleYCombattant.value() \
  221. , self.ui.imgPosXCombattant.value() \
  222. , self.ui.imgPosYCombattant.value() \
  223. , self.ui.imgRotationCombattant.value() \
  224. , self.ui.imgPivoteCombattant.isChecked() \
  225. , self.ui.imgMasqueCombattant.isChecked() )
  226. else:
  227. img = str(self.ui.imgLogoCombattant.text().toUtf8())
  228. self.vueForme.majImage(img)
  229. else:
  230. img = ""
  231. self.vueForme.majImage(img)
  232. def majApercuTexte(self):
  233. """met a jour l'etiquette sur l'apercu du pion"""
  234. if self.ui.txtAfficherCombattant.isChecked():
  235. txt = str(self.ui.nomCombattant.text().toUtf8())
  236. else:
  237. txt = "Pion"
  238. self.vueForme.majTexte(txt, self.ui.txtTaillePoliceCombattant.value() \
  239. , self.ui.txtGrasCombattant.isChecked() \
  240. , self.ui.txtPosXCombattant.value() \
  241. , self.ui.txtPosYCombattant.value() \
  242. , self.ui.txtRotationCombattant.value())
  243. def reinitImage(self):
  244. self.ui.imgTailleXCombattant.setValue(10)
  245. self.ui.imgTailleYCombattant.setValue(10)
  246. self.ui.imgPosXCombattant.setValue(0)
  247. self.ui.imgPosYCombattant.setValue(0)
  248. self.ui.imgRotationCombattant.setValue(0)
  249. self.ui.imgPivoteCombattant.setChecked(False)
  250. self.ui.imgMasqueCombattant.setChecked(False)
  251. self.majApercuImage()
  252. def reinitTexte(self):
  253. self.ui.txtTaillePoliceCombattant.setValue(21)
  254. self.ui.txtGrasCombattant.setCheckState(0)
  255. self.ui.txtPosXCombattant.setValue(0)
  256. self.ui.txtPosYCombattant.setValue(0)
  257. self.ui.txtRotationCombattant.setValue(0)
  258. self.majApercuTexte()
  259. def nouvelIdCombattant(self):
  260. """renvoie un identifiant pour un nouveau terrain"""
  261. dicoSvg = afficheSvg("lib\\biblio\\Combattant")
  262. nouvelId = 1
  263. while str(nouvelId) in dicoSvg.keys():
  264. nouvelId += 1
  265. return str(nouvelId)
  266. def selectionCouleur(self):
  267. """selectionne la couleur dans la boite de dialogue dediee"""
  268. couleur = QColorDialog(self).getColor(QColor("white"), self)
  269. if couleur.isValid():
  270. nomCouleur = couleur.name()
  271. self.ui.affichageCouleurCombattant.setStyleSheet("QLabel {backGround:%s}" %(nomCouleur))
  272. self.combattant.couleur = couleur
  273. def enregistrer(self):
  274. """enregistre le terrain cree/edite"""
  275. self.combattant.id = str(self.ui.idCombattant.text().toUtf8())
  276. self.combattant.nom = str(self.ui.nomCombattant.text().toUtf8())
  277. self.combattant.logo = str(self.ui.imgLogoCombattant.text().toUtf8())
  278. if len(str(self.ui.imgTextureCombattant.text().toUtf8())) > 0:
  279. self.combattant.img.nom = str(self.ui.imgTextureCombattant.text().toUtf8())
  280. self.combattant.img.kx = self.ui.imgTailleXCombattant.value()
  281. self.combattant.img.ky = self.ui.imgTailleYCombattant.value()
  282. self.combattant.img.dx = self.ui.imgPosXCombattant.value()
  283. self.combattant.img.dy = self.ui.imgPosYCombattant.value()
  284. self.combattant.img.rotation = self.ui.imgRotationCombattant.value()
  285. self.combattant.img.pivote = self.ui.imgPivoteCombattant.isChecked()
  286. self.combattant.img.masqueAuto = self.ui.imgMasqueCombattant.isChecked()
  287. else:
  288. self.combattant.img.nom = str(self.ui.imgLogoCombattant.text().toUtf8())
  289. self.combattant.img.kx = 10
  290. self.combattant.img.ky = 10
  291. self.combattant.img.dx = 0
  292. self.combattant.img.dy = 0
  293. self.combattant.img.rotation = 0
  294. self.combattant.img.pivote = False
  295. self.combattant.img.masqueAuto = False
  296. self.combattant.etiquette.taille_police = self.ui.txtTaillePoliceCombattant.value()
  297. self.combattant.etiquette.gras = bool(self.ui.txtGrasCombattant.checkState())
  298. self.combattant.etiquette.dx = self.ui.txtPosXCombattant.value()
  299. self.combattant.etiquette.dy = self.ui.txtPosYCombattant.value()
  300. self.combattant.etiquette.rotation = self.ui.txtRotationCombattant.value()
  301. self.combattant.deplacement = int(self.ui.deplacementCombattant.value())
  302. self.combattant.hauteur = int(self.ui.hauteurCombattant.value())
  303. self.combattant.vol = self.ui.volCombattant.isChecked()
  304. self.combattant.formeDef[self.formeCases] = self.vueForme.formeDef()
  305. self.combattant.notes = str(self.ui.notesCombattant.toPlainText())
  306. #attributs, attaques et inventaire enregistres lors de la modif des listes
  307. enregistrer(self.combattant.id, self.combattant, "lib\\biblio\\Combattant")
  308. self.combattant = None
  309. self.emit(SIGNAL("majListCombattants()"))
  310. self.close()
  311. def supprimer(self):
  312. """supprimer l'enregistrement de ce terrain"""
  313. supprSvg("lib\\biblio\\Combattant", self.combattant.id)
  314. self.emit(SIGNAL("majListCombattants()"))
  315. self.close()
  316. def annuler(self):
  317. """annule la creation/edition"""
  318. self.combattant = None
  319. self.close()