#from __future__ import unicode_literals # -*- coding: utf-8 -*- from __future__ import division import sys from PyQt4.QtCore import SIGNAL, Qt, QString, QSize from PyQt4.QtGui import QDialog, QColorDialog, QColor, QHBoxLayout, QFrame, \ QApplication import Actions from Combattant import Combattant from EcranEditionObjet import EcranEditionObjet from Objet import Objet from VueEditionForme import VueEditionForme from frameAttaque import FrameAttaque from lib.outilsSvg import afficheSvg import regles from rsc import selectionImage import ui.dm as dm from ui.ecran_editionCombattant import Ui_edc_fenetre class EcranEditionCombattant(QDialog): """interface de creation/edition de terrains""" def __init__(self, combattant=None, pageInitiale = 0, formeCases = "H", parent=None): """initialisation de la fenetre""" super (EcranEditionCombattant, self).__init__() self.pixGraphique = None self._compteurAttaque = 0 self.createWidgets() if combattant == None: self.combattant = Combattant() else: self.combattant = combattant self.modeCreation = True self.ouverture() self.ui.edc_menu.setCurrentCell(pageInitiale, 0) self.ui.edc_pages.setCurrentIndex(pageInitiale) if formeCases == "C": self.ui.edc_casesCarrees.setChecked(True) self.majFormeCases() 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 formeCases(self): retour = "" if self.ui.edc_casesHexa.isChecked(): retour = "H" else: retour = "C" return retour def createWidgets(self): """construction de l'interface""" #construction de l'interface self.ui = Ui_edc_fenetre() self.ui.setupUi(self) self.connect(self.ui.edc_nom, SIGNAL("textEdited(QString)"), self.majActivationEnregistrer) self.connect(self.ui.edc_nom, SIGNAL("textEdited(QString)"), self.majEtiquetteVueForme) self.connect(self.ui.edc_enregistrer, SIGNAL("clicked()"), self.enregistrer) self.connect(self.ui.edc_annuler, SIGNAL("clicked()"), self.annuler) self.connect(self.ui.edc_casesHexa, SIGNAL("clicked()"), self.majFormeCases) self.connect(self.ui.edc_casesCarrees, SIGNAL("clicked()"), self.majFormeCases) self.connect(self.ui.edc_couleur, SIGNAL("clicked()"), self.selectionCouleur) self.connect(self.ui.edc_image, SIGNAL("clicked()"), self.selectionImage) self.connect(self.ui.edc_logo, SIGNAL("clicked()"), self.selectionnerLogo) self.vueForme = VueEditionForme(self) self.construireListeAttributs() self.construireInventaire() self.connect(self.ui.edc_filtreTypeObjet, SIGNAL("currentChanged(int)"), self.filtrerInventaire) self.ui.edc_filtreTypeObjet.stackUnder(self.ui.edc_listeInventaire) def layoutAtt(self): """retourne le layout des attaques""" return self.ui.edc_deroulementAttaques_layout def layoutCarac(self): """retourne le layout des attributs""" return self.ui.edc_deroulementAttributs_layout def vueGraphique(self): return self.ui.edc_vueForme def ouverture(self): """premier affichage: on met a jour les champs""" #page_nom self.ui.edc_nom.majTexte(self.combattant.nom) if self.combattant.logo: self.ui.edc_logo.chargerImage(self.combattant.logo) else: self.ui.edc_logo.majTexte("Choisissez \nun fichier\nimage") self.vueForme.creer(self.formeCases()) self.vueForme.autoriserModifForme(self.modeCreation) self.vueForme.majCouleur(self.combattant.couleur) self.vueForme.chargerFormeDef(self.combattant.formeDef[self.formeCases()]) self.vueForme.chargerImageDef(self.combattant.img) self.vueForme.chargerEtiquetteDef(self.combattant.etiquette) #page deplacements self.ui.edc_taille.setValue(self.combattant.hauteur) self.ui.edc_depMarche.setValue(self.combattant.depMarche) self.ui.edc_depNage.setValue(self.combattant.depNage) self.ui.edc_depEscalade.setValue(self.combattant.depEscalade) self.ui.edc_depVol.setValue(self.combattant.depVol) self.ui.edc_saut.setValue(self.combattant.saut) #page attributs self.majListeAttributs() #page attaques: chargement des attaques du combattant, puis panneau 'nouvelle attaque' self.layoutAtt().setAlignment(Qt.AlignTop) for attaque in self.combattant.attaques: self.attaqueNouvelle(attaque) self.attaqueNouvelle() #page inventaire self.ui.edc_listeInventaire.charger(self.combattant.inventaire) self.majTotauxInventaire() #page_notes for detail in self.combattant.details: widget = self.ui.edc_pages.findChild(dm.DmLineEdit, "edc_detail_{}".format(detail)) if widget: widget.majTexte(self.combattant.details[detail]) self.ui.edc_notes.setText(QString.fromUtf8(self.combattant.notes)) #autre self.majActivationEnregistrer() ### page apparence def majFormeCases(self): if self.vueForme.formeCases() != self.formeCases(): #on enregistre la def de forme, d'image et d'etiquette en cours self.combattant.formeDef[self.vueForme.formeCases()] = self.vueForme.formeDef() self.combattant.img = self.vueForme.imageDef() self.combattant.etiquette = self.vueForme.etiquetteDef() #on recree la scene avec la nouvelle forme de cases self.vueForme.vider() self.vueForme.creer(self.formeCases()) #on charge les def correspondantes a la nouvelle forme self.vueForme.chargerFormeDef(self.combattant.formeDef[self.formeCases()]) self.vueForme.chargerImageDef(self.combattant.img) self.vueForme.chargerEtiquetteDef(self.combattant.etiquette) def majEtiquetteVueForme(self): self.combattant.etiquette.txt = self.ui.edc_nom.texte() self.vueForme.chargerEtiquetteDef(self.combattant.etiquette) def selectionnerLogo(self): img = selectionImage() if img: self.ui.edc_logo.chargerImage(img) self.vueForme.nouvelleImageDef(self.ui.edc_logo.image()) def selectionImage(self): """selectionne le fichier image dans la boite de dialogue dediee""" img = selectionImage() if img: self.vueForme.nouvelleImageDef(img) def selectionCouleur(self): """selectionne la couleur dans la boite de dialogue dediee""" couleur = QColorDialog(self).getColor(QColor("white"), self) if couleur.isValid(): self.combattant.couleur = couleur self.vueForme.majCouleur(couleur) #### page attributs def construireListeAttributs(self): """construit les champs d'attributs""" """cree les champs dedies a la saisie des attributs dans la grille dediee""" self.layoutCarac().setSpacing(4) self.layoutCarac().setMargin(0) self.layoutAtt().setAlignment(Qt.AlignLeft) for nomAttribut in regles.ordreAttributsFichePerso(): if len(nomAttribut) > 0: lay = QHBoxLayout() lay.setMargin(0) lay.setSpacing(2) etiquette = dm.DmLabel() etiquette.majTexte(regles.attribut(nomAttribut).nom) etiquette.setObjectName("{}_etiquette".format(nomAttribut)) etiquette.setAlignment(Qt.AlignLeft|Qt.AlignVCenter) etiquette.setMinimumSize(QSize(110, 24)) etiquette.setMaximumSize(QSize(110, 24)) lay.addWidget(etiquette) champ = dm.DmLineEdit() champ.setMinimumSize(QSize(80, 24)) champ.setMaximumSize(QSize(80, 24)) champ.setAlignment(Qt.AlignCenter) champ.majTexte(regles.listeAttributs()[nomAttribut]) champ.setObjectName("{}_champ".format(nomAttribut)) champ.setStyleSheet("background-color: rgb({},{},{});".format(248,248,248)) ## self.connect(champ, SIGNAL("textChanged()"), self.controlerAttribut) lay.addWidget(champ) self.layoutCarac().addLayout(lay) else: lay = QHBoxLayout() etiquetteVide = dm.DmLabel() etiquetteVide.setMinimumHeight(9) etiquetteVide.setMaximumHeight(9) lay.addWidget(etiquetteVide) lay.addWidget(etiquetteVide) self.layoutCarac().addLayout(lay) def majListeAttributs(self): """met a jour la liste des attributs de la Combattant""" for i in range(0, self.layoutCarac().count()): layout = self.layoutCarac().itemAt(i).layout() widget = layout.itemAt(1).widget() if widget != 0: if str(widget.objectName()[-6:]) == "_champ": attr = str(widget.objectName()[:-6]) widget.majTexte(self.combattant.listeAttributs[attr]) def listeAttributs(self): """renvoie la liste des attributs tels qu'ils sont saisis dans la liste des attributs""" attributs = regles.listeAttributs() for i in range(0, self.layoutCarac().count()): layout = self.layoutCarac().itemAt(i).layout() widget = layout.itemAt(1).widget() if widget != 0 and widget != None: if str(widget.objectName()[-6:]) == "_champ": attr = str(widget.objectName()[:-6]) attributs[attr] = widget.texte() return attributs #### page attaques def attaqueNouvelle(self, attaque = None): """ajoute une nouvelle ligne a la liste des attaques""" #on ajoute de suite un panneau 'nouvelle attaque en dessous' self._compteurAttaque += 1 panneau = FrameAttaque(self._compteurAttaque) if attaque: panneau.chargerAttaque(attaque) panneau.setObjectName(QString("att_frame_{}".format(self._compteurAttaque))) self.connect(panneau, SIGNAL("attaqueNouvelle()"), self.attaqueNouvelle) self.connect(panneau, SIGNAL("attaqueSupprimer(int)"), self.attaqueSupprimer) self.layoutAtt().addWidget(panneau) def attaqueSupprimer(self, index): """supprime la ligne selectionnee de la liste des attaques""" panneau = self.findChild(QFrame, "att_frame_{}".format(index)) self.layoutAtt().removeWidget(panneau) ### page inventaire def construireInventaire(self): """construction de la page inventaire""" self.ui.edc_listeInventaire.construire() self.connect(self.ui.edc_listeInventaire, SIGNAL("objetClique(int)"), self.editerObjet) def editerObjet(self, indexObjet): if indexObjet < len(self.ui.edc_listeInventaire.inventaire()): objet = self.ui.edc_listeInventaire.inventaire()[indexObjet] else: objet = None typeObjet = self.ui.edc_filtreTypeObjet.currentIndex() - 1 self.fenetreEO = EcranEditionObjet(objet, typeObjet) self.fenetreEO.show() self.fenetreEO.exec_() resultat = self.fenetreEO.resultat() if resultat: if objet: self.ui.edc_listeInventaire.majObjet(objet, resultat) else: self.ui.edc_listeInventaire.ajouterObjet(resultat) else: if objet: self.ui.edc_listeInventaire.supprimerObjet(objet) self.fenetreEO = None self.majTotauxInventaire() def majTotauxInventaire(self): inv = self.ui.edc_listeInventaire.inventaire() poidsTotal = 0.00 for obj in inv: poidsTotal += obj.poidsTotal() self.ui.edc_inventaire_poids.majTexte("{} kg".format(poidsTotal)) def filtrerInventaire(self, index): filtre = index - 1 self.ui.edc_listeInventaire.filtrer(filtre) #### barre d'outils def majActivationEnregistrer(self): """verifie la validite des saisies""" self.ui.edc_enregistrer.setEnabled(len(self.ui.edc_nom.texte()) > 0) def enregistrer(self): """enregistre le terrain cree/edite""" #identifiant if not self.combattant.id: self.combattant.id = self.nouvelIdCombattant() #page nom self.combattant.nom = self.ui.edc_nom.texte() self.combattant.logo = self.ui.edc_logo.image() self.combattant.formeDef[self.vueForme.formeCases()] = self.vueForme.formeDef() self.combattant.img = self.vueForme.imageDef() self.combattant.etiquette = self.vueForme.etiquetteDef() #page dep self.combattant.hauteur = self.ui.edc_taille.value() self.combattant.depMarche = self.ui.edc_depMarche.value() self.combattant.depNage = self.ui.edc_depNage.value() self.combattant.depEscalade = self.ui.edc_depEscalade.value() self.combattant.depVol = self.ui.edc_depVol.value() self.combattant.saut = self.ui.edc_saut.value() #page attributs self.combattant.listeAttributs = self.listeAttributs() #page attaque listeAttaques = [] for i in range(0, self.layoutAtt().count()): panneau = self.layoutAtt().itemAt(i).widget() if panneau != 0: attaque = panneau.attaque() if attaque: listeAttaques.append(attaque) self.combattant.attaques = listeAttaques #page inventaire self.combattant.inventaire = self.ui.edc_listeInventaire.inventaire() #page notes listeWidget = self.ui.edc_pages.findChildren(dm.DmLineEdit) for widget in listeWidget: detail = str(widget.objectName()).replace("edc_detail_","") txt = widget.texte() if len(txt) > 0: self.combattant.details[detail] = txt self.combattant.notes = str(self.ui.edc_notes.toPlainText().toUtf8()) # enregistrer(self.combattant.id, self.combattant, "lib\\biblio\\combattant") # self.combattant = None self.done(1) def annuler(self): """annule la creation/edition""" self.combattant = None self.done(0) if __name__ == "__main__": app = QApplication(sys.argv) ecran = EcranEditionCombattant() ecran.show() r = app.exec_() exit(r)