EcranEditionCombattant.py 15 KB

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