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

#==========================================================================================================================================
from PySide import QtCore, QtGui

from Code.Constantes import *

from Code.Traducir import tr

import Iconos
import Tablero
import QTUtil
import Controles
import QTVarios

import Columnas
import Grid
import Colocacion

import WCapturas

import Delegados

#==========================================================================================================================================

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

    #--------------------------------------------------------------------------------------------------------------------------------
    def __init__(self, parent, gestor ) :
        super(WBase, self).__init__(None)

        self.gestor = gestor

        self.parent = parent

        self.procesandoEventos = None

        self.setBackgroundRole(QtGui.QPalette.Light)
        self.setWindowIcon( Iconos.Aplicacion() )
        self.setStyleSheet( "QToolButton { padding: 0px;}" )

        self.creaToolBar()
        self.creaTablero()

        self.creaCapturas()
        lyBI = self.creaBloqueInformacion()

        lyAI = Colocacion.H().relleno(1).control(self.capturas).control( self.tablero ).otro( lyBI ).relleno(1).margen(2)
        ly = Colocacion.V().control( self.tb ).relleno(1).otro( lyAI ).relleno(1).margen(3)

        self.setLayout( ly )

        self.preparaColoresPGN()

    #--------------------------------------------------------------------------------------------------------------------------------
    def preparaColoresPGN( self ) :
        self.colorMateNegativo = QTUtil.qtColorRGB( 0, 0, 0 )
        self.colorMatePositivo = QTUtil.qtColorRGB( 159, 0, 159 )
        self.colorNegativo = QTUtil.qtColorRGB( 255, 0, 0 )
        self.colorPositivo = QTUtil.qtColorRGB( 0, 0, 255 )

        self.colorBlanco = QTUtil.qtColorRGB( 255, 255, 255 )

    #--------------------------------------------------------------------------------------------------------------------------------
    def ponGestor(self, gestor ) :
        self.gestor = gestor

    #--------------------------------------------------------------------------------------------------------------------------------
    def creaToolBar( self ) :
        self.tb = QtGui.QToolBar("BASICO", self)
        self.tb.setIconSize( QtCore.QSize( 32, 32 ) )
        self.tb.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)

        self.preparaTB()

    #--------------------------------------------------------------------------------------------------------------------------------
    def creaTablero( self ) :
        self.tablero = Tablero.Tablero(self, self.gestor.configuracion.cTableroN)
        self.tablero.crea()
        self.tablero.setFocus()

    #--------------------------------------------------------------------------------------------------------------------------------
    def columnas60( self, siPoner, cNivel ) :
        oColumnas = self.pgn.oColumnas
        oColumnas.liColumnas[0].cabecera = tr( cNivel if siPoner else "AB_NUM" )
        oColumnas.liColumnas[1].cabecera = tr( "J60_ERRORES" if siPoner else "BLANCAS" )
        oColumnas.liColumnas[2].cabecera = tr( "SEGUNDOS" if siPoner else "PGN_BLACK" )
        oColumnas.liColumnas[0].clave = "NIVEL" if siPoner else "NUMERO"
        oColumnas.liColumnas[1].clave = "ERRORES" if siPoner else "BLANCAS"
        oColumnas.liColumnas[2].clave = "TIEMPO" if siPoner else "NEGRAS"
        self.pgn.releerColumnas()

        self.pgn.seleccionaFilas( siPoner )

    #--------------------------------------------------------------------------------------------------------------------------------
    def creaBloqueInformacion( self ) :

        ## Blancas y negras
        f = Controles.TipoLetra( puntos=10, peso=75 )
        bl, ng = tr("PGN_WHITE"), tr("PGN_BLACK")
        self.lbJugBlancas = Controles.LB( bl ).anchoFijo( 100 ).alinCentrado().ponFuente( f ).ponColorFondoN( "black", "white" ).ponWrap()
        self.lbJugNegras = Controles.LB( ng ).anchoFijo( 100 ).alinCentrado().ponFuente( f ).ponColorFondoN( "white", "black" ).ponWrap()
        self.lbJugBlancas.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Raised)
        self.lbJugNegras.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Raised)

        ## Relojes
        f = Controles.TipoLetra( puntos=12, peso=75 )
        self.lbRelojBlancas = Controles.LB( "00:00" ).anchoFijo( 80 ).alinCentrado().ponFuente( f )
        self.lbRelojNegras = Controles.LB( "00:00" ).anchoFijo( 80 ).alinCentrado().ponFuente( f )

        ## Pgn
        oColumnas = Columnas.ListaColumnas()
        oColumnas.nueva( "NUMERO", tr( "AB_NUM" ), 35, siCentrado = True )
        oColumnas.nueva( "BLANCAS", tr( "PGN_WHITE" ), 100,  edicion=Delegados.EtiquetaCentrada() )
        oColumnas.nueva( "NEGRAS", tr( "PGN_BLACK" ), 100, edicion=Delegados.EtiquetaCentrada() )
        self.pgn = Grid.Grid( self, oColumnas, siCabeceraMovible = False )
        nAnchoPgn = self.pgn.anchoColumnas() + 20
        self.pgn.setMinimumWidth( nAnchoPgn )
        # self.pgn.setMaximumWidth( nAnchoPgn )

        ## Revisando
        self.lbRevision = Controles.LB( tr("REVISION") ).alinCentrado().ponFuente( f ).ponFondoN( "#b3b3b3" )

        ## Ayudas
        self.ayudasU = QTVarios.Numero( ) # unidades
        self.ayudasD = QTVarios.Numero( ) # decenas

        f = Controles.TipoLetra( puntos=8 )
        self.lbCredito = Controles.LB( tr("AYUDAS") + " :   ").alinCentrado().ponFuente( f )

        ## Botón de tutor activo
        self.btActivarTutor = Controles.PB( self, "", rutina = self.cambiaSiActivarTutor, plano = False ).anchoFijo( nAnchoPgn )

        ## Rótulos de información
        colTextoLB = QTUtil.qtColor( self.gestor.configuracion.cTableroN.colorExterior )
        self.lbRotulo1 = Controles.LB(  ).ponColor( colTextoLB ).anchoFijo( nAnchoPgn ).ponWrap()
        self.lbRotulo2 = Controles.LB(  ).ponColor( colTextoLB ).anchoFijo( nAnchoPgn ).ponWrap()

        # Lo escondemos todo
        self.lbJugBlancas.hide()
        self.lbJugNegras.hide()
        self.lbRelojBlancas.hide()
        self.lbRelojNegras.hide()
        self.pgn.hide()
        self.lbRevision.hide()
        self.ayudasU.hide()
        self.ayudasD.hide()
        self.lbCredito.hide()
        self.btActivarTutor.hide()
        self.lbRotulo1.hide()
        self.lbRotulo2.hide()

        # Layout

        ## Remoto
        lyRemoto = Colocacion.G()
        lyRemoto.controlc( self.lbJugBlancas, 0, 0 ).controlc( self.lbJugNegras, 0, 1 )
        lyRemoto.controlc( self.lbRelojBlancas, 1, 0 ).controlc( self.lbRelojNegras, 1, 1 )

        ## Ayudas
        lyAyudas = Colocacion.H().relleno(1).control( self.lbCredito ).control(self.ayudasD).control(self.ayudasU).relleno(1).ponSeparacion( 1 )

        ## Todo
        lyV = Colocacion.V().otro( lyRemoto ).control(self.pgn)
        lyV.control(self.lbRevision).otro( lyAyudas ).control( self.btActivarTutor )
        lyV.control( self.lbRotulo1 ).control( self.lbRotulo2 )

        return lyV

    #--------------------------------------------------------------------------------------------------------------------------------
    def preparaTB( self ) :

        self.dicTB = { }

        liOpciones =  ( ( tr( "TB_TERMINAR" ), "TB_Terminar", k_terminar ),
                        ( tr( "NUEVA_PARTIDA" ), "TB_NuevaPartida", k_nuevapartida ),
                        ( tr( "TB_ENTRENAMIENTO" ), "TB_Entrenamiento", k_entrenamiento ),
                        ( tr( "TB_OPCIONES" ), "TB_Opciones", k_opciones ),
                        ( tr( "TB_INFORMACION" ), "TB_Informacion", k_informacion ),
                        ( tr( "TB_GUARDAR" ), "TB_Grabar", k_grabar ),
                        ( tr( "TB_GUARDARCOMO" ), "TB_GrabarComo", k_grabarComo ),
                        ( tr( "TB_RECUPERAR" ), "TB_Recuperar", k_recuperar ),
                        ( tr( "TB_ABANDONAR" ), "TB_Abandonar", k_abandonar ),
                        ( tr( "TB_REINICIAR" ), "TB_Reiniciar", k_reiniciar ),
                        ( tr( "TB_ATRAS" ), "TB_Atras", k_atras ),
                        ( tr( "TB_ANTERIOR" ), "TB_Anterior", k_anterior ),
                        ( tr( "TB_APLAZAR" ), "TB_Aplazar", k_aplazar ),
                        ( tr( "TB_FINPARTIDA" ), "TB_FinPartida", k_finpartida ),
                        ( tr( "TB_REINICIAR" ), "TB_Reiniciar", k_ent_empezar ),
                        ( tr( "TB_SIGUIENTE" ), "TB_Siguiente", k_siguiente ),
                        # ( tr( "TB_OTRO" ), "TB_Otro", k_ent_otro ),
                        ( "+"+tr( "TB_OPCIONES" ), "TB_Otros", k_otros ), # quitado traducción TB_OTROS -> y poniendo = opciones -> aunque repite título es distinto concepto
                        ( tr( "TB_TERMINAR" ), "TB_FinPartida", k_pgnFin ),
                        ( tr( "TB_PGNPASTE" ), "TB_Pegar", k_pgnPaste ),
                        ( tr( "TB_PGNFICHERO" ), "TB_Fichero", k_pgnFichero ),
                        ( tr( "TB_PGNINFO" ), "TB_InformacionPGN", k_pgnInformacion ),
                        ( tr( "TB_PGNREPITE" ), "TB_FicheroRepite", k_pgnFicheroRepite ),
                        ( tr( "TB_PGNNUESTRO" ), "TB_NuestroFichero", k_pgnNuestroFichero ),
                        ( tr( "TB_RENDIRSE" ), "TB_Rendirse", k_rendirse ),
                        ( tr( "TABLAS" ), "TB_Tablas", k_tablas ),
                        ( tr( "TRASTEROS" ), "Trasteros", k_trasteros ),
                        ( tr( "PELICULA_TERMINAR" ), "Pelicula_Terminar", k_peliculaTerminar ),
                        ( tr( "PELICULA_LENTO" ), "Pelicula_Lento", k_peliculaLento ),
                        ( tr( "PELICULA_PAUSA" ), "Pelicula_Pausa", k_peliculaPausa ),
                        ( tr( "SEGUIR" ), "Pelicula_Seguir", k_peliculaSeguir ),
                        ( tr( "PELICULA_RAPIDO" ), "Pelicula_Rapido", k_peliculaRapido ),
                        ( tr( "PELICULA_REPETIR" ), "Pelicula_Repetir", k_peliculaRepetir ),
                        ( tr( "J60_JUGAR" ), "TB_Jugar", k_jugar ),
                        ( tr( "MATE_AYUDA" ), "AyudaGR", k_ayuda ),
                        ( tr( "MATE_NIVEL" ), "TB_Jugar", k_mateNivel ),
                        ( tr( "ACEPTAR" ), "TB_Aceptar", k_aceptar ),
                        ( tr( "CANCELAR" ), "TB_Cancelar", k_cancelar ),
                        ( tr( "JUGADADIA" ), "LM", k_jugadadia )
                        )

        # f = Controles.TipoLetra( puntos=11 ) #0, peso=75 )

        for titulo, cIcono, clave in liOpciones :
            accion = QtGui.QAction( titulo, None)
            accion.setIcon( eval( "Iconos.%s()"%cIcono) )
            accion.setIconText( titulo )
            # accion.setFont( f )
            self.connect( accion, QtCore.SIGNAL("triggered()"), self.procesarAccion )
            accion.clave = clave
            self.dicTB[clave] = accion

    #--------------------------------------------------------------------------------------------------------------------------------
    def procesarAccion( self ) :
        self.gestor.procesarAccion( self.sender().clave )

    #--------------------------------------------------------------------------------------------------------------------------------
    def ponToolBar( self, liAcciones ) :

        self.tb.clear()
        for k in liAcciones :
            self.dicTB[k].setVisible( True )
            self.dicTB[k].setEnabled( True )
            self.tb.addAction( self.dicTB[k] )

        self.tb.liAcciones = liAcciones
        self.tb.update()

    #--------------------------------------------------------------------------------------------------------------------------------
    def dameToolBar( self ) :
        return self.tb.liAcciones

    #--------------------------------------------------------------------------------------------------------------------------------
    def habilitaToolbar( self, kopcion, siHabilitar ) :
        self.dicTB[kopcion].setEnabled( siHabilitar )

    #--------------------------------------------------------------------------------------------------------------------------------
    def mostrarOpcionToolbar( self, kopcion, siMostrar ) :
        self.dicTB[kopcion].setVisible( siMostrar )

    #--------------------------------------------------------------------------------------------------------------------------------
    def ponActivarTutor( self, siActivar ) :
        if siActivar :
            mens = tr( "TUTOR_ACTIVADO" )
        else :
            mens = tr( "TUTOR_DESACTIVADO" )
        self.btActivarTutor.setText( mens )

    #--------------------------------------------------------------------------------------------------------------------------------
    def cambiaSiActivarTutor( self ) :
        self.gestor.cambiaActivarTutor()

    #--------------------------------------------------------------------------------------------------------------------------------
    def gridNumDatos( self, grid ) :
        return self.gestor.numDatos()
    #--------------------------------------------------------------------------------------------------------------------------------
    def gridBotonIzquierdo( self, grid, fila, columna ) :
        if columna.clave == "NUMERO" :
            return
        self.gestor.pgnMueve( fila, columna.clave == "BLANCAS" )
    #--------------------------------------------------------------------------------------------------------------------------------
    def gridBotonDerecho( self, grid, fila, columna, modificadores ) :
        if columna.clave == "NUMERO" :
            return

        self.gestor.pgnMueve( fila, columna.clave == "BLANCAS" )

        if modificadores.siControl :
            self.gestor.capturas()
        else :
            self.gestor.pgnInformacion( fila, columna.clave )
    #--------------------------------------------------------------------------------------------------------------------------------
    def gridDobleClick( self, grid, fila, columna ) :
        if columna.clave == "NUMERO" :
            return
        self.gestor.analizaPosicion( fila, columna.clave )
    #--------------------------------------------------------------------------------------------------------------------------------
    def gridTeclaControl( self, grid, k, siShift, siControl, siAlt ) :
        self.teclaPulsada( "G", k )
    #--------------------------------------------------------------------------------------------------------------------------------
    def gridWheelEvent( self, ogrid, siAdelante ) :
        self.teclaPulsada( "T", 16777236 if not siAdelante else 16777234 )
    #--------------------------------------------------------------------------------------------------------------------------------
    def gridDato( self, grid, fila, oColumna ) :
        multi = self.gestor.pgn.analisis(fila, oColumna.clave)
        mas = ""
        if multi :
            multianalisis, pos = multi
            analisis = multianalisis.liMultiPV[pos]
            mate = analisis.mate
            if mate :
                mas = " (M%d)"%mate
            else :
                mas = " ("+str(analisis.puntos)+")"
            mas = "<b>%s</b>"%mas
        info = self.gestor.pgn.conInformacion( fila, oColumna.clave )
        if info :
            jg = info
            siA = jg.siApertura
            nR = 0
            if jg.critica :
                nR += 1
            if jg.comentario :
                nR += 1
            if jg.variantes :
                nR += 1
            if siA :
                mas += "#R" if nR == 0 else "#S"
            elif nR == 1:
                mas += "#V"
            elif nR > 1 :
                mas += "#M"

        return self.gestor.pgn.dato(fila, oColumna.clave)+mas
    #--------------------------------------------------------------------------------------------------------------------------------
    def gridPonValor( self, grid, fila, oColumna, valor ) :
        """
        Al añadir los editores, pasa por aquí
        """
        pass
    #~ #--------------------------------------------------------------------------------------------------------------------------------
    #~ def gridColorTexto( self, fila, oColumna ) :
        #~ analisis = self.gestor.pgn.analisis(fila, oColumna.clave)
        #~ if analisis :
            #~ mate = analisis.mate
            #~ if mate :
                #~ return self.colorBlanco
            #~ else :
                #~ puntos = analisis.puntos
                #~ if puntos > 0 :
                    #~ if puntos < 1000 :
                        #~ return self.colorPositivo.darker( 1000-puntos )
                    #~ else :
                        #~ return self.colorBlanco
                #~ else :
                    #~ if puntos > -1000 :
                        #~ return self.colorNegativo.darker( -(-1000-puntos) )
                    #~ else :
                        #~ return self.colorBlanco

        #~ return None
    #~ #--------------------------------------------------------------------------------------------------------------------------------
    #~ def gridColorFondo( self, fila, oColumna ) :
        #~ analisis = self.gestor.pgn.analisis(fila, oColumna.clave)
        #~ if analisis :
            #~ mate = analisis.mate
            #~ if mate :
                #~ if mate < 0 :
                    #~ return self.colorMateNegativo
                #~ else :
                    #~ return self.colorMatePositivo
            #~ else :
                #~ puntos = analisis.puntos
                #~ if puntos > 0 :
                    #~ if puntos < 1000 :
                        #~ return self.colorPositivo.lighter( 1000-puntos )
                    #~ else :
                        #~ return self.colorPositivo
                #~ else :
                    #~ if puntos > -1000 :
                        #~ return self.colorNegativo.lighter( -(-1000-puntos) )
                    #~ else :
                        #~ return self.colorNegativo

        #~ return None

    #--------------------------------------------------------------------------------------------------------------------------------
    def keyPressEvent( self, event ) :
        self.teclaPulsada( "V", event.key() )
    #--------------------------------------------------------------------------------------------------------------------------------
    def tableroWheelEvent( self, tablero, siAdelante ) :
        self.teclaPulsada( "T", 16777236 if siAdelante else 16777234 )

    #--------------------------------------------------------------------------------------------------------------------------------
    def teclaPulsada( self, tipo, tecla ) :
        if self.procesandoEventos :
            QTUtil.refreshGUI()
            return
        self.procesandoEventos = True

        if tecla == self.gestor.teclaPanico :
            self.gestor.siTeclaPanico = True
        else :
            dic = { 16777234:"-", 16777236:"+", 16777235:"-", 16777237:"+", 16777232:"p", 16777233:"f" }
            if tecla in dic :
                self.gestor.mueveJugada( dic[tecla] )
        self.procesandoEventos = False

    #--------------------------------------------------------------------------------------------------------------------------------
    def pgnRefresh( self ) :
        self.pgn.refresh()

    #--------------------------------------------------------------------------------------------------------------------------------
    def activaJuego( self, siActivar, siReloj ) :

        self.pgn.setVisible( siActivar )
        self.lbRevision.hide()
        self.ayudasU.setVisible( siActivar )
        self.ayudasD.setVisible( siActivar )
        self.lbCredito.setVisible( siActivar )
        self.btActivarTutor.setVisible( siActivar )
        self.lbRotulo1.setVisible( siActivar )
        self.lbRotulo2.setVisible( siActivar )

        self.lbJugBlancas.setVisible( siReloj )
        self.lbJugNegras.setVisible( siReloj )
        self.lbRelojBlancas.setVisible( siReloj )
        self.lbRelojNegras.setVisible( siReloj )

    #--------------------------------------------------------------------------------------------------------------------------------
    def ponDatosReloj( self, bl, rb, ng, rn ) :
        self.lbJugBlancas.ponTexto( bl )
        self.lbJugNegras.ponTexto( ng )
        self.lbRelojBlancas.ponTexto( rb )
        self.lbRelojNegras.ponTexto( rn )

    #--------------------------------------------------------------------------------------------------------------------------------
    def ponAyudas( self, puntos, siQuitarAtras=True ) :
        if puntos > 9 :
            if puntos > 99 :
                puntos = 99
            decenas = puntos/10
            self.ayudasD.pon( decenas )
        else :
            self.ayudasD.setVisible(False)
        unidades = puntos %10
        self.ayudasU.pon( unidades )

        if (puntos == 0) and siQuitarAtras :
            if k_atras in self.tb.liAcciones :
                self.dicTB[k_atras].setVisible( False )

    #--------------------------------------------------------------------------------------------------------------------------------
    def quitaAyudas( self, siTambienTutorAtras, siQuitarAtras=True ) :
        self.ayudasU.setVisible( False )
        self.ayudasD.setVisible( False )
        self.lbCredito.setVisible( False )
        if siTambienTutorAtras :
            self.btActivarTutor.setVisible( False )
            if siQuitarAtras and (k_atras in self.tb.liAcciones) :
                self.dicTB[k_atras].setVisible( False )

    #--------------------------------------------------------------------------------------------------------------------------------
    def ponRotulo1( self, rotulo ) :
        if rotulo :
            self.lbRotulo1.ponTexto( rotulo )
            self.lbRotulo1.show()
        else :
            self.lbRotulo1.hide()

    #--------------------------------------------------------------------------------------------------------------------------------
    def ponRotulo2( self, rotulo ) :
        if rotulo :
            self.lbRotulo2.ponTexto( rotulo )
            self.lbRotulo2.show()
        else :
            self.lbRotulo2.hide()

    #--------------------------------------------------------------------------------------------------------------------------------
    def ponRelojBlancas( self, tm ) :
        self.lbRelojBlancas.ponTexto( tm )

    #--------------------------------------------------------------------------------------------------------------------------------
    def ponRelojNegras( self, tm ) :
        self.lbRelojNegras.ponTexto( tm )

    #--------------------------------------------------------------------------------------------------------------------------------
    def creaCapturas( self ) :
        tipoPieza, anchoPieza = self.tablero.tipoPieza, self.tablero.anchoPieza
        self.capturas = WCapturas.CapturaLista( self, tipoPieza, anchoPieza )
