#!/usr/bin/env python
# -*- coding: utf-8 -*-
# $Id: externalProgramPathGui.pyw 2384 2015-09-22 10:07:54Z papeleux $
#
#
# Gui to configure externals program path according to local configuration
# 

## Qt ##
from __future__ import print_function
foundQt=0
try:
    from PyQt4.QtCore import *
    from PyQt4.QtGui  import *
    foundQt=4
except:
    pass  
    
try:
    from PyQt5.QtCore    import *
    from PyQt5.QtGui     import *
    from PyQt5.QtWidgets import *
    foundQt=5
except:
    pass     
if not foundQt:
    raise Exception("PyQt4/5 not found!") 
#print "PyQt%d (Qt %s) loaded!" % (foundQt, QT_VERSION_STR)



from prmClassesGui import *
from postProLoop import *

import sys
# avec pythonw : pas de console => les prints sont interdits => redirection des sorties stdout et stderr vers os.devnull !!!
if (sys.executable.split( '\\' )[-1] == 'pythonw.exe'):
    sys.stdout = open(os.devnull, 'w')
    sys.stderr = open(os.devnull, 'w')

class PostProLoopGui(QWidget):
    app = QApplication(sys.argv)
    def __init__(self, parent=None):        
        # parent constructor
        QWidget.__init__(self, parent)
        # -----------guis datas ----------------       
        self.guiPRM={}
        self.sf={}
        # ----------- externalProgramPath ----------------       
        self.postProLoop = PostProLoop(False)
        # ---------- draw frames -------------------------------        
        #   |--------------------------------|
        #   |  BaseDir :                     |
        #   |       - options                |
        #   |--------------------------------|
        #   |  Matlab :                      |
        #   |       - options                |
        #   |--------------------------------|
        #   |  GhostScript :                 |
        #   |       - options                |
        #   |--------------------------------|
        #   |  Python :                      |
        #   |       - options                |
        #   |--------------------------------|
        #   |  Latex :                       |
        #   |       - options                |
        #   |--------------------------------|
        #   |  Buttons                       |
        #   |--------------------------------|
        mainBox = QVBoxLayout()
        mainBox.setContentsMargins(2,2,2,2)        
        self.setLayout(mainBox)
        #  Application Frame   
        self.buildApplicationFrame(mainBox)
        # Button Box
        self.buildButtonFrame(mainBox)
        self.resize(500, 450)
        self.setWindowTitle('PostPro Loop Utilities')      
        try:
            iconFile = os.path.join(os.path.dirname(os.path.realpath(__file__)), "./Metafor.png")
            self.setWindowIcon(QIcon(iconFile))
        except:        
            pass
        
    def buildApplicationFrame(self, box):
        appFrame = QFrame()                            
        box.addWidget(appFrame)        
        
        #Dir box
        self.mesherGrpBox  = QGroupBox("Base Directories of post processing")
        box.addWidget(self.mesherGrpBox)
        grplay1 = QGridLayout()
        grplay1.setColumnStretch(2,1)
        self.mesherGrpBox.setLayout(grplay1)
            
        self.sf['DIRNAME']      = PathLine    (self, grplay1, self.postProLoop.pars['DIRNAME'], 0, 0, 4)              
        self.sf['MULTITEST']    = CheckBoxLine(self, grplay1, self.postProLoop.pars['MULTITEST'], 1, 0)          
        self.sf['DIRWILDCARD']  = TextLine    (self, grplay1, self.postProLoop.pars['DIRWILDCARD'], 1, 3, 1) #, QIntValidator(-1,100000))

        if isUnix():
            exeFileType ="Exe files (*)"
        else:
            exeFileType ="Exe files (*.exe)"
            
        #Matlab box
        self.mesherGrpBox  = QGroupBox("Matlab")
        box.addWidget(self.mesherGrpBox)
        grplay2 = QGridLayout()
        grplay2.setColumnStretch(2,1)
        self.mesherGrpBox.setLayout(grplay2)
                    
        self.sf['MATLABRUN']       = CheckBoxLine(self, grplay2, self.postProLoop.pars['MATLABRUN'], 0, 0)    
        self.sf['MATLABEXE']       = ExeFileLine (self, grplay2, self.postProLoop.pars['MATLABEXE'], exeFileType, 1, 0, 4)
        self.sf['MATLABCMD']       = TextLine    (self, grplay2, self.postProLoop.pars['MATLABCMD'], 2, 0, 4)   
        self.sf['MATLABPATH']      = PathLine    (self, grplay2, self.postProLoop.pars['MATLABPATH'], 3, 0, 4)
        self.sf['MATLABREQUEST']   = TextLine    (self, grplay2, self.postProLoop.pars['MATLABREQUEST'], 4, 0, 4)
        
        #GhostScript box
        self.mesherGrpBox  = QGroupBox("GhostScript (eps -> png)")
        box.addWidget(self.mesherGrpBox)
        grplay3 = QGridLayout()
        grplay3.setColumnStretch(2,1)
        self.mesherGrpBox.setLayout(grplay3)
                    
        self.sf['GSRUN']           = CheckBoxLine(self, grplay3, self.postProLoop.pars['GSRUN'], 0, 0)     
        self.sf['GSEXE']           = ExeFileLine (self, grplay3, self.postProLoop.pars['GSEXE'], exeFileType, 1, 0, 4)
        self.sf['GSFILTER']        = TextLine    (self, grplay3, self.postProLoop.pars['GSFILTER'], 2, 0, 1)
        self.sf['GSOUTPUTFORMAT']  = MultiPMRLine(self, grplay3, self.postProLoop.pars['GSOUTPUTFORMAT'],3, 0)
        self.sf['GSDEFINITION']    = TextLine    (self, grplay3, self.postProLoop.pars['GSDEFINITION'], 3, 3, 1, QIntValidator(72,1800))
        self.sf['GSREQUEST']       = TextLine    (self, grplay3, self.postProLoop.pars['GSREQUEST'], 4, 0, 1)

        #build Latex box
        self.mesherGrpBox  = QGroupBox("Python")
        box.addWidget(self.mesherGrpBox)
        grplay4 = QGridLayout()
        grplay4.setColumnStretch(2,1)
        self.mesherGrpBox.setLayout(grplay4)
                    
        self.sf['PYTHONRUN']           = CheckBoxLine(self, grplay4, self.postProLoop.pars['PYTHONRUN'], 0, 0)     
        self.sf['PYTHONMODULE']        = FileLine    (self, grplay4, self.postProLoop.pars['PYTHONMODULE'], '*.py', 1, 0, 4)
        self.sf['PYTHONSCRIPT']        = TextLine    (self, grplay4, self.postProLoop.pars['PYTHONSCRIPT'], 2, 0, 4)
        self.sf['PYTHONREQUEST']       = TextLine    (self, grplay4, self.postProLoop.pars['PYTHONREQUEST'], 3, 0, 4)
        '''
        #build Latex box
        self.mesherGrpBox  = QGroupBox("Latex")
        box.addWidget(self.mesherGrpBox)
        grplay5 = QGridLayout()
        grplay5.setColumnStretch(2,1)
        self.mesherGrpBox.setLayout(grplay5)
                    
        self.sf['LATEXRUN']           = CheckBoxLine(self, grplay5, self.postProLoop.pars['LATEXRUN'], 0, 0)     
        self.sf['LATEXCMD']           = TextLine    (self, grplay5, self.postProLoop.pars['LATEXCMD'], 1, 0, 4)
        self.sf['LATEXREQUEST']       = TextLine    (self, grplay5, self.postProLoop.pars['LATEXREQUEST'], 2, 0, 4)
        '''        
        
    def buildButtonFrame(self, box):      
        # == Buttons Frame ==
        butframe = QFrame()
        box.addWidget(butframe)
        butlayout = QHBoxLayout(); 
        butlayout.setContentsMargins(0,0,0,0)
        butframe.setLayout(butlayout)
        
        # buttons        
        self.goButton = QPushButton(self.tr("Go")) 
        butlayout.addWidget(self.goButton)
        self.goButton.pressed.connect(self.go)

        self.saveButton = QPushButton(self.tr("Save")) 
        butlayout.addWidget(self.saveButton)
        self.saveButton.pressed.connect(self.save)
        
        self.quitButton = QPushButton(self.tr("Quit")) 
        butlayout.addWidget(self.quitButton)
        self.quitButton.pressed.connect(self.quit)         
               
    def updateWidgetsValues(self):
        self.postProLoop.applyDependencies()
        if self.postProLoop.debug:
            print("updateWidgetsValues")
        for var in self.sf:
            self.sf[var].setParamValue() 
                        
    def updateWidgetsVisibility(self):
        if self.postProLoop.debug:
            print("updateWidgetsVisibility")
        # update enabled/disabled of options  
        self.postProLoop.configActions()
        for var in self.sf:
            self.sf[var].setEnabled(self.postProLoop.pars[var].enabled)    
                   
    def updateWidgetsValues(self):
        if self.postProLoop.debug:
            print("updateWidgetsVisibility")
        # update enabled/disabled of options  
        self.postProLoop.configActions()
        for var in self.sf:
            self.sf[var].setEnabled(self.postProLoop.pars[var].enabled)       
            
    def go(self):     
        if self.postProLoop.debug:
            print("Go pressed")
        self.postProLoop.go()
        
    def save(self):     
        if self.postProLoop.debug:
            print("Save pressed")
        self.postProLoop.savePars('.')   

    def quit(self):
        if self.postProLoop.debug:
            print("Quit pressed")   
        sys.exit()     
        
# ============== Main ========================        
def main():    
    # create gui    
    confGui = PostProLoopGui()    
    # opening Gui 
    confGui.show()    
    # signal pour cloturer proprement l'application PyQt quand on ferme la fenetre
    confGui.app.lastWindowClosed.connect(confGui.app.quit)
    #print "ready."
    sys.exit(confGui.app.exec_())
    
if __name__ == "__main__":
    try:
        import signal  
        signal.signal(signal.SIGBREAK, sigbreak);
    except:
        pass
    main()