EcranEditionCombattant.py 15 KB

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