| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 |
- #from __future__ import unicode_literals
- # -*- coding: utf-8 -*-
- from __future__ import division
- from PyQt4.QtCore import *
- from PyQt4.QtGui import *
- from ui.ecran_gestionCombat import Ui_gc_fenetre
- import regles
- from lancer import jet, estJetValide
- class EcranGestionCombat(QFrame):
- """interface de gestion du combat (MJ)"""
- def __init__(self, plateau, parent=None):
- """initialisation de la fenetre"""
- super (EcranGestionCombat, self).__init__()
- self.plateau = plateau
- self.colonnesBase = {}
- self.createWidgets()
- self.positionDansHistoJets = 0
- self.histoJets = [QString.fromUtf8("")]
- self.majEnCours = False
-
- def createWidgets(self):
- """construction de l'interface"""
- #construction de l'interface
- self.ui = Ui_gc_fenetre()
- self.ui.setupUi(self)
- self.majListesDeroulantes()
- self.ui.gc_jetDes.installEventFilter(self)
- #selection
- self.connect(self.ui.gc_selectionEnCours, SIGNAL("clicked()"), self.selection)
- self.connect(self.ui.gc_selectionAttaquant, SIGNAL("clicked()"), self.selection)
- self.connect(self.ui.gc_selectionDefenseur, SIGNAL("clicked()"), self.selection)
- #jet de des
- self.connect(self.ui.gc_jetDes, SIGNAL("returnPressed()"), self.jetDes)
- ## self.connect(self.ui.jetDes, SIGNAL("keyPressEvent()"), self.jetDesToucheEnfoncee)
- self.connect(self.ui.gc_validerJetDes, SIGNAL("clicked()"), self.jetDes)
- self.connect(self.ui.gc_majChamp, SIGNAL("clicked()"), self.majChamp)
- self.connect(self.ui.gc_afficherDetailDes, SIGNAL("stateChanged(int)"), self.majAffichageDetailDes)
-
- #autre
- self.connect(self.ui.gc_liste.horizontalHeader(), SIGNAL("sectionClicked(int)"), self.enTeteCliquee)
- self.connect(self.ui.gc_aide, SIGNAL("clicked()"), self.afficherAide)
- self.connect(self.ui.gc_masquerHorsCombat, SIGNAL("stateChanged(int)"), self.majFiltreHorsCombat)
-
- self.initListe()
- self.majListe()
-
- self.connect(self.ui.gc_liste, SIGNAL("cellChanged(int, int)"), self.celluleModifiee)
- def majListesDeroulantes(self):
- """remplit les listes deroulantes des champs a mettre a jour"""
- self.ui.gc_nomChampMaj.addItem(QString.fromUtf8("Jet(s) de des"), "D")
- self.ui.gc_nomChampSourceMaj.addItem(QString.fromUtf8("Jet(s) de des"), "D")
- for elt in regles.ordreAttributs():
- if regles.listeControle()[elt].typ == "entier":
- self.ui.gc_nomChampMaj.addItem(QString.fromUtf8(regles.listeControle()[elt].nom), regles.ordreAttributs().index(elt))
- self.ui.gc_nomChampSourceMaj.addItem(QString.fromUtf8(regles.listeControle()[elt].nom), regles.ordreAttributs().index(elt))
- self.ui.gc_nomChampMaj.setCurrentIndex(1)
- def enTeteCliquee(self, colonne):
- """clic sur l'en-tete de la colonne"""
- if colonne >= 20: #ne s'applique pas aux colonnes de base (a part Des)
- attribut = regles.ordreAttributs()[(colonne-20)]
- index = self.ui.gc_nomChampMaj.findData((colonne-20))
- if index >= 0:
- self.ui.gc_nomChampMaj.setCurrentIndex(index)
- elif colonne == self.colonnesBase.index("Des"):
- self.ui.gc_nomChampMaj.setCurrentIndex(0)
- def initListe(self):
- """formate la table des donnees"""
- #mise en forme des colonnes
- #le dico des colonnes de base (celles qui ne dependent pas des regles utilisees) contient:
- #nom, largeur, (est modifiable?)
- self.ui.gc_liste.setEditTriggers(QAbstractItemView.DoubleClicked)
- self.ui.gc_liste.setIconSize(QSize(20,20))
- self.colonnesBase = ["num","I","Des","DetailDes","Combattant","Ordre","Etat","Alt.","Notes"]
- largeurColonnesBase = {"num": 0, "I": 20, "Des": 40, "DetailDes": 60, "Combattant": 80,"Ordre": 40, "Etat": 60,"Alt.": 30,"Notes": 80}
- for i in range(0, 20):
- self.ui.gc_liste.insertColumn(i)
- self.ui.gc_liste.setColumnHidden(i, (i >= len(self.colonnesBase)))
- if i < len(self.colonnesBase):
- self.ui.gc_liste.setHorizontalHeaderItem(i, QTableWidgetItem(self.colonnesBase[i]))
- if self.colonnesBase[i] in largeurColonnesBase:
- largeur = largeurColonnesBase[self.colonnesBase[i]]
- else:
- largeur = 60
- if largeur > 0:
- self.ui.gc_liste.setColumnWidth(i, largeur)
- else:
- self.ui.gc_liste.setColumnHidden(i, True)
- self.majAffichageDetailDes()
- ordre = regles.ordreAttributs()
- for elt in ordre:
- numCol = 20 + ordre.index(elt)
- self.ui.gc_liste.insertColumn(numCol)
- self.ui.gc_liste.setHorizontalHeaderItem(numCol, QTableWidgetItem(QString.fromUtf8(elt)))
- self.ui.gc_liste.setColumnWidth(numCol, 45)
- self.ui.gc_liste.setColumnHidden(numCol, False)
- if elt == regles.attributOrdreJeu():
- self.ui.gc_liste.setColumnHidden(self.colonnesBase.index("Ordre"), True) #si un attribut sert a definir l'ordre, on cache la colonne ordre de jeu
-
- def majListe(self):
- """met a jour le contenu de la table des donnees"""
- self.majEnCours = True
- while self.ui.gc_liste.rowCount() > 0:
- self.ui.gc_liste.removeRow(0)
- index = 0
- for num in self.plateau.combattants:
- self.ui.gc_liste.insertRow(int(index))
- #num du combattant (0):
- self.ui.gc_liste.setItem(int(index),0,QTableWidgetItem(QString.fromUtf8(str(num))))
- self.majDonneesCombattant(num)
- index += 1
- for elt in regles.ordreAttributs():
- if elt == regles.attributOrdreJeu():
- self.plateau.majOrdreJeu()
- self.majTri()
-
- self.majEnCours = False
- def majDonneesCombattant(self, numCombattant):
- """met a jour les donnees du combattant"""
- index = None
- for i in range(0, self.ui.gc_liste.rowCount()):
- if int(self.ui.gc_liste.item(i, 0).text().toUtf8()) == numCombattant:
- index = i
- break
-
- if index != None:
- ### parametres de base
- #I - Indication sur le combattant (attaquant, defenseur, selectionne sur la plateau...etc)
- item = QTableWidgetItem()
- item.setFlags(Qt.NoItemFlags)
- item.setFlags(Qt.ItemIsSelectable)
- if numCombattant == self.plateau.numCombattantEnCours:
- item.setIcon(QIcon("img\\flecheDroite2.png"))
- if item != None:
- self.ui.gc_liste.setItem(index, self.colonnesBase.index("I"), item)
-
- #Des et DetailDes - jets de des, on laisse tel quel
- self.ui.gc_liste.setItem(index, self.colonnesBase.index("Des"), QTableWidgetItem(QString.fromUtf8("")))
- self.ui.gc_liste.setItem(index, self.colonnesBase.index("DetailDes"), QTableWidgetItem(QString.fromUtf8("")))
-
- #Icone et nom
- item = QTableWidgetItem(QIcon("img\\"+self.plateau.combattants[numCombattant].logo), \
- QString.fromUtf8(self.plateau.combattants[numCombattant].txtId()))
- self.ui.gc_liste.setItem(index, self.colonnesBase.index("Combattant"), item)
-
- #Ordre
- self.ui.gc_liste.setItem(index, self.colonnesBase.index("Ordre"), QTableWidgetItem(QString.fromUtf8(str(self.plateau.ordreJeu[numCombattant]))))
- #Etat
- #...
- #altitude
- self.ui.gc_liste.setItem(index, self.colonnesBase.index("Alt."), QTableWidgetItem(QString.fromUtf8(str(self.plateau.combattants[numCombattant].zR))))
- ### parametres supplementaires (issus des regles)
- for elt in self.plateau.combattants[numCombattant].listeAttributs:
- col = 20 + regles.ordreAttributs().index(elt)
- self.ui.gc_liste.setItem(index, col , QTableWidgetItem(QString.fromUtf8(str(self.plateau.combattants[numCombattant].listeAttributs[elt]))))
- else:
- print ("Combattant {} introuvable, impossible de maj".format(numCombattant))
-
-
- def celluleModifiee(self, ligne, colonne):
- """une cellule de la table a ete modifiee"""
- if not self.majEnCours:
- numCombattant = int(self.ui.gc_liste.item(ligne, 0).text().toUtf8())
-
- if colonne < len(self.colonnesBase):
- if colonne == self.colonnesBase.index("Ordre"):
- #ordre de jeu
- nouvellePosition = int(self.ui.gc_liste.item(ligne, colonne).text().toUtf8())
- if nouvellePosition < 1: nouvellePosition = 1
- self.plateau.combattantDeplacerDansOrdreJeu(numCombattant, nouvellePosition)
- self.majListe()
-
- elif colonne == self.colonnesBase.index("Des"):
- #jet de de
- self.majEnCours = True
- if len(str(self.ui.gc_liste.item(ligne, colonne).text().toUtf8())) > 0:
- resultat = jet(str(self.ui.gc_liste.item(ligne, colonne).text().toUtf8()))[0]
- self.ui.gc_liste.item(ligne, colonne).setText(QString.fromUtf8(str(resultat)))
- else:
- self.ui.gc_liste.item(ligne, colonne).setText(QString.fromUtf8(""))
- self.majEnCours = False
- elif colonne >= 20:
- self.majEnCours = True
- index = colonne - 20
- attribut = regles.ordreAttributs()[index]
- valeurAttribut = regles.listeControle()[attribut].controler(str(self.ui.gc_liste.item(ligne, colonne).text().toUtf8()))
- if valeurAttribut != None:
- self.plateau.combattants[numCombattant].listeAttributs[attribut] = valeurAttribut
- if attribut == regles.attributOrdreJeu():
- self.plateau.majOrdreJeu()
- self.majTri()
- else:
- self.ui.gc_liste.item(ligne, colonne).setText(QString.fromUtf8(str(self.plateau.combattants[numCombattant].listeAttributs[attribut])))
- self.majEnCours = False
-
- self.emit(SIGNAL("majListesCombattants"), numCombattant)
- def majTri(self):
- """met a jour le tri en fonction de la colonne ordreJeu """
- for i in range(0,self.ui.gc_liste.rowCount()):
- self.ui.gc_liste.setItem(i, self.colonnesBase.index("Ordre"), \
- QTableWidgetItem(str(self.plateau.ordreJeu[int(str(self.ui.gc_liste.item(i,0).text().toUtf8()))])))
- def jetDes(self):
- """jette les des en fonction de ce qui est tape dans jetDes, et affecte les resultats a la colonne D des lignes selectionnees"""
- jetCommun = None
-
- for i in range(0, self.ui.gc_liste.rowCount()):
- self.ui.gc_liste.item(i, self.colonnesBase.index("Des")).setText(QString.fromUtf8(""))
- if estJetValide(str(self.ui.gc_jetDes.text().toUtf8())):
- if not self.ui.gc_jetDesIndependants.isChecked() and len(str(self.ui.gc_jetDes.text().toUtf8())) > 0:
- jetCommun = jet(str(self.ui.gc_jetDes.text().toUtf8()))
-
- for i in range(0, self.ui.gc_liste.rowCount()):
- self.ui.gc_liste.item(i, self.colonnesBase.index("Des")).setText(QString.fromUtf8(""))
- if len(str(self.ui.gc_jetDes.text().toUtf8())) > 0:
- if self.ui.gc_liste.isItemSelected(self.ui.gc_liste.item(i, 0)):
- if not jetCommun == None:
- resultat = jetCommun
- else:
- resultat = jet(str(self.ui.gc_jetDes.text().toUtf8()))
- if resultat[0] != None:
- self.ui.gc_liste.item(i, self.colonnesBase.index("Des")).setText(QString.fromUtf8(str(resultat[0])))
- self.ui.gc_liste.item(i, self.colonnesBase.index("DetailDes")).setText(QString.fromUtf8(str(resultat[1])))
- self.histoJets.insert(1, self.ui.gc_jetDes.text().toUtf8())
- else:
- print "Jet de des invalide"
- self.positionDansHistoJets = 0
- self.ui.gc_jetDes.setText(QString.fromUtf8(""))
- def afficherJetHisto(self):
- """affiche le jet depuis l'historique dans la qlineedit dediee"""
- if len(self.histoJets) > 0:
- if self.positionDansHistoJets < 0:
- self.positionDansHistoJets = 0
- elif self.positionDansHistoJets >= len(self.histoJets):
- self.positionDansHistoJets = len(self.histoJets) - 1
- self.ui.gc_jetDes.setText(QString.fromUtf8(self.histoJets[self.positionDansHistoJets]))
-
- def selection(self):
- """selectionne les lignes demandees"""
- origine = str(self.sender().objectName())
- for i in range(0, self.ui.gc_liste.rowCount()):
- if origine == "selectionCombattantEnCours":
- self.ui.gc_liste.item(i, 0).setSelected((int(self.ui.gc_liste.item(i, 0).text().toUtf8()) == self.plateau.numCombattantEnCours))
- elif origine == "selectionAttaquant":
- pass
- elif origine == "selectionDefenseur":
- pass
- if self.ui.gc_liste.item(i, 0).isSelected():
- self.ui.gc_liste.setCurrentCell(i, 0)
-
- def majChamp(self):
- """met a jour le champ demande avec les resultats de des ou avec les valeurs du champ specifie"""
- self.majEnCours = True
- aMaj = [] #liste des numCombattants a mettre a jour
- cible = str(self.ui.gc_nomChampMaj.itemData(self.ui.gc_nomChampMaj.currentIndex()).toString())
-
- if cible == "D":
- colonne = self.colonnesBase.index("Des")
- else:
- colonne = 20 + int(cible)
- source = str(self.ui.gc_nomChampSourceMaj.itemData(self.ui.gc_nomChampSourceMaj.currentIndex()).toString())
- if source != "D" and not len(self.ui.gc_liste.selectedItems()) > 0:
- msgBox = QMessageBox()
- msgBox.setWindowTitle(QString.fromUtf8("Avertissement"))
- msgBox.setText(QString.fromUtf8("Aucune ligne n'est sélectionnée"))
- msgBox.exec_()
- else:
- for i in range(0, self.ui.gc_liste.rowCount()):
- if len(str(self.ui.gc_liste.item(i, self.colonnesBase.index("Des")).text().toUtf8())) > 0:
- valeur = int(self.ui.gc_liste.item(i, colonne).text().toUtf8())
- jet = None
- try:
- if source == "D" and cible != "D":
- jet = int(str(self.ui.gc_liste.item(i, self.colonnesBase.index("Des")).text().toUtf8()))
- elif source != cible:
- if self.ui.gc_liste.item(i, 0).isSelected():
- jet = int(str(self.ui.gc_liste.item(i, (20 + int(source))).text().toUtf8()))
- except:
- print("jet invalide")
-
- if jet != None:
- if self.ui.gc_majValeurAjouter.isChecked():
- valeur += jet
- elif self.ui.gc_majValeurRetirer.isChecked():
- valeur -= jet
- elif self.ui.gc_majValeurRemplacer.isChecked():
- valeur = jet
- aMaj.append(i)
- self.ui.gc_liste.item(i, colonne).setText(QString.fromUtf8(str(valeur)))
- self.majEnCours = False
-
- for ligne in aMaj:
- self.celluleModifiee(ligne, colonne)
- self.ui.gc_nomChampSourceMaj.setCurrentIndex(0)
-
- def afficherAide(self):
- pass
- def majFiltreHorsCombat(self):
- pass
- def majAffichageDetailDes(self):
- """affiche ou cache la colonne de detail des jets de des en fonction de l'etat de la case correspondante"""
- self.ui.gc_liste.setColumnHidden(self.colonnesBase.index("DetailDes"), (not self.ui.gc_afficherDetailDes.isChecked()))
- def eventFilter(self, item, event):
- """filtre les evenements sur les widgets"""
- retour = False
- if item == self.ui.gc_jetDes:
- if event.type() == QEvent.KeyPress:
- if event.key() == Qt.Key_Up:
- self.positionDansHistoJets += 1
- self.afficherJetHisto()
- retour = True
- elif event.key() == Qt.Key_Down:
- self.positionDansHistoJets -= 1
- self.afficherJetHisto()
- retour = True
- return retour
|