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

import collections

from PySide import QtGui

from Code.Traducir import *

import Code.Util as Util

import QTUtil
import QTVarios
import Colocacion
import Iconos
import Controles

import Grid
import Columnas
import Delegados

#==========================================================================================================================================
class WEditaTrad( QTVarios.WDialogo ):

    def __init__(self, owner, original, usuario )  :

        titulo = tr("TRADUCCION_EDICION" )
        icono = Iconos.Traduccion()
        extparam = "translation1"
        QTVarios.WDialogo.__init__(self, owner, titulo, icono, extparam )

        # Toolbar
        liAcciones = (  ( tr( "ACEPTAR" ), Iconos.TB_Aceptar(), "aceptar" ), None,
                        ( tr( "CANCELAR" ), Iconos.TB_Cancelar(), "cancelar" ), None,
                        ( tr( "COPIAR" ), Iconos.TB_Copiar(), "copiar" ), None,
                        )
        tb = Controles.TB( self, liAcciones )

        ancho = owner.width()/2-10

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

        # modificacion
        self.usu = Controles.EM( self, usuario, siHTML = False ).ponFuente( flb )
        self.usu.anchoMinimo( ancho )
        ly = Colocacion.H().control( self.usu )
        gbUsu = Controles.GB( self, tr( "TRADUCCION_USUARIO" ), ly ).ponFuente( f ).alinCentrado()

        # original
        self.original = original # para las copias
        ori = Controles.EM( self, original, siHTML = False ).soloLectura().ponFuente( flb )
        ori.anchoMinimo( ancho )
        ly = Colocacion.H().control( ori )
        gbOri = Controles.GB( self, tr( "TRADUCCION_ORIGINAL" ), ly ).ponFuente( f ).alinCentrado()

        # Layout
        lyH = Colocacion.H().control(gbOri).control(gbUsu)
        layout = Colocacion.V().control(tb).otro(lyH).margen( 3 )
        self.setLayout( layout )

        self.usu.setFocus()

        self.recuperarVideo()

    def resultado( self ) :
        return self.usu.texto()

    #--------------------------------------------------------------------------------------------------------------------------------
    def procesarTB( self ) :

        accion = self.sender().clave
        if accion == "aceptar" :
            self.guardarVideo()
            self.accept()

        elif accion == "cancelar" :
            self.guardarVideo()
            self.reject()

        elif accion == "copiar" :
            self.usu.ponTexto( self.original )

#==========================================================================================================================================
class WTraduccion( QTVarios.WDialogo ):

    def __init__(self, procesador )  :

        titulo = tr("TRADUCCION_EDICION" )
        icono = Iconos.Traduccion()
        extparam = "translation"
        QTVarios.WDialogo.__init__(self, procesador.pantalla, titulo, icono, extparam )

        self.fichero = procesador.configuracion.userTRA
        self.procesador = procesador

        self.ultimaBusqueda = ""

        self.creaListaDatos()

        # Toolbar
        liAcciones = (  ( tr( "TB_TERMINAR" ), Iconos.TB_FinPartida(), "terminar" ), None,
                        ( tr( "TB_BUSCAR" ), Iconos.TB_Buscar(), "buscar" ), None,
                        )
        tb = Controles.TB( self, liAcciones )

        # Lista
        oColumnas = Columnas.ListaColumnas()
        oColumnas.nueva( "NUMERO", tr( "AB_NUM" ), 40, siCentrado = True )
        oColumnas.nueva( "ORIGINAL", tr( "TRADUCCION_ORIGINAL" ), 400, siCentrado = True )
        oColumnas.nueva( "CAMBIADO", tr( "TRADUCCION_USUARIO" ), 400, edicion=Delegados.LineaTexto() )

        self.grid = Grid.Grid( self, oColumnas, siEditable=True )
        ancho, alto = QTUtil.tamEscritorio()

        self.registraGrid( self.grid )

        # Layout
        layout = Colocacion.V().control(tb).control(self.grid).margen( 3 )
        self.setLayout( layout )

        self.grid.gotop()
        self.grid.setFocus()

        if not self.recuperarVideo() :
            self.resize( min( self.grid.anchoColumnas()+20, ancho - 10 ), min( 20*30, alto -80 ) )

    #--------------------------------------------------------------------------------------------------------------------------------
    def procesarTB( self ) :

        accion = self.sender().clave
        if accion == "terminar" :
            self.grabar()
            leeUno( self.fichero, False )
            self.guardarVideo()
            self.accept()

        elif accion == "buscar" :
            self.buscar()

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

    #--------------------------------------------------------------------------------------------------------------------------------
    def gridDobleClick( self, grid, fila, oColumna ) :
        if oColumna.clave == "ORIGINAL" :
            w = WEditaTrad( self, self.liDatos[fila][1], self.liDatos[fila][2])
            if w.exec_() :
                self.cambiaTraduccion( fila, w.resultado() )
                self.grid.refresh()

    #--------------------------------------------------------------------------------------------------------------------------------
    def gridPonValor( self, grid, fila, oColumna, valor ) :
        self.cambiaTraduccion( fila, valor )
    #--------------------------------------------------------------------------------------------------------------------------------
    def cambiaTraduccion( self, fila, valor ) :
        self.liDatos[fila][2] = valor
        if hasattr( self.procesador, "menuEntrenamientos") :
            del self.procesador.menuEntrenamientos
        self.grabar()
        self.procesador.configuracion.releeTRA(True)

    #--------------------------------------------------------------------------------------------------------------------------------
    def gridDato( self, grid, fila, oColumna ) :
        clave = oColumna.clave
        li = self.liDatos[fila]
        if clave == "NUMERO" :
            return str(fila+1)
        elif clave == "ORIGINAL" :
            return li[1]
        else :
            return li[2]

    #--------------------------------------------------------------------------------------------------------------------------------
    def creaListaDatos( self ) :

        self.liDatos = []

        dic = Util.iniBase8dic( self.fichero )

        self.procesador.configuracion.releeTRA( False )

        global tdic
        for k in tdic :
            if k != "El ajedrez de Lucas" :
                self.liDatos.append( [ k, tdic[k], dic.get(k,"") ] )

        self.procesador.configuracion.releeTRA( True )

    #--------------------------------------------------------------------------------------------------------------------------------
    def grabar( self ) :
        dic = collections.OrderedDict()
        for k, nada, valor in self.liDatos :
            valor = valor.rstrip()
            if valor :
                dic[k] = valor

        Util.dic8iniBase( self.fichero, dic )

    #--------------------------------------------------------------------------------------------------------------------------------
    def buscar( self ) :
        text, ok = QtGui.QInputDialog.getText(self, tr( "TB_BUSCAR" ), tr("BUSCAR_TEXTO") + " :", text=self.ultimaBusqueda )
        if ok :
            text = text.strip()
            if text:
                self.ultimaBusqueda = text

                self.hazBusqueda( )

    #--------------------------------------------------------------------------------------------------------------------------------
    def hazBusqueda( self ) :
        if self.ultimaBusqueda :
            desde = self.grid.recno()
            b = self.ultimaBusqueda.lower()
            for fila in range( desde+1, len(self.liDatos)) :

                if b in self.liDatos[fila][1].lower() :
                    self.grid.goto( fila, 0 )
                    return
                elif b in self.liDatos[fila][2].lower() :
                    self.grid.goto( fila, 1 )
                    return

            for fila in range( desde ) :
                if b in self.liDatos[fila][1].lower() :
                    self.grid.goto( fila, 0 )
                    return
                elif b in self.liDatos[fila][2].lower() :
                    self.grid.goto( fila, 1 )
                    return
            QTUtil.beep()

    def gridTeclaControl( self, grid, k, siShift, siControl, siAlt ) :
        if k == 16777266 : # F3
            self.hazBusqueda()
        elif siControl and k == 70 : # Ctrl-F
            self.buscar()

