EcranEditionCreature.py 18 KB

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