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

from PySide import QtCore, QtGui

from Code.Traducir import tr
from Code.Constantes import *

import QTUtil

import Colocacion
import Iconos

import Controles

#==========================================================================================================================================
def leeFichero( owner, carpeta, extension, titulo = None ) :
    if titulo is None :
        titulo = tr( "FICHERO" )
    resp = QtGui.QFileDialog.getOpenFileName( owner, titulo, carpeta, tr("FICHERO")+" %s (*.%s)"%(extension,extension) )
    if resp :
        return resp[0]
    else :
        return None

#==========================================================================================================================================
def salvaFichero( pantalla, titulo, carpeta, filtro, siConfirmarSobreescritura = True ) :
    if siConfirmarSobreescritura :
        resp = QtGui.QFileDialog.getSaveFileName( pantalla, titulo, carpeta, filtro )
    else :
        resp = QtGui.QFileDialog.getSaveFileName( pantalla, titulo, carpeta, filtro, options=QtGui.QFileDialog.DontConfirmOverwrite )
    if resp :
        resp = resp[0]
    return resp

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

    def __init__(self, parent, mensaje, siCancelar = False, siMuestraYa = True, opacity = 0.80, posicion = "c" ):

        super( MensEspera, self ).__init__(parent)

        self.setWindowFlags( QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint  )
        self.setStyleSheet("QWidget, QLabel { background: #79b600 }")
        lbi = QtGui.QLabel( )
        lbi.setPixmap(Iconos.pmMensEspera())
        self.setFixedWidth( 256 )

        self.owner = parent

        self.posicion = posicion

        self.lb = lb = Controles.LB( resalta(mensaje) ).ponFuente( Controles.TipoLetra( puntos = 12 ) ).ponWrap( )

        if siCancelar :
            self.siCancelado = False
            self.btCancelar = Controles.PB( self, tr( "CANCELAR" ), rutina = self.cancelar, plano = False ).ponIcono( Iconos.TB_Cancelar()).anchoFijo(100)

        ly = Colocacion.G().control( lbi, 0, 0, 3, 1 ).control( lb, 1, 1 )
        if siCancelar :
            ly.controlc( self.btCancelar, 2,1 )

        ly.margen( 12 )
        self.setLayout(ly)
        self.teclaPulsada = None

        self.setWindowOpacity( opacity )
        if siMuestraYa :
            self.muestra()

    def cancelar( self ) :
        self.siCancelado = True

    def cancelado( self ) :
        QTUtil.refreshGUI()
        return self.siCancelado

    def activarCancelar( self, siActivar ) :
        self.btCancelar.setVisible( siActivar )
        QTUtil.refreshGUI()
        return self

    def keyPressEvent( self, event ) :
        QtGui.QWidget.keyPressEvent( self, event )
        self.teclaPulsada = event.key()

    def rotulo(self, nuevo ) :
        self.lb.ponTexto( resalta(nuevo) )
        QTUtil.refreshGUI()

    def muestra(self) :
        self.show()

        v = self.owner
        s = self.size()
        if self.posicion == "c" :
            x = v.x()+(v.width()-s.width())/2
            y = v.y()+(v.height()-s.height())/2
        elif self.posicion == "ad" :
            x = v.x()+v.width()-s.width()
            y = v.y()+4
        self.move( x,y )
        QTUtil.refreshGUI()
        return self

    def final( self ) :
        self.hide()
        self.close()
        self.destroy()
        QTUtil.refreshGUI()

class ControlMensEspera :
    def __init__( self ) :
        self.me = None

    def inicio( self, parent, mensaje, siCancelar = False, siMuestraYa = True, opacity = 0.80, posicion = "c" ):
        if self.me :
            self.final()

        self.me = MensEspera( parent, mensaje, siCancelar, siMuestraYa, opacity, posicion )
        return self

    def final( self ) :
        if self.me :
            self.me.final()
            self.me = None

    def cancelado( self ) :
        if self.me :
            return self.me.cancelado()
        return True

    def teclaPulsada( self, k ) :
        if self.me is None :
            return False
        if self.me.teclaPulsada  :
            resp = self.me.teclaPulsada == k
            self.me.teclaPulsada = None
            return resp
        else :
            return False

mensEspera = ControlMensEspera()
#==========================================================================================================================================

#==========================================================================================================================================
class BarraProgreso( QtGui.QProgressDialog ) :
    #~ bp = QTUtil2.BarraProgreso( self, "me", 5 ).mostrar()
    #~ n = 0
    #~ for n in range(5) :
        #~ prlk( n )
        #~ bp.pon( n )
        #~ time.sleep(1)
        #~ if bp.siCancelado() :
            #~ break
    #~ bp.cerrar()

    def __init__( self, owner, titulo, mensaje, total ) :
        QtGui.QProgressDialog.__init__( self, mensaje, tr( "CANCELAR" ), 0, total, owner)
        self.total = total
        self.actual = 0
        self.setWindowModality(QtCore.Qt.WindowModal)
        self.setWindowFlags( QtCore.Qt.Dialog | QtCore.Qt.WindowTitleHint )
        self.setWindowTitle( titulo )
        self.owner = owner

    def mostrar( self ) :
        self.show()
        return self

    def mostrarAD( self ) :
        self.move( self.owner.x()+self.owner.width()-self.width(), self.owner.y() )

        self.show()
        return self

    def cerrar( self ) :
        self.setValue(self.total)
        self.close()

    def mensaje( self, mens ) :
        self.setLabelText( mens )

    def siCancelado( self ) :
        return self.wasCanceled()

    def ponTotal( self, total ) :
        self.setMaximum( total )
        self.pon( 0 )

    def pon( self, valor ) :
        self.setValue( valor )
        self.actual = valor

    def inc( self ) :
        self.pon( self.actual + 1 )

#==========================================================================================================================================
def resalta( mens, tipo = 4 ) :
    return ("<h%d>%s</h%d>"%( tipo,mens,tipo)).replace( "\n", "<br>" )

#==========================================================================================================================================
def mensaje( parent, mens, titulo = None, siResalta = True, siArribaDerecha = False ) :
    w = Mensaje( parent, mens, titulo, siResalta )
    if siArribaDerecha :
        w.move( parent.x()+parent.width()-w.width(), parent.y() )
        # w.show()
    w.muestra()

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

    def __init__(self, parent, mens, titulo = None, siResalta = True ) :
        super( Mensaje, self ).__init__(parent)

        if titulo is None :
            titulo = tr( "MENSAJE" )
        if siResalta :
            mens = resalta(mens)

        self.setWindowTitle( titulo )
        self.setWindowFlags( QtCore.Qt.Dialog | QtCore.Qt.WindowTitleHint )
        #~ self.setStyleSheet("QDialog, QLabel { background: #79b600 }")

        lbi = QtGui.QLabel( )
        lbi.setPixmap(Iconos.pmTB_Informacion())

        lbm = Controles.LB( mens )
        bt = Controles.PB( self, tr( "SEGUIR" ), rutina = self.accept, plano = False )

        ly = Colocacion.G().control( lbi, 0, 0 ).control( lbm, 0, 1 ).controld( bt, 1,1 )

        ly.margen( 10 )
        self.setLayout(ly)

    def muestra(self) :
        QTUtil.refreshGUI()
        self.exec_()
        QTUtil.refreshGUI()

#==========================================================================================================================================
def mensError( parent, mens) :
    msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Warning, tr("ERROR"), resalta(mens),parent=parent)
    msgBox.addButton(tr("SEGUIR"), QtGui.QMessageBox.ActionRole)
    msgBox.exec_()

#==========================================================================================================================================
def pregunta( parent, mens ) :
    msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Question, tr("PREGUNTA"), resalta(mens),parent=parent)
    siButton = msgBox.addButton(tr("SI"), QtGui.QMessageBox.YesRole)
    msgBox.addButton(tr("NO"), QtGui.QMessageBox.NoRole)
    msgBox.exec_()
    return msgBox.clickedButton() == siButton

#==========================================================================================================================================
def preguntaCancelar( parent, mens, si, no ) :
    msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Question, tr("PREGUNTA"), resalta(mens),parent=parent)
    siButton = msgBox.addButton(tr(si), QtGui.QMessageBox.YesRole)
    noButton = msgBox.addButton(tr(no), QtGui.QMessageBox.NoRole)
    msgBox.addButton(tr("CANCELAR"), QtGui.QMessageBox.RejectRole)
    msgBox.exec_()
    cb = msgBox.clickedButton()
    if cb == siButton :
        resp = True
    elif cb == noButton :
        resp = False
    else:
         resp = None
    return resp

#==========================================================================================================================================
def creaTBAceptarCancelar( parent, siDefecto = False ) :
    liAcciones = [ ( tr( "ACEPTAR" ), Iconos.TB_Aceptar(), "aceptar" ),
                    None,
                    ( tr( "CANCELAR" ), Iconos.TB_Cancelar(), "cancelar" ),
                    ]
    if siDefecto :
        liAcciones.append( ( tr( "DEFECTO" ), Iconos.TB_Defecto(), "defecto" ) )
    liAcciones.append( None )

    return Controles.TB( parent, liAcciones )

#==========================================================================================================================================
# class Proceso(QtCore.QProcess):

    # def __init__( self, exe ) :

        # QtCore.QProcess.__init__( self )
        # self.setWorkingDirectory ( os.path.abspath(os.path.dirname(exe)) )
        # self.start( exe, [] )

        # self.waitForStarted()

    # def escribeLinea( self, linea ) :
        # self.write( str(linea + "\n") )

    # def esperaRespuesta( self, segundos = None ) :
        # if segundos :
            # total = segundos*1000
            # self.waitForReadyRead(total)
            # #~ bloque = 100
            # #~ while not self.waitForReadyRead(bloque) :
                # #~ total -= bloque
                # #~ QtCore.QCoreApplication.processEvents()
                # #~ QtGui.QApplication.processEvents()
                # #~ if total <= 0 :
                    # #~ return ""

        # else :
            # self.waitForReadyRead()
        # return str(self.readAllStandardOutput())

    # def terminar( self ) :
        # try :
            # self.close()
        # except :
            # pass

#==========================================================================================================================================
def tiposDeLineas() :
    li = (
            ( tr( "TUT_NOPEN"), 0 ),
            ( tr( "TUT_SOLIDLINE"), 1 ),
            ( tr( "TUT_DASHLINE"), 2 ),
            ( tr( "TUT_DOTLINE"), 3 ),
            ( tr( "TUT_DASHDOTLINE"), 4 ),
            ( tr( "TUT_DASHDOTDOTLINE"), 5 ),
        )
    return li

#==========================================================================================================================================
def listaOrdenes() :
    li = []
    for k in range( 5, 30 ) :
        txt = "%2d"%(k-4,)
        if k == kZvalue_pieza :
            txt += " => " + tr( "ORDEN_PIEZA" )
        elif k == kZvalue_piezaMovimiento :
            txt += " => " + tr( "ORDEN_PIEZA_MOVIMIENTO" )

        li.append( (txt,k) )
    return li

#==========================================================================================================================================
def spinBoxLB( valor, desde, hasta, etiqueta = None, maxTam=None ) :
    ed = Controles.SB( valor, desde, hasta )
    if maxTam :
        ed.tamMaximo( maxTam )
    if etiqueta :
        label = Controles.LB( etiqueta + " : " )
        return ed, label
    else :
        return ed

#==========================================================================================================================================
def comboBoxLB( liOpciones, valor, etiqueta=None ) :
    cb = Controles.CB( liOpciones, valor )
    if etiqueta :
        return cb, Controles.LB( etiqueta + " : "  )
    else :
        return cb

