#from __future__ import unicode_literals # -*- coding: utf-8 -*- from PyQt4.QtCore import * from PyQt4.QtGui import * from ui.ecran_editionAttaques import Ui_editionAttaques class EcranEditionAttaques(QFrame): #*EEA """interface d'edition des attaques du pion""" def __init__(self, pion, parent=None): """initialisation de la fenetre""" super (EcranEditionAttaques, self).__init__() self.pion = pion self.colonnesBase = {} self.createWidgets() self.majEnCours = False def createWidgets(self): """construction de l'interface""" #construction de l'interface self.ui = Ui_editionAttaques() self.ui.setupUi(self) self.connect(self.ui.nouvelleAttaque, SIGNAL("clicked()"), self.nouvelleAttaque) self.connect(self.ui.supprimerAttaque, SIGNAL("clicked()"), self.supprimerAttaque) ## self.connect(SIGNAL("majTypeAttaque()"), self.majTypeAttaque) self.initListe() self.majListe() self.connect(self.ui.editionListeAttaques, SIGNAL("cellChanged(int, int)"), self.celluleModifiee) def initListe(self): """formate la table des donnees""" #mise en forme des colonnes #colonnes de base: celles qui ne dependent pas des regles utilisees self.colonnesBase = ["numAttaque","Type","Nom","Portee","Forme","Rayon"] largeurColonnesBase = {"numAttaque": 0, "Type": 70, "Nom": 100, "Portee": 60, "Forme": 80,"Rayon": 60} for i in range(0, 10): self.ui.editionListeAttaques.insertColumn(i) self.ui.editionListeAttaques.setColumnHidden(i, (i >= len(self.colonnesBase))) if i < len(self.colonnesBase): self.ui.editionListeAttaques.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.editionListeAttaques.setColumnWidth(i, largeur) else: self.ui.editionListeAttaques.setColumnHidden(i, True) ordre = regles.ordreAttributsAttaques() for elt in ordre: numCol = 10 + ordre.index(elt) self.ui.editionListeAttaques.insertColumn(numCol) self.ui.editionListeAttaques.setHorizontalHeaderItem(numCol, QTableWidgetItem(QString.fromUtf8(elt))) self.ui.editionListeAttaques.setColumnWidth(numCol, 45) self.ui.editionListeAttaques.setColumnHidden(numCol, False) def majListe(self): """met a jour le contenu de la table des donnees""" self.majEnCours = True while self.ui.editionListeAttaques.rowCount() > 0: self.ui.editionListeAttaques.removeRow(0) index = 0 for numAttaque in range(0, len(self.pion.attaques)): self.ui.editionListeAttaques.insertRow(int(index)) #liste deroulante des types d'attaque self.ui.editionListeAttaques.setCellWidget(int(index), self.colonnesBase.index("Type"), self.listeTypesAttaques()) #num du pion (0): self.ui.editionListeAttaques.setItem(int(index),0,QTableWidgetItem(QString.fromUtf8(str(numAttaque)))) self.majDonneesAttaque(numAttaque) index += 1 self.majEnCours = False def majDonneesAttaque(self, numAttaque): """met a jour les donnees de l'attaque""" index = None for i in range(0, self.ui.editionListeAttaques.rowCount()): if int(self.ui.editionListeAttaques.item(i, 0).text().toUtf8()) == numAttaque: index = i break if index != None: ### parametres de base #Type d'attaque item = QTableWidgetItem() item.setFlags(Qt.NoItemFlags) item.setFlags(Qt.ItemIsSelectable) if self.pion.attaques[numAttaque].typ in ["cac", "dist", "zone"]: self.ui.editionListeAttaques.cellWidget(index, self.colonnesBase.index("Type")).setCurrentIndex(\ self.ui.editionListeAttaques.cellWidget(index, self.colonnesBase.index("Type")).findData(QVariant(self.pion.attaques[numAttaque].typ))) self.afficherDonneesAttaqueZone(index, (self.pion.attaques[numAttaque].typ == "zone")) #Nom de l'attaque self.ui.editionListeAttaques.setItem(index, self.colonnesBase.index("Nom"), QTableWidgetItem(QString.fromUtf8(self.pion.attaques[numAttaque].nom))) #Portee self.ui.editionListeAttaques.setItem(index, self.colonnesBase.index("Portee"), QTableWidgetItem(QString.fromUtf8(str(self.pion.attaques[numAttaque].portee)))) ### parametres supplementaires (issus des regles) for elt in self.pion.attaques[numAttaque].attributs: col = 10 + regles.ordreAttributsAttaques().index(elt) self.ui.editionListeAttaques.setItem(index, col , QTableWidgetItem(QString.fromUtf8(str(self.pion.attaques[numAttaque].attributs[elt])))) else: print ("Attaque {} introuvable, impossible de maj".format(numPion)) def celluleModifiee(self, ligne, colonne): """une cellule de la table a ete modifiee""" if not self.majEnCours: numAttaque = int(self.ui.editionListeAttaques.item(ligne, 0).text().toUtf8()) if colonne < len(self.colonnesBase): if colonne == self.colonnesBase.index("Nom"): nom = str(self.ui.editionListeAttaques.item(ligne, colonne).text().toUtf8()) if not len(nom) > 0: nom = "Att. {}".format(numAttaque) self.pion.attaques[numAttaque].nom = nom elif colonne == self.colonnesBase.index("Type"): typ = str(self.ui.editionListeAttaques.cellWidget(ligne, colonne).itemData(\ self.ui.editionListeAttaques.cellWidget(ligne, colonne).currentIndex()).toString()) self.pion.attaques[numAttaque].typ = typ self.afficherDonneesAttaqueZone(ligne, (typ == "zone")) elif colonne == self.colonnesBase.index("Forme"): forme = str(self.ui.editionListeAttaques.cellWidget(ligne, colonne).itemData(\ self.ui.editionListeAttaques.cellWidget(ligne, colonne).currentIndex()).toString()) self.pion.attaques[numAttaque].formeZone = forme elif colonne == self.colonnesBase.index("Portee"): #doit etre de type numerique try: portee = int(str(self.ui.editionListeAttaques.item(ligne, colonne).text().toUtf8())) valide = True except: valide = False if valide: self.pion.attaques[numAttaque].portee = portee else: self.ui.editionListeAttaques.item(ligne, colonne).setText(QString.fromUtf8(self.pion.attaques[numAttaque].portee)) elif colonne == self.colonnesBase.index("Rayon"): #doit etre de type numerique try: rayon = int(str(self.ui.editionListeAttaques.item(ligne, colonne).text().toUtf8())) valide = True except: valide = False if valide: self.pion.attaques[numAttaque].rayon = rayon else: self.ui.editionListeAttaques.item(ligne, colonne).setText(QString.fromUtf8(str(self.pion.attaques[numAttaque].rayon))) elif colonne >= 10: self.majEnCours = True index = colonne - 10 attribut = regles.ordreAttributsAttaques()[index] valeurAttribut = regles.listeControleAttaques()[attribut].controler(str(self.ui.editionListeAttaques.item(ligne, colonne).text().toUtf8())) if valeurAttribut != None: self.pion.attaques[numAttaque].attributs[attribut] = valeurAttribut else: self.ui.editionListeAttaques.item(ligne, colonne).setText(QString.fromUtf8(str(self.pion.attaques[numAttaque].attributs[attribut]))) self.majEnCours = False def majTypeAttaque(self): """une des liste de type a ete modifiee, on met a jour toute la colonne (en attendant mieux :( )""" colonne = self.colonnesBase.index("Type") for i in range(0, self.ui.editionListeAttaques.rowCount()): if str(self.ui.editionListeAttaques.cellWidget(i, colonne).itemData(\ self.ui.editionListeAttaques.cellWidget(i, colonne).currentIndex())) != \ self.pion.attaques[int(self.ui.editionListeAttaques.item(i, 0).text().toUtf8())].typ: self.celluleModifiee(i, colonne) def majFormeZone(self): """une des liste de type a ete modifiee, on met a jour toute la colonne (en attendant mieux :( )""" colonne = self.colonnesBase.index("Forme") for i in range(0, self.ui.editionListeAttaques.rowCount()): if self.ui.editionListeAttaques.cellWidget(i, colonne).__class__.__name__ == "QComboBox": if str(self.ui.editionListeAttaques.cellWidget(i, colonne).itemData(\ self.ui.editionListeAttaques.cellWidget(i, colonne).currentIndex())) != \ self.pion.attaques[int(self.ui.editionListeAttaques.item(i, 0).text().toUtf8())].formeZone: self.celluleModifiee(i, colonne) def nouvelleAttaque(self): """ajoute une ligne a la table et une attaque au pion""" self.pion.attaques.append(Attaque()) self.majListe() def supprimerAttaque(self): """supprime l'attaque selectionnee de la liste des attaques du pion""" numAttaque = None for i in range(0, self.ui.editionListeAttaques.rowCount()): if self.ui.editionListeAttaques.item(i,0).isSelected(): numAttaque = int(self.ui.editionListeAttaques.item(i,0).text().toUtf8()) if numAttaque != None: reponse = QMessageBox.question(self, 'Message', "Etes vous sûr de vouloir supprimer cette attaque?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reponse == QMessageBox.Yes: del self.pion.attaques[numAttaque] self.majListe() else: print "pas d'attaque selectionnee" def listeTypesAttaques(self): """retourne la QComboBox qui apparait dans la colonne Type d'attaque""" liste = QComboBox() liste.addItem(QIcon("img\\curseurEpee.png"), QString.fromUtf8("C.à.C"), "cac") liste.addItem(QIcon("img\\arc.png"), QString.fromUtf8("Dist."), "dist") liste.addItem(QIcon("img\\baguette.png"), QString.fromUtf8("Zone"), "zone") self.connect(liste, SIGNAL("currentIndexChanged(int)"), self.majTypeAttaque) return liste def listeFormesZone(self): """retourne la QComboBox qui apparait dans la colonne forme de zone""" liste = QComboBox() liste.addItem(QIcon("img\\formeLigne.png"), QString.fromUtf8("Ligne"), "ligne") liste.addItem(QIcon("img\\formeEllipsePlein.png"), QString.fromUtf8("Disque"), "disque") liste.addItem(QIcon("img\\cone.png"), QString.fromUtf8("Cone"), "cone") self.connect(liste, SIGNAL("currentIndexChanged(int)"), self.majFormeZone) return liste def afficherDonneesAttaqueZone(self, ligne, afficher): """rend modifiables ou non les donnees de base liees aux attaques de zone et modifie l'affichage en consequence""" self.majEnCours = True if afficher == True: numAttaque = int(self.ui.editionListeAttaques.item(ligne, 0).text().toUtf8()) if self.ui.editionListeAttaques.cellWidget(ligne, self.colonnesBase.index("Forme")) == None: self.ui.editionListeAttaques.setCellWidget(ligne, self.colonnesBase.index("Forme"), self.listeFormesZone()) if self.pion.attaques[numAttaque].formeZone in ["ligne", "disque", "cone"]: self.ui.editionListeAttaques.cellWidget(ligne, self.colonnesBase.index("Forme")).setCurrentIndex(\ self.ui.editionListeAttaques.cellWidget(ligne, self.colonnesBase.index("Forme")).findData(QVariant(self.pion.attaques[numAttaque].formeZone))) item = QTableWidgetItem(QString.fromUtf8(str(self.pion.attaques[numAttaque].rayon))) item.setBackgroundColor(QColor("white")) self.ui.editionListeAttaques.setItem(ligne, self.colonnesBase.index("Rayon"), item) else: if self.ui.editionListeAttaques.cellWidget(ligne, self.colonnesBase.index("Forme")) != None: self.ui.editionListeAttaques.removeCellWidget(ligne, self.colonnesBase.index("Forme")) item = QTableWidgetItem(QString.fromUtf8("")) item.setFlags(Qt.NoItemFlags) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) item.setBackgroundColor(QColor(200,200,200)) self.ui.editionListeAttaques.setItem(ligne, self.colonnesBase.index("Forme"), item) item = QTableWidgetItem(QString.fromUtf8("")) item.setFlags(Qt.NoItemFlags) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) item.setBackgroundColor(QColor(200,200,200)) self.ui.editionListeAttaques.setItem(ligne, self.colonnesBase.index("Rayon"), item) self.majEnCours = False