#from __future__ import unicode_literals # -*- coding: utf-8 -*- from __future__ import division from PyQt4.QtCore import * from PyQt4.QtGui import * from Combattant import Combattant from ui.ecran_editionCombattant import Ui_editionCombattant from outilsSvg import * from VueEditionForme import VueEditionForme from EcranEditionAttaques import EcranEditionAttaques import regles class EcranEditionCombattant(QDialog): """interface de creation/edition de terrains""" def __init__(self, combattant=None, formeCases = "H", parent=None): """initialisation de la fenetre""" super (EcranEditionCombattant, self).__init__() self.pixGraphique = None self.formeCases = formeCases self.createWidgets() if combattant == None: self.combattant = Combattant() self.accesCreation() else: self.combattant = combattant self.accesEdition() self.majAffichage("") self.afficheListeAttaques() self.majListeAttributs() ## self.majListeInventaire() def createWidgets(self): """construction de l'interface""" #construction de l'interface self.ui = Ui_editionCombattant() self.ui.setupUi(self) self.connect(self.ui.enregistrerCombattant, SIGNAL("clicked()"), self.enregistrer) self.connect(self.ui.annulerCombattant, SIGNAL("clicked()"), self.annuler) self.connect(self.ui.supprimerCombattant, SIGNAL("clicked()"), self.supprimer) self.connect(self.ui.idCombattant, SIGNAL("textEdited(QString)"), self.majAffichage) self.connect(self.ui.nomCombattant, SIGNAL("textEdited(QString)"), self.majAffichage) self.connect(self.ui.couleurCombattant, SIGNAL("clicked()"), self.selectionCouleur) self.connect(self.ui.imgTextureCombattant, SIGNAL("textEdited(QString)"), self.majApercuImage) self.connect(self.ui.imgLogoCombattant, SIGNAL("textEdited(QString)"), self.majApercuImage) self.connect(self.ui.imgAfficherCombattant, SIGNAL("stateChanged(int)"), self.majApercuImage) self.connect(self.ui.imgPivoteCombattant, SIGNAL("stateChanged(int)"), self.majApercuImage) self.connect(self.ui.imgMasqueCombattant, SIGNAL("stateChanged(int)"), self.majApercuImage) self.connect(self.ui.imgTailleXCombattant, SIGNAL("valueChanged(int)"), self.majApercuImage) self.connect(self.ui.imgTailleYCombattant, SIGNAL("valueChanged(int)"), self.majApercuImage) self.connect(self.ui.imgPosXCombattant, SIGNAL("valueChanged(int)"), self.majApercuImage) self.connect(self.ui.imgPosYCombattant, SIGNAL("valueChanged(int)"), self.majApercuImage) self.connect(self.ui.imgRotationCombattant, SIGNAL("valueChanged(int)"), self.majApercuImage) self.connect(self.ui.imgReinitCombattant, SIGNAL("clicked()"), self.reinitImage) self.connect(self.ui.nomCombattant, SIGNAL("textEdited(QString)"), self.majApercuTexte) self.connect(self.ui.txtAfficherCombattant, SIGNAL("stateChanged(int)"), self.majApercuTexte) self.connect(self.ui.txtTaillePoliceCombattant, SIGNAL("valueChanged(int)"), self.majApercuTexte) self.connect(self.ui.txtGrasCombattant, SIGNAL("stateChanged(int)"), self.majApercuTexte) self.connect(self.ui.txtPosXCombattant, SIGNAL("valueChanged(int)"), self.majApercuTexte) self.connect(self.ui.txtPosYCombattant, SIGNAL("valueChanged(int)"), self.majApercuTexte) self.connect(self.ui.txtRotationCombattant, SIGNAL("valueChanged(int)"), self.majApercuTexte) self.connect(self.ui.txtReinitCombattant, SIGNAL("clicked()"), self.reinitTexte) self.vueForme = VueEditionForme(self, self.formeCases) self.vueForme.creer() self.ui.listeAttributs.setColumnWidth(0, (0.4*self.ui.listeAttributs.width())) self.ui.listeAttributs.setColumnWidth(1, (0.4*self.ui.listeAttributs.width())) self.connect(self.ui.listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee, Qt.UniqueConnection) ## self.ui.listeInventaireCombattant.setColumnWidth(0, (0.2*self.ui.listeInventaireCombattant.width())) ## self.ui.listeInventaireCombattant.setColumnWidth(1, (0.8*self.ui.listeInventaireCombattant.width())) ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("clicked()"), self.listeInventaireCelluleModifiee) ## self.connect(self.ui.supprimerInventaireCombattant, SIGNAL("clicked()"), self.supprimerLigneListeInventaire) ## self.connect(self.ui.ajouterInventaireCombattant, SIGNAL("clicked()"), self.ajouterLigneListeInventaire) def accesEdition(self): """ouverture en mode edition""" self.ui.idCombattant.setEnabled(True) self.ui.idCombattant.setText(QString.fromUtf8(str(self.combattant.id))) self.ui.nomCombattant.setText(QString.fromUtf8(str(self.combattant.nom))) self.ui.notesCombattant.setText(QString.fromUtf8(str(self.combattant.notes))) if self.combattant.couleur.isValid(): self.ui.affichageCouleurCombattant.setStyleSheet("QLabel {backGround:%s}" %(self.combattant.couleur.name())) self.ui.imgLogoCombattant.setText(QString.fromUtf8(str(self.combattant.logo))) self.ui.imgTextureCombattant.setText(QString.fromUtf8(str(self.combattant.img.nom))) self.ui.imgTailleXCombattant.setValue(self.combattant.img.kx) self.ui.imgTailleYCombattant.setValue(self.combattant.img.ky) self.ui.imgPosXCombattant.setValue(self.combattant.img.dx) self.ui.imgPosYCombattant.setValue(self.combattant.img.dy) self.ui.imgRotationCombattant.setValue(self.combattant.img.rotation) self.ui.imgPivoteCombattant.setChecked(self.combattant.img.pivote) self.ui.imgMasqueCombattant.setChecked(self.combattant.img.masqueAuto) self.ui.txtTaillePoliceCombattant.setValue(self.combattant.etiquette.taille_police) self.ui.txtGrasCombattant.setChecked(self.combattant.etiquette.gras) self.ui.txtPosXCombattant.setValue(self.combattant.etiquette.dx) self.ui.txtPosYCombattant.setValue(self.combattant.etiquette.dy) self.ui.txtRotationCombattant.setValue(self.combattant.etiquette.rotation) self.ui.deplacementCombattant.setValue(self.combattant.deplacement) self.ui.hauteurCombattant.setValue(self.combattant.hauteur) self.ui.volCombattant.setChecked(self.combattant.vol) self.vueForme.majForme(self.combattant.formeDef[self.formeCases]) self.ui.supprimerCombattant.setEnabled(True) self.ui.idCombattant.setEnabled(False) self.majApercuImage() self.majApercuTexte() def accesCreation(self): """ouverture en mode creation""" self.ui.idCombattant.setEnabled(True) self.ui.idCombattant.setText(QString.fromUtf8(str(self.nouvelIdCombattant()))) self.ui.idCombattant.setEnabled(False) self.majApercuImage() self.majApercuTexte() def majAffichage(self, txt): """verifie la validite des saisies""" self.ui.enregistrerCombattant.setEnabled(len(self.ui.idCombattant.text().toUtf8()) > 0 and len(self.ui.nomCombattant.text().toUtf8()) > 0) def afficheListeAttaques(self): """insere la frame d'edition des attaques""" tabAttaques = self.ui.ongletsCreation.widget(1) editionAttaques = EcranEditionAttaques(self.combattant) editionAttaques.setParent(tabAttaques) def majListeAttributs(self): """met a jour la liste des attributs de la Combattant""" """met a jour la liste des attributs dans le panneau de combat""" self.disconnect(self.ui.listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee) #on vide la liste while self.ui.listeAttributs.rowCount() > 0: self.ui.listeAttributs.removeRow(0) #attributs issus des regles utilisees ordre = regles.ordreAttributs() for elt in ordre: ligne = ordre.index(elt) self.ui.listeAttributs.insertRow(ligne) if regles.attribut(elt).combatSeulement == True: self.ui.listeAttributs.setRowHidden(ligne, True) item = QTableWidgetItem(QString.fromUtf8(elt)) item.setFlags(Qt.NoItemFlags) self.ui.listeAttributs.setItem(ligne, 0, item) self.ui.listeAttributs.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(str(self.combattant.lstCaracCombattant[elt])))) self.connect(self.ui.listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee) def listeAttributCelluleModifiee(self, ligne, colonne): """une cellule de la liste des attributs a ete modifiee""" if colonne != 1: pass else: attribut = regles.ordreAttributs()[(ligne)] nouvelleVal = str(self.ui.listeAttributs.item(ligne, 1).text().toUtf8()) valVerifiee = regles.listeControle()[attribut].controler(nouvelleVal) if valVerifiee != None: self.combattant.lstCaracCombattant[attribut] = valVerifiee else: self.ui.listeAttributs.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(str(self.combattant.lstCaracCombattant[attribut])))) ## def majListeInventaire(self): ## """met a jour la liste de l'inventaire de la Combattant""" ## self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee) ## ## #on vide la liste ## while self.ui.listeInventaireCombattant.rowCount() > 0: ## self.ui.listeInventaireCombattant.removeRow(0) ## ligne = 0 ## #attributs issus des regles utilisees ## for objet in self.combattant.inventaire: ## self.ui.listeInventaireCombattant.insertRow(ligne) ## self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8(self.combattant.inventaire[objet]))) ## self.ui.listeInventaireCombattant.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(objet))) ## ligne += 1 ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee) ## ## def listeInventaireCelluleModifiee(self, ligne, colonne): ## """une cellule de la liste des attributs a ete modifiee""" ## nouvelleVal = str(self.ui.listeInventaireCombattant.item(ligne, colonne).text().toUtf8()) ## val = None ## if colonne == 0: ## try: ## nbre = int(nouvelleVal) ## except: ## nbre = -1 ## if nbre >= 0: val = str(nbre) ## else: ## val = str(nouvelleVal) ## if val in self.combattant.inventaire or len(val) == 0: ## print("cet objet existe deja ou a un nom invalide") ## val = None ## ## if colonne == 0: ## if val != None: ## self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())] = val ## else: ## self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8(\ ## str(self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())])))) ## else: ## txt = str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8()) ## if txt in self.combattant.inventaire: ## del self.combattant.inventaire[txt] ## if val != None: ## self.combattant.inventaire[val] = txt ## else: ## self.ui.listeInventaireCombattant.removeRow(ligne) ## ## def ajouterLigneListeInventaire(self, objet=""): ## num = -1 ## for i in range(0, self.ui.listeInventaireCombattant.rowCount()): #si un objet de la liste a deja un nom vide, on ne cree pas de nouvelle ligne ## if len(str(self.ui.listeInventaireCombattant.item(i, 0).text().toUtf8())) == 0: ## num = i ## break ## if num < 0: ## self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee) ## ligne = self.ui.listeInventaireCombattant.rowCount() ## self.ui.listeInventaireCombattant.insertRow(ligne) ## self.ui.listeInventaireCombattant.setItem(ligne, 0, QTableWidgetItem(QString.fromUtf8("0"))) ## self.ui.listeInventaireCombattant.setItem(ligne, 1, QTableWidgetItem(QString.fromUtf8(objet))) ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee) ## else: ## self.ui.listeInventaireCombattant.setCurrentRow(num) ## ## def supprimerLigneListeInventaire(self): ## self.disconnect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee) ## ligne = self.ui.listeInventaireCombattant.currentRow() ## del self.combattant.inventaire[str(self.ui.listeInventaireCombattant.item(ligne, 1).text().toUtf8())] ## self.ui.listeInventaireCombattant.removeRow(ligne) ## self.connect(self.ui.listeInventaireCombattant, SIGNAL("cellChanged(int,int)"), self.listeInventaireCelluleModifiee) def majApercuImage(self): """met a jour l'image sur l'apercu du pion""" if self.ui.imgAfficherCombattant.isChecked(): if len(str(self.ui.imgTextureCombattant.text().toUtf8())) > 0: img = str(self.ui.imgTextureCombattant.text().toUtf8()) self.vueForme.majImage(img, self.ui.imgTailleXCombattant.value() \ , self.ui.imgTailleYCombattant.value() \ , self.ui.imgPosXCombattant.value() \ , self.ui.imgPosYCombattant.value() \ , self.ui.imgRotationCombattant.value() \ , self.ui.imgPivoteCombattant.isChecked() \ , self.ui.imgMasqueCombattant.isChecked() ) else: img = str(self.ui.imgLogoCombattant.text().toUtf8()) self.vueForme.majImage(img) else: img = "" self.vueForme.majImage(img) def majApercuTexte(self): """met a jour l'etiquette sur l'apercu du pion""" if self.ui.txtAfficherCombattant.isChecked(): txt = str(self.ui.nomCombattant.text().toUtf8()) else: txt = "Pion" self.vueForme.majTexte(txt, self.ui.txtTaillePoliceCombattant.value() \ , self.ui.txtGrasCombattant.isChecked() \ , self.ui.txtPosXCombattant.value() \ , self.ui.txtPosYCombattant.value() \ , self.ui.txtRotationCombattant.value()) def reinitImage(self): self.ui.imgTailleXCombattant.setValue(10) self.ui.imgTailleYCombattant.setValue(10) self.ui.imgPosXCombattant.setValue(0) self.ui.imgPosYCombattant.setValue(0) self.ui.imgRotationCombattant.setValue(0) self.ui.imgPivoteCombattant.setChecked(False) self.ui.imgMasqueCombattant.setChecked(False) self.majApercuImage() def reinitTexte(self): self.ui.txtTaillePoliceCombattant.setValue(21) self.ui.txtGrasCombattant.setCheckState(0) self.ui.txtPosXCombattant.setValue(0) self.ui.txtPosYCombattant.setValue(0) self.ui.txtRotationCombattant.setValue(0) self.majApercuTexte() def nouvelIdCombattant(self): """renvoie un identifiant pour un nouveau terrain""" dicoSvg = afficheSvg("lib\\biblio\\Combattant") nouvelId = 1 while str(nouvelId) in dicoSvg.keys(): nouvelId += 1 return str(nouvelId) def selectionCouleur(self): """selectionne la couleur dans la boite de dialogue dediee""" couleur = QColorDialog(self).getColor(QColor("white"), self) if couleur.isValid(): nomCouleur = couleur.name() self.ui.affichageCouleurCombattant.setStyleSheet("QLabel {backGround:%s}" %(nomCouleur)) self.combattant.couleur = couleur def enregistrer(self): """enregistre le terrain cree/edite""" self.combattant.id = str(self.ui.idCombattant.text().toUtf8()) self.combattant.nom = str(self.ui.nomCombattant.text().toUtf8()) self.combattant.logo = str(self.ui.imgLogoCombattant.text().toUtf8()) if len(str(self.ui.imgTextureCombattant.text().toUtf8())) > 0: self.combattant.img.nom = str(self.ui.imgTextureCombattant.text().toUtf8()) self.combattant.img.kx = self.ui.imgTailleXCombattant.value() self.combattant.img.ky = self.ui.imgTailleYCombattant.value() self.combattant.img.dx = self.ui.imgPosXCombattant.value() self.combattant.img.dy = self.ui.imgPosYCombattant.value() self.combattant.img.rotation = self.ui.imgRotationCombattant.value() self.combattant.img.pivote = self.ui.imgPivoteCombattant.isChecked() self.combattant.img.masqueAuto = self.ui.imgMasqueCombattant.isChecked() else: self.combattant.img.nom = str(self.ui.imgLogoCombattant.text().toUtf8()) self.combattant.img.kx = 10 self.combattant.img.ky = 10 self.combattant.img.dx = 0 self.combattant.img.dy = 0 self.combattant.img.rotation = 0 self.combattant.img.pivote = False self.combattant.img.masqueAuto = False self.combattant.etiquette.taille_police = self.ui.txtTaillePoliceCombattant.value() self.combattant.etiquette.gras = bool(self.ui.txtGrasCombattant.checkState()) self.combattant.etiquette.dx = self.ui.txtPosXCombattant.value() self.combattant.etiquette.dy = self.ui.txtPosYCombattant.value() self.combattant.etiquette.rotation = self.ui.txtRotationCombattant.value() self.combattant.deplacement = int(self.ui.deplacementCombattant.value()) self.combattant.hauteur = int(self.ui.hauteurCombattant.value()) self.combattant.vol = self.ui.volCombattant.isChecked() self.combattant.formeDef[self.formeCases] = self.vueForme.formeDef() self.combattant.notes = str(self.ui.notesCombattant.toPlainText()) #attributs, attaques et inventaire enregistres lors de la modif des listes enregistrer(self.combattant.id, self.combattant, "lib\\biblio\\Combattant") self.combattant = None self.emit(SIGNAL("majListCombattants()")) self.close() def supprimer(self): """supprimer l'enregistrement de ce terrain""" supprSvg("lib\\biblio\\Combattant", self.combattant.id) self.emit(SIGNAL("majListCombattants()")) self.close() def annuler(self): """annule la creation/edition""" self.combattant = None self.close()