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

#==========================================================================================================================================
import os
import operator

from PySide import QtCore, QtGui

from Code.Traducir import tr

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

import Code.MotoresExternos as MotoresExternos

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

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

    def __init__( self, wParent, ficheroMExternos ) :

        self.listaMotores = MotoresExternos.ListaMotoresExternos(ficheroMExternos)
        self.listaMotores.leer()
        self.siCambios = False

        super(WMotores, self).__init__(wParent)
        self.setWindowTitle( tr( "MOTORES_EXTERNOS" ) )
        self.setWindowIcon( Iconos.TB_Motores() )
        self.setWindowFlags( QtCore.Qt.Dialog | QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowMinimizeButtonHint )

        # Toolbar
        liAcciones = [  ( tr( "ME_GRABAR" ), Iconos.TB_Aceptar(), "aceptar" ), None,
                        ( tr( "CANCELAR" ), Iconos.TB_Cancelar(), "cancelar" ), None,
                        ( tr( "NUEVO" ), Iconos.TutorialesCrear(), "nuevo" ), None,
                        ( tr( "MODIFICAR" ), Iconos.TB_Modificar(), "modificar" ), None,
                        ( tr( "BORRAR" ), Iconos.TB_Borrar(), "borrar" ), None,
                        ( tr( "COPIAR" ), Iconos.TB_Copiar(), "copiar" ), None,
                    ]
        tb = Controles.TB( self, liAcciones )

        # Lista
        oColumnas = Columnas.ListaColumnas()
        oColumnas.nueva( "ALIAS", tr( "ME_ALIAS" ), 240 )
        oColumnas.nueva( "MOTOR", tr( "MOTOR" ), 240 )
        oColumnas.nueva( "AUTOR", tr( "AUTOR" ), 240 )

        self.grid = Grid.Grid( self, oColumnas, siSelecFilas=True )
        n = self.grid.anchoColumnas()
        self.grid.setFixedWidth( n + 20 )

        # Layout
        layout = Colocacion.V().control(tb).control(self.grid).relleno(1)
        self.setLayout( layout )

    #--------------------------------------------------------------------------------------------------------------------------------
    def procesarTB( self ) :
        accion = self.sender().clave
        if accion == "aceptar" :
            self.listaMotores.grabar()
            self.accept()
        elif accion == "cancelar" :
            if self.siCambios :
                if not QTUtil2.pregunta( self, tr( "ME_CANCELAMOS" ) ) :
                    return
            self.reject()
        elif accion == "nuevo" :
            self.nuevo()
        elif accion == "modificar" :
            self.modificar()
        elif accion == "borrar" :
            self.borrar()
        elif accion == "copiar" :
            self.copiar()

    #--------------------------------------------------------------------------------------------------------------------------------
    def gridNumDatos( self, grid ) :
        return self.listaMotores.numDatos()

    #--------------------------------------------------------------------------------------------------------------------------------
    def gridDato( self, grid, fila, oColumna ) :
        me = self.listaMotores.liMotores[fila]
        clave = oColumna.clave
        if clave == "AUTOR" :
            return me.idAuthor
        elif clave == "ALIAS" :
            return me.alias
        elif clave == "MOTOR" :
            return me.idName

    #--------------------------------------------------------------------------------------------------------------------------------
    def nuevo( self ) :
        # Pedimos el ejecutable
        exeMotor = QTUtil2.leeFichero( self, self.listaMotores.ultCarpeta, "*", tr("MOTOR") )
        if not exeMotor :
            return
        self.listaMotores.ultCarpeta = os.path.dirname( exeMotor )

        # Leemos el UCI
        me = MotoresExternos.MotorExterno()
        if not me.leerUCI( exeMotor ) :
            QTUtil2.mensaje( self, tr( "ME_NOUCI", exeMotor ) )
            return

        # Editamos
        w = WMotor( self, self.listaMotores,  me )
        if w.exec_() :
            self.listaMotores.nuevo( me )
            self.grid.refresh()
            self.grid.gobottom( 0 )

    #--------------------------------------------------------------------------------------------------------------------------------
    def gridDobleClick( self, grid, fil, col ) :
        self.modificar()

    #--------------------------------------------------------------------------------------------------------------------------------
    def gridDobleClickCabecera( self, grid, oColumna ) :
        clave = oColumna.clave
        if clave == "ALIAS" :
            clave = "alias"
        elif clave == "MOTOR" :
            clave = "idName"
        else :
            return
        self.listaMotores.liMotores.sort(key=operator.attrgetter(clave))
        self.grid.refresh()
        self.grid.gotop( )

    #--------------------------------------------------------------------------------------------------------------------------------
    def modificar( self ) :
        if len(self.listaMotores.liMotores) :
            fila = self.grid.recno()
            if fila >= 0:
                me = self.listaMotores.liMotores[fila]
                # Editamos, y graba si hace falta
                w = WMotor( self, self.listaMotores, me )
                if w.exec_() :
                    self.grid.refresh()

    #--------------------------------------------------------------------------------------------------------------------------------
    def borrar( self ) :
        fila = self.grid.recno()
        if fila >= 0:
            if QTUtil2.pregunta( self, tr( "ME_BORRAMOS" ) ) :
                del self.listaMotores.liMotores[fila]
                self.grid.refresh()

    #--------------------------------------------------------------------------------------------------------------------------------
    def copiar( self ) :
        fila = self.grid.recno()
        if fila >= 0:
            me = self.listaMotores.liMotores[fila].copiar()
            w = WMotor( self, self.listaMotores,  me )
            if w.exec_() :
                self.listaMotores.nuevo( me )
                self.grid.refresh()
                self.grid.gobottom( 0 )

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

    def __init__( self, wParent, listaMotores, motorExterno ) :

        super(WMotor, self).__init__(wParent)

        self.setWindowTitle( motorExterno.idName )
        self.setWindowIcon( Iconos.Motor() )
        self.setWindowFlags( QtCore.Qt.Dialog | QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowMinimizeButtonHint | QtCore.Qt.WindowMaximizeButtonHint )
        maxAncho, maxAlto = QTUtil.tamEscritorio()

        #~ w = WOpciones( motorExterno )
        w = QtGui.QWidget(self)
        ly = self.creaOpciones(motorExterno)
        w.setLayout( ly )
        self.scrollArea = QtGui.QScrollArea()
        self.scrollArea.setBackgroundRole(QtGui.QPalette.Light)
        self.scrollArea.setWidget(w)
        self.scrollArea.setWidgetResizable(True)

        lyS = Colocacion.H().control( self.scrollArea )

        self.motorExterno = motorExterno
        self.listaMotores = listaMotores

        # Toolbar
        tb = QTUtil2.creaTBAceptarCancelar( self )

        lb = Controles.LB( tr( "ME_ALIAS" ) + " : " ).alinDerecha()
        self.edAlias = Controles.ED( self, motorExterno.alias ).anchoFijo( 240 )

        # Layout
        lyEd = Colocacion.H().control( lb ).control( self.edAlias ).relleno(1)
        layout = Colocacion.V().control(tb).espacio(30).otro( lyEd ).espacio(20).otro( lyS )#control( self.scrollArea )
        self.setLayout( layout )

    #--------------------------------------------------------------------------------------------------------------------------------
    def procesarTB( self ) :
        accion = self.sender().clave
        if accion == "aceptar" :
            self.aceptar()

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

    #--------------------------------------------------------------------------------------------------------------------------------
    def aceptar( self ) :
        # Comprobamos que no se repita el nombre
        alias = self.edAlias.texto().strip()
        for motor in self.listaMotores.liMotores :
            if (self.motorExterno != motor) and (motor.alias == alias) :
                QTUtil2.mensError( self, tr( "ME_YAEXISTE" ) )
                return
        self.motorExterno.alias = alias

        # Grabamos opciones
        for opcion in self.motorExterno.liOpciones :
            tipo = opcion.tipo
            control = opcion.control
            if tipo == "spin" :
                valor = control.value()
            elif tipo == "check" :
                valor = control.isChecked()
            elif tipo == "combo" :
                valor = control.resultado()
            elif tipo == "string" :
                valor = control.texto()
            elif tipo == "button" :
                valor = control.isChecked()
            opcion.valor = valor

        self.accept()

    #--------------------------------------------------------------------------------------------------------------------------------
    def creaOpciones( self, motorExterno ) :

        fil = 0
        col = 0
        layout = Colocacion.G()
        for opcion in motorExterno.liOpciones :
            tipo = opcion.tipo
            lb = Controles.LB( opcion.nombre + " :").alinDerecha()
            if tipo == "spin" :
                control = QTUtil2.spinBoxLB( opcion.valor, opcion.min, opcion.max, maxTam=50 )
                lb.ponTexto( "%s [%d-%d] :"%( opcion.nombre, opcion.min, opcion.max ) )
            elif tipo == "check" :
                control = Controles.CHB( " ", opcion.valor )
            elif tipo == "combo" :
                liVars = []
                for var in opcion.liVars :
                    liVars.append( (var,var) )
                control = Controles.CB( liVars, opcion.valor )
            elif tipo == "string" :
                control = Controles.ED(self,opcion.valor)
            elif tipo == "button" :
                control = Controles.CHB( " ", opcion.valor )

            layout.controld( lb, fil, col ).control( control, fil, col+1 )
            col += 2
            if col > 2 :
                fil += 1
                col = 0
            opcion.control = control

        return layout

