# -*- coding: latin-1 -*-

#==========================================================================================================================================
import copy

from PySide import QtCore, QtGui

from Code.Traducir import tr
import Code.Configuracion as Configuracion
import Code.ControlPosicion as ControlPosicion
import Code.Tutoriales as Tutoriales

import QTUtil, QTUtil2
import TabTipos
import Colocacion
import Iconos
import Controles
import Columnas
import Grid
import Tablero

import FormLayout

#==========================================================================================================================================
class WET_Marco( QtGui.QDialog ):

    def __init__( self, owner, numMarco, liMarcos, tamTablero ) :

        QtGui.QDialog.__init__(self,owner)

        self.setWindowTitle( tr("TUT_MARCO") )
        self.setWindowFlags( QtCore.Qt.Dialog | QtCore.Qt.WindowTitleHint )

        self.configuracion = owner.configuracion
        self.numMarco = numMarco
        self.liPMarcos = liMarcos
        if numMarco >= 0 :
            regMarco = liMarcos[numMarco]
        else :
            regMarco = Tutoriales.PMarco()

        liAcciones = [  ( tr( "ME_GRABAR" ), Iconos.TB_Aceptar(), "grabar" ), None,
                        ( tr( "CANCELAR" ), Iconos.TB_Cancelar(), "reject" ), None,
                    ]
        tb = Controles.TB( self, liAcciones )

        # Tablero
        confTablero = Configuracion.ConfigTablero()
        confTablero.lee( self.configuracion.cTableroN.graba() )
        confTablero.anchoPieza = tamTablero
        posicion = ControlPosicion.ControlPosicion()
        # posicion.leeFen( "r8/8/8/8/8/8/8/8 w KQkq - 1 10" )
        posicion.leeFen( "r1bqk2r/pp2bp1p/2p2np1/4Q3/2B1P3/2N5/PPP2PPP/R1B1K2R w KQkq - 1 10" )
        self.tablero = Tablero.TutTablero(self, confTablero)
        self.tablero.crea()
        self.tablero.ponPosicion( posicion )

        # Datos generales
        liGen = []

        # nombre del marco que se usará en los menús del tutorial
        config = FormLayout.Editbox( tr( "TIT_NOMBRE" ), ancho=80 )
        liGen.append( (config, regMarco.nombre ) )

        # ( "tipo", "n", Qt.SolidLine ), #1=SolidLine, 2=DashLine, 3=DotLine, 4=DashDotLine, 5=DashDotDotLine
        config = FormLayout.Combobox( tr( "TUT_TIPOTRAZO" ), QTUtil2.tiposDeLineas() )
        liGen.append( ( config, regMarco.tipo ) )

        # ( "color", "n", 0 ),
        config = FormLayout.Colorbox( tr( "TUT_COLORTRAZO" ), 80, 20 )
        liGen.append( ( config, regMarco.color ) )

        # ( "colorinterior", "n", -1 ),
        config = FormLayout.Colorbox( tr( "TUT_COLORINTERIOR" ), 80, 20, siChecked=True )
        liGen.append( ( config, regMarco.colorinterior ) )

        # ( "colorinterior2", "n", -1 ), # para el gradiente
        # config = FormLayout.Colorbox( tr( "TUT_COLORINTERIOR2" ), 80, 20, siChecked=True )
        # liGen.append( ( config, regMarco.colorinterior2 ) )

        # ( "opacidad", "n", 1.0 ),
        config = FormLayout.Dial( tr( "TUT_TRASPARENCIA" ), 0, 99 )
        liGen.append( ( config, 100-int(regMarco.opacidad*100) ) )

        # ( "grosor", "n", 1 ), # ancho del trazo
        config = FormLayout.Spinbox( tr( "TUT_GROSORTRAZO" ), 1, 20, 50 )
        liGen.append( ( config, regMarco.grosor ) )

        # ( "redEsquina", "n", 0 ),
        config = FormLayout.Spinbox( tr( "TUT_REDONDEOESQUINAS" ), 0, 100, 50 )
        liGen.append( ( config, regMarco.redEsquina ) )

        # orden
        config = FormLayout.Combobox( tr( "TUT_ORDEN" ), QTUtil2.listaOrdenes() )
        liGen.append( ( config, regMarco.posicion.orden ) )

        self.form = FormLayout.FormWidget( liGen, dispatch = self.cambios )

        # Layout
        layout = Colocacion.H().control(self.form).relleno(1).control(self.tablero )
        layout1 = Colocacion.V().control(tb).otro(layout)
        self.setLayout( layout1 )

        # Ejemplos
        liMovs = [ "b4c4", "e2e2", "e4g7" ]
        self.liEjemplos = []
        for a1h8 in liMovs :
            regMarco.a1h8 = a1h8
            regMarco.siMovible = True
            marco = self.tablero.creaMarco( regMarco )
            self.liEjemplos.append(marco)

    #--------------------------------------------------------------------------------------------------------------------------------
    def procesarTB( self ) :
        accion = self.sender().clave
        eval( "self.%s()"%accion )

    #--------------------------------------------------------------------------------------------------------------------------------
    def cambios( self ) :
        if hasattr( self, "form" ) :
            li = self.form.get()
            for n, marco in enumerate(self.liEjemplos) :
                regMarco = marco.bloqueDatos
                regMarco.nombre = li[0]
                regMarco.tipo = li[1]
                regMarco.color = li[2]
                regMarco.colorinterior = li[3]
                # regMarco.colorinterior2 = li[]
                regMarco.opacidad = (100.0-float(li[4]))/100.0
                regMarco.grosor = li[5]
                regMarco.redEsquina = li[6]
                regMarco.posicion.orden = li[7]
                marco.setOpacity( regMarco.opacidad )
                marco.setZValue( regMarco.posicion.orden )
                marco.update()
            self.tablero.escena.update()
            QTUtil.refreshGUI()

    #--------------------------------------------------------------------------------------------------------------------------------
    def grabar( self ) :
        regMarco = self.liEjemplos[0].bloqueDatos
        nombre = regMarco.nombre.strip()
        if nombre == "" :
            QTUtil2.mensError( self, tr("TUT_FM_FALTANOMBRE"))
            return

        for nf, rf in enumerate(self.liPMarcos) :
            if nf != self.numMarco :
                if rf.nombre.lower() == nombre.lower() :
                    QTUtil2.mensError( self, tr("TUT_FM_NOMBREREPETIDO"))
                    return

        self.regMarco = regMarco
        self.accept()

#==========================================================================================================================================
class WET_Marcos( QtGui.QWidget ):

    def __init__( self, wowner, owner, funcTamTablero ) :

        QtGui.QWidget.__init__(self,wowner)

        self.funcTamTablero = funcTamTablero

        f = Controles.TipoLetra( puntos=12, peso = 75 )
        flb = Controles.TipoLetra( puntos=8 )

        self.tutorial = owner.tutorial
        self.configuracion = owner.procesador.configuracion
        self.liPMarcos = self.tutorial.liPMarcos

        # Lista
        oColumnas = Columnas.ListaColumnas()
        oColumnas.nueva( "NUMERO", tr( "AB_NUM" ), 60, siCentrado=True )
        oColumnas.nueva( "NOMBRE", tr( "TIT_NOMBRE" ), 256 )

        self.grid = Grid.Grid( self, oColumnas, id = "M", siSelecFilas=True )

        liAcciones = [  ( tr( "NUEVO" ), Iconos.TB_Nuevo(), "mas" ), None,
                        ( tr( "BORRAR" ), Iconos.TB_Borrar(), "borrar" ), None,
                        ( tr( "MODIFICAR" ), Iconos.TB_Modificar(), "modificar" ), None,
                        ( tr( "COPIAR" ), Iconos.TB_Copiar(), "copiar" ), None,
                        ( tr( "ARRIBA" ), Iconos.TB_Arriba(), "arriba" ), None,
                        ( tr( "ABAJO" ), Iconos.TB_Abajo(), "abajo" ), None,
                    ]
        tb = Controles.TB( self, liAcciones )
        tb.setFont( flb )

        ly = Colocacion.V().control(tb).control(self.grid)
        gb = Controles.GB(self,tr("TUT_MARCOS"),ly ).ponFuente( f )

        # Tablero
        confTablero = Configuracion.ConfigTablero()
        confTablero.lee( self.configuracion.cTableroN.graba() )
        confTablero.anchoPieza = 32
        posicion = ControlPosicion.ControlPosicion()
        posicion.leeFen( "r1bqk2r/pp2bp1p/2p2np1/4Q3/2B1P3/2N5/PPP2PPP/R1B1K2R w KQkq - 1 10" )
        self.tablero = Tablero.TutTablero(self, confTablero)
        self.tablero.crea()
        self.tablero.ponPosicion( posicion )

        # Layout
        layout = Colocacion.H().control(gb).relleno(1).control(self.tablero )
        self.setLayout( layout )

        # Ejemplos
        liMovs = [ "b4c4", "e2e2", "e4g7" ]
        self.liEjemplos = []
        regMarco = TabTipos.Marco()
        for a1h8 in liMovs :
            regMarco.a1h8 = a1h8
            regMarco.siMovible = True
            marco = self.tablero.creaMarco( regMarco )
            self.liEjemplos.append(marco)

    #--------------------------------------------------------------------------------------------------------------------------------
    def gridNumDatos( self, grid ) :
        return len(self.liPMarcos)

    #--------------------------------------------------------------------------------------------------------------------------------
    def gridDato( self, grid, fila, oColumna ) :
        clave = oColumna.clave
        if clave == "NUMERO" :
            return str(fila+1)
        elif clave == "NOMBRE" :
            return self.liPMarcos[fila].nombre

    #--------------------------------------------------------------------------------------------------------------------------------
    def gridDobleClick( self, grid, fila, oColumna ) :
        self.modificar()

    #--------------------------------------------------------------------------------------------------------------------------------
    def gridCambiadoRegistro( self, grid, fila, oColumna ) :
        if fila >= 0 :
            regMarco = self.liPMarcos[fila]
            for ejemplo in self.liEjemplos :
                a1h8 = ejemplo.bloqueDatos.a1h8
                bd = copy.deepcopy( regMarco )
                bd.a1h8 = a1h8
                bd.anchoCasilla = self.tablero.anchoCasilla
                ejemplo.bloqueDatos = bd
                ejemplo.reset()
            self.tablero.escena.update()

    #--------------------------------------------------------------------------------------------------------------------------------
    def procesarTB( self ) :
        accion = self.sender().clave
        eval( "self.%s()"%accion )

    #--------------------------------------------------------------------------------------------------------------------------------
    def mas( self ) :
        w = WET_Marco(self, -1, self.liPMarcos, self.funcTamTablero())
        if w.exec_() :
            regMarco = w.regMarco
            regMarco.id = self.tutorial.idNuevo()
            self.liPMarcos.append( regMarco )
            self.grid.refresh()
            self.grid.gobottom()
            self.grid.setFocus()

    #--------------------------------------------------------------------------------------------------------------------------------
    def borrar( self ) :
        fila = self.grid.recno()
        if fila >= 0 :
            if QTUtil2.pregunta( self, tr( "TUT_BORRAMOS_MARCO", self.liPMarcos[fila].nombre )) :
                del self.liPMarcos[fila]
                self.grid.refresh()
                self.grid.setFocus()

    #--------------------------------------------------------------------------------------------------------------------------------
    def modificar( self ) :
        fila = self.grid.recno()
        if fila >= 0 :
            w = WET_Marco(self, fila, self.liPMarcos, self.funcTamTablero())
            if w.exec_() :
                self.liPMarcos[fila] = w.regMarco
                self.grid.refresh()
                self.grid.setFocus()
                self.gridCambiadoRegistro( self.grid, fila, None )

    #--------------------------------------------------------------------------------------------------------------------------------
    def siEstaNombre( self, nombre ) :
        for rf in self.liPMarcos :
            if rf.nombre == nombre :
                return True
        return False

    #--------------------------------------------------------------------------------------------------------------------------------
    def copiar( self ) :
        fila = self.grid.recno()
        if fila >= 0 :
            regMarco = copy.deepcopy( self.liPMarcos[fila] )
            n = 1
            nombre = "%s-%d"%(regMarco.nombre, n )
            while self.siEstaNombre( nombre ) :
                n+=1
                nombre = "%s-%d"%(regMarco.nombre, n )
            regMarco.nombre = nombre
            regMarco.id = self.tutorial.idNuevo()
            self.liPMarcos.append(regMarco)
            self.grid.refresh()
            self.grid.setFocus()

    #--------------------------------------------------------------------------------------------------------------------------------
    def arriba( self ) :
        fila = self.grid.recno()
        if fila > 0 :
            self.liPMarcos[fila-1],self.liPMarcos[fila] = self.liPMarcos[fila],self.liPMarcos[fila-1]
            self.grid.goto(fila-1,0)
            self.grid.refresh()
            self.grid.setFocus()

    #--------------------------------------------------------------------------------------------------------------------------------
    def abajo( self ) :
        fila = self.grid.recno()
        if fila >= 0 and fila < (len(self.liPMarcos)-1) :
            self.liPMarcos[fila+1],self.liPMarcos[fila] = self.liPMarcos[fila],self.liPMarcos[fila+1]
            self.grid.goto(fila+1,0)
            self.grid.refresh()
            self.grid.setFocus()
