Selaa lähdekoodia

Gestion des materiels au poil!

olinox14 10 vuotta sitten
vanhempi
commit
9118e1f68f

+ 10 - 0
.settings/org.eclipse.core.resources.prefs

@@ -5,6 +5,7 @@ encoding//lib/Cache.py=utf-8
 encoding//lib/Case.py=utf-8
 encoding//lib/Combattant.py=utf-8
 encoding//lib/Decor.py=utf-8
+encoding//lib/EcranAffichageTexte.py=utf-8
 encoding//lib/EcranAltitude.py=utf-8
 encoding//lib/EcranChargerPlateau.py=utf-8
 encoding//lib/EcranCreerPlateau.py=utf-8
@@ -14,17 +15,26 @@ encoding//lib/EcranEditionTerrain.py=utf-8
 encoding//lib/EcranFondPlateau.py=utf-8
 encoding//lib/EcranGestionCombat.py=utf-8
 encoding//lib/EcranSelectionPj.py=utf-8
+encoding//lib/Forme.py=utf-8
 encoding//lib/Modes.py=utf-8
 encoding//lib/Partie.py=utf-8
 encoding//lib/Pion.py=utf-8
 encoding//lib/Plateau.py=utf-8
 encoding//lib/Terrain.py=utf-8
+encoding//lib/VueEditionForme.py=utf-8
+encoding//lib/explorateurMat.py=utf-8
+encoding//lib/frameAttaque.py=utf-8
 encoding//lib/framePj.py=utf-8
+encoding//lib/mat.py=utf-8
 encoding//lib/outilsSvg.py=latin1
 encoding//lib/rsc.py=utf-8
 encoding//lib/ui/dm.py=utf-8
 encoding//lib/ui/ecran_altitude.py=utf-8
+encoding//lib/ui/ecran_creationPlateau.py=utf-8
 encoding//lib/ui/ecran_creerPlateau.py=utf-8
+encoding//lib/ui/ecran_editionCombattant.py=utf-8
+encoding//lib/ui/ecran_editionDecor.py=utf-8
 encoding//lib/ui/ecran_explorateur.py=utf-8
+encoding//lib/ui/ecran_principal.py=utf-8
 encoding//lib/ui/ecran_saisie.py=utf-8
 encoding/DMonde.py=utf-8

+ 0 - 239
DMonde.ppr

@@ -1,239 +0,0 @@
-[Config]
-Compilator.SaveAll=0
-Compilator.Capture=0
-Compilator.HideOutput=0
-Compilator.ProgSaveAll=0
-Compilator.ProgRunSelection=0
-Compilator.LogType=0
-DefaultDir=F:\DMonde
-DefaultCPIndex=0
-LogtoEnd=1
-DontOpen=0
-AbsolutePath=0
-FileFormat=0
-ProjectFilesOnly=0
-Extensions=*.py
-[Project tree]
-DMonde
-	+DMonde
-		-.git
-			-hooks
-			-info
-			-logs
-				-refs
-					-heads
-					-remotes
-						-origin
-			-objects
-				-01
-				-02
-				-05
-				-06
-				-08
-				-0c
-				-14
-				-1c
-				-1e
-				-1f
-				-23
-				-24
-				-31
-				-33
-				-37
-				-39
-				-3c
-				-3f
-				-41
-				-48
-				-4b
-				-53
-				-57
-				-58
-				-59
-				-5b
-				-5d
-				-5e
-				-67
-				-68
-				-6f
-				-77
-				-79
-				-7a
-				-7e
-				-81
-				-83
-				-85
-				-87
-				-8b
-				-8d
-				-8f
-				-93
-				-a1
-				-a3
-				-a4
-				-a6
-				-aa
-				-b4
-				-bb
-				-bc
-				-c3
-				-c4
-				-c7
-				-c8
-				-cd
-				-d0
-				-d7
-				-d8
-				-d9
-				-e0
-				-e3
-				-e4
-				-e8
-				-ec
-				-ee
-				-ef
-				-f1
-				-f4
-				-f9
-				-fb
-				-fd
-				-ff
-				-info
-				-pack
-			-refs
-				-heads
-				-remotes
-					-origin
-				-tags
-		+lib
-			-biblio
-			-ui
-				-corbeille_ui
-					lib\ui\corbeille_ui\dmOngletsH.py
-					lib\ui\corbeille_ui\dmtableattaques - Copie.py
-					lib\ui\corbeille_ui\dmtableattaques_tableAttaques.py
-					lib\ui\corbeille_ui\ecran_panneauAttaques.py
-					lib\ui\corbeille_ui\EcranEditionAttaques.py
-					lib\ui\corbeille_ui\test_ui.py
-				-ressource
-				lib\ui\__init__.py
-				lib\ui\dm.py
-				lib\ui\dmOngletsH.py
-				lib\ui\ecran_affichageTexte.py
-				lib\ui\ecran_chargerPlateau.py
-				lib\ui\ecran_creationPlateau.py
-				lib\ui\ecran_creerPlateau.py
-				lib\ui\ecran_editionAttaques.py
-				lib\ui\ecran_editionCombattant.py
-				lib\ui\ecran_editionCreature.py
-				lib\ui\ecran_editionDecor.py
-				lib\ui\ecran_editionObjet.py
-				lib\ui\ecran_editionQuantiteObjet.py
-				lib\ui\ecran_editionTerrain.py
-				lib\ui\ecran_explorateur.py
-				lib\ui\ecran_gestionCombat.py
-				lib\ui\ecran_panneauAttaques.py
-				lib\ui\ecran_panneauPj.py
-				lib\ui\ecran_principal.py
-				lib\ui\ecran_selectionPj.py
-				lib\ui\panneauImage.py
-				lib\ui\ressource_rc.py
-				lib\dmK.py
-			lib\__init__.py
-			lib\Actions.py
-			lib\AEtoile.py
-			lib\afficherSousMenu.py
-			lib\Boucle.py
-			lib\br.py
-			lib\Cache - Copie.py
-			lib\Cache.py
-			lib\Case.py
-			lib\Combattant.py
-			lib\Creature.py
-			lib\Decor.py
-			lib\dmF.py
-			lib\EcranAffichageTexte.py
-			lib\EcranChargerPlateau.py
-			lib\EcranCreerPlateau.py
-			lib\EcranEditionCombattant.py
-			lib\EcranEditionDecor.py
-			lib\EcranEditionObjet.py
-			lib\EcranEditionTerrain.py
-			lib\EcranFondPlateau.py
-			lib\EcranGestionCombat.py
-			lib\EcranSelectionPj.py
-			lib\EcranVol.py
-			lib\EffetsCase.py
-			lib\EntreeSortie.py
-			lib\fonctionsCommunes.py
-			lib\Forme.py
-			lib\frameAttaque.py
-			lib\framePj.py
-			lib\Inventaire.py
-			lib\lancer.py
-			lib\Modes.py
-			lib\Objet.py
-			lib\ObjetAction.py
-			lib\outilsSvg.py
-			lib\Partie.py
-			lib\Pinceau.py
-			lib\Pion.py
-			lib\Plateau.py
-			lib\ProjectionDep.py
-			lib\regles.py
-			lib\rsc.py
-			lib\Terrain.py
-			lib\test.py
-			lib\VueEditionForme.py
-		-parties
-			-Partie1
-				-journal
-				-personnages
-				-ressources
-				-svg
-		-ressources
-			-commun
-			-dd35
-			-dm
-		__init__.py
-		DMonde.py
-[Open project files]
-0=DMonde.py
-1=lib\Plateau.py
-2=lib\Modes.py
-3=lib\br.py
-4=lib\Case.py
-5=lib\Actions.py
-6=lib\Pion.py
-7=lib\ui\dm.py
-8=lib\EcranEditionCombattant.py
-[Selected Project Files]
-Main=
-Selected=lib\Plateau.py
-[DMonde.py]
-TopLine=1
-Caret=25,26
-[lib\Plateau.py]
-TopLine=990
-Caret=22,1002
-[lib\Modes.py]
-TopLine=537
-Caret=1,564
-[lib\br.py]
-TopLine=9
-Caret=1,22
-[lib\Case.py]
-TopLine=256
-Caret=18,269
-[lib\Actions.py]
-TopLine=397
-Caret=49,416
-[lib\Pion.py]
-TopLine=151
-Caret=35,158
-[lib\ui\dm.py]
-TopLine=535
-Caret=47,538
-[lib\EcranEditionCombattant.py]
-TopLine=1
-Caret=30,9

+ 60 - 79
DMonde.py

@@ -3,25 +3,29 @@
 """Interface principale du programme DMonde
 """
 import os
-from sys import exit, argv
+from sys import exit
 
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
+from PyQt4.QtCore import SIGNAL, Qt, QString
+from PyQt4.QtGui import QMainWindow, QGraphicsView, QTableWidget, QLineEdit, \
+    QTextEdit, QToolButton, QSlider, QDoubleSpinBox, QWidget, QFrame, \
+    QApplication
 
+from lib.Actions import Ligne
 from lib.EcranChargerPlateau import EcranChargerPlateau
 from lib.EcranCreerPlateau import EcranCreerPlateau
 from lib.EcranEditionCombattant import EcranEditionCombattant
 from lib.EcranFondPlateau import EcranFondPlateau
 from lib.Plateau import Plateau
+from lib.commun import rep, Session
 from lib.framePj import FramePj
-from lib.outilsSvg import *
-from lib.ui.ecran_principal import Ui_principal
-from lib.Actions import Ligne
-from lib.commun import rep
+from lib.mat import chargerMat, supprimerMat
+from lib.outilsSvg import afficheSvg, enregistrer, chargerUnique, supprSvg
 from lib.rsc import RImage
+from lib.ui.ecran_principal import Ui_principal
+
 
 class DMonde(QMainWindow):
-    """interface comprenant: chat ecrit, fenetre d'infos, lancer de des, echange de fichiers, lancement du chat vocal"""
+    """interface principale de DMonde"""
     def __init__(self, parent=None):
         """initialisation de la fenetre"""
         super (DMonde, self).__init__()
@@ -39,7 +43,7 @@ class DMonde(QMainWindow):
         self.ui = Ui_principal()
         self.ui.setupUi(self)
         self.afficherPanneauxPlateau(False)
-        self.connect(self.ui.cbt_sauver, SIGNAL("clicked()"), self.sauverPlateau)   
+        self.connect(self.ui.cbt_sauver, SIGNAL("clicked()"), self.enregistrerPlateau)   
         self.connect(self.ui.cbt_fermer, SIGNAL("clicked()"), self.fermerPlateau)
         self.connect(self.ui.grp_nouveauPj, SIGNAL("clicked()"), self.nouveauPj)
         self.ui.cbt_vue.setViewportUpdateMode(QGraphicsView.BoundingRectViewportUpdate)
@@ -61,6 +65,7 @@ class DMonde(QMainWindow):
         self.chargerListePj()
 
     ########## onglet plateau
+    
     def creerEcranFondPlateau(self):
         ecranFondPlateau = EcranFondPlateau(self)
         self.ui.cbt_vue.resetTransform()
@@ -71,56 +76,35 @@ class DMonde(QMainWindow):
         if self.plateau != None:
             if self.plateau.estCree() == True:
                 return 
-        
         self.creationPlateau = EcranCreerPlateau()
-        idPlateau = str(len(afficheSvg("parties\\{}\\svg\\infos_sauvegarde".format(self.partie))))
         plateau = Plateau(self)
-        plateau.id = idPlateau
         self.creationPlateau.afficher(plateau)
         r = self.creationPlateau.exec_()
         if r == 1:
-            QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
             self.plateau = self.creationPlateau.resultat()
             self.plateau.creer()
-            QApplication.restoreOverrideCursor()
-        
         
-#     def creerPlateau(self, nom, chapitre, formeCases, largeur, hauteur, couleur, description, presentation):
-#         """cree le plateau entre en parametre"""
-#         nouvelId = str(len(afficheSvg("parties\\{}\\svg\\infos_sauvegarde".format(self.partie))))
-#         QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
-#         self.plateau = Plateau(self)
-#         self.plateau.creer(nouvelId, nom, chapitre, formeCases, largeur, hauteur, couleur, description, presentation)
-#         QApplication.restoreOverrideCursor()
-#         del self.creationPlateau
-
     def afficherEcranChargerPlateau(self):
         """ouvre la fenetre de chargement de plateau"""
-        valide = True
-        if self.plateau != None:
-            if self.plateau.estCree() == True:
-                valide = False
-        if valide:
-            self.chargementPlateau = EcranChargerPlateau(self)
-            self.chargementPlateau.setWindowModality(Qt.ApplicationModal)
-            self.chargementPlateau.show()
-            self.chargementPlateau.raise_()
-
-    def chargerPlateau(self, nomFichierSvg):
         if self.plateau != None:
-            if self.plateau.estCree() == True:
-                self.fermerPlateau()
-        QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
-        self.plateau = chargerUnique("parties\\{}\\svg\\{}.p".format(self.partie, nomFichierSvg))
-        if self.plateau:
-            self.plateau.recreer(self)
-        else:
-            self.plateau = Plateau(self)
-        QApplication.restoreOverrideCursor()    
+            if self.plateau.estCree(): return
+        fen = EcranChargerPlateau(self)
+        fen.show()
+        r = fen.exec_()
+        if r == 1:
+            idM = fen.resultat()
+            del fen
+            self.chargerPlateau(idM)
+        
+    def chargerPlateau(self, idM):
+        if self.plateau: 
+            if self.plateau.estCree(): self.fermerPlateau()
+        self.plateau = chargerMat(idM, "cbt")
+        self.plateau.recreer(self)  
 
     def chargerDernierPlateau(self):
         """charge le dernier plateau sauvegarde"""
-        infosSvg = afficheSvg("parties\\{}\\svg\\infos_sauvegarde".format(self.partie))
+        infosSvg = afficheSvg(os.path.join(rep("cbt"), "infos_sauvegarde"))
         dernier = None
         for id_svg in infosSvg:
             if not dernier or infosSvg[id_svg]["dateSvg"] > infosSvg[dernier]["dateSvg"]:
@@ -128,18 +112,11 @@ class DMonde(QMainWindow):
         if dernier:
             self.chargerPlateau(dernier)
                                    
-    def sauverPlateau(self):
-        QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
-        if self.plateau.id in afficheSvg("parties\\{}\\svg\\infos_sauvegarde".format(self.partie)):
-            idPlateau = self.plateau.id
-        else:   
-            idPlateau = str(len(afficheSvg("parties\\{}\\svg\\infos_sauvegarde".format(self.partie))))
-
-        enregistrerUnique(self.plateau, "parties\\{}\\svg\\{}.p".format(self.partie, idPlateau))
-        infos = {"nom": self.plateau.nom, "chapitre": self.plateau.chapitre, "dateCreation":self.plateau.dateCreation, "dateSvg":self.plateau.dateSvg, \
+    def enregistrerPlateau(self):
+        self.plateau.enregistrer("cbt")
+        infos = {"nom": self.plateau.nom(), "chapitre": self.plateau.chapitre, "dateCreation":self.plateau.dateCreation, "dateSvg":self.plateau.dateSvg, \
                  "public": self.plateau.public, "enCours": self.plateau.enCours}
-        enregistrer(str(idPlateau), infos, "parties\\{}\\svg\\infos_sauvegarde".format(self.partie))
-        QApplication.restoreOverrideCursor()
+        enregistrer(self.plateau.idM(), infos, os.path.join(rep("cbt"), "infos_sauvegarde"))
     
     def fermerPlateau(self):
         self.plateau.fermer()
@@ -153,29 +130,30 @@ class DMonde(QMainWindow):
         #on parcourt les fichiers de sauvegarde
         f = []
         lstFichiersSvg = []
-        for (dirpath, dirnames, filenames) in os.walk("parties\\{}\\svg\\".format(self.partie)):
+        for (dirpath, dirnames, filenames) in os.walk(rep("cbt")):
             f.extend(filenames)
             break
         for fichier in f:
             fileName, fileExtension = os.path.splitext(fichier)
-            if fileExtension == ".p":
+            if fileExtension == ".dm":
                 lstFichiersSvg.append(fileName)
       
         #on verifie leur presence dans le fichier 'infos_sauvegarde'
-        infosSvg = afficheSvg("parties\\{}\\svg\\infos_sauvegarde".format(self.partie))
+        infosSvg = afficheSvg(os.path.join(rep("cbt"), "infos_sauvegarde"))
         index = len(infosSvg)
 
         #on ajoute les sauvegardes manquantes si besoin
         for fichier in lstFichiersSvg:
             if not fichier in infosSvg:
-                plateau = chargerUnique("parties\\{}\\svg\\{}.p".format(self.partie, fichier))
-                enregistrer(fichier, {"nom": plateau.nom, "chapitre": plateau.chapitre, "dateCreation":plateau.dateCreation, "dateSvg":plateau.dateSvg, \
+                plateau = chargerUnique(os.path.join(rep("cbt"), "{}.dm".format(fichier)))
+                enregistrer(fichier, {"nom": plateau.nom(), "chapitre": plateau.chapitre, "dateCreation":plateau.dateCreation, "dateSvg":plateau.dateSvg, \
                                       "public": plateau.public, "enCours": plateau.enCours}, "svg\\infos_sauvegarde")
-                index += 1       
+                index += 1     
+                  
         #on supprime ceux qui ne sont plus trouves
         for fichier in infosSvg:
             if not fichier in lstFichiersSvg:
-                supprSvg("parties\\{}\\svg\\infos_sauvegarde".format(self.partie), fichier)
+                supprSvg(os.path.join(rep("cbt"), "infos_sauvegarde"), fichier)
 
 
     ########## apparence de l'onglet plateau
@@ -215,47 +193,46 @@ class DMonde(QMainWindow):
 
     ########## onglet groupe
     def chargerListePj(self):
-        listePj = chargerUnique("parties\\{}\\groupe".format(self.partie))
-        if not listePj: listePj = []
+        for attributsFichier in os.walk(rep("grp")):
+            for f in attributsFichier[2]:
+                pj = chargerMat(os.path.join(attributsFichier[0], f))
+                self.pjAjouterAListe(pj)
         self.ui.grp_deroulement_layout.setAlignment(Qt.AlignTop)
-        
-        for pj in listePj:
-            self.pjAjouterAListe(pj)
 
     def pjAjouterAListe(self, pj = None):
         colonne = (self._compteurPj % 3) * 2
         ligne = int(self._compteurPj / 3)
         self._compteurPj += 1
+        
         panneau = FramePj(self._compteurPj)
         if pj:
             panneau.chargerPj(pj)
         panneau.setObjectName(QString("pj_panneau_{}".format(self._compteurPj)))
         self.connect(panneau, SIGNAL("pjModifie(int)"), self.pjEnregistrer)
         self.ui.grp_deroulement_layout.addWidget(panneau, ligne, colonne)
+        
         ## pour l'espacement entre les panneaux
         w = QWidget()
         self.ui.grp_deroulement_layout.addWidget(w, ligne, colonne + 1)
 
     def pjSupprimer(self, index):
         panneau = self.findChild(QFrame, "pj_panneau_{}".format(index))
+        pj = panneau.pj()
+        supprimerMat(pj.idM(), "grp")
         self.ui.grp_deroulement_layout.removeWidget(panneau)
 
     def nouveauPj(self):
-        self.editionPj = EcranEditionCombattant()
-        self.editionPj.setAttribute(Qt.WA_DeleteOnClose)
-        self.editionPj.exec_()
-        pj = self.editionPj.combattant
+        fen = EcranEditionCombattant()
+        fen.exec_()
+        pj = fen.combattant()
+        del fen
+        pj.enregistrer("grp")
         self.pjAjouterAListe(pj)
-        self.pjEnregistrer(self._compteurPj)
 
     def pjEnregistrer(self, idPj):
-        listePj = chargerUnique("parties\\{}\\groupe".format(self.partie))
-        if not listePj: listePj = []
         panneau = self.findChild(QFrame, "pj_panneau_{}".format(idPj))
         pj = panneau.pj()
-        listePj.append(pj)
-        enregistrerUnique(listePj, "parties\\{}\\groupe".format(self.partie))
-
+        pj.enregistrer("grp")
 
     def resizeEvent(self, event):
         val = (self.ui.dm_panneauCentre.width() - 20) / 3
@@ -263,12 +240,16 @@ class DMonde(QMainWindow):
         
         
 if __name__ == "__main__":
-    app = QApplication(argv)
+    s = Session()
+    arg = ["DMonde", s.idS()]
+    app = QApplication(arg)
     #settrace(trace_calls)
     dm = DMonde()
     dm.show()
     r = app.exec_()
+    s.fin()
     exit(r)
+    
    
 
 

+ 2 - 2
lib/Actions.py

@@ -157,7 +157,7 @@ class Deplacement(Action):
                 super(Deplacement, self).valider()
 
     def estValide(self):
-        return len(self._chemin)>0
+        return len(self._chemin) > 0
 
     def majCoordCible(self, coord):
         if coord != self.coordActeur():
@@ -177,7 +177,7 @@ class Deplacement(Action):
             self._chercheurChemin.arreter()
             self._chercheurChemin = None
             
-        if self.plateau.cases[self._coordCible].terrain.franchissable and self.plateau.cases[self._coordCible].occupant(None, Combattant) == None:
+        if self.plateau.cases[self._coordCible].terrain.franchissable and not self.plateau.cases[self._coordCible].occupeeParCombattant():
             self._chercheurChemin = AEtoile.Chemin(self.plateau, self.coordActeur(), self._coordCible, self.acteur().z, self._zCible)
             self._chemin = self._chercheurChemin.liste()
         self.afficherCibles(True)        

+ 20 - 9
lib/Cache.py

@@ -1,29 +1,38 @@
 #from __future__ import unicode_literals
 # -*- coding: utf-8 -*-
-from PyQt4.QtCore import QString, QPointF, Qt
+from PyQt4.QtCore import QString, Qt
 from PyQt4.QtGui import QGraphicsTextItem, QFont, QColor, QCursor
-from commun import dmConfirmer
+from dialogues import dmConfirmer
 
 
-class Cache():
+class Cache(object):
     """cache place sur le plateau"""
-    def __init__(self, plateau, idCache, parent=None):
-        self.plateau = plateau
+    def __init__(self, idCache, parent=None):
         self._idCache = idCache
         self._nom = ""
         self.etiquette = None
         self._listeCases = []
 
+    def __getstate__(self):
+        state = {key:value for key, value in self.__dict__.items() if not key in ["plateau", "etiquette"]}
+        return (state)
+
+    def __setstate__(self, state):
+        self.__dict__ = state
+        
     def nom(self):
         return self._nom
 
     def listeCases(self):
         return self._listeCases
 
-    def creer(self, listeCases, nom):
+    def creer(self, plateau, listeCases, nom):
         self._nom = nom
         self._listeCases = listeCases
+        self.ajouter(plateau)
 
+    def ajouter(self, plateau):
+        self.plateau = plateau
         self.plateau.caches[self._idCache] = self
         
         for coord in self._listeCases:
@@ -32,10 +41,12 @@ class Cache():
         for idCombattant in self.plateau.combattants:
             if self.plateau.combattants[idCombattant].position in self._listeCases:
                 self.plateau.combattants[idCombattant].cacher(self._idCache)
-            
+        
+        self.creerEtiquette()            
+
+    def creerEtiquette(self):
         self.etiquette = EtiquetteCache(self)
-        self.etiquette.creer()
-                    
+        self.etiquette.creer()        
 
     def retirer(self):
         """retire le cache du plateau apres confirmation"""

+ 8 - 3
lib/Case.py

@@ -4,7 +4,7 @@ from __future__ import division
 
 from PyQt4.QtCore import Qt, SIGNAL, QPointF, QString, QRectF
 from PyQt4.QtGui import QGraphicsPolygonItem, QColor, QGraphicsItem, QPolygonF, \
-    QGraphicsSimpleTextItem, QBrush, QImage, QPen, QRadialGradient, QFont, qRed, \
+    QGraphicsSimpleTextItem, QBrush, QPen, QRadialGradient, QFont, qRed, \
     qGreen, qBlue, QGraphicsEllipseItem, QGraphicsTextItem, QTextBlockFormat, \
     QTextCursor
 
@@ -15,8 +15,6 @@ from Combattant import Combattant
 from Terrain import Terrain
 
 
-# from Combattant import Combattant
-# from Decor import Decor
 class Case(QGraphicsPolygonItem):
     """objet graphique representant une case du plateau"""
     def __init__(self, plateau, parent=None):
@@ -235,6 +233,12 @@ class Case(QGraphicsPolygonItem):
             if not isinstance(retour, classe): retour = None        
         return retour                          
 
+    def occupeeParCombattant(self):
+        """la case est occupee par un combattant - on ne peut pas s'y deplacer"""
+        for idPion in self.occupation.values():
+            if idPion < 10000: return True
+        return False
+
     def estFranchissable(self, zAbs = None):
         """a l'altitude absolue demandee, 
         la case est-elle franchissable ** pour une ligne de mire **"""
@@ -314,6 +318,7 @@ class Case(QGraphicsPolygonItem):
 
             self.effetActif = effet
         else:
+            self.effetActif = ""
             self.polygoneEffet.setVisible(False)              
 
     def majAffichageSpecial(self, affichage=""):

+ 2 - 1
lib/Decor.py

@@ -12,8 +12,9 @@ class Decor(Pion, Materiel):
         self.numero = -1
         self.escalade = False            #peut etre escalade
         self.brule = False               #peut prendre feu
+        self.hauteurMax = False          #la hauteur doit etre calculee pour atteindre le plafond (s'il existe)
         self.inventaire = []
-        self.notes = ""
+        self.details = {}
 
     def ajouterAuPlateau(self, plateau):
         self.plateau = plateau

+ 18 - 14
lib/EcranChargerPlateau.py

@@ -1,14 +1,15 @@
 #from __future__ import unicode_literals
 # -*- coding: utf-8 -*-
-from __future__ import division
-from time import strftime, localtime
 import os
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
+from time import strftime, localtime
 
+from PyQt4.QtCore import SIGNAL, QString
+from PyQt4.QtGui import QDialog, QMessageBox, QIcon, QTableWidgetItem
+from lib.commun import rep
+from lib.outilsSvg import supprSvg, afficheSvg
+from mat import supprimerMat
 from ui.ecran_chargerPlateau import Ui_chp_fenetre
 
-from outilsSvg import *
 
 class EcranChargerPlateau(QDialog):
     """interface de creation/chargement de plateau"""
@@ -16,6 +17,7 @@ class EcranChargerPlateau(QDialog):
         """initialisation de la fenetre"""
         super (EcranChargerPlateau, self).__init__()
         self.fenetre = fenetrePrincipale
+        self._resultat = None
         self.createWidgets()
         self.majAffichage()
         
@@ -26,29 +28,31 @@ class EcranChargerPlateau(QDialog):
         self.ui.setupUi(self)
         self.majListeChargement()
         self.connect(self.ui.chp_supprimer, SIGNAL("clicked()"), self.supprimerPlateau)
-        self.connect(self.ui.chp_ok, SIGNAL("clicked()"), self.charger)
+        self.connect(self.ui.chp_ok, SIGNAL("clicked()"), self.ok)
         self.connect(self.ui.chp_chapitre, SIGNAL("valueChanged(int)"), self.majListeChargement)
         self.connect(self.ui.chp_toutAfficher, SIGNAL("stateChanged(int)"), self.majListeChargement)
         
         self.connect(self.ui.chp_liste, SIGNAL("cellClicked(int,int)"), self.focusBoutonCharger)
         self.connect(self.ui.chp_liste, SIGNAL("cellClicked(int,int)"), self.majAffichage)
-        self.connect(self.ui.chp_liste, SIGNAL("cellDoubleClicked(int,int)"), self.charger)
+        self.connect(self.ui.chp_liste, SIGNAL("cellDoubleClicked(int,int)"), self.ok)
 
-    def charger(self):
+    def ok(self):
         """charge le plateau selectionne"""
-        index = self.ui.chp_liste.texte(self.ui.chp_liste.currentRow(), 0)
-        self.fenetre.chargerPlateau(index)
+        self._resultat = self.ui.chp_liste.texte(self.ui.chp_liste.currentRow(), 0)
         self.done(1)
             
+    def resultat(self):
+        return self._resultat
+            
     def supprimerPlateau(self):
         """supprime le plateau selectionne"""
         reponse = QMessageBox.question(self, 'Avertissement',
                                            QString().fromUtf8("Etes-vous sûr de vouloir supprimer ce plateau?"), QMessageBox.Yes | 
                                            QMessageBox.No, QMessageBox.No)
         if reponse == QMessageBox.Yes:       
-            index = self.ui.chp_liste.texte(self.ui.chp_liste.currentRow(), 0)
-            os.remove("parties\\{}\\svg\\{}.p".format(self.fenetre.partie, index))
-            supprSvg("parties\\{}\\svg\\infos_sauvegarde".format(self.fenetre.partie), index)
+            idM = self.ui.chp_liste.texte(self.ui.chp_liste.currentRow(), 0)
+            supprimerMat(idM, "cbt")
+            supprSvg(os.path.join(rep("cbt"), "infos_sauvegarde"), idM)
             self.majListeChargement()
 
     def majAffichage(self):
@@ -69,7 +73,7 @@ class EcranChargerPlateau(QDialog):
 
         self.ui.chp_liste.vider()
         
-        infosSvg = afficheSvg("parties\\{}\\svg\\infos_sauvegarde".format(self.fenetre.partie))
+        infosSvg = afficheSvg(os.path.join(rep("cbt"), "infos_sauvegarde"))
         
         for id_svg in infosSvg:
             if infosSvg[id_svg]["chapitre"] == str(self.ui.chp_chapitre.value()) or bool(self.ui.chp_toutAfficher.checkState()) == True:

+ 7 - 7
lib/EcranCreerPlateau.py

@@ -1,12 +1,12 @@
 #from __future__ import unicode_literals
 # -*- coding: utf-8 -*-
-from __future__ import division
 
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-from outilsSvg import afficheSvg
+from PyQt4.QtCore import Qt, SIGNAL
+from PyQt4.QtGui import QDialog, QColor, QMessageBox, QColorDialog
+
 from ui.ecran_creerPlateau import Ui_crp_fenetre
 
+
 class EcranCreerPlateau(QDialog):
     """interface de creation/chargement de plateau"""
     def __init__(self, parent=None):
@@ -36,7 +36,7 @@ class EcranCreerPlateau(QDialog):
 
     def afficher(self, plateau):
         """affiche la fenetre avec le plateau en parametre, ou un nouveau plateau sinon"""
-        self.ui.crp_nom.majTexte(plateau.nom)
+        self.ui.crp_nom.majTexte(plateau.nom())
         self.ui.crp_chapitre.setValue(int(plateau.chapitre))
         self.ui.crp_description.majTexte(plateau.description)
         self.ui.crp_presentation.majTexte(plateau.presentation)
@@ -56,10 +56,10 @@ class EcranCreerPlateau(QDialog):
 
     def resultat(self):
         """renvoie le plateau ainsi parametre"""
-        self._retour.nom = self.ui.crp_nom.texte()
+        self._retour.majNom(self.ui.crp_nom.texte())
         self._retour.chapitre = str(self.ui.crp_chapitre.value())
         self._retour.description = self.ui.crp_description.texte()
-        self._retour.presentation = self.ui.crp_nom.texte()
+        self._retour.presentation = self.ui.crp_presentation.texte()
         self._retour.couleurInit = self.couleur
         
         if self.ui.crp_formes.isEnabled():

+ 17 - 1
lib/EcranEditionCombattant.py

@@ -13,6 +13,7 @@ from Combattant import Combattant
 from EcranEditionObjet import EcranEditionObjet
 from Objet import Objet
 from VueEditionForme import VueEditionForme
+from dialogues import dmMessage
 from frameAttaque import FrameAttaque
 import regles
 from rsc import selectionImage, RImage
@@ -53,6 +54,7 @@ class EcranEditionCombattant(QDialog):
         
         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_aideForme, SIGNAL("clicked()"), self.afficherAideForme)
         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)
@@ -67,6 +69,9 @@ class EcranEditionCombattant(QDialog):
         self.connect(self.ui.edc_filtreTypeObjet, SIGNAL("currentChanged(int)"), self.filtrerInventaire)
         self.ui.edc_filtreTypeObjet.stackUnder(self.ui.edc_listeInventaire)
 
+    def mat(self):
+        """retourne le materiel de la fenetre"""
+        return self.combattant()
 
     def layoutAtt(self):
         """retourne le layout des attaques"""
@@ -81,6 +86,7 @@ class EcranEditionCombattant(QDialog):
 
     def allerAPage(self, index):
         self.ui.edc_menu.setCurrentCell(index, 0)
+        self.ui.edc_menu.setCurrentCell(index, 1)
         self.ui.edc_pages.setCurrentIndex(index)        
 
     def ouverture(self):
@@ -170,6 +176,17 @@ class EcranEditionCombattant(QDialog):
             self._combattant.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)         
+
     #### page attributs
     def construireListeAttributs(self):
         """construit les champs d'attributs"""
@@ -355,7 +372,6 @@ if __name__ == "__main__":
     ecran = EcranEditionCombattant()
     ecran.show()
     r = app.exec_()
-    ecran.combattant().enregistrer()
     exit(r)      
 
 

+ 15 - 5
lib/EcranEditionDecor.py

@@ -23,7 +23,6 @@ class EcranEditionDecor(QDialog):
         self.createWidgets()
         
         self.decor = Decor() if not decor else decor
-        self.modeCreation = (decor == None)
         self.ouverture()
         self.allerAPage(pageInitiale)
 
@@ -54,6 +53,10 @@ class EcranEditionDecor(QDialog):
         self.connect(self.ui.edd_filtreTypeObjet, SIGNAL("currentChanged(int)"), self.filtrerInventaire)
         self.ui.edd_filtreTypeObjet.stackUnder(self.ui.edd_listeInventaire)
 
+    def mat(self):
+        """retourne le materiel de la fenetre"""
+        return self.decor
+
     def vueGraphique(self):
         return self.ui.edd_vueForme
 
@@ -71,13 +74,14 @@ class EcranEditionDecor(QDialog):
             self.ui.edd_logo.majTexte("Choisissez \nun fichier\nimage")
 
         self.vueForme.creer(self.formeCases())
-        self.vueForme.autoriserModifForme(self.modeCreation)
+        self.vueForme.autoriserModifForme(True)
         self.vueForme.majCouleur(self.decor.couleur)
         self.vueForme.chargerFormeDef(self.decor.formeDef[self.formeCases()])
         self.vueForme.chargerImageDef(self.decor.img)
 
         #page deplacements
         self.ui.edd_taille.setValue(self.decor.hauteur)
+        self.ui.edd_hauteurPlafond.setChecked(self.decor.hauteurMax)
         self.ui.edd_escalade.setChecked(self.decor.escalade)
         self.ui.edd_brule.setChecked(self.decor.brule)
         
@@ -85,7 +89,9 @@ class EcranEditionDecor(QDialog):
         self.ui.edd_listeInventaire.charger(self.decor.inventaire)
 
         #page_notes
-        self.ui.edd_notes.setText(QString.fromUtf8(self.decor.notes))
+        if "dim" in self.decor.details: self.ui.edd_detail_dim.majTexte(self.decor.details["dim"])
+        if "poids" in self.decor.details: self.ui.edd_detail_poids.majTexte(self.decor.details["poids"])
+        if "notes" in self.decor.details: self.ui.edd_notes.majTexte(self.decor.details["notes"])
 
         #autre
         self.majActivationEnregistrer()
@@ -180,7 +186,8 @@ class EcranEditionDecor(QDialog):
         """enregistre le terrain cree/edite"""
         #page nom
         self.decor.majNom(self.ui.edd_nom.texte())
-        self.decor.logo = self.ui.edd_logo.image()
+        if self.ui.edd_logo.image():
+            self.decor.logo = self.ui.edd_logo.image()
         
         self.decor.formeDef[self.vueForme.formeCases()] = self.vueForme.formeDef()
         self.decor.img = self.vueForme.imageDef()
@@ -188,6 +195,7 @@ class EcranEditionDecor(QDialog):
 
         #page dep
         self.decor.hauteur = self.ui.edd_taille.value()
+        self.decor.hauteurMax = self.ui.edd_hauteurPlafond.isChecked()
         self.decor.escalade = self.ui.edd_escalade.isChecked()
         self.decor.brule = self.ui.edd_brule.isChecked()
 
@@ -195,7 +203,9 @@ class EcranEditionDecor(QDialog):
         self.decor.inventaire = self.ui.edd_listeInventaire.inventaire()
 
         #page notes
-        self.decor.notes = str(self.ui.edd_notes.toPlainText().toUtf8())
+        self.decor.details["dim"] = self.ui.edd_detail_dim.texte()
+        self.decor.details["poids"] = self.ui.edd_detail_poids.texte()
+        self.decor.details["notes"] = self.ui.edd_notes.texte()
 
         self.done(1)
 

+ 5 - 1
lib/EcranEditionTerrain.py

@@ -32,7 +32,11 @@ class EcranEditionTerrain(QDialog):
         self.connect(self.ui.et_nom, SIGNAL("textEdited(QString)"), self.majAffichage)
         self.connect(self.ui.et_selectionCouleur, SIGNAL("clicked()"), self.selectionCouleur)
         self.connect(self.ui.et_selectionFichier, SIGNAL("clicked()"), self.selectionFichier)
-        
+
+    def mat(self):
+        """retourne le materiel de la fenetre"""
+        return self.terrain
+  
     def accesEdition(self):
         """ouverture en mode edition"""
         self.ui.et_nom.majTexte(self.terrain.nom())

+ 14 - 14
lib/Forme.py

@@ -16,35 +16,35 @@ class Forme():
         """renvoie la liste des cases situees a [distance] cases du centre, dans l'ordre des aiguilles d'une montre"""
         anneau = {}
         if self.formeCases == "H":
-             anneau[1] = [(0,-1),(1,0),(1,1),(0,1),(-1,1),(-1,0)]
+            anneau[1] = [(0,-1),(1,0),(1,1),(0,1),(-1,1),(-1,0)]
              
-             anneau[2] = [(0,-2),(1,-1),(2,-1),(2,0),(2,1),(1,2),(0,2),(-1,2),(-2,1),(-2,0),(-2,-1),(-1,-1)]
+            anneau[2] = [(0,-2),(1,-1),(2,-1),(2,0),(2,1),(1,2),(0,2),(-1,2),(-2,1),(-2,0),(-2,-1),(-1,-1)]
              
-             anneau[3] = [(0,-3),(1,-2),(2,-2),(3,-1),(3,0),(3,1),(3,2),(2,2),(1,3), \
+            anneau[3] = [(0,-3),(1,-2),(2,-2),(3,-1),(3,0),(3,1),(3,2),(2,2),(1,3), \
                           (0,3),(-1,3),(-2,2),(-3,2),(-3,1),(-3,0),(-3,-1),(-2,-2),(-1,-2)]
              
-             anneau[4] = [(0,-4),(1,-3),(2,-3),(3,-2),(4,-2),(4,-1),(4,0),(4,1),(4,2),(3,3),(2,3),(1,4), \
+            anneau[4] = [(0,-4),(1,-3),(2,-3),(3,-2),(4,-2),(4,-1),(4,0),(4,1),(4,2),(3,3),(2,3),(1,4), \
                           (0,4),(-1,4),(-2,3),(-3,3),(-4,2),(-4,1),(-4,0),(-4,-1),(-4,-2),(-3,-2),(-2,-3),(-1,-3)]
              
-             anneau[5] = [(0,-5),(1,-4),(2,-4),(3,-3),(4,-3),(5,-2),(5,-1),(5,0),(5,1),(5,2),(5,3),(4,3),(3,4),(2,4),(1,5), \
+            anneau[5] = [(0,-5),(1,-4),(2,-4),(3,-3),(4,-3),(5,-2),(5,-1),(5,0),(5,1),(5,2),(5,3),(4,3),(3,4),(2,4),(1,5), \
                           (0,5),(-1,5),(-2,4),(-3,4),(-4,3),(-5,3),(-5,2),(-5,1),(-5,0),(-5,-1),(-5,-2),(-4,-3),(-3,-3),(-2,-4),(-1,-4)]
              
         elif self.formeCases == "C":
-             anneau[1] = [(0,-1),(1,-1),(1,0),(1,1),\
+            anneau[1] = [(0,-1),(1,-1),(1,0),(1,1),\
                           (0,1),(-1,1),(-1,0),(-1,-1)]
-             anneau[2] = [(0,-2),(1,-2),(2,-2),(2,-1),(2,0),(2,1),(2,2),(1,2),\
+            anneau[2] = [(0,-2),(1,-2),(2,-2),(2,-1),(2,0),(2,1),(2,2),(1,2),\
                           (0,2),(-1,2),(-2,2),(-2,1),(-2,0),(-2,-1),(-2,-2),(-1,-2)]
-             anneau[3] = [(0,-3),(1,-3),(2,-3),(3,-3),(3,-2),(3,-1),(3,0),(3,1),(3,2),(3,3),(2,3),(1,3),\
+            anneau[3] = [(0,-3),(1,-3),(2,-3),(3,-3),(3,-2),(3,-1),(3,0),(3,1),(3,2),(3,3),(2,3),(1,3),\
                           (0,3),(-1,3),(-2,3),(-3,3),(-3,2),(-3,1),(-3,0),(-3,-1),(-3,-2),(-3,-3),(-2,-3),(-1,-3)]
-             anneau[4] = [(0,-4),(1,-4),(2,-4),(3,-4),(4,-4),(4,-3),(4,-2),(4,-1),(4,0),(4,1),(4,2),(4,3),(4,4),(3,4),(2,4),(1,4),\
+            anneau[4] = [(0,-4),(1,-4),(2,-4),(3,-4),(4,-4),(4,-3),(4,-2),(4,-1),(4,0),(4,1),(4,2),(4,3),(4,4),(3,4),(2,4),(1,4),\
                           (0,4),(-1,4),(-2,4),(-3,4),(-4,4),(-4,3),(-4,2),(-4,1),(-4,0),(-4,-1),(-4,-2),(-4,-3),(-4,-4),(-3,-4),(-2,-4),(-1,-4)]
-             anneau[5] = [(0,-5),(1,-5),(2,-5),(3,-5),(4,-5),(5,-5),(5,-4),(5,-3),(5,-2),(5,-1),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(4,5),(3,5),(2,5),(1,5),\
+            anneau[5] = [(0,-5),(1,-5),(2,-5),(3,-5),(4,-5),(5,-5),(5,-4),(5,-3),(5,-2),(5,-1),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(4,5),(3,5),(2,5),(1,5),\
                           (0,5),(-1,5),(-2,5),(-3,5),(-4,5),(-5,5),(-5,4),(-5,3),(-5,2),(-5,1),(-5,0),(-5,-1),(-5,-2),(-5,-3),(-5,-4),(-5,-5),(-4,-5),(-3,-5),(-2,-5),(-1,-5)]
              
         if distance > 0:
-             retour = anneau[distance]
+            retour = anneau[distance]
         elif distance == 0:
-             retour = anneau
+            retour = anneau
              
         return retour
         
@@ -60,8 +60,8 @@ class Forme():
         if not coordRelatives in self.formeDef:
             for distance in self.anneau(0):
                 if coordRelatives in self.anneau(distance):
-                     self.formeDef.append(coordRelatives)
-                     ajoutee = True
+                    self.formeDef.append(coordRelatives)
+                    ajoutee = True
         if not ajoutee:
             print("case non prise en charge (trop eloignee du centre)")
     

+ 17 - 15
lib/Modes.py

@@ -5,18 +5,21 @@ entre l'interface (l'utilisateur) et le plateau de combat.
 Un seul mode ne peut etre actif a la fois
 Cette classe doit permettre de recevoir les commandes de l'utilisateur
 de maniere a produire un resultat unique (cases peintes, pion deplace...)"""
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-from EntreeSortie import EntreeSortie
+
+from PyQt4.QtCore import Qt
+from PyQt4.QtGui import QPixmap, QCursor
+
 import Actions
-import regles
-from Pion import Pion
+from Cache import Cache
 from Combattant import Combattant
 from Decor import Decor
+from EntreeSortie import EntreeSortie
+from Pion import Pion
+from dialogues import dmSaisie
 import dmK
 from lib.EcranAltitude import EcranAltitude
-from Cache import Cache
-from commun import dmSaisie
+import regles
+
 
 class ModeBase(object):
     """mode de base: tous les modes heritent de cette classe"""
@@ -214,7 +217,7 @@ class MajCases(ModeBaseCp):
 
     def desactiver(self):
         """desactive le mode"""
-        self.plateau.pinceau.reinit()
+        if self.plateau.pinceau: self.plateau.pinceau.reinit()
         super(MajCases, self).desactiver()
 
     def majParam(self, param):
@@ -300,12 +303,9 @@ class ZonePlacement(ModeBaseCp):
     """mode de definition de la/les zones de placement des joueurs"""
     def __init__(self, plateau):
         super(ZonePlacement, self).__init__(plateau)
-        self._sourceCurseur = ":/interface/16/ressource/pinceau.png"
+        self._sourceCurseur = ":/interface/16/ressource/pinceau_16.png"
         self._focus = True
 
-    def activerCurseur(self):
-        super(ZonePlacement, self).activerCurseur()
-
     def activer(self, param = None):
         self.plateau.pinceau.majForme("rectP")
         self.plateau.pinceau.verrouillerForme(True)
@@ -328,6 +328,7 @@ class ZonePlacement(ModeBaseCp):
         if self.plateau.pinceau.estActif():
             if len(self.plateau.pinceau.selection()) > 0:
                 self.plateau.majZonePlacement(self.plateau.pinceau.selection())
+                self.plateau.activerMode(StandardCp)
         return True        
 
 class PlacerCaches(ModeBaseCp):
@@ -354,11 +355,11 @@ class PlacerCaches(ModeBaseCp):
         if len(self.plateau.caches) > 0:
             idCache = max(self.plateau.caches) + 1
         #nom par defaut si besoin
-        if not len(nom) >0:
+        if not len(nom) > 0:
             nom = "Cache {}".format(idCache + 1)
         #creation du cache    
-        cache = Cache(self.plateau, idCache)
-        cache.creer(listeCases, nom)
+        cache = Cache(idCache)
+        cache.creer(self.plateau, listeCases, nom)
 
     def clic_case(self, coord):
         #on peint la liste des cases qui sera cachee
@@ -627,6 +628,7 @@ class DeplacementPion(ModeBaseCp):
     
     def clic_case(self, coord):
         accepte = False
+        if self.plateau.cases[coord].occupeeParCombattant(): return
         if self._num > 0:
             if self.deplace:
                 if self._num < 10000:

+ 9 - 0
lib/Pinceau.py

@@ -140,6 +140,15 @@ class Pinceau():
 #                 else:
 #                     select = [coord]
                 select = self.selectionLigne(self._coordOrigine, coord)
+                #on prend l'epaisseur en compte
+                selectPlus = []
+                for coord in select:
+                    zone = self.plateau.zone(coord, self._epaisseur - 1)
+                    for ajout in zone:
+                        if not ajout in select and not ajout in selectPlus:
+                            selectPlus.append(ajout)
+                select += selectPlus
+
                 for coord in self._selection:
                     if not coord in select:
                         enMoins.append(coord)

+ 4 - 4
lib/Pion.py

@@ -16,7 +16,7 @@ class Pion(QGraphicsObject):
         super(Pion, self).__init__()
         #caracteristiques du pion
         self.numero = -1
-        self.couleur = QColor()
+        self.couleur = QColor(200, 200, 200)
         self.logo = RImage()
         self.img = ImgPion()
         self.etiquette = EtiquettePion()
@@ -49,7 +49,7 @@ class Pion(QGraphicsObject):
         self.__dict__ = state
         self.pixGraphique = None
         self.etiquetteGraphique = None
-#         super(Pion, self).__init__()
+        super(Pion, self).__init__()
 
     def paint(self, painter, option, widget = None):
         """reimplemente de QGraphicsItem: on ne peint pas cet item, seulement ses items enfants"""
@@ -207,8 +207,8 @@ class Pion(QGraphicsObject):
 ##                deltaY = self.img.dy + 0.5*(self.plateau.hCase - self._h0)
                 deltaX = self.img.dx + 0.5*(self.plateau.hCase*1.1544 - self.pixGraphique.pixmap().width())
                 deltaY = self.img.dy + 0.5*(self.plateau.hCase - self.pixGraphique.pixmap().height())
-                    
-                if self.img.rimage.nom() == self.logo.nom():
+
+                if self.img.rimage.idR() == self.logo.idR():
                     #si l'image est le logo, elle ne doit pas pivoter
                     self.pixGraphique.setParentItem(self)
                 else:

+ 104 - 172
lib/Plateau.py

@@ -3,6 +3,7 @@
 from __future__ import division
 
 from math import sqrt
+import os
 from time import time
 
 from PyQt4.QtCore import Qt, SIGNAL, QPointF, QString, QSize, QLineF
@@ -27,26 +28,26 @@ from Pinceau import Pinceau
 from ProjectionDep import ProjectionDep
 from Terrain import Terrain
 import br
-from outilsSvg import enregistrer, charger, chargerUnique
+from lib.commun import rep, charger
+from lib.gM import GestionMateriel
+from lib.mat import Materiel, chargerMat
+from outilsSvg import chargerUnique
 import regles as regles
 
 
-##from ui.ecran_editionAttaques import Ui_editionAttaques
 m_couleursRapides = [(255,255,255), (200,200,200), (130,130,130), (90,90,90), (15,15,15), \
                    (0,85,0), (170,255,0), (170,255,127), (85,85,0), (85,0,0), (170,85,0), (100,50,0), \
                    (255,255,127), (240,80,0), (85,170,255), (85,85,255), (85,0,255), (0,255,255)]
         
-class Plateau(QGraphicsScene):
+class Plateau(QGraphicsScene, Materiel):
     """plateau de jeu contenant les cases, decors et pions"""
     def __init__(self, fenetre, parent=None):
         super(Plateau, self).__init__()
         #parametres et variables
-
+        self._type = "pl"
         self.fenetre = fenetre
 
-        self.id = ""
         ##partie et infos plateau
-        self.nom = ""
         self.chapitre = 0
         self.tour = 0
         
@@ -63,9 +64,11 @@ class Plateau(QGraphicsScene):
         self.nbCasesY = 0
         self.hCase = 0
         self.couleurInit = QColor(0, 255, 0, 80)
+        self.plafond = None
 
         #objets
         self.pinceau = Pinceau(self)
+        self.gM = GestionMateriel()
         self.cases = {}   #dict des cases du plateau   (coordonnées: case)
         self.combattants = {}   #liste de combattants positionnes sur le plateau
         self.decors = {}  #liste des decors places sur le plateau
@@ -93,8 +96,6 @@ class Plateau(QGraphicsScene):
     def vue(self):
         return self.fenetre.ui.cbt_vue
 
-#     def creer(self, idPlateau, nom, chapitre, formeCases, nbCasesX, nbCasesY, \
-#               couleur = QColor(0, 255, 0, 80), description = "", presentation = ""):
     def creer(self):
         """cree le plateau"""
         self.dateCreation = time()
@@ -126,7 +127,9 @@ class Plateau(QGraphicsScene):
             self.cases[coord].recreer(self)
 
         #recreation des caches
-        self.initListeCaches()
+        for idCache in self.caches:
+            self.caches[idCache].ajouter(self)
+        self.majCaches()
 
         #recreation des pions
         for numCombattant in self.combattants:
@@ -145,8 +148,11 @@ class Plateau(QGraphicsScene):
         if len(self.listeCasesZonePlacement) > 0:
             self.polygoneZonePlacement = None
             self.majZonePlacement(self.listeCasesZonePlacement)
-
-        self.plateauModeCombat()
+        
+        if self.public:
+            self.plateauModeCombat()
+        else:
+            self.plateauModeCreation()
 
     def fermer(self):
         """ferme le plateau 'proprement'"""
@@ -185,7 +191,7 @@ class Plateau(QGraphicsScene):
         self.fenetre.connect(self.fenetre.ui.pi_listeAttributs, SIGNAL("cellChanged(int,int)"), self.listeAttributCelluleModifiee, Qt.UniqueConnection)
 
         self.fenetre.connect(self.fenetre.ui.cp_dialogueCouleurs, SIGNAL("clicked()"), self.modePeintureCase, Qt.UniqueConnection)
-        self.fenetre.connect(self.fenetre.ui.cp_pipetteCouleur, SIGNAL("clicked()"), self.modeCopieTerrain, Qt.UniqueConnection)
+
         self.fenetre.connect(self.fenetre.ui.cp_afficherNotes, SIGNAL("clicked()"), self.agrandirNotesMjPlateau, Qt.UniqueConnection)
         
         #listes
@@ -195,18 +201,20 @@ class Plateau(QGraphicsScene):
         self.fenetre.connect(self.fenetre.ui.cp_listeCreatures, SIGNAL("cellClicked(int,int)"), self.modeCreationCombattant, Qt.UniqueConnection)
         self.fenetre.connect(self.fenetre.ui.cp_listeDecors, SIGNAL("cellClicked(int,int)"), self.modeCreationDecor, Qt.UniqueConnection)
         
-        self.fenetre.connect(self.fenetre.ui.cp_editerTerrain, SIGNAL("clicked()"), self.terrainEdit, Qt.UniqueConnection)
-        self.fenetre.connect(self.fenetre.ui.cp_nouveauTerrain, SIGNAL("clicked()"), self.terrainNouveau, Qt.UniqueConnection)
-        self.fenetre.connect(self.fenetre.ui.cp_editerCombattant, SIGNAL("clicked()"), self.creatureEdit, Qt.UniqueConnection)
-        self.fenetre.connect(self.fenetre.ui.cp_nouveauCombattant, SIGNAL("clicked()"), self.creatureNouveau, Qt.UniqueConnection)
-        self.fenetre.connect(self.fenetre.ui.cp_gommeCombattant, SIGNAL("clicked()"), self.majModeSupprimerCombattant, Qt.UniqueConnection)
-        self.fenetre.connect(self.fenetre.ui.cp_editerDecor, SIGNAL("clicked()"), self.decorEdit, Qt.UniqueConnection)
-        self.fenetre.connect(self.fenetre.ui.cp_nouveauDecor, SIGNAL("clicked()"), self.decorNouveau, Qt.UniqueConnection)
-        self.fenetre.connect(self.fenetre.ui.cp_gommeDecor, SIGNAL("clicked()"), self.majModeSupprimerDecor, Qt.UniqueConnection)
+#         self.fenetre.connect(self.fenetre.ui.cp_editerTerrain, SIGNAL("clicked()"), self.terrainEdit, Qt.UniqueConnection)
+#         self.fenetre.connect(self.fenetre.ui.cp_nouveauTerrain, SIGNAL("clicked()"), self.terrainNouveau, Qt.UniqueConnection)
+#         self.fenetre.connect(self.fenetre.ui.cp_editerCombattant, SIGNAL("clicked()"), self.creatureEdit, Qt.UniqueConnection)
+#         self.fenetre.connect(self.fenetre.ui.cp_nouveauCombattant, SIGNAL("clicked()"), self.creatureNouveau, Qt.UniqueConnection)
+#         self.fenetre.connect(self.fenetre.ui.cp_gommeCombattant, SIGNAL("clicked()"), self.majModeSupprimerCombattant, Qt.UniqueConnection)
+#         self.fenetre.connect(self.fenetre.ui.cp_editerDecor, SIGNAL("clicked()"), self.decorEdit, Qt.UniqueConnection)
+#         self.fenetre.connect(self.fenetre.ui.cp_nouveauDecor, SIGNAL("clicked()"), self.decorNouveau, Qt.UniqueConnection)
+#         self.fenetre.connect(self.fenetre.ui.cp_gommeDecor, SIGNAL("clicked()"), self.majModeSupprimerDecor, Qt.UniqueConnection)
 
         #creation
         self.fenetre.connect(self.fenetre.ui.cp_epaisseurPinceau, SIGNAL("valueChanged(int)"), self.majEpaisseurPinceau, Qt.UniqueConnection)
-
+        self.fenetre.connect(self.fenetre.ui.cp_pipetteCouleur, SIGNAL("clicked()"), self.modeCopieTerrain, Qt.UniqueConnection)
+        self.fenetre.connect(self.fenetre.ui.cp_effets, SIGNAL("activated(int)"), self.modeCaseEffet, Qt.UniqueConnection)
+        
         #autres:
         self.fenetre.connect(self.fenetre.ui.cp_placerEntree, SIGNAL("clicked()"), self.majModeDefinirEntree, Qt.UniqueConnection)
         self.fenetre.connect(self.fenetre.ui.cp_placerCache, SIGNAL("clicked()"), self.majModePlacerCache, Qt.UniqueConnection)
@@ -258,10 +266,7 @@ class Plateau(QGraphicsScene):
         self.fenetre.afficherPanneauxPlateau(True)
         self.majNomPlateau()
         self.majBoutonsCouleursPerso()
-        self.majListeTerrains()
-        self.majListeCreatures()
-        self.majListeDecors()
-        self.majCaches()
+        self.gM.initialiser(self.fenetre)
         
         self.initListeOrdreJeu()
         self.initListeAttaques()
@@ -287,7 +292,7 @@ class Plateau(QGraphicsScene):
         r = ecran.exec_()
         if r == 1:
             res = ecran.resultat()
-            self.nom = res.nom
+            self.majNom(res.nom())
             self.chapitre = res.chapitre
             self.description = res.description
             self.presentation = res.presentation
@@ -295,9 +300,8 @@ class Plateau(QGraphicsScene):
 
     def majNomPlateau(self):
         """met a jour l'affichage du nom du plateau"""
-        txt = self.nom
-        if not self.public:
-            txt += "  [Non Publié]"
+        txt = self.nom()
+        if not self.public: txt += "  [Non Publié]"
         self.fenetre.ui.cbt_nom.setText(QString().fromUtf8("    {}    ".format(txt)))
         
     def majBoutonEtape(self):
@@ -407,93 +411,10 @@ class Plateau(QGraphicsScene):
     def agrandirNotesMjPlateau(self):
         """affiche les notes du plateau dans une QDialog, puis recupere les donnees qui y sont saisies"""
         affichageTexte = EcranAffichageTexte(self.notes)
-        affichageTexte.setAttribute(Qt.WA_DeleteOnClose)
         affichageTexte.exec_()
         self.notes = affichageTexte.recupererTexte()
-        
-    ##### affichage de la liste des terrains enregistres, et fonctions d'acces aux donnees""""     
-    def terrainEdit(self):
-        """ouvre la fenetre 'terrains' en mode edition"""
-        self.afficheEcranEditionTerrains(self.fenetre.ui.cp_listeTerrains.selection())
-        self.activerMode(Modes.StandardCp)
-        
-    def terrainNouveau(self):
-        """ouvre la fenetre 'terrains' en mode edition"""
-        self.afficheEcranEditionTerrains()
-        self.activerMode(Modes.StandardCp)
-        
-    def afficheEcranEditionTerrains(self, terrain = None):
-        """affiche l'ecran d'edition/creation de terrains"""
-        fen = EcranEditionTerrain(terrain)     
-        r = fen.exec_()
-        if r == 1:
-            terrain = fen.terrain
-            if terrain: terrain.enregistrer()
-            self.majListeTerrains()
-            self.activerMode(Modes.StandardCp)
+        del affichageTexte
  
-    def majListeTerrains(self):
-        """mise a jour de la liste des terrains depuis la sauvegarde"""
-        self.fenetre.ui.cp_listeTerrains.vider()
-        self.fenetre.ui.cp_listeTerrains.charger("tr")
-    ###############
-
-    ##### affichage de la liste des creatures enregistrees, et fonctions d'acces aux donnees""""     
-    def creatureEdit(self):
-        """ouvre la fenetre 'creatures' en mode edition"""
-        self.afficheEcranEditionCombattants(self.fenetre.ui.cp_listeCreatures.selection())
-        self.activerMode(Modes.StandardCp)
-        
-    def creatureNouveau(self):
-        """ouvre la fenetre 'creatures' en mode edition"""
-        self.afficheEcranEditionCombattants()
-        self.activerMode(Modes.StandardCp)
-        
-    def afficheEcranEditionCombattants(self, combattant = None):
-        """affiche l'ecran d'edition/creation de creatures"""
-        fen = EcranEditionCombattant(combattant, 0, self.formeCases)
-        r = fen.exec_()
-        if r == 1:
-            combattant = fen.combattant()
-            if combattant: combattant.enregistrer()
-            self.majListeCreatures()
-            self.activerMode(Modes.StandardCp)
-        del fen
-        
-    def majListeCreatures(self):
-        """mise a jour de la liste des creatures depuis la sauvegarde"""
-        self.fenetre.ui.cp_listeCreatures.vider()
-        self.fenetre.ui.cp_listeCreatures.charger("cb")
-        
-    ###############
-
-    ##### affichage de la liste des decors enregistrees, et fonctions d'acces aux donnees""""     
-    def decorEdit(self):
-        """ouvre la fenetre 'decors' en mode edition"""
-        self.afficheEcranEditionDecors(self.fenetre.ui.cp_listeDecors.selection())
-        self.activerMode(Modes.StandardCp)
-        
-    def decorNouveau(self):
-        """ouvre la fenetre 'decors' en mode edition"""
-        self.afficheEcranEditionDecors()
-        self.activerMode(Modes.StandardCp)
-        
-    def afficheEcranEditionDecors(self, decor = None):
-        """affiche l'ecran d'edition/creation de decors"""
-        fen = EcranEditionDecor(decor, 0, self.formeCases)
-        r = fen.exec_()
-        if r == 1:
-            decor = fen.decor
-            if decor: decor.enregistrer()
-            self.majListeDecors()
-            self.activerMode(Modes.StandardCp)
-        del fen
-            
-    def majListeDecors(self):
-        """mise a jour de la liste des decors depuis la sauvegarde"""
-        self.fenetre.ui.cp_listeDecors.vider()
-        self.fenetre.ui.cp_listeDecors.charger("dc")
-    ###############
     
     ############### affichage des caches enregistres
     
@@ -608,6 +529,7 @@ class Plateau(QGraphicsScene):
         self.majInfosAttaqueEC()
 
     ##### activation des differents modes d'interaction avec le plateau et mises a jour des principaux parametres  #######
+    
     def plateauModeCreation(self):
         self.activerMode(Modes.StandardCp)
 
@@ -685,17 +607,17 @@ class Plateau(QGraphicsScene):
     
     def modeCreationDecor(self, ligne, col):
         """enclenche le mode de creation de decors depuis la liste des decors"""
-        decor = self.fenetre.ui.cp_listeDecors.selection()
+        decor = chargerMat(self.fenetre.ui.cp_listeDecors.selection())
         self.activerMode(Modes.CreationPion, decor)
         
     def modeCreationCombattant(self, ligne, col):
         """enclenche le mode de creation de pions depuis la liste des creatures"""
-        creature = self.fenetre.ui.cp_listeCreatures.selection()
+        creature = chargerMat(self.fenetre.ui.cp_listeCreatures.selection())
         self.activerMode(Modes.CreationPion, creature)
 
     def modeMajTerrainCase(self, ligne, col):
         """enclenche le mode permettant la mise a jour du terrain des cases"""
-        terrain = self.fenetre.ui.cp_listeTerrains.selection()
+        terrain = chargerMat(self.fenetre.ui.cp_listeTerrains.selection())
         if terrain:
             self.activerMode(Modes.MajCases, terrain)
         else:
@@ -879,6 +801,7 @@ class Plateau(QGraphicsScene):
 
     def listeAttributCelluleModifiee(self, ligne, colonne):
         """une cellule de la liste des attributs a ete modifiee"""
+        return
         if colonne != 1:
             print("valeur non modifiable")
         else:
@@ -1121,59 +1044,66 @@ class Plateau(QGraphicsScene):
 
     def cone3d(self, coord1, coord2, z1 = 0, z2 = 0):
         return self.cone(coord1, coord2)
+   
 
+    def blocAdjacent(self, listeCases):
+        """renvoie un bloc de cases adjacentes a partir de la liste en parametre"""
+        retour = []
+        tmp1 = [listeCases[0]]; tmp2 = [listeCases[0]]
+        while len(tmp2) > 0:
+            tmp2 = []
+            #on liste les cases voisines qui sont dans la liste et pas encore verifiees
+            for coord in tmp1:
+                for voisine in self.cases[coord].voisins:
+                    if voisine in listeCases and not voisine in tmp1 and not voisine in tmp2:
+                        tmp2.append(voisine)
+            #chacune de ces cases prend le statut de verifiee
+            for coord in tmp1:
+                listeCases.remove(coord)
+                retour.append(coord)
+            tmp1 = tmp2
+        return retour 
+    
     def polygoneAgglo(self, listeCases):
         """renvoie un polygone contruit par agglomeration des polygones des cases de la liste
            les cases doivent etre adjacentes (cases hexagonales ou carrees)"""
-        pointsPolygone = []
         segments = []
         case = Case(self)
-        
-        #on verifie que toutes les cases sont adjacentes les unes aux autres
-        valide = True
-        if len(listeCases) > 1:
-            for coord in listeCases:
-                if not len(set(listeCases).intersection(self.lstCoordAdjacentes(coord[0], coord[1]))) > 0: valide = False
-        if not len(listeCases) > 0:
-            valide = False
-        
-        if valide:
-            #on parcourt les faces des polygones des cases, et on ne garde que ceux qui n'ont pas de case 'en face'
-            for coord in listeCases:
-                polygone = case.polygone(coord[0], coord[1])
-                voisins = self.lstCoordAdjacentes(coord[0], coord[1])
-                
-                for i in range(0, len(voisins)):
-                    if not voisins[i] in listeCases:
-                        j = i+1
-                        if j > len(voisins) - 1:
-                            j = 0
-                        segments.append(QLineF(polygone[i], polygone[j]))
-
-            #on 'accroche' les segments les uns aux autres, dans l'ordre
-            segments2 = [segments[0]]
-            for segment2 in segments2:
-                for segment in segments:
-                    if not QLineF(segment.p1(), segment.p2()) in segments2 and not QLineF(segment.p2(), segment.p1()) in segments2:
-                        if sqrt((segment.p1().x()-segment2.p2().x())**2+(segment.p1().y()-segment2.p2().y())**2) < 1:
-                            segments2.append(QLineF(segment.p1(), segment.p2()))
-                        elif sqrt((segment.p2().x()-segment2.p2().x())**2+(segment.p2().y()-segment2.p2().y())**2) < 1:   
-                            segments2.append(QLineF(segment.p2(), segment.p1()))
-
-            pointsPolygone = []
-            premierPoint = segments2[0].p1()
-            pointsPolygone.append(premierPoint)
-            for segment in segments2:
-                pointSuivant = segment.p2()
-                if pointSuivant != premierPoint:
-                    pointsPolygone.append(pointSuivant)
-
-            #creation du polygone
-            polygone = QPolygonF()
-            for point in pointsPolygone:   
-                polygone.append(point)   
-        else:
-            polygone = None
+        #on parcourt les faces des polygones des cases, et on ne garde que ceux qui n'ont pas de case 'en face'
+        for coord in listeCases:
+            polygone = case.polygone(coord[0], coord[1])
+            voisins = self.lstCoordAdjacentes(coord[0], coord[1])
+            
+            for i in range(0, len(voisins)):
+                if not voisins[i] in listeCases:
+                    j = i+1
+                    if j > len(voisins) - 1:
+                        j = 0
+                    segments.append(QLineF(polygone[i], polygone[j]))
+
+        #on 'accroche' les segments les uns aux autres, dans l'ordre
+        if not len(segments) > 0: return None
+        segments2 = [segments[0]]
+        for segment2 in segments2:
+            for segment in segments:
+                if not QLineF(segment.p1(), segment.p2()) in segments2 and not QLineF(segment.p2(), segment.p1()) in segments2:
+                    if sqrt((segment.p1().x()-segment2.p2().x())**2+(segment.p1().y()-segment2.p2().y())**2) < 1:
+                        segments2.append(QLineF(segment.p1(), segment.p2()))
+                    elif sqrt((segment.p2().x()-segment2.p2().x())**2+(segment.p2().y()-segment2.p2().y())**2) < 1:   
+                        segments2.append(QLineF(segment.p2(), segment.p1()))
+
+        pointsPolygone = []
+        premierPoint = segments2[0].p1()
+        pointsPolygone.append(premierPoint)
+        for segment in segments2:
+            pointSuivant = segment.p2()
+            if pointSuivant != premierPoint:
+                pointsPolygone.append(pointSuivant)
+
+        #creation du polygone
+        polygone = QPolygonF()
+        for point in pointsPolygone:   
+            polygone.append(point)   
 
         return polygone  
 
@@ -1376,10 +1306,15 @@ class Plateau(QGraphicsScene):
                 self.polygoneZonePlacement.setAcceptHoverEvents(False)
                 self.addItem(self.polygoneZonePlacement)
             listeCases2 = []    
+            
             for coord in listeCases:
-                if self.cases[coord].estFranchissable():
+                if self.cases[coord].terrain.franchissable:
                     listeCases2.append(coord)
-            self.polygoneZonePlacement.setPolygon(self.polygoneAgglo(listeCases2))
+            listeCases3 = self.blocAdjacent(listeCases2)
+
+            polygone = self.polygoneAgglo(listeCases3)
+            if not polygone: return
+            self.polygoneZonePlacement.setPolygon(polygone)
             self.listeCasesZonePlacement = listeCases
 
     def materialiserPions(self,actif):
@@ -1485,7 +1420,7 @@ class Plateau(QGraphicsScene):
                 if len(self.combattants) > 0:
                     numero = max(self.combattants) + 1
                 pion.numero = numero    
-                pion.numComplementaire = self.numeroterNom(pion.nom)    
+                pion.numComplementaire = self.numeroterNom(pion.nom())    
                 self.combattants[numero] = pion
                 self.pionDeplacerDansOrdreJeu(numero, len(self.ordreJeu) + 2)
                 
@@ -1507,12 +1442,8 @@ class Plateau(QGraphicsScene):
         """renvoie le nom du pion avec un numero complementaire si necessaire """
         i = 1
         for numCombattant in self.combattants:
-            if self.combattants[numCombattant].nom == nom:
-                i += 1     
-        if i == 1:
-            retour = ""
-        else:
-            retour = str(i)
+            if self.combattants[numCombattant].nom() == nom: i += 1     
+        retour = str(i) if i > 1 else ""
         return retour
         
     def pionDeposer(self, coordCase):
@@ -1575,6 +1506,7 @@ class Plateau(QGraphicsScene):
     ###############"
         
     ######### gestion des evenements souris et clavier ###############
+    
     def mouseMoveEvent(self, event):
         super(Plateau, self).mouseMoveEvent(event)
         if event.buttons() == Qt.LeftButton and self.vue().dragMode() != QGraphicsView.ScrollHandDrag:

+ 1 - 0
lib/Terrain.py

@@ -22,6 +22,7 @@ class Terrain(Materiel):
     
     def __setstate__(self, state):
         self.__dict__ = state
+        super(Terrain, self).__init__()
 
     def icone(self):
         """renvoie l'image a afficher dans les listes"""

+ 26 - 26
lib/VueEditionForme.py

@@ -109,37 +109,37 @@ class VueEditionForme(QGraphicsScene):
                     self._cases[coord].setBrush(self._couleur)
 
     def majSelection(self, coord):
-         """met a jour l'affichage des cases selectionnees pour l'affichage de la forme"""
-         if self._autoriseModifForme:
-             if self._cases[coord].estSelectionnee():
-                 valide = True
-                 for coordVerif in self._cases:
-                     #on parcourt les autres cases selectionnees
-                     if coordVerif != (0,0) and coordVerif != coord and self._cases[coordVerif].estSelectionnee():
-                         #on liste les cases connectees a cette case, de proche en proche
-                         connectees = [coordVerif]
-                         for coordVerif2 in connectees:
-                             for coordVoisin in self._cases[coordVerif2].voisins():
-                                 if coordVoisin in self._cases and not coordVoisin in connectees:
-                                     if self._cases[coordVoisin].estSelectionnee():
-                                         connectees.append(coordVoisin)
-                         if not (0,0) in connectees:
-                             valide = False
-                             break
-                 if valide:
-                     self._cases[coord].selectionner(False)
-             else:
-                 #on s'assure que la case est bien adjacente a une case selectionnee
-                 valide = False
-                 for coordVerif in self._cases[coord].voisins():
+        """met a jour l'affichage des cases selectionnees pour l'affichage de la forme"""
+        if self._autoriseModifForme:
+            if self._cases[coord].estSelectionnee():
+                valide = True
+                for coordVerif in self._cases:
+                    #on parcourt les autres cases selectionnees
+                    if coordVerif != (0,0) and coordVerif != coord and self._cases[coordVerif].estSelectionnee():
+                        #on liste les cases connectees a cette case, de proche en proche
+                        connectees = [coordVerif]
+                        for coordVerif2 in connectees:
+                            for coordVoisin in self._cases[coordVerif2].voisins():
+                                if coordVoisin in self._cases and not coordVoisin in connectees:
+                                    if self._cases[coordVoisin].estSelectionnee():
+                                        connectees.append(coordVoisin)
+                        if not (0,0) in connectees:
+                            valide = False
+                            break
+                if valide:
+                    self._cases[coord].selectionner(False)
+            else:
+                #on s'assure que la case est bien adjacente a une case selectionnee
+                valide = False
+                for coordVerif in self._cases[coord].voisins():
                     if coordVerif in self._cases:
                         if self._cases[coordVerif].estSelectionnee():
                             valide = True
                             break
-                 if valide:
-                     self._cases[coord].selectionner(True)
+                if valide:
+                    self._cases[coord].selectionner(True)
                      
-             self._majCouleurGraphique()
+            self._majCouleurGraphique()
 
 
     def afficherMsg(self, msg):

+ 12 - 21
lib/frameAttaque.py

@@ -3,12 +3,13 @@
 """Panneau de creation/edition d'une attaque
 """
 import sys
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-from ui.ecran_panneauAttaques import Ui_att_frame
+
 from Actions import *
+from lib.br import ligne
+from lib.ui.dm import DmLabel, DmLineEdit
 import regles
-from ui.dm import *
+from ui.ecran_panneauAttaques import Ui_att_frame
+
 
 class FrameAttaque(QFrame):
     """Panneau de creation/edition d'une attaque
@@ -147,11 +148,10 @@ class FrameAttaque(QFrame):
             lay.addWidget(etiquette)
             
             champ = DmLineEdit()
-            champ.setMinimumSize(QSize(60, 20))
-            champ.setMaximumSize(QSize(60, 20))
+            champ.setMinimumSize(QSize(80, 20))
+            champ.setMaximumSize(QSize(80, 20))
             champ.majTexte(regles.listeAttributsAttaques()[nomAttribut])
             champ.setObjectName("{}_champ".format(nomAttribut))
-            self.connect(champ, SIGNAL("textChanged()"), self.controlerAttribut)
             lay.addWidget(champ)
 
             largeur = 85
@@ -191,23 +191,14 @@ class FrameAttaque(QFrame):
                     attributs[attr] = widget.texte()
         return attributs
 
-    def controlerAttribut(self):
-        emetteur = self.sender().objectName()
-        index = colonne - 10
-        attribut = regles.ordreAttributsAttaques()[index]
-        valeurAttribut = regles.listeControleAttaques()[attribut].controler(str(self.data(ligne, colonne).toString()))
-        if valeurAttribut != None:
-            attaque.attributs[attribut] = valeurAttribut
-        else:
-            self.majData(ligne, colonne, attaque.attributs[attribut])
 
 
 if __name__ == "__main__":
-   app = QApplication(sys.argv)
-   ecran = FrameAttaque(0)
-   ecran.show()
-   r = app.exec_()
-   exit(r)  
+    app = QApplication(sys.argv)
+    ecran = FrameAttaque(0)
+    ecran.show()
+    r = app.exec_()
+    exit(r)  
 
 
 

+ 13 - 10
lib/framePj.py

@@ -3,11 +3,12 @@
 """Panneau d'affichage des PJ dans l'onglet groupe
 """
 import sys
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-from ui.ecran_panneauPj import Ui_pj_panneau
-from ui.dm import *
+
+from PyQt4.QtCore import SIGNAL, Qt
+from PyQt4.QtGui import QFrame, QPushButton, QApplication
+
 from EcranEditionCombattant import EcranEditionCombattant
+from ui.ecran_panneauPj import Ui_pj_panneau
 
 
 class FramePj(QFrame):
@@ -43,7 +44,7 @@ class FramePj(QFrame):
         """met a jour le contenu avec les donnees du pj en param"""
         if pj != None:
             self.ui.pj_image.chargerImage(pj.logo)
-            self.ui.pj_nom.majTexte(pj.nom)
+            self.ui.pj_nom.majTexte(pj.nom())
             for i in range(0, 6):
                 bouton = self.findChild(QPushButton, "pj_afficher_{}".format(i))
                 bouton.setEnabled(True)
@@ -61,12 +62,13 @@ class FramePj(QFrame):
         """affiche la fiche de perso a la page demandee"""
         emetteur = self.sender().objectName()
         page = int(str(emetteur)[-1:])
-        self.editionPj = EcranEditionCombattant(self._pj, page)
-        self.editionPj.setAttribute(Qt.WA_DeleteOnClose)
-        self.editionPj.exec_()
-        self._pj = self.editionPj.combattant
+        fen = EcranEditionCombattant(self._pj, page)
+        fen.exec_()
+        self._pj = fen.combattant()
+        del fen
         self.ui.pj_image.chargerImage(self._pj.logo)
-        self.ui.pj_nom.majTexte(self._pj.nom)    
+        self.ui.pj_nom.majTexte(self._pj.nom())    
+        self.majApparence()
         self.signalerModif()
 
     def majApparence(self):
@@ -76,6 +78,7 @@ class FramePj(QFrame):
                            "border: 2px solid " + self._pj.couleur.lighter(110).name() + ";" \
                            "border-radius: 5px;}" \
                            "QLabel {border-width: 0px;}")
+        
     def enterEvent(self, event):
         self.setEnabled(True)
 

+ 2 - 1
lib/rsc.py

@@ -9,7 +9,8 @@ from PyQt4.QtCore import Qt, SIGNAL, QString
 from PyQt4.QtGui import QPixmap, QDialog, QFrame, QColor, QPalette, QApplication, \
     QFileDialog
 
-from commun import rep, uid, enregistrerSous, charger, dmConfirmer
+from commun import rep, uid, enregistrerSous, charger
+from dialogues import dmConfirmer
 from ui.ecran_editerImage import Ui_edi_fenetre
 from ui.ecran_explorateur import Ui_exr_fenetre
 from ui.panneauImage import Ui_exi_panneau

+ 3 - 0
lib/ui/chargerPlateau.ui

@@ -2,6 +2,9 @@
 <ui version="4.0">
  <class>chp_fenetre</class>
  <widget class="QDialog" name="chp_fenetre">
+  <property name="windowModality">
+   <enum>Qt::ApplicationModal</enum>
+  </property>
   <property name="geometry">
    <rect>
     <x>0</x>

+ 65 - 80
lib/ui/dm.py

@@ -9,18 +9,8 @@ from PyQt4.QtGui import QLabel, QPixmap, QTextEdit, QLineEdit, QGraphicsView, \
     QComboBox, QSpinBox, QTabWidget, QTableWidget, QTableWidgetItem, \
     QItemSelectionModel, QIcon, QColor, QBrush, QGroupBox, QFrame
 
-from lib.mat import chargerMat
 from lib.outilsSvg import afficheSvg
 
-
-try:
-    from lib.commun import rep, charger
-except:
-    try:
-        from commun import rep, charger
-    except:
-        print "dm: impossible de charger commun"
-
 try:        
     import lib.regles as regles
 except:
@@ -288,26 +278,26 @@ class DmTableMat(DmTableWidget):
         terrains, decors, creatures"""
     def __init__(self, parent = None):
         super(DmTableMat, self).__init__(parent)
+        self._init = False
         
-    def charger(self, filtre = ""):
+    def charger(self, listeMat):
         """remplit la table avec les donnees contenues dans les fichiers de materiel
            (filtre selon le prefixe)"""
-        self.setIconSize(QSize(30,20))   
-        self.horizontalHeader().setStretchLastSection(True)
-        self.masquerColonneId()           
+        if not self._init:
+            self.setIconSize(QSize(30,20))   
+            self.horizontalHeader().setStretchLastSection(True)
+            self.masquerColonneId()    
+            self._init = True       
            
         self.majEnCours = True
         self.setSortingEnabled(False)
         
-        for attributsFichier in os.walk(rep("jeu")):
-            for f in attributsFichier[2]:
-                if f[:2] == filtre or len(filtre) == 0:
-                    ligne = self.nouvelleLigneFin()
-                    mat = charger(os.path.join(attributsFichier[0], f))
-                    self.majTexte(ligne, 0, mat.idM())
-                    icon = QIcon() if not mat.icone() else QIcon(mat.icone().fichier())
-                    item = QTableWidgetItem(icon, QString.fromUtf8(mat.nom()))
-                    self.setItem(ligne, 1, item)
+        for mat in listeMat:
+            ligne = self.nouvelleLigneFin()
+            self.majTexte(ligne, 0, mat.idM())
+            icon = QIcon() if not mat.icone() else QIcon(mat.icone().fichier())
+            item = QTableWidgetItem(icon, QString.fromUtf8(mat.nom()))
+            self.setItem(ligne, 1, item)
           
         self.sizeHintForColumn(1)
         self.sortItems(1)
@@ -320,62 +310,55 @@ class DmTableMat(DmTableWidget):
         self.remplir()
 
     def selection(self):
-        """renvoie l'objet actuellement selectionne"""
-        mat = chargerMat(self.texte(self.currentRow(), 0))
-        return mat
+        """renvoie l'idM du materiel actuellement selectionne"""
+        return self.texte(self.currentRow(), 0)
     
 
-class DmTableAttributsPi(DmTableWidget):
-    """table utilisee pour afficher les attributs d'un pion dans le panneau Pi"""
-    def __init__(self, parent = None):
-        super(DmTableMat, self).__init__(parent)
-        self.fichier = ""
-        self.masquerColonneId()
-
-    def defFichier(self, fichier):
-        """definit le fichier de sauvegarde qui la source des donnees de la table"""
-        self.fichier = fichier
-
-    def initAffichage(self):
-        """fait les differents reglages relatifs a l'apparence"""
-        self.setColumnWidth(0, 0)
-        self.setIconSize(QSize(30,20))   
-        self.horizontalHeader().setStretchLastSection(True)
-        
-    def remplir(self):
-        """remplit la table avec les donnees contenues dans le dictionnaire de la savuvegarde"""
-        dico = afficheSvg(self.fichier)
-        self.majEnCours = True
-        self.setSortingEnabled(False)
-        index = 0
-        for elt in dico:
-            objet = dico[elt]
-            self.insertRow(int(index))
-            
-            #code de l'objet
-            self.setItem(int(index),0,QTableWidgetItem(QString.fromUtf8(elt)))
-            #icone et nom
-            icon = QIcon("img\\"+objet.icone())
-            item = QTableWidgetItem(icon,QString.fromUtf8(objet.nom))
-            self.setItem(int(index),1,item)
-            
-            index += 1        
-        self.sizeHintForColumn(1)
-        self.setSortingEnabled(True)
-        self.sortItems(1)
-        self.majEnCours = False
-
-    def maj(self):
-        self.vider()
-        self.remplir()
-
-    def actuel(self):
-        """renvoie l'objet actuellement selectionne"""
-        objet = None
-        index = self.item(self.currentRow(), 0)
-        if index > 0:
-            objet = charger(self.fichier, str(index.text().toUtf8()))
-        return objet
+# class DmTableAttributsPi(DmTableWidget):
+#     """table utilisee pour afficher les attributs d'un pion dans le panneau Pi"""
+#     def __init__(self, parent = None):
+#         super(DmTableMat, self).__init__(parent)
+#         self.masquerColonneId()
+# 
+#     def initAffichage(self):
+#         """fait les differents reglages relatifs a l'apparence"""
+#         self.setColumnWidth(0, 0)
+#         self.setIconSize(QSize(30,20))   
+#         self.horizontalHeader().setStretchLastSection(True)
+#         
+#     def remplir(self, attributs):
+#         """remplit la table avec les donnees du pion"""
+#         self.majEnCours = True
+#         self.setSortingEnabled(False)
+#         index = 0
+#         for elt in dico:
+#             objet = dico[elt]
+#             self.insertRow(int(index))
+#             
+#             #code de l'objet
+#             self.setItem(int(index),0,QTableWidgetItem(QString.fromUtf8(elt)))
+#             #icone et nom
+#             icon = QIcon("img\\"+objet.icone())
+#             item = QTableWidgetItem(icon,QString.fromUtf8(objet.nom))
+#             self.setItem(int(index),1,item)
+#             
+#             index += 1        
+#         self.sizeHintForColumn(1)
+#         self.setSortingEnabled(True)
+#         self.sortItems(1)
+#         self.majEnCours = False
+# 
+#     def maj(self):
+#         self.vider()
+#         self.remplir()
+
+#     def actuel(self):
+#         """renvoie l'objet actuellement selectionne"""
+#         objet = None
+#         index = self.item(self.currentRow(), 0)
+#         if index > 0:
+#             objet = charger(self.fichier, str(index.text().toUtf8()))
+#         return objet
 
 
 class DmTableInventaire(DmTableWidget):
@@ -537,10 +520,12 @@ class DmFrameInf_Case(QGroupBox):
             self.findChild(DmLabel, "inf_caseTerrain").majTexte("Case")
             
         self.findChild(DmLabel, "inf_caseCoord").majTexte("X: {}  Y: {}".format(case.x, case.y))
-        self.findChild(DmLabel, "inf_caseAltitude").majTexte("Alt.: {}".format(case.altitude))
+        self.findChild(DmLabel, "inf_caseAltitude").majTexte("Altitude: {}".format(case.altitude))
         
-        if case.effetActif != "":
-            self.findChild(DmLabel, "inf_caseEffet").chargerImage("img\\"+case.imgEffet[case.effetActif])          
+        if case.effetActif not in ["", "aucun"]:
+            imgEffet = {"brule": "feu_16.png", "eau": "eau_16.png","glace": "glace_16.png","poison": "poison_16.png"}
+            pix = QPixmap(":/interface/16/ressource/{}".format(imgEffet[case.effetActif]))
+            self.findChild(DmLabel, "inf_caseEffet").setPixmap(pix)          
         else:
             self.findChild(DmLabel, "inf_caseEffet").clear()      
 

+ 6 - 6
lib/ui/ecran_editionCombattant.py

@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'editionCombattant.ui'
 #
-# Created: Fri Jul 17 11:19:27 2015
+# Created: Wed Sep 09 17:48:20 2015
 #      by: PyQt4 UI code generator 4.10.4
 #
 # WARNING! All changes made in this file will be lost!
@@ -27,9 +27,9 @@ class Ui_edc_fenetre(object):
     def setupUi(self, edc_fenetre):
         edc_fenetre.setObjectName(_fromUtf8("edc_fenetre"))
         edc_fenetre.setWindowModality(QtCore.Qt.ApplicationModal)
-        edc_fenetre.resize(679, 484)
-        edc_fenetre.setMinimumSize(QtCore.QSize(0, 484))
-        edc_fenetre.setMaximumSize(QtCore.QSize(16777215, 10000))
+        edc_fenetre.resize(679, 486)
+        edc_fenetre.setMinimumSize(QtCore.QSize(679, 484))
+        edc_fenetre.setMaximumSize(QtCore.QSize(679, 486))
         self.horizontalLayout_2 = QtGui.QHBoxLayout(edc_fenetre)
         self.horizontalLayout_2.setContentsMargins(0, 0, -1, 0)
         self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
@@ -1043,8 +1043,8 @@ class Ui_edc_fenetre(object):
         self.horizontalLayout_2.addLayout(self.horizontalLayout)
 
         self.retranslateUi(edc_fenetre)
-        self.edc_pages.setCurrentIndex(1)
-        self.edc_filtreTypeObjet.setCurrentIndex(4)
+        self.edc_pages.setCurrentIndex(4)
+        self.edc_filtreTypeObjet.setCurrentIndex(0)
         QtCore.QObject.connect(self.edc_menu, QtCore.SIGNAL(_fromUtf8("cellClicked(int,int)")), self.edc_pages.setCurrentIndex)
         QtCore.QMetaObject.connectSlotsByName(edc_fenetre)
 

+ 4 - 4
lib/ui/ecran_editionDecor.py

@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'editionDecor.ui'
 #
-# Created: Mon Jun 29 16:27:29 2015
+# Created: Wed Sep 09 14:00:08 2015
 #      by: PyQt4 UI code generator 4.10.4
 #
 # WARNING! All changes made in this file will be lost!
@@ -524,7 +524,7 @@ class Ui_edd_fenetre(object):
         font.setFamily(_fromUtf8("Verdana"))
         self.label_23.setFont(font)
         self.label_23.setObjectName(_fromUtf8("label_23"))
-        self.edd_notes = QtGui.QTextEdit(self.page_notes)
+        self.edd_notes = DmTextEdit(self.page_notes)
         self.edd_notes.setGeometry(QtCore.QRect(30, 150, 441, 171))
         palette = QtGui.QPalette()
         brush = QtGui.QBrush(QtGui.QColor(248, 248, 248))
@@ -620,7 +620,7 @@ class Ui_edd_fenetre(object):
         self.horizontalLayout_2.addLayout(self.horizontalLayout)
 
         self.retranslateUi(edd_fenetre)
-        self.edd_pages.setCurrentIndex(0)
+        self.edd_pages.setCurrentIndex(3)
         self.edd_filtreTypeObjet.setCurrentIndex(3)
         QtCore.QObject.connect(self.edd_menu, QtCore.SIGNAL(_fromUtf8("cellClicked(int,int)")), self.edd_pages.setCurrentIndex)
         QtCore.QMetaObject.connectSlotsByName(edd_fenetre)
@@ -692,7 +692,7 @@ class Ui_edd_fenetre(object):
         self.edd_enregistrer.setText(_translate("edd_fenetre", "Enregistrer", None))
         self.edd_annuler.setText(_translate("edd_fenetre", "Annuler", None))
 
-from dm import DmTabInventaire, DmTableInventaire, DmTableMenu, DmLabel, DmLineEdit
+from dm import DmTabInventaire, DmLineEdit, DmLabel, DmTableMenu, DmTextEdit, DmTableInventaire
 import ressource_rc
 
 if __name__ == "__main__":

+ 105 - 40
lib/ui/ecran_principal.py

@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'principal.ui'
 #
-# Created: Mon Sep 07 21:37:46 2015
+# Created: Thu Sep 10 11:41:36 2015
 #      by: PyQt4 UI code generator 4.10.4
 #
 # WARNING! All changes made in this file will be lost!
@@ -44,13 +44,37 @@ class Ui_principal(object):
         self.dm_panneauCentre.setFont(font)
         self.dm_panneauCentre.setAcceptDrops(False)
         self.dm_panneauCentre.setObjectName(_fromUtf8("dm_panneauCentre"))
+        self.tab = QtGui.QWidget()
+        self.tab.setObjectName(_fromUtf8("tab"))
+        self.label_5 = QtGui.QLabel(self.tab)
+        self.label_5.setGeometry(QtCore.QRect(40, 30, 171, 41))
+        self.label_5.setObjectName(_fromUtf8("label_5"))
+        self.label_6 = QtGui.QLabel(self.tab)
+        self.label_6.setGeometry(QtCore.QRect(40, 90, 171, 41))
+        self.label_6.setObjectName(_fromUtf8("label_6"))
+        self.label_7 = QtGui.QLabel(self.tab)
+        self.label_7.setGeometry(QtCore.QRect(40, 150, 171, 41))
+        self.label_7.setObjectName(_fromUtf8("label_7"))
+        self.dm_panneauCentre.addTab(self.tab, _fromUtf8(""))
         self.Combats_tab = QtGui.QWidget()
         self.Combats_tab.setObjectName(_fromUtf8("Combats_tab"))
         self.horizontalLayout_3 = QtGui.QHBoxLayout(self.Combats_tab)
         self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3"))
+        self.combatPanneau = QtGui.QStackedWidget(self.Combats_tab)
+        self.combatPanneau.setMinimumSize(QtCore.QSize(50, 0))
+        self.combatPanneau.setObjectName(_fromUtf8("combatPanneau"))
+        self.menu = QtGui.QWidget()
+        self.menu.setObjectName(_fromUtf8("menu"))
+        self.combatPanneau.addWidget(self.menu)
+        self.combat = QtGui.QWidget()
+        self.combat.setObjectName(_fromUtf8("combat"))
+        self.horizontalLayout_9 = QtGui.QHBoxLayout(self.combat)
+        self.horizontalLayout_9.setSpacing(1)
+        self.horizontalLayout_9.setMargin(1)
+        self.horizontalLayout_9.setObjectName(_fromUtf8("horizontalLayout_9"))
         self.layoutCombat = QtGui.QVBoxLayout()
         self.layoutCombat.setObjectName(_fromUtf8("layoutCombat"))
-        self.cbt_panneauHaut = QtGui.QStackedWidget(self.Combats_tab)
+        self.cbt_panneauHaut = QtGui.QStackedWidget(self.combat)
         self.cbt_panneauHaut.setMinimumSize(QtCore.QSize(0, 32))
         self.cbt_panneauHaut.setMaximumSize(QtCore.QSize(16777215, 32))
         self.cbt_panneauHaut.setObjectName(_fromUtf8("cbt_panneauHaut"))
@@ -125,7 +149,7 @@ class Ui_principal(object):
         self.plateauLayoutH = QtGui.QHBoxLayout()
         self.plateauLayoutH.setSpacing(3)
         self.plateauLayoutH.setObjectName(_fromUtf8("plateauLayoutH"))
-        self.cbt_panneauGauche = QtGui.QStackedWidget(self.Combats_tab)
+        self.cbt_panneauGauche = QtGui.QStackedWidget(self.combat)
         self.cbt_panneauGauche.setMinimumSize(QtCore.QSize(90, 0))
         self.cbt_panneauGauche.setMaximumSize(QtCore.QSize(128, 16777215))
         self.cbt_panneauGauche.setObjectName(_fromUtf8("cbt_panneauGauche"))
@@ -193,7 +217,14 @@ class Ui_principal(object):
         self.cbt_afficherGestion.setIconSize(QtCore.QSize(24, 24))
         self.cbt_afficherGestion.setObjectName(_fromUtf8("cbt_afficherGestion"))
         self.panneauInfosPlateau.addWidget(self.cbt_afficherGestion)
-        self.inf_boitePion = DmFrameInf_Combattant(self.inf_panneau)
+        self.inf_bas = QtGui.QFrame(self.inf_panneau)
+        self.inf_bas.setMinimumSize(QtCore.QSize(90, 200))
+        self.inf_bas.setMaximumSize(QtCore.QSize(120, 200))
+        self.inf_bas.setFrameShape(QtGui.QFrame.StyledPanel)
+        self.inf_bas.setFrameShadow(QtGui.QFrame.Raised)
+        self.inf_bas.setObjectName(_fromUtf8("inf_bas"))
+        self.inf_boitePion = DmFrameInf_Combattant(self.inf_bas)
+        self.inf_boitePion.setGeometry(QtCore.QRect(0, 0, 110, 65))
         self.inf_boitePion.setMinimumSize(QtCore.QSize(80, 65))
         self.inf_boitePion.setMaximumSize(QtCore.QSize(110, 16777215))
         self.inf_boitePion.setTitle(_fromUtf8(""))
@@ -211,7 +242,7 @@ class Ui_principal(object):
         self.inf_pionEffet = DmLabel(self.inf_boitePion)
         self.inf_pionEffet.setGeometry(QtCore.QRect(50, 40, 21, 20))
         self.inf_pionEffet.setText(_fromUtf8(""))
-        self.inf_pionEffet.setPixmap(QtGui.QPixmap(_fromUtf8("../../../../Users/olivier.massot/.designer/backup/img/etatEtourdi.png")))
+        self.inf_pionEffet.setPixmap(QtGui.QPixmap(_fromUtf8("../../../../../Users/olivier.massot/.designer/backup/img/etatEtourdi.png")))
         self.inf_pionEffet.setScaledContents(False)
         self.inf_pionEffet.setObjectName(_fromUtf8("inf_pionEffet"))
         self.inf_pionNom = DmLabel(self.inf_boitePion)
@@ -219,15 +250,15 @@ class Ui_principal(object):
         self.inf_pionNom.setMargin(1)
         self.inf_pionNom.setIndent(-1)
         self.inf_pionNom.setObjectName(_fromUtf8("inf_pionNom"))
-        self.panneauInfosPlateau.addWidget(self.inf_boitePion)
-        self.inf_boiteDecor = DmFrameInf_Decor(self.inf_panneau)
+        self.inf_boiteDecor = DmFrameInf_Decor(self.inf_bas)
         self.inf_boiteDecor.setEnabled(True)
+        self.inf_boiteDecor.setGeometry(QtCore.QRect(0, 70, 110, 61))
         self.inf_boiteDecor.setMinimumSize(QtCore.QSize(80, 61))
         self.inf_boiteDecor.setMaximumSize(QtCore.QSize(110, 16777215))
         self.inf_boiteDecor.setTitle(_fromUtf8(""))
         self.inf_boiteDecor.setObjectName(_fromUtf8("inf_boiteDecor"))
         self.inf_decorNom = DmLabel(self.inf_boiteDecor)
-        self.inf_decorNom.setGeometry(QtCore.QRect(10, 0, 61, 21))
+        self.inf_decorNom.setGeometry(QtCore.QRect(10, 0, 91, 21))
         self.inf_decorNom.setObjectName(_fromUtf8("inf_decorNom"))
         self.inf_decorImage = DmLabel(self.inf_boiteDecor)
         self.inf_decorImage.setGeometry(QtCore.QRect(10, 20, 31, 31))
@@ -236,15 +267,21 @@ class Ui_principal(object):
         self.inf_decorImage.setObjectName(_fromUtf8("inf_decorImage"))
         self.inf_decorEffet = DmLabel(self.inf_boiteDecor)
         self.inf_decorEffet.setGeometry(QtCore.QRect(50, 20, 21, 21))
+        self.inf_decorEffet.setText(_fromUtf8(""))
+        self.inf_decorEffet.setPixmap(QtGui.QPixmap(_fromUtf8(":/interface/16/ressource/feu_16.png")))
         self.inf_decorEffet.setObjectName(_fromUtf8("inf_decorEffet"))
         self.inf_decorDetruit = DmLabel(self.inf_boiteDecor)
         self.inf_decorDetruit.setGeometry(QtCore.QRect(50, 40, 21, 21))
+        self.inf_decorDetruit.setText(_fromUtf8(""))
+        self.inf_decorDetruit.setPixmap(QtGui.QPixmap(_fromUtf8(":/interface/16/ressource/brise_16.png")))
         self.inf_decorDetruit.setObjectName(_fromUtf8("inf_decorDetruit"))
         self.inf_decorVerrouille = DmLabel(self.inf_boiteDecor)
-        self.inf_decorVerrouille.setGeometry(QtCore.QRect(50, 0, 21, 21))
+        self.inf_decorVerrouille.setGeometry(QtCore.QRect(70, 20, 21, 21))
+        self.inf_decorVerrouille.setText(_fromUtf8(""))
+        self.inf_decorVerrouille.setPixmap(QtGui.QPixmap(_fromUtf8(":/interface/16/ressource/verrou_ferme_16.png")))
         self.inf_decorVerrouille.setObjectName(_fromUtf8("inf_decorVerrouille"))
-        self.panneauInfosPlateau.addWidget(self.inf_boiteDecor)
-        self.inf_boiteCase = DmFrameInf_Case(self.inf_panneau)
+        self.inf_boiteCase = DmFrameInf_Case(self.inf_bas)
+        self.inf_boiteCase.setGeometry(QtCore.QRect(0, 136, 110, 61))
         self.inf_boiteCase.setMinimumSize(QtCore.QSize(80, 61))
         self.inf_boiteCase.setMaximumSize(QtCore.QSize(110, 16777215))
         self.inf_boiteCase.setTitle(_fromUtf8(""))
@@ -282,36 +319,42 @@ class Ui_principal(object):
         self.infoPionEnCours_vol_2.setGeometry(QtCore.QRect(60, 160, 21, 21))
         self.infoPionEnCours_vol_2.setObjectName(_fromUtf8("infoPionEnCours_vol_2"))
         self.inf_caseTerrain = DmLabel(self.inf_boiteCase)
-        self.inf_caseTerrain.setGeometry(QtCore.QRect(10, 0, 61, 21))
+        self.inf_caseTerrain.setGeometry(QtCore.QRect(10, 0, 71, 21))
         self.inf_caseTerrain.setMargin(1)
         self.inf_caseTerrain.setIndent(-1)
         self.inf_caseTerrain.setObjectName(_fromUtf8("inf_caseTerrain"))
         self.inf_caseCoord = DmLabel(self.inf_boiteCase)
-        self.inf_caseCoord.setGeometry(QtCore.QRect(10, 20, 61, 21))
+        self.inf_caseCoord.setGeometry(QtCore.QRect(10, 20, 91, 21))
         self.inf_caseCoord.setMargin(1)
         self.inf_caseCoord.setIndent(-1)
         self.inf_caseCoord.setObjectName(_fromUtf8("inf_caseCoord"))
         self.inf_caseEffet = DmLabel(self.inf_boiteCase)
         self.inf_caseEffet.setGeometry(QtCore.QRect(60, 0, 21, 21))
         self.inf_caseEffet.setText(_fromUtf8(""))
-        self.inf_caseEffet.setPixmap(QtGui.QPixmap(_fromUtf8("../../../../Users/olivier.massot/.designer/backup/img/etatFeu.png")))
+        self.inf_caseEffet.setPixmap(QtGui.QPixmap(_fromUtf8("../../../../../Users/olivier.massot/.designer/backup/img/etatFeu.png")))
         self.inf_caseEffet.setScaledContents(True)
         self.inf_caseEffet.setMargin(1)
         self.inf_caseEffet.setIndent(-1)
         self.inf_caseEffet.setObjectName(_fromUtf8("inf_caseEffet"))
         self.inf_caseAltitude = DmLabel(self.inf_boiteCase)
-        self.inf_caseAltitude.setGeometry(QtCore.QRect(10, 40, 31, 21))
+        self.inf_caseAltitude.setGeometry(QtCore.QRect(10, 40, 91, 21))
         self.inf_caseAltitude.setMargin(1)
         self.inf_caseAltitude.setIndent(-1)
         self.inf_caseAltitude.setObjectName(_fromUtf8("inf_caseAltitude"))
-        self.panneauInfosPlateau.addWidget(self.inf_boiteCase)
+        self.inf_caseEffet_2 = DmLabel(self.inf_boiteCase)
+        self.inf_caseEffet_2.setGeometry(QtCore.QRect(90, 0, 21, 21))
+        self.inf_caseEffet_2.setText(_fromUtf8(""))
+        self.inf_caseEffet_2.setMargin(1)
+        self.inf_caseEffet_2.setIndent(-1)
+        self.inf_caseEffet_2.setObjectName(_fromUtf8("inf_caseEffet_2"))
+        self.panneauInfosPlateau.addWidget(self.inf_bas)
         self.horizontalLayout_6.addWidget(self.inf_panneau)
         self.cbt_panneauGauche.addWidget(self.page_5)
         self.plateauLayoutH.addWidget(self.cbt_panneauGauche)
         self.layoutCombatCentre = QtGui.QVBoxLayout()
         self.layoutCombatCentre.setSpacing(0)
         self.layoutCombatCentre.setObjectName(_fromUtf8("layoutCombatCentre"))
-        self.cbt_vue = DmGraphicsView(self.Combats_tab)
+        self.cbt_vue = DmGraphicsView(self.combat)
         self.cbt_vue.setMinimumSize(QtCore.QSize(100, 0))
         self.cbt_vue.setAcceptDrops(True)
         self.cbt_vue.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
@@ -323,7 +366,7 @@ class Ui_principal(object):
         self.cbt_vue.setViewportUpdateMode(QtGui.QGraphicsView.MinimalViewportUpdate)
         self.cbt_vue.setObjectName(_fromUtf8("cbt_vue"))
         self.layoutCombatCentre.addWidget(self.cbt_vue)
-        self.cbt_panneauBas = QtGui.QStackedWidget(self.Combats_tab)
+        self.cbt_panneauBas = QtGui.QStackedWidget(self.combat)
         self.cbt_panneauBas.setMinimumSize(QtCore.QSize(0, 75))
         self.cbt_panneauBas.setMaximumSize(QtCore.QSize(16777215, 75))
         self.cbt_panneauBas.setObjectName(_fromUtf8("cbt_panneauBas"))
@@ -390,7 +433,7 @@ class Ui_principal(object):
         self.layoutV_droite.setSizeConstraint(QtGui.QLayout.SetDefaultConstraint)
         self.layoutV_droite.setContentsMargins(3, -1, 3, -1)
         self.layoutV_droite.setObjectName(_fromUtf8("layoutV_droite"))
-        self.cbt_panneauDroite = QtGui.QStackedWidget(self.Combats_tab)
+        self.cbt_panneauDroite = QtGui.QStackedWidget(self.combat)
         self.cbt_panneauDroite.setMinimumSize(QtCore.QSize(170, 0))
         self.cbt_panneauDroite.setMaximumSize(QtCore.QSize(170, 16777215))
         self.cbt_panneauDroite.setObjectName(_fromUtf8("cbt_panneauDroite"))
@@ -634,6 +677,9 @@ class Ui_principal(object):
         self.horizontalLayout_4 = QtGui.QHBoxLayout()
         self.horizontalLayout_4.setContentsMargins(-1, 0, -1, -1)
         self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4"))
+        self.cp_importTerrain = QtGui.QToolButton(self.cp_afficherTerrains)
+        self.cp_importTerrain.setObjectName(_fromUtf8("cp_importTerrain"))
+        self.horizontalLayout_4.addWidget(self.cp_importTerrain)
         spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
         self.horizontalLayout_4.addItem(spacerItem2)
         self.cp_nouveauTerrain = QtGui.QToolButton(self.cp_afficherTerrains)
@@ -650,6 +696,9 @@ class Ui_principal(object):
         self.cp_editerTerrain.setIcon(icon15)
         self.cp_editerTerrain.setObjectName(_fromUtf8("cp_editerTerrain"))
         self.horizontalLayout_4.addWidget(self.cp_editerTerrain)
+        self.cp_retirerTerrain = QtGui.QToolButton(self.cp_afficherTerrains)
+        self.cp_retirerTerrain.setObjectName(_fromUtf8("cp_retirerTerrain"))
+        self.horizontalLayout_4.addWidget(self.cp_retirerTerrain)
         self.verticalLayout_4.addLayout(self.horizontalLayout_4)
         icon16 = QtGui.QIcon()
         icon16.addPixmap(QtGui.QPixmap(_fromUtf8(":/interface/32/ressource/montagne_32.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
@@ -679,13 +728,9 @@ class Ui_principal(object):
         self.horizontalLayout_7 = QtGui.QHBoxLayout()
         self.horizontalLayout_7.setContentsMargins(-1, 0, -1, -1)
         self.horizontalLayout_7.setObjectName(_fromUtf8("horizontalLayout_7"))
-        self.cp_gommeDecor = QtGui.QToolButton(self.cp_afficherDecors)
-        self.cp_gommeDecor.setText(_fromUtf8(""))
-        icon17 = QtGui.QIcon()
-        icon17.addPixmap(QtGui.QPixmap(_fromUtf8(":/interface/16/ressource/gomme_16.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
-        self.cp_gommeDecor.setIcon(icon17)
-        self.cp_gommeDecor.setObjectName(_fromUtf8("cp_gommeDecor"))
-        self.horizontalLayout_7.addWidget(self.cp_gommeDecor)
+        self.cp_importDecor = QtGui.QToolButton(self.cp_afficherDecors)
+        self.cp_importDecor.setObjectName(_fromUtf8("cp_importDecor"))
+        self.horizontalLayout_7.addWidget(self.cp_importDecor)
         spacerItem3 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
         self.horizontalLayout_7.addItem(spacerItem3)
         self.cp_nouveauDecor = QtGui.QToolButton(self.cp_afficherDecors)
@@ -698,6 +743,13 @@ class Ui_principal(object):
         self.cp_editerDecor.setIcon(icon15)
         self.cp_editerDecor.setObjectName(_fromUtf8("cp_editerDecor"))
         self.horizontalLayout_7.addWidget(self.cp_editerDecor)
+        self.cp_retirerDecor = QtGui.QToolButton(self.cp_afficherDecors)
+        self.cp_retirerDecor.setText(_fromUtf8(""))
+        icon17 = QtGui.QIcon()
+        icon17.addPixmap(QtGui.QPixmap(_fromUtf8(":/interface/16/ressource/gomme_16.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.cp_retirerDecor.setIcon(icon17)
+        self.cp_retirerDecor.setObjectName(_fromUtf8("cp_retirerDecor"))
+        self.horizontalLayout_7.addWidget(self.cp_retirerDecor)
         self.verticalLayout_7.addLayout(self.horizontalLayout_7)
         icon18 = QtGui.QIcon()
         icon18.addPixmap(QtGui.QPixmap(_fromUtf8(":/interface/32/ressource/decor_32.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
@@ -727,11 +779,11 @@ class Ui_principal(object):
         self.horizontalLayout_8 = QtGui.QHBoxLayout()
         self.horizontalLayout_8.setContentsMargins(-1, 0, -1, -1)
         self.horizontalLayout_8.setObjectName(_fromUtf8("horizontalLayout_8"))
-        self.cp_gommeCombattant = QtGui.QToolButton(self.cp_afficherCreatures)
-        self.cp_gommeCombattant.setText(_fromUtf8(""))
-        self.cp_gommeCombattant.setIcon(icon17)
-        self.cp_gommeCombattant.setObjectName(_fromUtf8("cp_gommeCombattant"))
-        self.horizontalLayout_8.addWidget(self.cp_gommeCombattant)
+        self.cp_importCombattant = QtGui.QToolButton(self.cp_afficherCreatures)
+        self.cp_importCombattant.setMinimumSize(QtCore.QSize(23, 22))
+        self.cp_importCombattant.setMaximumSize(QtCore.QSize(23, 22))
+        self.cp_importCombattant.setObjectName(_fromUtf8("cp_importCombattant"))
+        self.horizontalLayout_8.addWidget(self.cp_importCombattant)
         spacerItem4 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
         self.horizontalLayout_8.addItem(spacerItem4)
         self.cp_nouveauCombattant = QtGui.QToolButton(self.cp_afficherCreatures)
@@ -744,6 +796,11 @@ class Ui_principal(object):
         self.cp_editerCombattant.setIcon(icon15)
         self.cp_editerCombattant.setObjectName(_fromUtf8("cp_editerCombattant"))
         self.horizontalLayout_8.addWidget(self.cp_editerCombattant)
+        self.cp_retirerCombattant = QtGui.QToolButton(self.cp_afficherCreatures)
+        self.cp_retirerCombattant.setText(_fromUtf8(""))
+        self.cp_retirerCombattant.setIcon(icon17)
+        self.cp_retirerCombattant.setObjectName(_fromUtf8("cp_retirerCombattant"))
+        self.horizontalLayout_8.addWidget(self.cp_retirerCombattant)
         self.verticalLayout_6.addLayout(self.horizontalLayout_8)
         icon19 = QtGui.QIcon()
         icon19.addPixmap(QtGui.QPixmap(_fromUtf8(":/interface/32/ressource/creature_32.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
@@ -756,8 +813,8 @@ class Ui_principal(object):
         self.creationPlateau_sousPanneauBas.setFrameShadow(QtGui.QFrame.Raised)
         self.creationPlateau_sousPanneauBas.setObjectName(_fromUtf8("creationPlateau_sousPanneauBas"))
         self.gridLayout_3 = QtGui.QGridLayout(self.creationPlateau_sousPanneauBas)
-        self.gridLayout_3.setMargin(3)
         self.gridLayout_3.setSpacing(3)
+        self.gridLayout_3.setMargin(3)
         self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
         self.cp_placerEntree = QtGui.QToolButton(self.creationPlateau_sousPanneauBas)
         self.cp_placerEntree.setMinimumSize(QtCore.QSize(41, 31))
@@ -1145,7 +1202,7 @@ class Ui_principal(object):
         self.label_4.setObjectName(_fromUtf8("label_4"))
         self.cbt_panneauDroite.addWidget(self.cbt_panneauDroite3)
         self.layoutV_droite.addWidget(self.cbt_panneauDroite)
-        self.cbt_etapeSuivante = QtGui.QPushButton(self.Combats_tab)
+        self.cbt_etapeSuivante = QtGui.QPushButton(self.combat)
         self.cbt_etapeSuivante.setMinimumSize(QtCore.QSize(0, 50))
         self.cbt_etapeSuivante.setMaximumSize(QtCore.QSize(1000, 50))
         font = QtGui.QFont()
@@ -1157,7 +1214,9 @@ class Ui_principal(object):
         self.plateauLayoutH.addLayout(self.layoutV_droite)
         self.plateauLayoutH.setStretch(1, 1)
         self.layoutCombat.addLayout(self.plateauLayoutH)
-        self.horizontalLayout_3.addLayout(self.layoutCombat)
+        self.horizontalLayout_9.addLayout(self.layoutCombat)
+        self.combatPanneau.addWidget(self.combat)
+        self.horizontalLayout_3.addWidget(self.combatPanneau)
         self.dm_panneauCentre.addTab(self.Combats_tab, _fromUtf8(""))
         self.Monde_tab = QtGui.QWidget()
         self.Monde_tab.setObjectName(_fromUtf8("Monde_tab"))
@@ -1543,18 +1602,23 @@ class Ui_principal(object):
         self.menubar.addAction(self.menuAide.menuAction())
 
         self.retranslateUi(principal)
-        self.dm_panneauCentre.setCurrentIndex(0)
+        self.dm_panneauCentre.setCurrentIndex(1)
+        self.combatPanneau.setCurrentIndex(1)
         self.cbt_panneauHaut.setCurrentIndex(1)
         self.cbt_panneauGauche.setCurrentIndex(1)
         self.cbt_panneauBas.setCurrentIndex(1)
         self.cbt_panneauDroite.setCurrentIndex(1)
-        self.cp_ongletsListes.setCurrentIndex(2)
-        self.pi_ongletsListes.setCurrentIndex(2)
+        self.cp_ongletsListes.setCurrentIndex(0)
+        self.pi_ongletsListes.setCurrentIndex(0)
         self.tabStatutAppli.setCurrentIndex(2)
         QtCore.QMetaObject.connectSlotsByName(principal)
 
     def retranslateUi(self, principal):
         principal.setWindowTitle(_translate("principal", "Bienvenue sur le Dé-Monde", None))
+        self.label_5.setText(_translate("principal", "Partie 1 / Chapitre 1", None))
+        self.label_6.setText(_translate("principal", "Règles utilisées", None))
+        self.label_7.setText(_translate("principal", "Participants: ", None))
+        self.dm_panneauCentre.setTabText(self.dm_panneauCentre.indexOf(self.tab), _translate("principal", "Partie", None))
         self.cbt_sauver.setToolTip(_translate("principal", "Enregistrer le combat", None))
         self.cbt_nom.setText(_translate("principal", "    La tour sombre [Non Publié]    ", None))
         self.cbt_fermer.setToolTip(_translate("principal", "Fermer le combat", None))
@@ -1574,9 +1638,6 @@ class Ui_principal(object):
         self.inf_pionEffet.setToolTip(_translate("principal", "Evanoui", None))
         self.inf_pionNom.setText(_translate("principal", "nom", None))
         self.inf_decorNom.setText(_translate("principal", "nom", None))
-        self.inf_decorEffet.setText(_translate("principal", "TextLabel", None))
-        self.inf_decorDetruit.setText(_translate("principal", "TextLabel", None))
-        self.inf_decorVerrouille.setText(_translate("principal", "TextLabel", None))
         self.infoPionEnCours_depRestant_2.setText(_translate("principal", "Dep.: 0 ", None))
         self.infoPionEnCours_aJoue_2.setText(_translate("principal", "A joué: Non", None))
         self.infoPionEnCours_endormi_2.setToolTip(_translate("principal", "Endormi", None))
@@ -1629,16 +1690,20 @@ class Ui_principal(object):
         item.setText(_translate("principal", "code", None))
         item = self.cp_listeTerrains.horizontalHeaderItem(1)
         item.setText(_translate("principal", "Terrain", None))
+        self.cp_importTerrain.setText(_translate("principal", "...", None))
+        self.cp_retirerTerrain.setText(_translate("principal", "...", None))
         self.cp_ongletsListes.setTabToolTip(self.cp_ongletsListes.indexOf(self.cp_afficherTerrains), _translate("principal", "Afficher la liste des terrains", None))
         item = self.cp_listeDecors.horizontalHeaderItem(0)
         item.setText(_translate("principal", "code", None))
         item = self.cp_listeDecors.horizontalHeaderItem(1)
         item.setText(_translate("principal", "Decor", None))
+        self.cp_importDecor.setText(_translate("principal", "...", None))
         self.cp_ongletsListes.setTabToolTip(self.cp_ongletsListes.indexOf(self.cp_afficherDecors), _translate("principal", "Afficher la liste des décors", None))
         item = self.cp_listeCreatures.horizontalHeaderItem(0)
         item.setText(_translate("principal", "code", None))
         item = self.cp_listeCreatures.horizontalHeaderItem(1)
         item.setText(_translate("principal", "Creature", None))
+        self.cp_importCombattant.setText(_translate("principal", "...", None))
         self.cp_ongletsListes.setTabToolTip(self.cp_ongletsListes.indexOf(self.cp_afficherCreatures), _translate("principal", "Afficher la liste des créatures", None))
         self.cp_placerEntree.setToolTip(_translate("principal", "Placer la/les entrée(s)", None))
         self.cp_placerEntree.setText(_translate("principal", "...", None))

+ 10 - 10
lib/ui/editionCombattant.ui

@@ -10,19 +10,19 @@
     <x>0</x>
     <y>0</y>
     <width>679</width>
-    <height>484</height>
+    <height>486</height>
    </rect>
   </property>
   <property name="minimumSize">
    <size>
-    <width>0</width>
+    <width>679</width>
     <height>484</height>
    </size>
   </property>
   <property name="maximumSize">
    <size>
-    <width>16777215</width>
-    <height>10000</height>
+    <width>679</width>
+    <height>486</height>
    </size>
   </property>
   <property name="windowTitle">
@@ -508,7 +508,7 @@
           </font>
          </property>
          <property name="currentIndex">
-          <number>1</number>
+          <number>4</number>
          </property>
          <widget class="QWidget" name="page_nom">
           <widget class="DmLineEdit" name="edc_nom">
@@ -1823,7 +1823,7 @@ image</string>
             <enum>QTabWidget::Rounded</enum>
            </property>
            <property name="currentIndex">
-            <number>4</number>
+            <number>0</number>
            </property>
            <property name="iconSize">
             <size>
@@ -2845,13 +2845,13 @@ parlées : </string>
  </widget>
  <customwidgets>
   <customwidget>
-   <class>DmTableMenu</class>
-   <extends>QTableWidget</extends>
+   <class>DmLineEdit</class>
+   <extends>QLineEdit</extends>
    <header location="global">dm.h</header>
   </customwidget>
   <customwidget>
-   <class>DmLineEdit</class>
-   <extends>QLineEdit</extends>
+   <class>DmTableMenu</class>
+   <extends>QTableWidget</extends>
    <header location="global">dm.h</header>
   </customwidget>
   <customwidget>

+ 9 - 4
lib/ui/editionDecor.ui

@@ -417,7 +417,7 @@
           </font>
          </property>
          <property name="currentIndex">
-          <number>0</number>
+          <number>1</number>
          </property>
          <widget class="QWidget" name="page_nom">
           <widget class="DmLineEdit" name="edd_nom">
@@ -1339,7 +1339,7 @@ image</string>
             <string>Notes :</string>
            </property>
           </widget>
-          <widget class="QTextEdit" name="edd_notes">
+          <widget class="DmTextEdit" name="edd_notes">
            <property name="geometry">
             <rect>
              <x>30</x>
@@ -1613,8 +1613,8 @@ image</string>
  </widget>
  <customwidgets>
   <customwidget>
-   <class>DmTableMenu</class>
-   <extends>QTableWidget</extends>
+   <class>DmTextEdit</class>
+   <extends>QTextEdit</extends>
    <header location="global">dm.h</header>
   </customwidget>
   <customwidget>
@@ -1622,6 +1622,11 @@ image</string>
    <extends>QLineEdit</extends>
    <header location="global">dm.h</header>
   </customwidget>
+  <customwidget>
+   <class>DmTableMenu</class>
+   <extends>QTableWidget</extends>
+   <header location="global">dm.h</header>
+  </customwidget>
   <customwidget>
    <class>DmLabel</class>
    <extends>QLabel</extends>

+ 5 - 0
lib/ui/ressource.qrc

@@ -52,6 +52,11 @@
         <file>ressource/depart_16.png</file>
         <file>ressource/rafraichir_16.png</file>
         <file>ressource/potPeinture_16.png</file>
+        <file>ressource/verrou_ferme_16.png</file>
+        <file>ressource/verrou_ouvert_16.png</file>
+		<file>ressource/brise_16.png</file>
+		<file>ressource/import_16.png</file>
+		<file>ressource/moins_16.png</file>
     </qresource>
     <qresource prefix="/interface/24" lang="fr">
         <file>ressource/poids_24.png</file>

+ 108 - 33
lib/ui/ressource_rc.py

@@ -2,7 +2,7 @@
 
 # Resource object code
 #
-# Created: lun. 7. sept. 11:59:04 2015
+# Created: mer. 9. sept. 14:29:51 2015
 #      by: The Resource Compiler for PyQt (Qt v4.8.5)
 #
 # WARNING! All changes made in this file will be lost!
@@ -2418,6 +2418,24 @@ qt_resource_data = "\
 \xe8\xc6\x26\x77\x73\xe4\x16\xc4\x2b\x03\xb9\x95\xa8\xba\xab\xa3\
 \x99\x84\x86\x87\xa5\xa4\x96\x9d\x2a\xbd\x01\xfd\xab\x14\x9a\x23\
 \x98\x71\xb2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x00\xfc\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\
+\x00\x00\x00\xc3\x49\x44\x41\x54\x38\x8d\xa5\x92\x31\x0e\x01\x51\
+\x14\x45\x4f\x08\x0b\xa0\x98\xd0\x1b\x9d\xb0\x08\x91\x88\xbd\xb0\
+\x05\x89\x06\xb1\x00\xad\x15\x08\xb1\x00\xb1\x0d\x91\xd0\x51\xa9\
+\xa6\x99\x91\x51\xb8\xc5\x64\xfc\xff\x27\xbe\x97\xdc\xe6\x9f\xfb\
+\x4e\xf1\xf2\xc1\x3c\x23\xe0\x04\x3c\x95\x23\x30\xb4\x74\xbf\x66\
+\x06\xa4\x96\x4c\x8b\x96\x07\x2a\x26\xc0\x1c\x68\x2b\x4b\xbd\xa5\
+\x40\xdf\x25\x38\xa8\xb4\x30\xb0\x95\xd8\xde\x25\x78\xa8\xd4\x31\
+\xb0\xae\xd8\xdd\x25\x88\x54\x0a\x0c\x2c\x10\x8b\x6c\xcb\x13\x20\
+\x56\x69\x03\xac\x73\xd9\x88\xc5\xc0\x38\xbf\xdc\xc4\x7e\x79\x5b\
+\x1a\x59\x41\x68\x29\xbd\x14\x13\x0b\x8b\x04\x67\xa0\x06\xd4\x81\
+\x8b\x8f\x60\x9b\xe1\x3b\x1f\x41\x0c\x94\x94\xc4\x47\x90\x02\x65\
+\xc5\xeb\x06\x29\x9f\xcf\xd3\xfb\x47\xe0\x4a\x2b\x2b\xa8\x02\xb7\
+\x1f\x96\xaf\x40\x05\xe0\x0d\x2d\x66\x89\x76\xea\xd1\x1e\xe5\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
 \x00\x00\x00\x88\
 \x89\
 \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
@@ -2690,6 +2708,23 @@ qt_resource_data = "\
 \xf1\x14\x7a\xc3\x7d\x78\x73\x45\x80\x7e\xdc\xf8\xff\x2b\x67\xba\
 \x46\x5f\xfe\xc2\x2f\x49\xaf\x6c\x66\x2d\xab\xa2\x88\x00\x00\x00\
 \x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x00\xf0\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\
+\x00\x00\x00\xb7\x49\x44\x41\x54\x38\x8d\x9d\x92\x31\x0a\xc2\x40\
+\x10\x45\x5f\x2f\x82\x60\xad\xde\x45\x82\xb5\x60\x2f\xde\x22\x10\
+\x44\xd0\x4e\x8f\x20\x88\x56\xde\xc3\x15\xef\x23\x5a\x68\x61\xb2\
+\x16\x99\x80\x6c\xd6\xc9\x66\x07\x5e\xf5\x67\xde\xc2\xec\x80\xbf\
+\x12\xc0\x00\x77\xe1\x02\x8c\xff\xf4\xd6\x6a\x01\xe4\x80\x75\xf8\
+\x00\xf3\xa6\xe1\x11\xf0\x16\x41\x0a\xf4\x84\x0c\x28\x80\x17\x30\
+\xd0\x04\x99\xbc\xb6\xf7\x64\x07\xc9\x52\x4d\x70\x94\xa6\xa9\x27\
+\x9b\x49\x76\xd2\x04\x89\x48\xba\x9e\x6c\x22\x82\xb3\x26\xd0\xaa\
+\x51\xb0\xa2\x5c\x94\xbb\x7d\x97\x02\x58\xfa\x04\x26\x60\xb8\xc2\
+\x84\x08\x72\x60\x0d\x6c\xa8\xdf\x45\x90\xe0\xfa\x93\xdd\x62\x04\
+\x0f\xa0\x23\x3c\x63\x04\x16\xe8\x0b\x51\x3b\xb0\xc0\x90\xf2\xbc\
+\xa3\x05\xad\x7e\x61\xd7\x42\xb0\xad\x86\xbe\x7f\xac\x79\xe0\x12\
+\x55\x6b\x16\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
 \x00\x00\x01\xd3\
 \x89\
 \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
@@ -2722,6 +2757,29 @@ qt_resource_data = "\
 \xc0\xd7\x35\x30\xa6\xb7\xb1\xdf\x38\xff\xae\x81\xe1\x16\x64\x3b\
 \x6c\xeb\x19\x9b\xf5\x20\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
 \x60\x82\
+\x00\x00\x01\x45\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\
+\x00\x00\x01\x0c\x49\x44\x41\x54\x38\x8d\xb5\xd1\x4d\x2b\xc4\x51\
+\x18\x05\xf0\xdf\x68\xe2\x9f\x85\x61\xb2\xd0\x94\x97\xa2\x58\xce\
+\x42\x59\xc8\xc6\xc2\x46\x49\x16\x6c\x95\x12\x86\xbc\x24\xb6\xb3\
+\xd1\x28\xd9\xce\xd2\xbb\x10\x93\x8d\xa5\x05\x2b\x0b\xc9\x17\xf0\
+\x61\x2c\xdc\x99\xa6\xbf\x31\x6a\xe4\xd4\x53\xb7\x73\x9e\x73\xee\
+\xf3\xdc\x4b\x7d\x24\xd0\xfc\x4b\x4f\x5d\xec\xe1\x11\x43\x8d\x98\
+\x53\xb8\x44\x1a\x37\x98\x41\x37\x76\xb0\x1d\xf8\x6f\x68\xc2\x2e\
+\xc6\x11\xe1\x03\xf3\x81\xcf\xe3\x1d\xb3\x58\xc3\x54\xdc\xdc\x89\
+\x0b\x4c\xe0\x18\x59\xe4\x82\xb1\x80\x36\x4c\xa2\x84\xa5\x78\xc0\
+\x08\xee\xc2\x88\x29\x9c\x60\x0b\x73\x58\x44\x3b\x0e\x30\x8c\x7e\
+\xbc\x61\xa1\x6c\xce\xe1\x1a\x2d\x98\xc6\x21\x5e\x30\x18\x26\x4a\
+\x84\xbe\x44\xb8\x79\x05\xad\xb8\xc7\x32\x6c\xe2\x39\xac\x30\x8a\
+\x1e\x3c\x60\x1d\x63\x35\xde\x29\x8b\x3e\x3c\x61\xa3\x4c\x16\x90\
+\x89\xad\xf4\x1a\xc6\xae\x85\x4c\xf0\x54\x10\x0f\x80\x2e\xac\xfe\
+\x25\x60\x00\x67\x38\x42\x6f\x23\x01\x57\xbe\xbe\x2e\x8d\xf3\x46\
+\x02\x4e\x7f\x38\xff\x4f\x40\x1e\x45\xec\x57\xd5\x6d\x95\x5e\x8a\
+\x69\xc5\xe0\xa9\x20\x89\x8e\x58\x45\x55\x7a\x54\x43\x4f\xc2\x27\
+\x05\xd0\x33\x07\x2e\x4d\x6a\x17\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
 \x00\x00\x01\x17\
 \x89\
 \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
@@ -4656,6 +4714,11 @@ qt_resource_name = "\
 \x02\x44\x46\x67\
 \x00\x61\
 \x00\x72\x00\x63\x00\x5f\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x13\
+\x0a\xf6\x29\x07\
+\x00\x76\
+\x00\x65\x00\x72\x00\x72\x00\x6f\x00\x75\x00\x5f\x00\x66\x00\x65\x00\x72\x00\x6d\x00\x65\x00\x5f\x00\x31\x00\x36\x00\x2e\x00\x70\
+\x00\x6e\x00\x67\
 \x00\x0d\
 \x06\x9a\x09\xc7\
 \x00\x73\
@@ -4710,10 +4773,19 @@ qt_resource_name = "\
 \x03\x23\xa8\x07\
 \x00\x63\
 \x00\x6f\x00\x72\x00\x62\x00\x65\x00\x69\x00\x6c\x00\x6c\x00\x65\x00\x5f\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x14\
+\x0d\xb5\x56\x67\
+\x00\x76\
+\x00\x65\x00\x72\x00\x72\x00\x6f\x00\x75\x00\x5f\x00\x6f\x00\x75\x00\x76\x00\x65\x00\x72\x00\x74\x00\x5f\x00\x31\x00\x36\x00\x2e\
+\x00\x70\x00\x6e\x00\x67\
 \x00\x0d\
 \x05\x0c\x56\xe7\
 \x00\x65\
 \x00\x63\x00\x6c\x00\x61\x00\x69\x00\x72\x00\x5f\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x0f\x7b\x44\x27\
+\x00\x62\
+\x00\x72\x00\x69\x00\x73\x00\x65\x00\x5f\x00\x31\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\
 \x00\x11\
 \x0e\xc0\xe0\xe7\
 \x00\x66\
@@ -4795,9 +4867,9 @@ qt_resource_struct = "\
 \x00\x00\x00\x38\x00\x02\x00\x00\x00\x01\x00\x00\x00\x0a\
 \x00\x00\x00\x22\x00\x02\x00\x00\x00\x01\x00\x00\x00\x06\
 \x00\x00\x00\x42\x00\x02\x00\x00\x00\x03\x00\x00\x00\x07\
-\x00\x00\x0c\x58\x00\x00\x00\x4a\x00\x25\x00\x00\xec\x08\
-\x00\x00\x0c\x38\x00\x00\x00\x4a\x00\x25\x00\x00\xbb\xd4\
-\x00\x00\x0c\x14\x00\x00\x00\x4a\x00\x25\x00\x00\xa9\x00\
+\x00\x00\x0c\xd0\x00\x00\x00\x4a\x00\x25\x00\x00\xef\x45\
+\x00\x00\x0c\xb0\x00\x00\x00\x4a\x00\x25\x00\x00\xbf\x11\
+\x00\x00\x0c\x8c\x00\x00\x00\x4a\x00\x25\x00\x00\xac\x3d\
 \x00\x00\x00\x42\x00\x02\x00\x00\x00\x24\x00\x00\x00\x0b\
 \x00\x00\x01\xfe\x00\x00\x00\x4a\x00\x25\x00\x00\x20\xd7\
 \x00\x00\x00\x5a\x00\x00\x00\x4a\x00\x25\x00\x00\x00\x00\
@@ -4836,13 +4908,13 @@ qt_resource_struct = "\
 \x00\x00\x00\xec\x00\x00\x00\x4a\x00\x25\x00\x00\x0a\xeb\
 \x00\x00\x01\x6a\x00\x00\x00\x4a\x00\x25\x00\x00\x14\xfe\
 \x00\x00\x00\x42\x00\x02\x00\x00\x00\x06\x00\x00\x00\x30\
-\x00\x00\x0c\x76\x00\x00\x00\x4a\x00\x25\x00\x00\xf7\xdc\
-\x00\x00\x0d\x18\x00\x00\x00\x4a\x00\x25\x00\x01\x00\x75\
-\x00\x00\x0c\xfc\x00\x00\x00\x4a\x00\x25\x00\x00\xff\x20\
-\x00\x00\x0c\x9a\x00\x00\x00\x4a\x00\x25\x00\x00\xf9\xef\
-\x00\x00\x0c\xde\x00\x00\x00\x4a\x00\x25\x00\x00\xfd\xb0\
-\x00\x00\x0c\xc0\x00\x00\x00\x4a\x00\x25\x00\x00\xfc\x02\
-\x00\x00\x00\x42\x00\x02\x00\x00\x00\x34\x00\x00\x00\x37\
+\x00\x00\x0c\xee\x00\x00\x00\x4a\x00\x25\x00\x00\xfb\x19\
+\x00\x00\x0d\x90\x00\x00\x00\x4a\x00\x25\x00\x01\x03\xb2\
+\x00\x00\x0d\x74\x00\x00\x00\x4a\x00\x25\x00\x01\x02\x5d\
+\x00\x00\x0d\x12\x00\x00\x00\x4a\x00\x25\x00\x00\xfd\x2c\
+\x00\x00\x0d\x56\x00\x00\x00\x4a\x00\x25\x00\x01\x00\xed\
+\x00\x00\x0d\x38\x00\x00\x00\x4a\x00\x25\x00\x00\xff\x3f\
+\x00\x00\x00\x42\x00\x02\x00\x00\x00\x37\x00\x00\x00\x37\
 \x00\x00\x08\x20\x00\x00\x00\x4a\x00\x25\x00\x00\x82\xa3\
 \x00\x00\x05\xea\x00\x00\x00\x4a\x00\x25\x00\x00\x6e\x83\
 \x00\x00\x07\x3e\x00\x00\x00\x4a\x00\x25\x00\x00\x7a\xca\
@@ -4852,47 +4924,50 @@ qt_resource_struct = "\
 \x00\x00\x07\xdc\x00\x00\x00\x4a\x00\x25\x00\x00\x7f\xef\
 \x00\x00\x09\x06\x00\x00\x00\x4a\x00\x25\x00\x00\x8c\xce\
 \x00\x00\x07\x24\x00\x00\x00\x4a\x00\x25\x00\x00\x79\xb9\
-\x00\x00\x0b\x24\x00\x00\x00\x4a\x00\x25\x00\x00\x9f\xa3\
+\x00\x00\x0b\x9c\x00\x00\x00\x4a\x00\x25\x00\x00\xa2\xe0\
 \x00\x00\x05\x92\x00\x00\x00\x4a\x00\x25\x00\x00\x6a\xf2\
-\x00\x00\x09\x40\x00\x00\x00\x4a\x00\x25\x00\x00\x8e\x0e\
-\x00\x00\x0a\x34\x00\x00\x00\x4a\x00\x25\x00\x00\x97\x4a\
+\x00\x00\x09\x6c\x00\x00\x00\x4a\x00\x25\x00\x00\x8f\x0e\
+\x00\x00\x0a\x60\x00\x00\x00\x4a\x00\x25\x00\x00\x98\x4a\
 \x00\x00\x06\x58\x00\x00\x00\x4a\x00\x25\x00\x00\x71\x9a\
-\x00\x00\x0b\x6c\x00\x00\x00\x4a\x00\x25\x00\x00\xa2\x30\
-\x00\x00\x09\x58\x00\x00\x00\x4a\x00\x25\x00\x00\x8f\x82\
-\x00\x00\x0a\x74\x00\x00\x00\x4a\x00\x25\x00\x00\x98\xf3\
-\x00\x00\x0a\xb6\x00\x00\x00\x4a\x00\x25\x00\x00\x9b\x63\
-\x00\x00\x09\xbc\x00\x00\x00\x4a\x00\x25\x00\x00\x93\x76\
-\x00\x00\x0b\x3e\x00\x00\x00\x4a\x00\x25\x00\x00\xa1\x0f\
+\x00\x00\x0b\xe4\x00\x00\x00\x4a\x00\x25\x00\x00\xa5\x6d\
+\x00\x00\x09\x84\x00\x00\x00\x4a\x00\x25\x00\x00\x90\x82\
+\x00\x00\x0a\xa0\x00\x00\x00\x4a\x00\x25\x00\x00\x99\xf3\
+\x00\x00\x0a\xe2\x00\x00\x00\x4a\x00\x25\x00\x00\x9c\x63\
+\x00\x00\x09\xe8\x00\x00\x00\x4a\x00\x25\x00\x00\x94\x76\
+\x00\x00\x0b\xb6\x00\x00\x00\x4a\x00\x25\x00\x00\xa4\x4c\
 \x00\x00\x05\xac\x00\x00\x00\x4a\x00\x25\x00\x00\x6c\x6f\
 \x00\x00\x08\x82\x00\x00\x00\x4a\x00\x25\x00\x00\x85\xe9\
-\x00\x00\x0a\xdc\x00\x00\x00\x4a\x00\x25\x00\x00\x9c\xb1\
-\x00\x00\x09\x74\x00\x00\x00\x4a\x00\x25\x00\x00\x90\x67\
-\x00\x00\x0b\x88\x00\x00\x00\x4a\x00\x25\x00\x00\xa4\x0d\
+\x00\x00\x0b\x36\x00\x00\x00\x4a\x00\x25\x00\x00\x9e\xa5\
+\x00\x00\x09\xa0\x00\x00\x00\x4a\x00\x25\x00\x00\x91\x67\
+\x00\x00\x0c\x00\x00\x00\x00\x4a\x00\x25\x00\x00\xa7\x4a\
 \x00\x00\x08\xa4\x00\x00\x00\x4a\x00\x25\x00\x00\x87\x8b\
 \x00\x00\x07\x00\x00\x00\x00\x4a\x00\x25\x00\x00\x78\x41\
 \x00\x00\x08\xc4\x00\x00\x00\x4a\x00\x25\x00\x00\x89\xb7\
-\x00\x00\x09\x20\x00\x00\x00\x4a\x00\x25\x00\x00\x8d\x82\
+\x00\x00\x09\x4c\x00\x00\x00\x4a\x00\x25\x00\x00\x8e\x82\
 \x00\x00\x07\xf6\x00\x00\x00\x4a\x00\x25\x00\x00\x81\x42\
-\x00\x00\x0a\x50\x00\x00\x00\x4a\x00\x25\x00\x00\x98\x99\
-\x00\x00\x0a\x96\x00\x00\x00\x4a\x00\x25\x00\x00\x9a\x37\
+\x00\x00\x0a\x7c\x00\x00\x00\x4a\x00\x25\x00\x00\x99\x99\
+\x00\x00\x0a\xc2\x00\x00\x00\x4a\x00\x25\x00\x00\x9b\x37\
 \x00\x00\x06\x2e\x00\x00\x00\x4a\x00\x25\x00\x00\x70\x5f\
-\x00\x00\x0b\xea\x00\x00\x00\x4a\x00\x25\x00\x00\xa7\xfc\
+\x00\x00\x0c\x62\x00\x00\x00\x4a\x00\x25\x00\x00\xab\x39\
 \x00\x00\x06\xd2\x00\x00\x00\x4a\x00\x25\x00\x00\x77\x3d\
+\x00\x00\x09\x20\x00\x00\x00\x4a\x00\x25\x00\x00\x8d\x82\
 \x00\x00\x08\x44\x00\x00\x00\x4a\x00\x25\x00\x00\x84\x12\
 \x00\x00\x05\x28\x00\x00\x00\x4a\x00\x25\x00\x00\x67\x1a\
 \x00\x00\x06\xb2\x00\x00\x00\x4a\x00\x25\x00\x00\x76\x50\
-\x00\x00\x09\x98\x00\x00\x00\x4a\x00\x25\x00\x00\x92\x00\
+\x00\x00\x09\xc4\x00\x00\x00\x4a\x00\x25\x00\x00\x93\x00\
 \x00\x00\x05\xcc\x00\x00\x00\x4a\x00\x25\x00\x00\x6d\xd0\
-\x00\x00\x09\xe0\x00\x00\x00\x4a\x00\x25\x00\x00\x94\xf4\
+\x00\x00\x0a\x0c\x00\x00\x00\x4a\x00\x25\x00\x00\x95\xf4\
 \x00\x00\x06\x92\x00\x00\x00\x4a\x00\x25\x00\x00\x74\xaa\
 \x00\x00\x06\x74\x00\x00\x00\x4a\x00\x25\x00\x00\x72\xe8\
+\x00\x00\x0b\x08\x00\x00\x00\x4a\x00\x25\x00\x00\x9d\xb1\
 \x00\x00\x05\x4a\x00\x00\x00\x4a\x00\x25\x00\x00\x68\xa4\
-\x00\x00\x0a\x08\x00\x00\x00\x4a\x00\x25\x00\x00\x96\x3d\
-\x00\x00\x0a\xfc\x00\x00\x00\x4a\x00\x25\x00\x00\x9e\x88\
+\x00\x00\x0a\x34\x00\x00\x00\x4a\x00\x25\x00\x00\x97\x3d\
+\x00\x00\x0b\x74\x00\x00\x00\x4a\x00\x25\x00\x00\xa1\xc5\
 \x00\x00\x06\x10\x00\x00\x00\x4a\x00\x25\x00\x00\x6f\x58\
-\x00\x00\x0b\xa8\x00\x00\x00\x4a\x00\x25\x00\x00\xa5\x54\
+\x00\x00\x0c\x20\x00\x00\x00\x4a\x00\x25\x00\x00\xa8\x91\
 \x00\x00\x05\x74\x00\x00\x00\x4a\x00\x25\x00\x00\x69\xf5\
-\x00\x00\x0b\xcc\x00\x00\x00\x4a\x00\x25\x00\x00\xa5\xf5\
+\x00\x00\x0c\x44\x00\x00\x00\x4a\x00\x25\x00\x00\xa9\x32\
+\x00\x00\x0b\x56\x00\x00\x00\x4a\x00\x25\x00\x00\xa0\x7c\
 \x00\x00\x07\x6c\x00\x00\x00\x4a\x00\x25\x00\x00\x7b\xe8\
 \x00\x00\x08\x64\x00\x00\x00\x4a\x00\x25\x00\x00\x84\x9c\
 "

+ 1 - 2
parties/Partie1/svg/infos_sauvegarde

@@ -1,2 +1 @@
-€}q(U1}q(UnomqULa chambre noireqUdateCreationqGAÕxwäÌÍUdateSvgqGAÕxÿ¿®UchapitreqU1UenCoursq‰Upublicq	‰uU0}q
-(UnomUtestUdateCreationGAÕxemãTUdateSvgGAÕxh:°!UchapitreU1UenCours‰Upublic‰uu.
+€}q.