#from __future__ import unicode_literals # -*- coding: utf-8 -*- from __future__ import division import sys from PyQt4.QtCore import SIGNAL, Qt, QString, QSize, QVariant from PyQt4.QtGui import QDialog, QColorDialog, QColor, QHBoxLayout, QFrame, \ QApplication, QCheckBox import Actions from Combattant import Combattant from EcranEditionObjet import EcranEditionObjet from Objet import Objet from VueEditionForme import VueEditionForme from dialogues import dmMessage from frameAttaque import FrameAttaque from lib.Decor import Decor from lib.commun import lstLibEtats import regles from rsc import selectionImage, RImage import ui.dm as dm from ui.ecran_editionMateriel import Ui_edm_fenetre def nouveauCombattant(): return Combattant() def nouveauDecor(): return Decor() class EcranEditionMateriel(QDialog): """interface de creation/edition de terrains""" def __init__(self, mat, parent=None): """initialisation de la fenetre""" super (EcranEditionMateriel, self).__init__() self._mat = mat self._mode = "creation" if mat.position == (-1,-1) else "combat" self._sections = [] def mat(self): """retourne le materiel de la fenetre""" return self._mat def mode(self): return self._mode def createWidgets(self): """construction de l'interface""" #construction de l'interface self.ui = Ui_edm_fenetre() self.ui.setupUi(self) self.connect(self.ui.edm_enregistrer, SIGNAL("clicked()"), self.valider) self.connect(self.ui.edm_annuler, SIGNAL("clicked()"), self.annuler) def toutesLesSections(self): return [EdEnTete, EdPageCreation, EdPageCombat, EdPageDeplacement, EdPageProprietes, \ EdPageAttributs, EdPageAttaques, EdPageInventaire, EdPageNotes] def section(self, nom): for section in self._sections: if section.__class__.__name__ == nom: return section return None def afficher(self, pageInitiale = 0, formeCases = "H"): """affiche la fenetre""" self.createWidgets() #on instancie et on construit les sections necessaires for section in self.toutesLesSections(): instance = section(self) if self.mat().typ() in instance.filtre() \ and self._mode in instance.modes(): self._sections.append(instance) instance.construire() if section == EdPageCreation: if formeCases == "C": self.ui.edm_casesCarrees.setChecked(True) instance.charger() else: self.ui.edm_menu.setRowHidden((self.toutesLesSections().index(section) - 1), True) self.allerAPage(pageInitiale) self.majAffichage() self.show() def allerAPage(self, index, sens = "+"): while self.ui.edm_menu.isRowHidden(index): index += 1 if sens == "+" else -1 if index > self.ui.edm_menu.rowCount(): return self.ui.edm_menu.setCurrentCell(index, 0) self.ui.edm_menu.setCurrentCell(index, 1) self.ui.edm_pages.setCurrentIndex(index) def pageSuivante(self): index = self.ui.edm_menu.currentRow() + 1 if index > (self.ui.edm_menu.rowCount() - 1): index = 0 self.allerAPage(index) def pagePrecedente(self): index = self.ui.edm_menu.currentRow() - 1 if index < 0: index = self.ui.edm_menu.rowCount() - 1 self.allerAPage(index, "-") def nomModifie(self): """le nom du pion a ete modifie""" self.majAffichage() sectionForme = self.section("EdPageCreation") if sectionForme: sectionForme.majEtiquetteVueForme() def logoModifie(self): """le logo du pion a ete modifie""" sectionForme = self.section("EdPageCreation") if sectionForme: sectionForme.logoModifie() #### barre d'outils def majAffichage(self): """verifie la validite des saisies""" self.ui.edm_enregistrer.setEnabled(len(self.ui.edm_nom.texte()) > 0) def valider(self): """enregistre le materiel cree/edite""" for section in self._sections: section.enregistrer() self.done(1) def annuler(self): """annule la creation/edition""" self._mat = None self.done(0) def wheelEvent(self, event): if event.delta() < 0: self.pageSuivante() return elif event.delta() > 0: self.pagePrecedente() return return QDialog.wheelEvent(self, event) class EdSectionBase(object): """classe de base pour les differentes sections de l'ecran d'edition des pions""" def __init__(self, ecran): self.ecran = ecran self._filtre = [] self._modes = ["creation", "combat"] def filtre(self): """liste des classes de materiel concernees par cette section""" return self._filtre def modes(self): return self._modes def ui(self): return self.ecran.ui def mat(self): return self.ecran.mat() def construire(self): """construit et met en forme""" pass def charger(self): """charge les donnees du materiel dans la section""" pass def enregistrer(self): """met a jour le materiel en fonction des donnees saisies""" pass class EdEnTete(EdSectionBase): def __init__(self, ecran): super(EdEnTete, self).__init__(ecran) self._filtre = ["cb", "dc"] def construire(self): if self.ecran.mode() == "creation": self.ecran.connect(self.ui().edm_logo, SIGNAL("clicked()"), self.selectionnerLogo) self.ecran.connect(self.ui().edm_nom, SIGNAL("textEdited(QString)"), self.ecran.nomModifie) else: self.ui().edm_nom.setEnabled(False) self.majLibelleMode() def majLibelleMode(self): if self.mat().typ() == "cb": txt1 = "Fiche de personnage" else: txt1 = "Fiche du decor" txt2 = " Creation" if self.ecran.mode() == "creation" else "Combat" self.ui().edm_mode.majTexte((txt1 + " : " + txt2).upper()) couleur = "rgb(180,60,50)" if self.ecran.mode() == "combat" else "rgb(20,20,150)" self.ui().edm_enTete.setStyleSheet(QString("#edm_mode {color: "+couleur+";}")) def selectionnerLogo(self): img = selectionImage() if img: self.ui().edm_logo.chargerImage(img) self.ecran.logoModifie() def charger(self): self.ui().edm_nom.majTexte(self.mat().nom()) if self.mat().logo.estValide(): self.ui().edm_logo.chargerImage(self.mat().logo) else: self.ui().edm_logo.majTexte("Choisissez \nun fichier\nimage") def enregistrer(self): self.mat().majNom(self.ui().edm_nom.texte()) self.mat().logo = self.ui().edm_logo.image() if self.ui().edm_logo.image() else RImage() class EdPageCreation(EdSectionBase): def __init__(self, ecran): super(EdPageCreation, self).__init__(ecran) self._filtre = ["cb", "dc"] self._modes = ["creation"] def construire(self): self.vueForme = VueEditionForme(self.ui().edm_vueForme) self.ecran.connect(self.ui().edm_aideForme, SIGNAL("clicked()"), self.afficherAideForme) self.ecran.connect(self.ui().edm_casesHexa, SIGNAL("clicked()"), self.majFormeCases) self.ecran.connect(self.ui().edm_casesCarrees, SIGNAL("clicked()"), self.majFormeCases) self.ecran.connect(self.ui().edm_couleur, SIGNAL("clicked()"), self.selectionCouleur) self.ecran.connect(self.ui().edm_image, SIGNAL("clicked()"), self.selectionImage) def formeCases(self): return "H" if self.ui().edm_casesHexa.isChecked() else "C" def majFormeCases(self): if self.vueForme.formeCases() != self.ecran.formeCases(): #on enregistre la def de forme, d'image et d'etiquette en cours self.mat().formeDef[self.vueForme.formeCases()] = self.vueForme.formeDef() self.mat().img = self.vueForme.imageDef() self.mat().etiquette = self.vueForme.etiquetteDef() #on recree la scene avec la nouvelle forme de cases self.vueForme.vider() self.vueForme.creer(self.ecran.formeCases()) #on charge les def correspondantes a la nouvelle forme self.vueForme.chargerFormeDef(self.mat().formeDef[self.formeCases()]) self.vueForme.chargerImageDef(self.mat().img) self.vueForme.chargerEtiquetteDef(self.mat().etiquette) def majEtiquetteVueForme(self): self.mat().etiquette.txt = self.ui().edm_nom.texte() self.vueForme.chargerEtiquetteDef(self.mat().etiquette) def logoModifie(self): self.vueForme.nouvelleImageDef(self.ui().edm_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.ecran).getColor(QColor("white"), self.ecran) if couleur.isValid(): self.mat().couleur = couleur self.vueForme.majCouleur(couleur) def afficherAideForme(self): msg = "Sur l'écran ci-contre, vous pouvez éditer la forme et l'apparence de votre pion. Vous pouvez: \n\n" \ "Choisir la couleur du pion \n" \ "Choisir une image (qui remplacera alors le logo sur le pion) \n" \ "Deplacer l'etiquette et l'image sur le pion en cliquant dessus \n" \ "Faire pivoter l'image avec [FLECHE HAUT] et [FLECHE BAS] \n" \ "Modifier la taille de l'image avec [FLECHE GAUCHE] et [FLECHE DROITE] \n" \ "Activer desactiver l'etiquette en gras avec [G] \n" \ "Modifier la taille de la police avec [FLECHE HAUT] et [FLECHE BAS]" dmMessage(msg) def charger(self): self.vueForme.creer(self.formeCases()) self.vueForme.autoriserModifForme(True) self.vueForme.majCouleur(self.mat().couleur) self.vueForme.chargerFormeDef(self.mat().formeDef[self.formeCases()]) self.vueForme.chargerImageDef(self.mat().img) self.vueForme.chargerEtiquetteDef(self.mat().etiquette) def enregistrer(self): self.mat().formeDef[self.vueForme.formeCases()] = self.vueForme.formeDef() self.mat().img = self.vueForme.imageDef() self.mat().etiquette = self.vueForme.etiquetteDef() class EdPageCombat(EdSectionBase): def __init__(self, ecran): super(EdPageCombat, self).__init__(ecran) self._filtre = ["cb", "dc"] self._modes = ["combat"] def construire(self): #etat dico = lstLibEtats(self.mat().typ()) for num in dico: self.ui().edm_etat.addItem(QString.fromUtf8(dico[num]), QVariant(num)) self.ui().edm_etat.setCurrentIndex(0) #statuts if self.mat().typ() == "dc": self.ui().edm_statut0.setVisible(False) self.ui().edm_statut1.setVisible(False) self.ui().edm_statut2.setVisible(False) self.ui().edm_statut3.setVisible(False) self.ui().edm_effets.setVisible(False);self.ui().edm_effets_lbl.setVisible(False) self.ui().edm_actions_lbl.setVisible(False) else: self.ui().edm_statut5.setVisible(False) # self.ui().edm_layoutStatuts.update() def charger(self): self.ui().edm_etat.setCurrentIndex(self.ui().edm_etat.findData(QVariant(self.mat().etat))) for statut in self.mat().statuts: case = self.ui().page_cbt.findChild(QCheckBox, "edm_statut{}".format(statut)) if case: case.setChecked(True) def enregistrer(self): self.mat().etat = self.ui().edm_etat.itemData(self.ui().edm_etat.currentIndex()).toInt()[0] self.mat().statuts = [] for i in range(0, 6): case = self.ui().page_cbt.findChild(QCheckBox, "edm_statut{}".format(i)) if case: if case.isChecked(): self.mat().statuts.append(i) class EdPageDeplacement(EdSectionBase): def __init__(self, ecran): super(EdPageDeplacement, self).__init__(ecran) self._filtre = ["cb"] def charger(self): self.ui().edm_taille.setValue(self.mat().h) self.ui().edm_depMarche.setValue(self.mat().depMarche) self.ui().edm_depNage.setValue(self.mat().depNage) self.ui().edm_depEscalade.setValue(self.mat().depEscalade) self.ui().edm_depVol.setValue(self.mat().depVol) self.ui().edm_saut.setValue(self.mat().saut) def enregistrer(self): self.mat().h = self.ui().edm_taille.value() self.mat().depMarche = self.ui().edm_depMarche.value() self.mat().depNage = self.ui().edm_depNage.value() self.mat().depEscalade = self.ui().edm_depEscalade.value() self.mat().depVol = self.ui().edm_depVol.value() self.mat().saut = self.ui().edm_saut.value() class EdPageProprietes(EdSectionBase): def __init__(self, ecran): super(EdPageProprietes, self).__init__(ecran) self._filtre = ["dc"] def charger(self): self.ui().edm_hauteur.setValue(self.mat().h) self.ui().edm_hauteurPlafond.setChecked(self.mat().hMax) self.ui().edm_escalade.setChecked(self.mat().escalade) self.ui().edm_inflammable.setChecked(self.mat().inflammable) def enregistrer(self): self.mat().h = self.ui().edm_hauteur.value() self.mat().hMax = self.ui().edm_hauteurPlafond.isChecked() self.mat().escalade = self.ui().edm_escalade.isChecked() self.mat().brule = self.ui().edm_inflammable.isChecked() class EdPageAttributs(EdSectionBase): def __init__(self, ecran): super(EdPageAttributs, self).__init__(ecran) self._filtre = ["cb"] self._modes = ["creation", "combat"] def layoutCarac(self): """retourne le layout des attributs""" return self.ecran.ui.edm_deroulementAttributs_layout def construire(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) 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 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 def charger(self): """met a jour la liste des attributs du 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.ecran.mat().listeAttributs[attr]) def enregistrer(self): self.mat().attributs = self.listeAttributs() class EdPageAttaques(EdSectionBase): def __init__(self, ecran): super(EdPageAttaques, self).__init__(ecran) self._filtre = ["cb"] self._compteurAttaque = 0 def layoutAtt(self): """retourne le layout des attaques""" return self.ecran.ui.edm_deroulementAttaques_layout def construire(self): self.layoutAtt().setAlignment(Qt.AlignLeft) 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.ecran.connect(panneau, SIGNAL("attaqueNouvelle()"), self.attaqueNouvelle) self.ecran.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) def charger(self): self.layoutAtt().setAlignment(Qt.AlignTop) for attaque in self.mat().attaques: self.attaqueNouvelle(attaque) self.attaqueNouvelle() def enregistrer(self): 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.mat().attaques = listeAttaques class EdPageInventaire(EdSectionBase): def __init__(self, ecran): super(EdPageInventaire, self).__init__(ecran) self._filtre = ["cb", "dc"] def construire(self): self.ecran.ui.edm_listeInventaire.construire() self.ecran.connect(self.ecran.ui.edm_filtreTypeObjet, SIGNAL("currentChanged(int)"), self.filtrerInventaire) self.ecran.ui.edm_filtreTypeObjet.stackUnder(self.ecran.ui.edm_listeInventaire) self.ecran.connect(self.ecran.ui.edm_listeInventaire, SIGNAL("objetClique(int)"), self.editerObjet) def editerObjet(self, indexObjet): if indexObjet < len(self.ecran.ui.edm_listeInventaire.inventaire()): objet = self.ecran.ui.edm_listeInventaire.inventaire()[indexObjet] else: objet = None typeObjet = self.ecran.ui.edm_filtreTypeObjet.currentIndex() - 1 self.fenetreEO = EcranEditionObjet(objet, typeObjet) self.fenetreEO.show() self.fenetreEO.exec_() resultat = self.fenetreEO.resultat() if resultat: if objet: self.ecran.ui.edm_listeInventaire.majObjet(objet, resultat) else: self.ecran.ui.edm_listeInventaire.ajouterObjet(resultat) else: if objet: self.ecran.ui.edm_listeInventaire.supprimerObjet(objet) self.fenetreEO = None self.majTotauxInventaire() def majTotauxInventaire(self): inv = self.ecran.ui.edm_listeInventaire.inventaire() poidsTotal = 0.00 for obj in inv: poidsTotal += obj.poidsTotal() self.ecran.ui.edm_inventaire_poids.majTexte("{} kg".format(poidsTotal)) def filtrerInventaire(self, index): filtre = index - 1 self.ecran.ui.edm_listeInventaire.filtrer(filtre) def charger(self): self.ui().edm_listeInventaire.charger(self.mat().inventaire) self.majTotauxInventaire() def enregistrer(self): self.mat().inventaire = self.ui().edm_listeInventaire.inventaire() class EdPageNotes(EdSectionBase): def __init__(self, ecran): super(EdPageNotes, self).__init__(ecran) self._filtre = ["cb", "dc"] def construire(self): if self.mat().typ() == "dc": self.ui().edm_detail_espece.setVisible(False);self.ui().edm_lbl_espece.setVisible(False) self.ui().edm_detail_profession.setVisible(False);self.ui().edm_lbl_profession.setVisible(False) self.ui().edm_detail_religion.setVisible(False);self.ui().edm_lbl_religion.setVisible(False) self.ui().edm_detail_lieuNaissance.setVisible(False);self.ui().edm_lbl_lieuNaissance.setVisible(False) self.ui().edm_detail_espece.setVisible(False);self.ui().edm_lbl_espece.setVisible(False) self.ui().edm_detail_sexe.setVisible(False);self.ui().edm_lbl_sexe.setVisible(False) self.ui().edm_detail_yeux.setVisible(False);self.ui().edm_lbl_yeux.setVisible(False) self.ui().edm_detail_peau.setVisible(False);self.ui().edm_lbl_peau.setVisible(False) self.ui().edm_detail_cheveux.setVisible(False);self.ui().edm_lbl_cheveux.setVisible(False) self.ui().edm_detail_langues.setVisible(False);self.ui().edm_lbl_langues.setVisible(False) def layout(self): return self.ui().edm_layoutNotes def charger(self): for detail in self.mat().details: widget = self.ui().edm_pages.findChild(dm.DmLineEdit, "edm_detail_{}".format(detail)) if widget: widget.majTexte(self.mat().details[detail]) # self.ui().edm_notes.setText(QString.fromUtf8(self.mat().notes)) def enregistrer(self): listeWidget = self.ui().edm_pages.findChildren(dm.DmLineEdit) for widget in listeWidget: detail = str(widget.objectName()).replace("edm_detail_","") txt = widget.texte() if len(txt) > 0: self.mat().details[detail] = txt # self.mat().notes = str(self.ui().edm_notes.toPlainText().toUtf8()) if __name__ == "__main__": app = QApplication(sys.argv) mat = Combattant() # mat.position = (1,1) ecran = EcranEditionMateriel(mat) ecran.afficher() r = app.exec_() mat = ecran.mat() exit(r)