#from __future__ import unicode_literals
# -*- coding: utf-8 -*-
"""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 *
import regles
from ui.dm import *

class FrameAttaque(QFrame):
    """Panneau de creation/edition d'une attaque
        a inserer dans le layout de l'onglet attaques
        de l'ecran d'edition des combattants"""
    def __init__(self, idAtt, parent=None):
        super (FrameAttaque, self).__init__(parent)
        self.idAtt = idAtt
        self.enCreation = False
        self.createWidgets()

    def createWidgets(self):
        """construction de l'interface"""
        self.ui = Ui_att_frame()
        self.ui.setupUi(self)
        self.ui.att_forme.setVisible(False)
        self.ui.att_forme_e.setVisible(False)
        self.ui.att_rayon.setVisible(False)
        self.ui.att_rayon_e.setVisible(False)
        self.ui.att_voile.setAttribute(Qt.WA_TransparentForMouseEvents)
        
        self.connect(self.ui.att_type, SIGNAL("activated(int)"), self.majAffichage)
        self.connect(self.ui.att_type, SIGNAL("activated(int)"), self.signalerNouvelleAttaque)
        self.connect(self.ui.att_forme, SIGNAL("activated(int)"), self.majAffichage)
        
        self.connect(self.ui.att_nom, SIGNAL("textEdited(const QString&)"), self.signalerNouvelleAttaque)
        self.connect(self.ui.att_supprimer, SIGNAL("clicked()"), self.signalerSuppressionAttaque)

        self.construireListeAttributs()

    def signalerNouvelleAttaque(self):
        """on signale a la fenetre principale qu'une nouvelle attaque est creee"""
        if not self.enCreation:
            self.emit(SIGNAL("attaqueNouvelle()"))
            self.enCreation = True
            self.majAffichage()

    def signalerSuppressionAttaque(self):
        """on signale a la fenetre principale qu'une nouvelle attaque est creee"""
        if self.enCreation:
            self.enCreation = False
            self.reinitialiser()
            self.emit(SIGNAL("attaqueSupprimer(int)"), self.idAtt) 

    def majAffichage(self):
        if self.enCreation: self.ui.att_nom.setPlaceholderText(QString(""))
        self.ui.att_voile.setVisible(not self.enCreation)
        self.ui.att_forme.setVisible(self.enCreation and self.ui.att_type.currentIndex() == 2)
        self.ui.att_forme_e.setVisible(self.enCreation and self.ui.att_type.currentIndex() == 2)
        self.ui.att_rayon.setVisible(self.enCreation and self.ui.att_type.currentIndex() == 2 and self.ui.att_forme.currentIndex() == 1)
        self.ui.att_rayon_e.setVisible(self.enCreation and self.ui.att_type.currentIndex() == 2 and self.ui.att_forme.currentIndex() == 1)
            
        self.ui.att_supprimer.setEnabled(self.enCreation)

    def attaque(self):
        """retourne l'attaque representee"""
        attaque = None
        if self.enCreation:
            if self.ui.att_type.currentIndex() == 0:
                attaque = Cac()
            elif self.ui.att_type.currentIndex() == 1:
                attaque = Distance()
            elif self.ui.att_type.currentIndex() == 2:
                if self.ui.att_forme.currentIndex() == 0:
                    attaque = Ligne()
                elif self.ui.att_forme.currentIndex() == 1:
                    attaque = Disque()
                    attaque.majRayon(self.ui.att_rayon.value())
                elif self.ui.att_forme.currentIndex() == 2:
                    attaque = Cone()

            nom = self.ui.att_nom.texte()
            if len(nom) == 0: nom = "..."
            attaque.majNom(nom)
            attaque.majPortee(self.ui.att_portee.value())
            attaque.majAttributs(self.attributs())
            attaque.majNotes(self.ui.att_notes.texte())
        return attaque         


    def chargerAttaque(self, attaque = None):
        """met a jour le contenu avec les donnees de l'attaque en param"""
        if attaque:
            if isinstance(attaque, Cac):
                self.ui.att_type.setCurrentIndex(0)
            elif isinstance(attaque, Distance):
                self.ui.att_type.setCurrentIndex(1)
            elif isinstance(attaque, Zone):
                self.ui.att_type.setCurrentIndex(2)
                if isinstance(attaque, Ligne):
                    self.ui.att_forme.setCurrentIndex(0)
                elif isinstance(attaque, Disque):
                    self.ui.att_forme.setCurrentIndex(1)
                    self.ui.att_rayon.setValue(attaque.rayon())
                elif isinstance(attaque, Cone):
                    self.ui.att_forme.setCurrentIndex(2)
            self.ui.att_nom.majTexte(attaque.nom())
            self.ui.att_portee.setValue(attaque.portee())
            self.chargerAttributs(attaque.attributs())
            self.ui.att_notes.majTexte(attaque.notes())

            self.enCreation = True
            self.majAffichage()

    def reinitialiser(self):
        self.ui.att_type.setCurrentIndex(0)
        self.ui.att_nom.majTexte("")
        self.ui.att_portee.setValue(1)
        self.ui.att_forme.setCurrentIndex(0)
        self.ui.att_rayon.setValue(1)
        self.ui.att_notes.majTexte("")
        for i in range(0, self.ui.att_layout_attributs.count()):
            layout = self.ui.att_layout_attributs.itemAt(i).layout()
            widget = layout.itemAt(1).widget()
            if widget != 0:
                if str(widget.objectName()[-6:]) == "_champ":
                    widget.clear()
        self.majAffichage()
    
    def construireListeAttributs(self):
        """cree les champs dedies a la saisie des attributs dans la grille dediee"""
        self.ui.att_layout_attributs.setSpacing(4)
        self.ui.att_layout_attributs.setMargin(0)
        ligne = 0
        largeurLigne = 0
        colonne = 0
        for nomAttribut in regles.ordreAttributsAttaques():
            lay = QHBoxLayout()
            lay.setMargin(0)
            lay.setSpacing(2)
            lay.setSizeConstraint(QLayout.SetMinimumSize)
            
            etiquette = DmLabel()
            etiquette.majTexte(nomAttribut)        
            etiquette.setObjectName("{}_etiquette".format(nomAttribut))
            lay.addWidget(etiquette)
            
            champ = DmLineEdit()
            champ.setMinimumSize(QSize(60, 20))
            champ.setMaximumSize(QSize(60, 20))
            champ.majTexte(regles.listeAttributsAttaques()[nomAttribut])
            champ.setObjectName("{}_champ".format(nomAttribut))
            self.connect(champ, SIGNAL("textChanged()"), self.controlerAttribut)
            lay.addWidget(champ)

            largeur = 85
            if (largeurLigne + largeur) > (0.9*self.ui.att_panneau.width()):
                ligne += 1
                colonne = 0
                largeurLigne = 0
            self.ui.att_layout_attributs.addLayout(lay, ligne, colonne) 
            largeurLigne += largeur
            colonne += 1

        nouvelleH = 100 + (ligne*50)
        self.setMaximumHeight(nouvelleH)
        self.setMinimumHeight(nouvelleH)
        self.ui.att_panneau.setGeometry(0, 0, 471, (nouvelleH-1))
        self.ui.att_voile.setGeometry(0, 0, 471, (nouvelleH-1))
        
    def chargerAttributs(self, attributs):
        """charge le dictionnaire d'attributs demande"""
        for i in range(0, self.ui.att_layout_attributs.count()):
            layout = self.ui.att_layout_attributs.itemAt(i).layout()
            widget = layout.itemAt(1).widget()
            if widget != 0:
                if str(widget.objectName()[-6:]) == "_champ":
                    attr = str(widget.objectName()[:-6])
                    widget.majTexte(attributs[attr])

    def attributs(self):
        """recupere les attributs saisis dans la grille dediee"""
        attributs = regles.listeAttributsAttaques()
        for i in range(0, self.ui.att_layout_attributs.count()):
            layout = self.ui.att_layout_attributs.itemAt(i).layout()
            widget = layout.itemAt(1).widget()
            if widget != 0 and widget != None:
                if str(widget.objectName()[-6:]) == "_champ":
                    attr = str(widget.objectName()[:-6])
                    attributs[attr] = widget.texte()
        return attributs

    def 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)  





