EcranEditionCombattant.py 15 KB

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