EcranEditionCombattant.py 15 KB

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