EcranEditionCombattant.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  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 dialogues import dmMessage
  14. from frameAttaque import FrameAttaque
  15. import regles
  16. from rsc import selectionImage, RImage
  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._combattant = Combattant() if combattant == None else combattant
  25. #param de fonctionnement
  26. self._modeCreation = True
  27. self._compteurAttaque = 0
  28. self.createWidgets()
  29. self.ouverture()
  30. self.allerAPage(pageInitiale)
  31. if formeCases == "C":
  32. self.ui.edc_casesCarrees.setChecked(True)
  33. self.majFormeCases()
  34. def combattant(self):
  35. return self._combattant
  36. def formeCases(self):
  37. return "H" if self.ui.edc_casesHexa.isChecked() else "C"
  38. def createWidgets(self):
  39. """construction de l'interface"""
  40. #construction de l'interface
  41. self.ui = Ui_edc_fenetre()
  42. self.ui.setupUi(self)
  43. self.connect(self.ui.edc_nom, SIGNAL("textEdited(QString)"), self.majActivationEnregistrer)
  44. self.connect(self.ui.edc_nom, SIGNAL("textEdited(QString)"), self.majEtiquetteVueForme)
  45. self.connect(self.ui.edc_aideForme, SIGNAL("clicked()"), self.afficherAideForme)
  46. self.connect(self.ui.edc_enregistrer, SIGNAL("clicked()"), self.enregistrer)
  47. self.connect(self.ui.edc_annuler, SIGNAL("clicked()"), self.annuler)
  48. self.connect(self.ui.edc_casesHexa, SIGNAL("clicked()"), self.majFormeCases)
  49. self.connect(self.ui.edc_casesCarrees, SIGNAL("clicked()"), self.majFormeCases)
  50. self.connect(self.ui.edc_couleur, SIGNAL("clicked()"), self.selectionCouleur)
  51. self.connect(self.ui.edc_image, SIGNAL("clicked()"), self.selectionImage)
  52. self.connect(self.ui.edc_logo, SIGNAL("clicked()"), self.selectionnerLogo)
  53. self.vueForme = VueEditionForme(self)
  54. self.construireListeAttributs()
  55. self.construireInventaire()
  56. self.connect(self.ui.edc_filtreTypeObjet, SIGNAL("currentChanged(int)"), self.filtrerInventaire)
  57. self.ui.edc_filtreTypeObjet.stackUnder(self.ui.edc_listeInventaire)
  58. def mat(self):
  59. """retourne le materiel de la fenetre"""
  60. return self.combattant()
  61. def layoutAtt(self):
  62. """retourne le layout des attaques"""
  63. return self.ui.edc_deroulementAttaques_layout
  64. def layoutCarac(self):
  65. """retourne le layout des attributs"""
  66. return self.ui.edc_deroulementAttributs_layout
  67. def vueGraphique(self):
  68. return self.ui.edc_vueForme
  69. def allerAPage(self, index):
  70. self.ui.edc_menu.setCurrentCell(index, 0)
  71. self.ui.edc_menu.setCurrentCell(index, 1)
  72. self.ui.edc_pages.setCurrentIndex(index)
  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. if self._combattant.logo.estValide():
  78. self.ui.edc_logo.chargerImage(self._combattant.logo)
  79. else:
  80. self.ui.edc_logo.majTexte("Choisissez \nun fichier\nimage")
  81. self.vueForme.creer(self.formeCases())
  82. self.vueForme.autoriserModifForme(self._modeCreation)
  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.hauteur)
  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. self.layoutAtt().setAlignment(Qt.AlignTop)
  98. for attaque in self._combattant.attaques:
  99. self.attaqueNouvelle(attaque)
  100. self.attaqueNouvelle()
  101. #page inventaire
  102. self.ui.edc_listeInventaire.charger(self._combattant.inventaire)
  103. self.majTotauxInventaire()
  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 selectionnerLogo(self):
  130. img = selectionImage()
  131. if img:
  132. self.ui.edc_logo.chargerImage(img)
  133. self.vueForme.nouvelleImageDef(self.ui.edc_logo.image())
  134. def selectionImage(self):
  135. """selectionne le fichier image dans la boite de dialogue dediee"""
  136. img = selectionImage()
  137. if img:
  138. self.vueForme.nouvelleImageDef(img)
  139. def selectionCouleur(self):
  140. """selectionne la couleur dans la boite de dialogue dediee"""
  141. couleur = QColorDialog(self).getColor(QColor("white"), self)
  142. if couleur.isValid():
  143. self._combattant.couleur = couleur
  144. self.vueForme.majCouleur(couleur)
  145. def afficherAideForme(self):
  146. msg = "Sur l'écran ci-contre, vous pouvez éditer la forme et l'apparence de votre pion. Vous pouvez: \n\n" \
  147. "Choisir la couleur du pion \n" \
  148. "Choisir une image (qui remplacera alors le logo sur le pion) \n" \
  149. "Deplacer l'etiquette et l'image sur le pion en cliquant dessus \n" \
  150. "Faire pivoter l'image avec [FLECHE HAUT] et [FLECHE BAS] \n" \
  151. "Modifier la taille de l'image avec [FLECHE GAUCHE] et [FLECHE DROITE] \n" \
  152. "Activer desactiver l'etiquette en gras avec [G] \n" \
  153. "Modifier la taille de la police avec [FLECHE HAUT] et [FLECHE BAS]"
  154. dmMessage(msg)
  155. #### page attributs
  156. def construireListeAttributs(self):
  157. """construit les champs d'attributs"""
  158. """cree les champs dedies a la saisie des attributs dans la grille dediee"""
  159. self.layoutCarac().setSpacing(4)
  160. self.layoutCarac().setMargin(0)
  161. self.layoutAtt().setAlignment(Qt.AlignLeft)
  162. for nomAttribut in regles.ordreAttributsFichePerso():
  163. if len(nomAttribut) > 0:
  164. lay = QHBoxLayout()
  165. lay.setMargin(0)
  166. lay.setSpacing(2)
  167. etiquette = dm.DmLabel()
  168. etiquette.majTexte(regles.attribut(nomAttribut).nom)
  169. etiquette.setObjectName("{}_etiquette".format(nomAttribut))
  170. etiquette.setAlignment(Qt.AlignLeft|Qt.AlignVCenter)
  171. etiquette.setMinimumSize(QSize(110, 24))
  172. etiquette.setMaximumSize(QSize(110, 24))
  173. lay.addWidget(etiquette)
  174. champ = dm.DmLineEdit()
  175. champ.setMinimumSize(QSize(80, 24))
  176. champ.setMaximumSize(QSize(80, 24))
  177. champ.setAlignment(Qt.AlignCenter)
  178. champ.majTexte(regles.listeAttributs()[nomAttribut])
  179. champ.setObjectName("{}_champ".format(nomAttribut))
  180. champ.setStyleSheet("background-color: rgb({},{},{});".format(248,248,248))
  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(9)
  188. etiquetteVide.setMaximumHeight(9)
  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. ### page inventaire
  230. def construireInventaire(self):
  231. """construction de la page inventaire"""
  232. self.ui.edc_listeInventaire.construire()
  233. self.connect(self.ui.edc_listeInventaire, SIGNAL("objetClique(int)"), self.editerObjet)
  234. def editerObjet(self, indexObjet):
  235. if indexObjet < len(self.ui.edc_listeInventaire.inventaire()):
  236. objet = self.ui.edc_listeInventaire.inventaire()[indexObjet]
  237. else:
  238. objet = None
  239. typeObjet = self.ui.edc_filtreTypeObjet.currentIndex() - 1
  240. self.fenetreEO = EcranEditionObjet(objet, typeObjet)
  241. self.fenetreEO.show()
  242. self.fenetreEO.exec_()
  243. resultat = self.fenetreEO.resultat()
  244. if resultat:
  245. if objet:
  246. self.ui.edc_listeInventaire.majObjet(objet, resultat)
  247. else:
  248. self.ui.edc_listeInventaire.ajouterObjet(resultat)
  249. else:
  250. if objet:
  251. self.ui.edc_listeInventaire.supprimerObjet(objet)
  252. self.fenetreEO = None
  253. self.majTotauxInventaire()
  254. def majTotauxInventaire(self):
  255. inv = self.ui.edc_listeInventaire.inventaire()
  256. poidsTotal = 0.00
  257. for obj in inv:
  258. poidsTotal += obj.poidsTotal()
  259. self.ui.edc_inventaire_poids.majTexte("{} kg".format(poidsTotal))
  260. def filtrerInventaire(self, index):
  261. filtre = index - 1
  262. self.ui.edc_listeInventaire.filtrer(filtre)
  263. #### barre d'outils
  264. def majActivationEnregistrer(self):
  265. """verifie la validite des saisies"""
  266. self.ui.edc_enregistrer.setEnabled(len(self.ui.edc_nom.texte()) > 0)
  267. def enregistrer(self):
  268. """enregistre le terrain cree/edite"""
  269. #page nom
  270. self._combattant.majNom(self.ui.edc_nom.texte())
  271. self._combattant.logo = self.ui.edc_logo.image() if self.ui.edc_logo.image() else RImage()
  272. self._combattant.formeDef[self.vueForme.formeCases()] = self.vueForme.formeDef()
  273. self._combattant.img = self.vueForme.imageDef()
  274. self._combattant.etiquette = self.vueForme.etiquetteDef()
  275. #page dep
  276. self._combattant.hauteur = self.ui.edc_taille.value()
  277. self._combattant.depMarche = self.ui.edc_depMarche.value()
  278. self._combattant.depNage = self.ui.edc_depNage.value()
  279. self._combattant.depEscalade = self.ui.edc_depEscalade.value()
  280. self._combattant.depVol = self.ui.edc_depVol.value()
  281. self._combattant.saut = self.ui.edc_saut.value()
  282. #page attributs
  283. self._combattant.listeAttributs = self.listeAttributs()
  284. #page attaque
  285. listeAttaques = []
  286. for i in range(0, self.layoutAtt().count()):
  287. panneau = self.layoutAtt().itemAt(i).widget()
  288. if panneau != 0:
  289. attaque = panneau.attaque()
  290. if attaque:
  291. listeAttaques.append(attaque)
  292. self._combattant.attaques = listeAttaques
  293. #page inventaire
  294. self._combattant.inventaire = self.ui.edc_listeInventaire.inventaire()
  295. #page notes
  296. listeWidget = self.ui.edc_pages.findChildren(dm.DmLineEdit)
  297. for widget in listeWidget:
  298. detail = str(widget.objectName()).replace("edc_detail_","")
  299. txt = widget.texte()
  300. if len(txt) > 0:
  301. self._combattant.details[detail] = txt
  302. self._combattant.notes = str(self.ui.edc_notes.toPlainText().toUtf8())
  303. self.done(1)
  304. def annuler(self):
  305. """annule la creation/edition"""
  306. self._combattant = None
  307. self.done(0)
  308. if __name__ == "__main__":
  309. app = QApplication(sys.argv)
  310. ecran = EcranEditionCombattant()
  311. ecran.show()
  312. r = app.exec_()
  313. exit(r)