EcranEditionCombattant.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. from __future__ import division
  4. import sys
  5. from PyQt4.QtCore import *
  6. from PyQt4.QtGui import *
  7. from Combattant import Combattant
  8. from ui.ecran_editionCombattant import Ui_edc_fenetre
  9. from frameAttaque import FrameAttaque
  10. from outilsSvg import *
  11. from VueEditionForme import VueEditionForme
  12. import regles
  13. import Actions
  14. import ui.dm as dm
  15. class EcranEditionCombattant(QDialog):
  16. """interface de creation/edition de terrains"""
  17. def __init__(self, combattant=None, parent=None):
  18. """initialisation de la fenetre"""
  19. super (EcranEditionCombattant, self).__init__()
  20. self.pixGraphique = None
  21. self._compteurAttaque = 0
  22. self.createWidgets()
  23. if combattant == None:
  24. self.combattant = Combattant()
  25. else:
  26. self.combattant = combattant
  27. self.ouverture()
  28. def nouvelIdCombattant(self):
  29. """renvoie un identifiant pour un nouveau terrain"""
  30. dicoSvg = afficheSvg("lib\\biblio\\Combattant")
  31. nouvelId = 1
  32. while str(nouvelId) in dicoSvg.keys():
  33. nouvelId += 1
  34. return str(nouvelId)
  35. def formeCases(self):
  36. retour = ""
  37. if self.ui.edc_casesHexa.isChecked():
  38. retour = "H"
  39. else:
  40. retour = "C"
  41. return retour
  42. def createWidgets(self):
  43. """construction de l'interface"""
  44. #construction de l'interface
  45. self.ui = Ui_edc_fenetre()
  46. self.ui.setupUi(self)
  47. self.connect(self.ui.edc_nom, SIGNAL("textEdited(QString)"), self.majActivationEnregistrer)
  48. self.connect(self.ui.edc_nom, SIGNAL("textEdited(QString)"), self.majEtiquetteVueForme)
  49. self.connect(self.ui.edc_enregistrer, SIGNAL("clicked()"), self.enregistrer)
  50. self.connect(self.ui.edc_annuler, SIGNAL("clicked()"), self.annuler)
  51. self.connect(self.ui.edc_casesHexa, SIGNAL("clicked()"), self.majFormeCases)
  52. self.connect(self.ui.edc_casesCarrees, SIGNAL("clicked()"), self.majFormeCases)
  53. self.connect(self.ui.edc_couleur, SIGNAL("clicked()"), self.selectionCouleur)
  54. self.connect(self.ui.edc_image, SIGNAL("clicked()"), self.selectionImage)
  55. ## self.connect(self.ui.edc_aideForme, SIGNAL("clicked()"), self.afficherAideForme)
  56. self.connect(self.ui.edc_logo, SIGNAL("imageModifiee()"), self.logoModifie)
  57. self.vueForme = VueEditionForme(self)
  58. self.construireListeAttributs()
  59. ## self.ui.edc_listeAttributs.setColumnWidth(0, (0.4*self.ui.edc_listeAttributs.width()))
  60. ## self.ui.edc_listeAttributs.setColumnWidth(1, (0.4*self.ui.edc_listeAttributs.width()))
  61. ## self.connect(self.ui.edc_listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee, Qt.UniqueConnection)
  62. ## self.ui.listeInventaireCombattant.setColumnWidth(0, (0.2*self.ui.listeInventaireCombattant.width()))
  63. ## self.ui.listeInventaireCombattant.setColumnWidth(1, (0.8*self.ui.listeInventaireCombattant.width()))
  64. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("clicked()"), self.listeInventaireCelluleModifiee)
  65. ## self.connect(self.ui.supprimerInventaireCombattant, SIGNAL("clicked()"), self.supprimerLigneListeInventaire)
  66. ## self.connect(self.ui.ajouterInventaireCombattant, SIGNAL("clicked()"), self.ajouterLigneListeInventaire)
  67. def layoutAtt(self):
  68. """retourne le layout des attaques"""
  69. return self.ui.edc_deroulementAttaques_layout
  70. def layoutCarac(self):
  71. """retourne le layout des attributs"""
  72. return self.ui.edc_deroulementAttributs_layout
  73. def ouverture(self):
  74. """premier affichage: on met a jour les champs"""
  75. #page_nom
  76. ## self.ui.edc_nom.majTexte(self.combattant.nom)
  77. self.ui.edc_nom.majTexte("test")
  78. if self.combattant.logo:
  79. self.ui.edc_logo.chargerImage(self.combattant.logo)
  80. else:
  81. self.ui.edc_logo.majTexte("Choisissez \nun fichier\nimage")
  82. self.vueForme.creer(self.formeCases())
  83. self.vueForme.majCouleur(self.combattant.couleur)
  84. self.vueForme.chargerFormeDef(self.combattant.formeDef[self.formeCases()])
  85. self.vueForme.chargerImageDef(self.combattant.img)
  86. self.vueForme.chargerEtiquetteDef(self.combattant.etiquette)
  87. #page deplacements
  88. self.ui.edc_taille.setValue(self.combattant.taille)
  89. self.ui.edc_depMarche.setValue(self.combattant.depMarche)
  90. self.ui.edc_depNage.setValue(self.combattant.depNage)
  91. self.ui.edc_depEscalade.setValue(self.combattant.depEscalade)
  92. self.ui.edc_depVol.setValue(self.combattant.depVol)
  93. self.ui.edc_saut.setValue(self.combattant.saut)
  94. #page attributs
  95. self.majListeAttributs()
  96. #page attaques: chargement des attaques du combattant, puis panneau 'nouvelle attaque'
  97. index = 0
  98. self.layoutAtt().setAlignment(Qt.AlignTop)
  99. for attaque in self.combattant.attaques:
  100. self.attaqueNouvelle(attaque)
  101. self.attaqueNouvelle()
  102. #page inventaire
  103. #self.majListeInventaire()
  104. #page_notes
  105. for detail in self.combattant.details:
  106. widget = self.ui.edc_pages.findChild(dm.DmLineEdit, "edc_detail_{}".format(detail))
  107. if widget:
  108. widget.majTexte(self.combattant.details[detail])
  109. self.ui.edc_notes.setText(QString.fromUtf8(self.combattant.notes))
  110. #autre
  111. self.majActivationEnregistrer()
  112. ### page apparence
  113. def majFormeCases(self):
  114. if self.vueForme.formeCases() != self.formeCases():
  115. #on enregistre la def de forme, d'image et d'etiquette en cours
  116. self.combattant.formeDef[self.vueForme.formeCases()] = self.vueForme.formeDef()
  117. self.combattant.img = self.vueForme.imageDef()
  118. self.combattant.etiquette = self.vueForme.etiquetteDef()
  119. #on recree la scene avec la nouvelle forme de cases
  120. self.vueForme.vider()
  121. self.vueForme.creer(self.formeCases())
  122. #on charge les def correspondantes a la nouvelle forme
  123. self.vueForme.chargerFormeDef(self.combattant.formeDef[self.formeCases()])
  124. self.vueForme.chargerImageDef(self.combattant.img)
  125. self.vueForme.chargerEtiquetteDef(self.combattant.etiquette)
  126. def majEtiquetteVueForme(self):
  127. self.combattant.etiquette.txt = self.ui.edc_nom.texte()
  128. self.vueForme.chargerEtiquetteDef(self.combattant.etiquette)
  129. def logoModifie(self):
  130. if not len(self.combattant.img.nomFichier) > 0:
  131. #si pas d'image attribuee au pion, on utilise le logo pour le pion
  132. self.vueForme.nouvelleImageDef(self.ui.edc_logo.image())
  133. def selectionImage(self):
  134. """selectionne le fichier image dans la boite de dialogue dediee"""
  135. fichier = QFileDialog.getOpenFileName(self,
  136. "Selectionnez une image",
  137. "\\img",
  138. "Images (*.png *.jpg)")
  139. if len(fichier) > 0:
  140. pix = QPixmap(fichier)
  141. if not pix.isNull():
  142. self.vueForme.nouvelleImageDef(fichier)
  143. else:
  144. dial = QMessageBox(self)
  145. dial.setText("Format non reconnu")
  146. dial.setWindowTitle("Erreur")
  147. dial.setStandardButtons(QMessageBox.Ok)
  148. dial.exec_()
  149. def selectionCouleur(self):
  150. """selectionne la couleur dans la boite de dialogue dediee"""
  151. couleur = QColorDialog(self).getColor(QColor("white"), self)
  152. if couleur.isValid():
  153. nomCouleur = couleur.name()
  154. self.combattant.couleur = couleur
  155. self.vueForme.majCouleur(couleur)
  156. #### page attributs
  157. def construireListeAttributs(self):
  158. """construit les champs d'attributs"""
  159. """cree les champs dedies a la saisie des attributs dans la grille dediee"""
  160. self.layoutCarac().setSpacing(4)
  161. self.layoutCarac().setMargin(0)
  162. self.layoutAtt().setAlignment(Qt.AlignLeft)
  163. for nomAttribut in regles.ordreAttributsFichePerso():
  164. if len(nomAttribut) > 0:
  165. lay = QHBoxLayout()
  166. lay.setMargin(0)
  167. lay.setSpacing(2)
  168. etiquette = dm.DmLabel()
  169. etiquette.majTexte(regles.attribut(nomAttribut).nom)
  170. etiquette.setObjectName("{}_etiquette".format(nomAttribut))
  171. etiquette.setAlignment(Qt.AlignLeft|Qt.AlignVCenter)
  172. etiquette.setMinimumSize(QSize(110, 22))
  173. etiquette.setMaximumSize(QSize(110, 22))
  174. lay.addWidget(etiquette)
  175. champ = dm.DmLineEdit()
  176. champ.setMinimumSize(QSize(80, 22))
  177. champ.setMaximumSize(QSize(80, 22))
  178. champ.setAlignment(Qt.AlignCenter)
  179. champ.majTexte(regles.listeAttributs()[nomAttribut])
  180. champ.setObjectName("{}_champ".format(nomAttribut))
  181. ## self.connect(champ, SIGNAL("textChanged()"), self.controlerAttribut)
  182. lay.addWidget(champ)
  183. self.layoutCarac().addLayout(lay)
  184. else:
  185. lay = QHBoxLayout()
  186. etiquetteVide = dm.DmLabel()
  187. etiquetteVide.setMinimumHeight(10)
  188. etiquetteVide.setMaximumHeight(10)
  189. lay.addWidget(etiquetteVide)
  190. lay.addWidget(etiquetteVide)
  191. self.layoutCarac().addLayout(lay)
  192. def majListeAttributs(self):
  193. """met a jour la liste des attributs de la Combattant"""
  194. for i in range(0, self.layoutCarac().count()):
  195. layout = self.layoutCarac().itemAt(i).layout()
  196. widget = layout.itemAt(1).widget()
  197. if widget != 0:
  198. if str(widget.objectName()[-6:]) == "_champ":
  199. attr = str(widget.objectName()[:-6])
  200. widget.majTexte(self.combattant.listeAttributs[attr])
  201. def listeAttributs(self):
  202. """renvoie la liste des attributs tels qu'ils
  203. sont saisis dans la liste des attributs"""
  204. attributs = regles.listeAttributs()
  205. for i in range(0, self.layoutCarac().count()):
  206. layout = self.layoutCarac().itemAt(i).layout()
  207. widget = layout.itemAt(1).widget()
  208. if widget != 0 and widget != None:
  209. if str(widget.objectName()[-6:]) == "_champ":
  210. attr = str(widget.objectName()[:-6])
  211. attributs[attr] = widget.texte()
  212. return attributs
  213. #### page attaques
  214. def attaqueNouvelle(self, attaque = None):
  215. """ajoute une nouvelle ligne a la liste des attaques"""
  216. #on ajoute de suite un panneau 'nouvelle attaque en dessous'
  217. self._compteurAttaque += 1
  218. panneau = FrameAttaque(self._compteurAttaque)
  219. if attaque:
  220. panneau.chargerAttaque(attaque)
  221. panneau.setObjectName(QString("att_frame_{}".format(self._compteurAttaque)))
  222. self.connect(panneau, SIGNAL("attaqueNouvelle()"), self.attaqueNouvelle)
  223. self.connect(panneau, SIGNAL("attaqueSupprimer(int)"), self.attaqueSupprimer)
  224. self.layoutAtt().addWidget(panneau)
  225. def attaqueSupprimer(self, index):
  226. """supprime la ligne selectionnee de la liste des attaques"""
  227. panneau = self.findChild(QFrame, "att_frame_{}".format(index))
  228. self.layoutAtt().removeWidget(panneau)
  229. #### barre d'outils
  230. def majActivationEnregistrer(self):
  231. """verifie la validite des saisies"""
  232. self.ui.edc_enregistrer.setEnabled(len(self.ui.edc_nom.texte()) > 0)
  233. def enregistrer(self):
  234. """enregistre le terrain cree/edite"""
  235. #identifiant
  236. if not self.combattant.id:
  237. self.combattant.id = self.nouvelIdCombattant()
  238. #page nom
  239. self.combattant.nom = self.ui.edc_nom.texte()
  240. self.combattant.logo = self.ui.edc_logo.image()
  241. self.combattant.formeDef[self.vueForme.formeCases()] = self.vueForme.formeDef()
  242. self.combattant.img = self.vueForme.imageDef()
  243. self.combattant.etiquette = self.vueForme.etiquetteDef()
  244. #page dep
  245. self.combattant.taille = self.ui.edc_taille.value()
  246. self.combattant.depMarche = self.ui.edc_depMarche.value()
  247. self.combattant.depNage = self.ui.edc_depNage.value()
  248. self.combattant.depEscalade = self.ui.edc_depEscalade.value()
  249. self.combattant.depVol = self.ui.edc_depVol.value()
  250. self.combattant.saut = self.ui.edc_saut.value()
  251. #page attributs
  252. self.combattant.listeAttributs = self.listeAttributs()
  253. #page attaque
  254. listeAttaques = []
  255. for i in range(0, self.layoutAtt().count()):
  256. panneau = self.layoutAtt().itemAt(i).widget()
  257. if panneau != 0:
  258. attaque = panneau.attaque()
  259. if attaque:
  260. listeAttaques.append(attaque)
  261. self.combattant.attaques = listeAttaques
  262. #page inventaire
  263. #a voir...
  264. #page notes
  265. listeWidget = self.ui.edc_pages.findChildren(dm.DmLineEdit)
  266. for widget in listeWidget:
  267. detail = str(widget.objectName()).replace("edc_detail_","")
  268. txt = widget.texte()
  269. if len(txt) > 0:
  270. self.combattant.details[detail] = txt
  271. self.combattant.notes = str(self.ui.edc_notes.toPlainText().toUtf8())
  272. enregistrer(self.combattant.id, self.combattant, "lib\\biblio\\combattant")
  273. self.combattant = None
  274. self.done(1)
  275. ## def supprimer(self):
  276. ## """supprimer l'enregistrement de ce terrain"""
  277. ## supprSvg("lib\\biblio\\combattant", self.combattant.id)
  278. ## self.done(1)
  279. def annuler(self):
  280. """annule la creation/edition"""
  281. self.combattant = None
  282. self.done(0)
  283. ## def majListeInventaire(self):
  284. ## """met a jour la liste de l'inventaire de la Combattant"""
  285. ## self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  286. ##
  287. ## #on vide la liste
  288. ## while self.ui.listeInventaireCombattant.rowCount() > 0:
  289. ## self.ui.listeInventaireCombattant.removeRow(0)
  290. ## ligne = 0
  291. ## #attributs issus des regles utilisees
  292. ## for objet in self.combattant.inventaire:
  293. ## self.ui.listeInventaireCombattant.insertRow(ligne)
  294. ## self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8(self.combattant.inventaire[objet])))
  295. ## self.ui.listeInventaireCombattant.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(objet)))
  296. ## ligne += 1
  297. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  298. ##
  299. ## def listeInventaireCelluleModifiee(self, ligne, colonne):
  300. ## """une cellule de la liste des attributs a ete modifiee"""
  301. ## nouvelleVal = str(self.ui.listeInventaireCombattant.item(ligne, colonne).text().toUtf8())
  302. ## val = None
  303. ## if colonne == 0:
  304. ## try:
  305. ## nbre = int(nouvelleVal)
  306. ## except:
  307. ## nbre = -1
  308. ## if nbre >= 0: val = str(nbre)
  309. ## else:
  310. ## val = str(nouvelleVal)
  311. ## if val in self.combattant.inventaire or len(val) == 0:
  312. ## print("cet objet existe deja ou a un nom invalide")
  313. ## val = None
  314. ##
  315. ## if colonne == 0:
  316. ## if val != None:
  317. ## self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())] = val
  318. ## else:
  319. ## self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8(\
  320. ## str(self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())]))))
  321. ## else:
  322. ## txt = str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())
  323. ## if txt in self.combattant.inventaire:
  324. ## del self.combattant.inventaire[txt]
  325. ## if val != None:
  326. ## self.combattant.inventaire[val] = txt
  327. ## else:
  328. ## self.ui.listeInventaireCombattant.removeRow(ligne)
  329. ##
  330. ## def ajouterLigneListeInventaire(self, objet=""):
  331. ## num = -1
  332. ## 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
  333. ## if len(str(self.ui.listeInventaireCombattant.item(i, 0).text().toUtf8())) == 0:
  334. ## num = i
  335. ## break
  336. ## if num < 0:
  337. ## self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  338. ## ligne = self.ui.listeInventaireCombattant.rowCount()
  339. ## self.ui.listeInventaireCombattant.insertRow(ligne)
  340. ## self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8("0")))
  341. ## self.ui.listeInventaireCombattant.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(objet)))
  342. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  343. ## else:
  344. ## self.ui.listeInventaireCombattant.setCurrentRow(num)
  345. ##
  346. ## def supprimerLigneListeInventaire(self):
  347. ## self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  348. ## ligne = self.ui.listeInventaireCombattant.currentRow()
  349. ## del self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())]
  350. ## self.ui.listeInventaireCombattant.removeRow(ligne)
  351. ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee)
  352. if __name__ == "__main__":
  353. app = QApplication(sys.argv)
  354. #settrace(trace_calls)
  355. ecran = EcranEditionCombattant()
  356. ecran.show()
  357. r = app.exec_()
  358. exit(r)