Partie.py 9.9 KB

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