EcranGestionCombat.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. from __future__ import division
  4. from PyQt4.QtCore import *
  5. from PyQt4.QtGui import *
  6. class EcranGestionCombat(QFrame):
  7. #*EGC
  8. """interface de gestion du combat (MJ)"""
  9. def __init__(self, plateau, parent=None):
  10. """initialisation de la fenetre"""
  11. super (EcranGestionCombat, self).__init__()
  12. self.plateau = plateau
  13. self.colonnesBase = {}
  14. self.createWidgets()
  15. self.positionDansHistoJets = 0
  16. self.histoJets = [QString.fromUtf8("")]
  17. self.majEnCours = False
  18. def createWidgets(self):
  19. """construction de l'interface"""
  20. #construction de l'interface
  21. self.ui = Ui_gestionCombat()
  22. self.ui.setupUi(self)
  23. self.majListesDeroulantes()
  24. self.ui.jetDes.installEventFilter(self)
  25. #selection
  26. self.connect(self.ui.selectionPionEnCours, SIGNAL("clicked()"), self.selection)
  27. self.connect(self.ui.selectionAttaquant, SIGNAL("clicked()"), self.selection)
  28. self.connect(self.ui.selectionDefenseur, SIGNAL("clicked()"), self.selection)
  29. #jet de des
  30. self.connect(self.ui.jetDes, SIGNAL("returnPressed()"), self.jetDes)
  31. ## self.connect(self.ui.jetDes, SIGNAL("keyPressEvent()"), self.jetDesToucheEnfoncee)
  32. self.connect(self.ui.validerJetDes, SIGNAL("clicked()"), self.jetDes)
  33. self.connect(self.ui.majChamp, SIGNAL("clicked()"), self.majChamp)
  34. self.connect(self.ui.afficherDetailDes, SIGNAL("stateChanged(int)"), self.majAffichageDetailDes)
  35. #autre
  36. self.connect(self.ui.listePions.horizontalHeader(), SIGNAL("sectionClicked(int)"), self.enTeteCliquee)
  37. self.connect(self.ui.gestionCombatAide, SIGNAL("clicked()"), self.afficherAide)
  38. self.connect(self.ui.masquerHorsCombat, SIGNAL("stateChanged(int)"), self.majFiltreHorsCombat)
  39. self.initListe()
  40. self.majListe()
  41. self.connect(self.ui.listePions, SIGNAL("cellChanged(int, int)"), self.celluleModifiee)
  42. def majListesDeroulantes(self):
  43. """remplit les listes deroulantes des champs a mettre a jour"""
  44. self.ui.nomChampMaj.addItem(QString.fromUtf8("Jet(s) de des"), "D")
  45. self.ui.nomChampSourceMaj.addItem(QString.fromUtf8("Jet(s) de des"), "D")
  46. for elt in regles.ordreAttributs():
  47. if regles.listeControle()[elt].typ == "entier":
  48. self.ui.nomChampMaj.addItem(QString.fromUtf8(regles.listeControle()[elt].nom), regles.ordreAttributs().index(elt))
  49. self.ui.nomChampSourceMaj.addItem(QString.fromUtf8(regles.listeControle()[elt].nom), regles.ordreAttributs().index(elt))
  50. self.ui.nomChampMaj.setCurrentIndex(1)
  51. def enTeteCliquee(self, colonne):
  52. """clic sur l'en-tete de la colonne"""
  53. if colonne >= 20: #ne s'applique pas aux colonnes de base (a part Des)
  54. attribut = regles.ordreAttributs()[(colonne-20)]
  55. index = self.ui.nomChampMaj.findData((colonne-20))
  56. if index >= 0:
  57. self.ui.nomChampMaj.setCurrentIndex(index)
  58. elif colonne == self.colonnesBase.index("Des"):
  59. self.ui.nomChampMaj.setCurrentIndex(0)
  60. def initListe(self):
  61. """formate la table des donnees"""
  62. #mise en forme des colonnes
  63. #le dico des colonnes de base (celles qui ne dependent pas des regles utilisees) contient:
  64. #nom, largeur, (est modifiable?)
  65. self.ui.listePions.setEditTriggers(QAbstractItemView.DoubleClicked)
  66. self.ui.listePions.setIconSize(QSize(20,20))
  67. self.colonnesBase = ["num","I","Des","DetailDes","Pion","Ordre","Etat","Alt.","Notes"]
  68. largeurColonnesBase = {"num": 0, "I": 20, "Des": 40, "DetailDes": 60, "Pion": 80,"Ordre": 40, "Etat": 60,"Alt.": 30,"Notes": 80}
  69. for i in range(0, 20):
  70. self.ui.listePions.insertColumn(i)
  71. self.ui.listePions.setColumnHidden(i, (i >= len(self.colonnesBase)))
  72. if i < len(self.colonnesBase):
  73. self.ui.listePions.setHorizontalHeaderItem(i, QTableWidgetItem(self.colonnesBase[i]))
  74. if self.colonnesBase[i] in largeurColonnesBase:
  75. largeur = largeurColonnesBase[self.colonnesBase[i]]
  76. else:
  77. largeur = 60
  78. if largeur > 0:
  79. self.ui.listePions.setColumnWidth(i, largeur)
  80. else:
  81. self.ui.listePions.setColumnHidden(i, True)
  82. self.majAffichageDetailDes()
  83. ordre = regles.ordreAttributs()
  84. for elt in ordre:
  85. numCol = 20 + ordre.index(elt)
  86. self.ui.listePions.insertColumn(numCol)
  87. self.ui.listePions.setHorizontalHeaderItem(numCol, QTableWidgetItem(QString.fromUtf8(elt)))
  88. self.ui.listePions.setColumnWidth(numCol, 45)
  89. self.ui.listePions.setColumnHidden(numCol, False)
  90. if elt == regles.attributOrdreJeu():
  91. self.ui.listePions.setColumnHidden(self.colonnesBase.index("Ordre"), True) #si un attribut sert a definir l'ordre, on cache la colonne ordre de jeu
  92. def majListe(self):
  93. """met a jour le contenu de la table des donnees"""
  94. self.majEnCours = True
  95. while self.ui.listePions.rowCount() > 0:
  96. self.ui.listePions.removeRow(0)
  97. index = 0
  98. for num in self.plateau.pions:
  99. self.ui.listePions.insertRow(int(index))
  100. #num du pion (0):
  101. self.ui.listePions.setItem(int(index),0,QTableWidgetItem(QString.fromUtf8(str(num))))
  102. self.majDonneesPion(num)
  103. index += 1
  104. for elt in regles.ordreAttributs():
  105. if elt == regles.attributOrdreJeu():
  106. self.plateau.majOrdreJeu()
  107. self.majTri()
  108. self.majEnCours = False
  109. def majDonneesPion(self, numPion):
  110. """met a jour les donnees du pion"""
  111. index = None
  112. for i in range(0, self.ui.listePions.rowCount()):
  113. if int(self.ui.listePions.item(i, 0).text().toUtf8()) == numPion:
  114. index = i
  115. break
  116. if index != None:
  117. ### parametres de base
  118. #I - Indication sur le pion (attaquant, defenseur, selectionne sur la plateau...etc)
  119. item = QTableWidgetItem()
  120. item.setFlags(Qt.NoItemFlags)
  121. item.setFlags(Qt.ItemIsSelectable)
  122. if numPion == self.plateau.numPionEnCours:
  123. item.setIcon(QIcon("img\\flecheDroite2.png"))
  124. if item != None:
  125. self.ui.listePions.setItem(index, self.colonnesBase.index("I"), item)
  126. #Des et DetailDes - jets de des, on laisse tel quel
  127. self.ui.listePions.setItem(index, self.colonnesBase.index("Des"), QTableWidgetItem(QString.fromUtf8("")))
  128. self.ui.listePions.setItem(index, self.colonnesBase.index("DetailDes"), QTableWidgetItem(QString.fromUtf8("")))
  129. #Icone et nom
  130. item = QTableWidgetItem(QIcon("img\\"+self.plateau.pions[numPion].creature.logo), \
  131. QString.fromUtf8(self.plateau.pions[numPion].txtId()))
  132. self.ui.listePions.setItem(index, self.colonnesBase.index("Pion"), item)
  133. #Ordre
  134. self.ui.listePions.setItem(index, self.colonnesBase.index("Ordre"), QTableWidgetItem(QString.fromUtf8(str(self.plateau.ordreJeu[numPion]))))
  135. #Etat
  136. #...
  137. #altitude
  138. self.ui.listePions.setItem(index, self.colonnesBase.index("Alt."), QTableWidgetItem(QString.fromUtf8(str(self.plateau.pions[numPion].z))))
  139. ### parametres supplementaires (issus des regles)
  140. for elt in self.plateau.pions[numPion].lstCarac:
  141. col = 20 + regles.ordreAttributs().index(elt)
  142. self.ui.listePions.setItem(index, col , QTableWidgetItem(QString.fromUtf8(str(self.plateau.pions[numPion].lstCarac[elt]))))
  143. else:
  144. print ("Pion {} introuvable, impossible de maj".format(numPion))
  145. def celluleModifiee(self, ligne, colonne):
  146. """une cellule de la table a ete modifiee"""
  147. if not self.majEnCours:
  148. numPion = int(self.ui.listePions.item(ligne, 0).text().toUtf8())
  149. if colonne < len(self.colonnesBase):
  150. if colonne == self.colonnesBase.index("Ordre"):
  151. #ordre de jeu
  152. nouvellePosition = int(self.ui.listePions.item(ligne, colonne).text().toUtf8())
  153. if nouvellePosition < 1: nouvellePosition = 1
  154. self.plateau.pionDeplacerDansOrdreJeu(numPion, nouvellePosition)
  155. self.majListe()
  156. elif colonne == self.colonnesBase.index("Des"):
  157. #jet de de
  158. self.majEnCours = True
  159. if len(str(self.ui.listePions.item(ligne, colonne).text().toUtf8())) > 0:
  160. resultat = jet(str(self.ui.listePions.item(ligne, colonne).text().toUtf8()))[0]
  161. self.ui.listePions.item(ligne, colonne).setText(QString.fromUtf8(str(resultat)))
  162. else:
  163. self.ui.listePions.item(ligne, colonne).setText(QString.fromUtf8(""))
  164. self.majEnCours = False
  165. elif colonne >= 20:
  166. self.majEnCours = True
  167. index = colonne - 20
  168. attribut = regles.ordreAttributs()[index]
  169. valeurAttribut = regles.listeControle()[attribut].controler(str(self.ui.listePions.item(ligne, colonne).text().toUtf8()))
  170. if valeurAttribut != None:
  171. self.plateau.pions[numPion].lstCarac[attribut] = valeurAttribut
  172. if attribut == regles.attributOrdreJeu():
  173. self.plateau.majOrdreJeu()
  174. self.majTri()
  175. else:
  176. self.ui.listePions.item(ligne, colonne).setText(QString.fromUtf8(str(self.plateau.pions[numPion].lstCarac[attribut])))
  177. self.majEnCours = False
  178. self.emit(SIGNAL("majListesPions"), numPion)
  179. def majTri(self):
  180. """met a jour le tri en fonction de la colonne ordreJeu """
  181. for i in range(0,self.ui.listePions.rowCount()):
  182. self.ui.listePions.setItem(i, self.colonnesBase.index("Ordre"), \
  183. QTableWidgetItem(str(self.plateau.ordreJeu[int(str(self.ui.listePions.item(i,0).text().toUtf8()))])))
  184. trierTable(self.ui.listePions, self.colonnesBase.index("Ordre"))
  185. def jetDes(self):
  186. """jette les des en fonction de ce qui est tape dans jetDes, et affecte les resultats a la colonne D des lignes selectionnees"""
  187. jetCommun = None
  188. for i in range(0, self.ui.listePions.rowCount()):
  189. self.ui.listePions.item(i, self.colonnesBase.index("Des")).setText(QString.fromUtf8(""))
  190. if estJetValide(str(self.ui.jetDes.text().toUtf8())):
  191. if not self.ui.jetDesIndependants.isChecked() and len(str(self.ui.jetDes.text().toUtf8())) > 0:
  192. jetCommun = jet(str(self.ui.jetDes.text().toUtf8()))
  193. for i in range(0, self.ui.listePions.rowCount()):
  194. self.ui.listePions.item(i, self.colonnesBase.index("Des")).setText(QString.fromUtf8(""))
  195. if len(str(self.ui.jetDes.text().toUtf8())) > 0:
  196. if self.ui.listePions.isItemSelected(self.ui.listePions.item(i, 0)):
  197. if not jetCommun == None:
  198. resultat = jetCommun
  199. else:
  200. resultat = jet(str(self.ui.jetDes.text().toUtf8()))
  201. if resultat[0] != None:
  202. self.ui.listePions.item(i, self.colonnesBase.index("Des")).setText(QString.fromUtf8(str(resultat[0])))
  203. self.ui.listePions.item(i, self.colonnesBase.index("DetailDes")).setText(QString.fromUtf8(str(resultat[1])))
  204. self.histoJets.insert(1, self.ui.jetDes.text().toUtf8())
  205. else:
  206. print "Jet de des invalide"
  207. self.positionDansHistoJets = 0
  208. self.ui.jetDes.setText(QString.fromUtf8(""))
  209. def afficherJetHisto(self):
  210. """affiche le jet depuis l'historique dans la qlineedit dediee"""
  211. if len(self.histoJets) > 0:
  212. if self.positionDansHistoJets < 0:
  213. self.positionDansHistoJets = 0
  214. elif self.positionDansHistoJets >= len(self.histoJets):
  215. self.positionDansHistoJets = len(self.histoJets) - 1
  216. self.ui.jetDes.setText(QString.fromUtf8(self.histoJets[self.positionDansHistoJets]))
  217. def selection(self):
  218. """selectionne les lignes demandees"""
  219. origine = str(self.sender().objectName())
  220. for i in range(0, self.ui.listePions.rowCount()):
  221. if origine == "selectionPionEnCours":
  222. self.ui.listePions.item(i, 0).setSelected((int(self.ui.listePions.item(i, 0).text().toUtf8()) == self.plateau.numPionEnCours))
  223. elif origine == "selectionAttaquant":
  224. pass
  225. elif origine == "selectionDefenseur":
  226. pass
  227. if self.ui.listePions.item(i, 0).isSelected():
  228. self.ui.listePions.setCurrentCell(i, 0)
  229. def majChamp(self):
  230. """met a jour le champ demande avec les resultats de des ou avec les valeurs du champ specifie"""
  231. self.majEnCours = True
  232. aMaj = [] #liste des numPions a mettre a jour
  233. cible = str(self.ui.nomChampMaj.itemData(self.ui.nomChampMaj.currentIndex()).toString())
  234. if cible == "D":
  235. colonne = self.colonnesBase.index("Des")
  236. else:
  237. colonne = 20 + int(cible)
  238. source = str(self.ui.nomChampSourceMaj.itemData(self.ui.nomChampSourceMaj.currentIndex()).toString())
  239. if source != "D" and not len(self.ui.listePions.selectedItems()) > 0:
  240. msgBox = QMessageBox()
  241. msgBox.setWindowTitle(QString.fromUtf8("Avertissement"))
  242. msgBox.setText(QString.fromUtf8("Aucune ligne n'est sélectionnée"))
  243. msgBox.exec_()
  244. else:
  245. for i in range(0, self.ui.listePions.rowCount()):
  246. if len(str(self.ui.listePions.item(i, self.colonnesBase.index("Des")).text().toUtf8())) > 0:
  247. valeur = int(self.ui.listePions.item(i, colonne).text().toUtf8())
  248. jet = None
  249. try:
  250. if source == "D" and cible != "D":
  251. jet = int(str(self.ui.listePions.item(i, self.colonnesBase.index("Des")).text().toUtf8()))
  252. elif source != cible:
  253. if self.ui.listePions.item(i, 0).isSelected():
  254. jet = int(str(self.ui.listePions.item(i, (20 + int(source))).text().toUtf8()))
  255. except:
  256. print("jet invalide")
  257. if jet != None:
  258. if self.ui.majValeurAjouter.isChecked():
  259. valeur += jet
  260. elif self.ui.majValeurRetirer.isChecked():
  261. valeur -= jet
  262. elif self.ui.majValeurRemplacer.isChecked():
  263. valeur = jet
  264. aMaj.append(i)
  265. self.ui.listePions.item(i, colonne).setText(QString.fromUtf8(str(valeur)))
  266. self.majEnCours = False
  267. for ligne in aMaj:
  268. self.celluleModifiee(ligne, colonne)
  269. self.ui.nomChampSourceMaj.setCurrentIndex(0)
  270. def afficherAide(self):
  271. pass
  272. def majFiltreHorsCombat(self):
  273. pass
  274. def majAffichageDetailDes(self):
  275. """affiche ou cache la colonne de detail des jets de des en fonction de l'etat de la case correspondante"""
  276. self.ui.listePions.setColumnHidden(self.colonnesBase.index("DetailDes"), (not self.ui.afficherDetailDes.isChecked()))
  277. def eventFilter(self, item, event):
  278. """filtre les evenements sur les widgets"""
  279. retour = False
  280. if item == self.ui.jetDes:
  281. if event.type() == QEvent.KeyPress:
  282. if event.key() == Qt.Key_Up:
  283. self.positionDansHistoJets += 1
  284. self.afficherJetHisto()
  285. retour = True
  286. elif event.key() == Qt.Key_Down:
  287. self.positionDansHistoJets -= 1
  288. self.afficherJetHisto()
  289. retour = True
  290. return retour