#from __future__ import unicode_literals # -*- coding: utf-8 -*- from PyQt4.QtCore import * from PyQt4.QtGui import * from lib.Actions import * import lib.regles as regles from lib.ui.dm import * #dans une DmTableAttaques, les 10 premieres colonnes sont reservees aux donnees de base #le reste des colonnes sert aux donnees complementaires issues des regles colonnesBase= ["Type", "Nom", "Portee", "Forme", "Rayon"] largeurColonnesBase = {"Type": 70, "Nom": 100, "Portee": 60, "Forme": 80,"Rayon": 60} class DmTableAttaques(DmTableWidget): """interface d'edition des attaques du combattant""" def __init__(self, parent=None): super (DmTableAttaques, self).__init__(parent) def construire(self): """cree les colonnes de la table""" #colonnes de base: celles qui ne dependent pas des regles utilisees for i in range(0, 10): self.insertColumn(i) #on cache les colonnes qui ne seront pas utilisees self.setColumnHidden(i, (i >= len(colonnesBase))) if i < len(colonnesBase): #la largeur est geree par une variable globale self.setHorizontalHeaderItem(i, QTableWidgetItem(colonnesBase[i])) if colonnesBase[i] in largeurColonnesBase: largeur = largeurColonnesBase[colonnesBase[i]] else: largeur = 60 if largeur > 0: self.setColumnWidth(i, largeur) else: self.setColumnHidden(i, True) #on ajoute maintenant les colonnes issues des regles ordre = regles.ordreAttributsAttaques() for elt in ordre: numCol = 10 + ordre.index(elt) self.insertColumn(numCol) self.setHorizontalHeaderItem(numCol, QTableWidgetItem(QString.fromUtf8(elt))) self.setColumnWidth(numCol, 45) self.setColumnHidden(numCol, False) self.connect(self, SIGNAL("cellChanged(int, int)"), self.celluleModifiee) def posColonne(self, nom): """renvoie la position de la colonne demandee""" retour = None if nom in colonnesBase: retour = colonnesBase.index(nom) elif nom in regles.ordreAttributsAttaques(): retour = 10 + regles.ordreAttributsAttaques().index(nom) return retour def listeAttaques(self): """retourne la liste des attaques de la liste""" liste = [] for ligne in self.lignes(): attaque = None typeAttaque = str(self.cellWidget(ligne, self.posColonne("Type")).valeurActuelle().toString()) if typeAttaque == "cac": attaque = Cac() elif typeAttaque == "dist": attaque = Distance() elif typeAttaque == "zone": formeAttaque = str(self.cellWidget(ligne, self.posColonne("Forme")).valeurActuelle().toString()) if formeAttaque == "ligne": attaque = Ligne() elif formeAttaque == "disque": attaque = Disque() elif formeAttaque == "cone": attaque = Cone() if attaque: attaque.majNom(self.texte(ligne, self.posColonne("Nom"))) attaque.majPortee(self.data(ligne, self.posColonne("Portee"))) if typeAttaque == "zone" and formeAttaque == "disque": attaque.majRayon(self.data(ligne, self.posColonne("Rayon"))) for col in range(10, self.columnCount()): attr = regles.ordreAttributsAttaques()[(col-10)] val = str(self.data(ligne, col-10)) if regles.attributAttaque(attr).controler(val): attaque.majAttribut(attr, val) liste.append(attaque) return liste def charger(self, listeAttaques): """charge et affiche une liste d'attaques""" self.vider() self.majEnCours = True ligne = 0 for attaque in listeAttaques: #controle du type d'attaque if isinstance(attaque, Attaque): if attaque.__class__.__name__ in ["ligne", "disque", "cone"]: typeAtt = "zone" formeAtt = attaque.typeAtt() else: typeAtt = attaque.typeAtt() formeAtt = "" self.nouvelleLigneFin() #donnees generales donneesAttaque = {"Nom": attaque.nom(), "Portee": attaque.portee(), "Rayon": attaque.rayon()} self.majLigne(ligne, donneesAttaque) #met a jour le type d'attaque widget = self.listeTypesAttaques(ligne) widget.allerA(typeAtt) self.setCellWidget(ligne, self.posColonne("Type"), widget) self.afficherDonneesAttaqueZone(ligne, (typeAtt == "zone")) #maj des attributs de regles self.majLigne(ligne, attaque.attributs()) ligne += 1 self.majEnCours = False def nouvelle(self): """ajoute une ligne a la table et maj avec les valeurs par defaut""" ligne = self.nouvelleLigneFin() modeleAttaque = Attaque() #donnees generales donneesAttaque = {"Nom": modeleAttaque.nom(), "Portee": modeleAttaque.portee(), "Rayon": modeleAttaque.rayon()} self.majLigne(ligne, donneesAttaque) #liste types attaque widget = self.listeTypesAttaques(ligne) widget.allerA("cac") self.setCellWidget(ligne, self.posColonne("Type"), widget) #des regles attributs = regles.listeAttributsAttaques() self.majLigne(ligne, attributs) self.afficherDonneesAttaqueZone(ligne, False) def supprimer(self): """supprime l'attaque selectionnee de la liste des attaques du pion""" select = self.ligneSelectionnee() if select: numAttaque = int(self.data(sel,0)) reponse = QMessageBox.question(self, 'Message', "Etes vous sûr de vouloir supprimer cette attaque?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reponse == QMessageBox.Yes: self.removeRow(select) def celluleModifiee(self, ligne, colonne): """une cellule de la table a ete modifiee par l'utilisateur, on controle sa validite via la classe Attaque et on retourne la valeur acceptee, ou l'ancienne valeur sinon""" if not self.majEnCours: modeleAttaque = Attaque() if colonne < len(colonnesBase): if colonne == self.posColonne("Nom"): #maj du nom de l'attaque nouveauNom = self.texte(ligne, colonne) modeleAttaque.majNom(nouveauNom) if modeleAttaque.nom() != nouveauNom: self.majTexte(ligne, colonne, modeleAttaque.nom()) elif colonne == self.posColonne("Type"): #maj du type de l'attaque (ici, on ne controle pas, mais on met a jour tout l'affichage si besoin) nouveauType = str(self.cellWidget(ligne, colonne).valeurActuelle().toString()) self.afficherDonneesAttaqueZone(ligne, (nouveauType == "zone")) elif colonne == self.posColonne("Portee"): #maj de la portee de l'attaque nouvellePortee = self.data(ligne, colonne) #! QVariant modeleAttaque.majPortee(nouvellePortee) if modeleAttaque.portee() != nouvellePortee: self.majEnt(ligne, colonne, modeleAttaque.portee()) elif colonne == self.posColonne("Rayon"): #maj du rayon de l'attaque nouveauRayon = self.data(ligne, colonne) #! QVariant modeleAttaque.majRayon(nouveauRayon) if modeleAttaque.rayon() != nouveauRayon: self.majEnt(ligne, colonne, modeleAttaque.rayon()) elif colonne >= 10: #colonnes issues des regles index = colonne - 10 attribut = regles.ordreAttributsAttaques()[index] valeurAttribut = regles.listeControleAttaques()[attribut].controler(str(self.data(ligne, colonne).toString())) if valeurAttribut == None: self.majData(ligne, colonne, regles.listeControleAttaques()[attribut].defaut) 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: modeleAttaque = Attaque() if self.cellWidget(ligne, self.posColonne("Forme")) == None: self.setCellWidget(ligne, self.posColonne("Forme"), self.listeFormesZone(ligne)) item = QTableWidgetItem() item.setData(0, modeleAttaque.rayon()) item.setBackgroundColor(QColor("white")) self.setItem(ligne, self.posColonne("Rayon"), item) else: if self.cellWidget(ligne, self.posColonne("Forme")) != None: self.removeCellWidget(ligne, self.posColonne("Forme")) item = QTableWidgetItem(QString.fromUtf8("")) item.setFlags(Qt.NoItemFlags) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) item.setBackgroundColor(QColor(200,200,200)) self.setItem(ligne, self.posColonne("Forme"), item) item = QTableWidgetItem(QString.fromUtf8("")) item.setFlags(Qt.NoItemFlags) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) item.setBackgroundColor(QColor(200,200,200)) self.setItem(ligne, self.posColonne("Rayon"), item) self.majEnCours = False def typeAttaqueModifie(self): emetteur = self.sender().objectName() ligne = int(emetteur.replace("cbType_","")) colonne = self.posColonne("Type") self.celluleModifiee(ligne, colonne) def formeAttaqueModifiee(self): emetteur = self.sender().objectName() ligne = int(emetteur.replace("cbForme_","")) colonne = self.posColonne("Type") self.celluleModifiee(ligne, colonne) def listeTypesAttaques(self, ligne): """retourne la DmComboBox qui apparait dans la colonne Type d'attaque""" liste = DmComboBox() liste.setObjectName(QString("cbType_{}".format(ligne))) #sert a reconnaitre l'emetteur du signal apres une modif 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.typeAttaqueModifie) return liste def listeFormesZone(self, ligne): """retourne la DmComboBox qui apparait dans la colonne forme de zone""" liste = DmComboBox() liste.setObjectName(QString("cbForme_{}".format(ligne))) 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.formeAttaqueModifiee) return liste