DMonde.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. """Interface principale du programme DMonde
  4. """
  5. from __future__ import division
  6. import os
  7. from sys import exit, argv, getsizeof, settrace
  8. from time import time, sleep, strftime, localtime
  9. import pydoc
  10. from PyQt4.QtCore import *
  11. from PyQt4.QtGui import *
  12. from lib.ui.ecran_principal import Ui_principal
  13. import lib.rsc as rsc
  14. from lib.EcranCreerPlateau import EcranCreerPlateau
  15. from lib.EcranChargerPlateau import EcranChargerPlateau
  16. from lib.EcranFondPlateau import EcranFondPlateau
  17. from lib.Plateau import Plateau
  18. from lib.EcranEditionCombattant import EcranEditionCombattant
  19. from lib.framePj import FramePj
  20. from lib.outilsSvg import *
  21. from lib.Case import Case
  22. from lib.Combattant import Combattant
  23. from lib.Decor import Decor
  24. from lib.Terrain import Terrain
  25. from lib.Cache import Cache
  26. from lib.EntreeSortie import EntreeSortie
  27. class DMonde(QMainWindow):
  28. """interface comprenant: chat ecrit, fenetre d'infos, lancer de des, echange de fichiers, lancement du chat vocal"""
  29. def __init__(self, parent=None):
  30. """initialisation de la fenetre"""
  31. super (DMonde, self).__init__()
  32. self.plateau = None
  33. self.partie = "partie1"
  34. self.idPlateauEnCours = ""
  35. self.plateauConnecte = False
  36. self._compteurPj = 0
  37. self.createWidgets()
  38. def createWidgets(self):
  39. """construction de l'interface"""
  40. self.ui = Ui_principal()
  41. self.ui.setupUi(self)
  42. self.afficherPanneauxPlateau(False)
  43. self.connect(self.ui.cbt_sauver, SIGNAL("clicked()"), self.sauverPlateau)
  44. self.connect(self.ui.cbt_fermer, SIGNAL("clicked()"), self.fermerPlateau)
  45. self.ui.cbt_vue.setViewportUpdateMode(QGraphicsView.BoundingRectViewportUpdate)
  46. self.ui.cp_ongletsListes.setStyleSheet("QTabBar::tab { width: 38px; }")
  47. self.ui.pi_ongletsListes.setStyleSheet("QTabBar::tab { width: 38px; }")
  48. self.majFichierInfosSvg()
  49. self.creerEcranFondPlateau()
  50. self.chargerListePj()
  51. self.connect(self.ui.grp_nouveauPj, SIGNAL("clicked()"), self.nouveauPj)
  52. ## self.showMaximized()
  53. ########## onglet plateau
  54. def creerEcranFondPlateau(self):
  55. ecranFondPlateau = EcranFondPlateau(self)
  56. self.ui.cbt_vue.resetTransform()
  57. self.ui.cbt_vue.setScene(ecranFondPlateau)
  58. def afficherEcranCreerPlateau(self):
  59. """ouvre la fenetre de creation de plateau"""
  60. valide = True
  61. if self.plateau != None:
  62. if self.plateau.estCree() == True:
  63. valide = False
  64. if valide:
  65. self.creationPlateau = EcranCreerPlateau(self)
  66. self.creationPlateau.setWindowModality(Qt.ApplicationModal)
  67. self.creationPlateau.show()
  68. self.creationPlateau.raise_()
  69. def creerPlateau(self, nom, chapitre, formeCases, largeur, hauteur, couleur):
  70. """cree le plateau entre en parametre"""
  71. nouvelId = str(len(afficheSvg("parties\\{}\\svg\\infos_sauvegarde".format(self.partie))))
  72. QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
  73. self.plateau = Plateau(self)
  74. self.plateau.creer(nouvelId, nom, chapitre, formeCases, largeur, hauteur, couleur)
  75. QApplication.restoreOverrideCursor()
  76. del self.creationPlateau
  77. def afficherEcranChargerPlateau(self):
  78. """ouvre la fenetre de chargement de plateau"""
  79. valide = True
  80. if self.plateau != None:
  81. if self.plateau.estCree() == True:
  82. valide = False
  83. if valide:
  84. self.chargementPlateau = EcranChargerPlateau(self)
  85. self.chargementPlateau.setWindowModality(Qt.ApplicationModal)
  86. self.chargementPlateau.show()
  87. self.chargementPlateau.raise_()
  88. def chargerPlateau(self, nomFichierSvg):
  89. if self.plateau != None:
  90. if self.plateau.estCree() == True:
  91. self.fermerPlateau()
  92. QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
  93. self.plateau = chargerUnique("parties\\{}\\svg\\{}.p".format(self.partie, nomFichierSvg))
  94. if self.plateau:
  95. self.plateau.recreer(self)
  96. else:
  97. self.plateau = Plateau(self)
  98. QApplication.restoreOverrideCursor()
  99. def chargerDernierPlateau(self):
  100. """charge le dernier plateau sauvegarde"""
  101. infosSvg = afficheSvg("parties\\{}\\svg\\infos_sauvegarde".format(self.partie))
  102. dernier = None
  103. for id_svg in infosSvg:
  104. if not dernier or infosSvg[id_svg]["dateSvg"] > infosSvg[dernier]["dateSvg"]:
  105. dernier = id_svg
  106. if dernier:
  107. self.chargerPlateau(dernier)
  108. def sauverPlateau(self):
  109. QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
  110. if self.plateau.id in afficheSvg("parties\\{}\\svg\\infos_sauvegarde".format(self.partie)):
  111. idPlateau = self.plateau.id
  112. else:
  113. idPlateau = str(len(afficheSvg("parties\\{}\\svg\\infos_sauvegarde".format(self.partie))))
  114. enregistrerUnique(self.plateau, "parties\\{}\\svg\\{}.p".format(self.partie, idPlateau))
  115. infos = {"nom": self.plateau.nom, "chapitre": self.plateau.chapitre, "dateCreation":self.plateau.dateCreation, "dateSvg":self.plateau.dateSvg, \
  116. "public": self.plateau.public, "enCours": self.plateau.enCours}
  117. enregistrer(str(idPlateau), infos, "parties\\{}\\svg\\infos_sauvegarde".format(self.partie))
  118. QApplication.restoreOverrideCursor()
  119. def fermerPlateau(self):
  120. self.plateau.fermer()
  121. self.plateau = None
  122. self.creerEcranFondPlateau()
  123. self.afficherPanneauxPlateau(False)
  124. def majFichierInfosSvg(self):
  125. """construit/maj le fichier contenant la liste des
  126. plateaux sauvegardes et leurs informations"""
  127. #on parcourt les fichiers de sauvegarde
  128. f = []
  129. lstFichiersSvg = []
  130. for (dirpath, dirnames, filenames) in os.walk("parties\\{}\\svg\\".format(self.partie)):
  131. f.extend(filenames)
  132. break
  133. for fichier in f:
  134. fileName, fileExtension = os.path.splitext(fichier)
  135. if fileExtension == ".p":
  136. lstFichiersSvg.append(fileName)
  137. #on verifie leur presence dans le fichier 'infos_sauvegarde'
  138. infosSvg = afficheSvg("parties\\{}\\svg\\infos_sauvegarde".format(self.partie))
  139. index = len(infosSvg)
  140. #on ajoute les sauvegardes manquantes si besoin
  141. for fichier in lstFichiersSvg:
  142. if not fichier in infosSvg:
  143. plateau = chargerUnique("parties\\{}\\svg\\{}.p".format(self.partie, fichier))
  144. enregistrer(fichier, {"nom": plateau.nom, "chapitre": plateau.chapitre, "dateCreation":plateau.dateCreation, "dateSvg":plateau.dateSvg, \
  145. "public": plateau.public, "enCours": plateau.enCours}, "svg\\infos_sauvegarde")
  146. index += 1
  147. #on supprime ceux qui ne sont plus trouves
  148. for fichier in infosSvg:
  149. if not fichier in lstFichiersSvg:
  150. supprSvg("parties\\{}\\svg\\infos_sauvegarde".format(self.partie), fichier)
  151. ########## apparence de l'onglet plateau
  152. def afficherPanneauxPlateau(self, actif):
  153. index = int(actif) # 0 si faux, 1 si vrai
  154. self.ui.cbt_panneauBas.setCurrentIndex(index)
  155. self.ui.cbt_panneauHaut.setCurrentIndex(index)
  156. self.ui.cbt_panneauDroite.setCurrentIndex(index)
  157. self.ui.cbt_panneauGauche.setCurrentIndex(index)
  158. def reinitialiserPanneauxPlateau(self):
  159. """remet a neuf les commandes liees au plateau"""
  160. for panneau in [self.ui.cbt_panneauHaut, \
  161. self.ui.cbt_panneauBas, \
  162. self.ui.cbt_panneauGauche, \
  163. self.ui.cbt_panneauDroite]:
  164. #listes
  165. for liste in panneau.findChildren(QTableWidget):
  166. while liste.rowCount() > 0:
  167. liste.removeRow(0)
  168. #textes
  169. for texte in panneau.findChildren(QLineEdit):
  170. texte.clear()
  171. for texte in panneau.findChildren(QTextEdit):
  172. texte.clear()
  173. #a cocher
  174. for bouton in panneau.findChildren(QToolButton):
  175. if bouton.isCheckable():
  176. bouton.setChecked(False)
  177. #autre
  178. for item in panneau.findChildren(QSlider):
  179. item.setValue(1)
  180. for item in panneau.findChildren(QDoubleSpinBox):
  181. item.setValue(0)
  182. ########## onglet groupe
  183. def chargerListePj(self):
  184. listePj = chargerUnique("parties\\{}\\groupe".format(self.partie))
  185. if not listePj: listePj = []
  186. self.ui.grp_deroulement_layout.setAlignment(Qt.AlignTop)
  187. for pj in listePj:
  188. self.pjAjouterAListe(pj)
  189. def pjAjouterAListe(self, pj = None):
  190. self._compteurPj += 1
  191. panneau = FramePj(self._compteurPj)
  192. if pj:
  193. panneau.chargerPj(pj)
  194. panneau.setObjectName(QString("pj_panneau_{}".format(self._compteurPj)))
  195. self.connect(panneau, SIGNAL("pjModifie(int)"), self.pjEnregistrer)
  196. self.ui.grp_deroulement_layout.addWidget(panneau)
  197. def pjSupprimer(self, index):
  198. panneau = self.findChild(QFrame, "pj_panneau_{}".format(index))
  199. self.ui.grp_deroulement_layout.removeWidget(panneau)
  200. def nouveauPj(self):
  201. self.editionPj = EcranEditionCombattant()
  202. self.editionPj.setAttribute(Qt.WA_DeleteOnClose)
  203. self.editionPj.exec_()
  204. pj = self.editionPj.combattant
  205. self.pjAjouterAListe(pj)
  206. self.pjEnregistrer(self._compteurPj)
  207. def pjEnregistrer(self, idPj):
  208. listePj = chargerUnique("parties\\{}\\groupe".format(self.partie))
  209. if not listePj: listePj = []
  210. panneau = self.findChild(QFrame, "pj_panneau_{}".format(idPj))
  211. pj = panneau.pj()
  212. listePj.append(pj)
  213. enregistrerUnique(listePj, "parties\\{}\\groupe".format(self.partie))
  214. def resizeEvent(self, event):
  215. val = (self.ui.dm_panneauCentre.width() - 20) / 3
  216. self.ui.dm_panneauCentre.setStyleSheet("QTabBar::tab { height: 25; width: "+str(val)+"px; }")
  217. if __name__ == "__main__":
  218. app = QApplication(argv)
  219. #settrace(trace_calls)
  220. dm = DMonde()
  221. dm.show()
  222. r = app.exec_()
  223. exit(r)