Partie.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. """partie de DMonde, caracterisee par un groupe de joueurs, des personnages,
  4. un MJ (interchangeable), une carte du monde, un journal de quêtes
  5. une liste de plateaux, et un ensemble de règles"""
  6. import os
  7. from time import time
  8. from PyQt4.QtCore import SIGNAL, Qt, QString
  9. from PyQt4.QtGui import QGraphicsView, QWidget, QFrame
  10. from lib.Combattant import PJ
  11. from lib.EcranChargerPlateau import EcranChargerPlateau
  12. from lib.EcranCreerPlateau import EcranCreerPlateau
  13. from lib.EcranEditionMateriel import EcranEditionMateriel
  14. from lib.Plateau import Plateau
  15. from lib.commun import uid, rep, sessionEnCours
  16. from lib.framePj import FramePj
  17. from lib.mat import chargerMat, supprimerMat, Materiel
  18. from lib.outilsSvg import afficheSvg, enregistrer, chargerUnique, supprSvg
  19. class Partie(Materiel):
  20. def __init__(self):
  21. super(Partie, self).__init__()
  22. self._type = "pt"
  23. self._repCible = "parties"
  24. self.prog = None
  25. # self.nom = "Partie"
  26. self.j = [] #liste des joueurs
  27. self.mj = "" #idPr du profil associe (utile?)
  28. self.idRg = None #id des regles utilisees
  29. self.pjs = [] #liste de Combattant()
  30. self.plateau = None #plateau en cours
  31. self._ch = {1: Chapitre(1)} #liste des chapitres (num: Chapitre)
  32. self._chEC = 1 #chapitre en cours
  33. # self.carteMonde = CarteMonde()
  34. # self.journal = Journal()
  35. def __getstate__(self):
  36. state = {key:value for key, value in self.__dict__.items() if not key in ["prog", "plateau"]}
  37. return (state)
  38. def __setstate__(self, state):
  39. self.__dict__ = state
  40. super(Partie, self).__init__()
  41. self.plateau = None
  42. def nom(self):
  43. return self._nom
  44. def majNom(self, nom):
  45. if len(nom) > 0: self._nom = nom
  46. def fermer(self):
  47. self.fermerPlateau()
  48. self.viderListePj()
  49. def enregistrer(self):
  50. super(Partie, self).enregistrer()
  51. def afficher(self, prog):
  52. """on affiche la partie"""
  53. self.prog = prog
  54. if len(afficheSvg(os.path.join(rep("cbt"), "infos_sauvegarde"))) == 0:
  55. self.prog.ui.cbt_enCours.setEnabled(False)
  56. self.afficherPlateau(False)
  57. self.chargerListePj()
  58. self.majAffichage()
  59. def majAffichage(self):
  60. """met a jour l'interface avec les informations de la partie"""
  61. self.prog.ui.pt_nom.majTexte("Partie: {}".format(self._nom) )
  62. self.prog.ui.pt_chap.majTexte("{}".format(self._ch[self._chEC].nomLong()) )
  63. self.prog.ui.pt_presentation.majTexte("{}".format(self._ch[self._chEC].presentation) )
  64. self.enregistrer()
  65. ##### chapitres
  66. def chapitres(self):
  67. return self._ch
  68. def majChapitres(self, dico):
  69. self._ch = dico
  70. def chapitreEnCours(self):
  71. return self._chEC
  72. def majChapitreEnCours(self, num):
  73. if num in self._ch: self._chEC = num
  74. ##### groupe ########"
  75. def chargerListePj(self):
  76. for idPj in self.pjs:
  77. pj = chargerMat(idPj, "grp")
  78. self.pjAjouterAListe(pj)
  79. self.prog.ui.grp_deroulement_layout.setAlignment(Qt.AlignTop)
  80. def pjAjouterAListe(self, pj = None):
  81. compteur = len(self.prog.ui.grp_deroulement_layout)
  82. colonne = (compteur % 3) * 2
  83. ligne = int(compteur / 3)
  84. panneau = FramePj(compteur)
  85. if pj:
  86. panneau.chargerPj(pj)
  87. panneau.setObjectName(QString("pj_panneau_{}".format(compteur)))
  88. self.prog.connect(panneau, SIGNAL("pjModifie(int)"), self.pjEnregistrer)
  89. self.prog.ui.grp_deroulement_layout.addWidget(panneau, ligne, colonne)
  90. ## pour l'espacement entre les panneaux
  91. w = QWidget()
  92. self.prog.ui.grp_deroulement_layout.addWidget(w, ligne, colonne + 1)
  93. def pjSupprimer(self, index):
  94. panneau = self.prog.findChild(QFrame, "pj_panneau_{}".format(index))
  95. pj = panneau.pj()
  96. supprimerMat(pj.idM(), "grp")
  97. self.pjs.remove(pj.idM())
  98. self.ui.grp_deroulement_layout.removeWidget(panneau)
  99. def nouveauPj(self):
  100. fen = EcranEditionMateriel(PJ())
  101. fen.afficher()
  102. fen.exec_()
  103. pj = fen.mat()
  104. del fen
  105. if pj:
  106. pj.enregistrer("grp")
  107. self.pjs.append(pj.idM())
  108. self.pjAjouterAListe(pj)
  109. def pjEnregistrer(self, idPj):
  110. panneau = self.prog.findChild(QFrame, "pj_panneau_{}".format(idPj))
  111. pj = panneau.pj()
  112. pj.enregistrer("grp")
  113. def viderListePj(self):
  114. for i in reversed(range(self.prog.ui.grp_deroulement_layout.count())):
  115. self.prog.ui.grp_deroulement_layout.itemAt(i).widget().setParent(None)
  116. ####### plateaux ##########
  117. def nouveauPlateau(self):
  118. """ouvre la fenetre de creation de plateau"""
  119. if self.plateau != None: return
  120. fenCP = EcranCreerPlateau()
  121. fenCP.afficher( Plateau() )
  122. r = fenCP.exec_()
  123. if r == 1:
  124. self.plateau = fenCP.resultat()
  125. self.prog.connecterPlateau()
  126. self.plateau.creer(self.prog)
  127. self.afficherPlateau(True)
  128. del fenCP
  129. def afficherEcranChargerPlateau(self):
  130. """ouvre la fenetre de chargement de plateau"""
  131. if self.plateau != None: return
  132. fen = EcranChargerPlateau(self)
  133. fen.show()
  134. r = fen.exec_()
  135. if r == 1:
  136. idM = fen.resultat()
  137. self.chargerPlateau(idM)
  138. del fen
  139. def chargerDernierPlateau(self):
  140. """charge le dernier plateau sauvegarde"""
  141. infosSvg = afficheSvg(os.path.join(rep("cbt"), "infos_sauvegarde"))
  142. dates = {val["dateSvg"]:key for key, val in infosSvg.items()}
  143. if len(dates) == 0: return
  144. dernier = dates[max( dates.keys() )]
  145. if dernier:
  146. self.chargerPlateau(dernier)
  147. def chargerPlateau(self, idM):
  148. if self.plateau: return
  149. self.plateau = chargerMat(idM, "cbt")
  150. self.prog.connecterPlateau()
  151. self.plateau.recreer(self.prog)
  152. self.afficherPlateau(True)
  153. def enregistrerPlateau(self):
  154. self.plateau.enregistrer("cbt")
  155. infos = {"nom": self.plateau.nom(), "chapitre": self.plateau.chapitre, "dateCreation":self.plateau.dateCreation, "dateSvg":self.plateau.dateSvg, \
  156. "public": self.plateau.public, "enCours": self.plateau.enCours}
  157. enregistrer(self._plEc.idM(), infos, os.path.join(rep("cbt"), "infos_sauvegarde"))
  158. def fermerPlateau(self):
  159. if self.plateau:
  160. self.plateau.fermer()
  161. self.plateau = None
  162. self.afficherPlateau(False)
  163. def majFichierInfosSvg(self):
  164. """construit/maj le fichier contenant la liste des
  165. plateaux sauvegardes et leurs informations"""
  166. #on parcourt les fichiers de sauvegarde
  167. f = []
  168. lstFichiersSvg = []
  169. for (dirpath, dirnames, filenames) in os.walk(rep("cbt")):
  170. f.extend(filenames)
  171. break
  172. for fichier in f:
  173. fileName, fileExtension = os.path.splitext(fichier)
  174. if fileExtension == ".dm":
  175. lstFichiersSvg.append(fileName)
  176. #on verifie leur presence dans le fichier 'infos_sauvegarde'
  177. infosSvg = afficheSvg(os.path.join(rep("cbt"), "infos_sauvegarde"))
  178. index = len(infosSvg)
  179. #on ajoute les sauvegardes manquantes si besoin
  180. for fichier in lstFichiersSvg:
  181. if not fichier in infosSvg:
  182. plateau = chargerUnique(os.path.join(rep("cbt"), "{}.dm".format(fichier)))
  183. enregistrer(fichier, {"nom": plateau.nom(), "chapitre": plateau.chapitre, "dateCreation":plateau.dateCreation, "dateSvg":plateau.dateSvg, \
  184. "public": plateau.public, "enCours": plateau.enCours}, "svg\\infos_sauvegarde")
  185. index += 1
  186. #on supprime ceux qui ne sont plus trouves
  187. for fichier in infosSvg:
  188. if not fichier in lstFichiersSvg:
  189. supprSvg(os.path.join(rep("cbt"), "infos_sauvegarde"), fichier)
  190. def afficherPlateau(self, actif):
  191. index = int(actif) # 0 si faux, 1 si vrai
  192. self.prog.ui.combatPanneau.setCurrentIndex(index)
  193. # self.prog.ui.cbt_panneauBas.setCurrentIndex(index)
  194. # self.prog.ui.cbt_panneauHaut.setCurrentIndex(index)
  195. # self.prog.ui.cbt_panneauDroite.setCurrentIndex(index)
  196. # self.prog.ui.cbt_panneauGauche.setCurrentIndex(index)
  197. # self.prog.ui.cbt_etapeSuivante.setVisible(actif)
  198. class Chapitre():
  199. def __init__(self, numero, nom = "", presentation = "", public = False):
  200. self.num = numero
  201. self.nom = nom
  202. self.presentation = ""
  203. self.public = public
  204. def nomLong(self):
  205. if len(self.nom) > 0:
  206. return "Ch. {} - {}".format(self.num, self.nom)
  207. else:
  208. return "Chapitre {}".format(self.num)