# -*- coding: utf-8 -*-
"""
Created on Thu May 31 14:22:48 2018

@author: Usuario
"""

import sys


from pyqtgraph.Qt import QtGui

from myWidgets import anal_control_signal, digital_control_signal, activation_button, burleighWM, coherentWM, kick_ions_hard, kick_ions_soft
from PyQt5.QtWidgets import QMainWindow, QPushButton
from PyQt5.QtCore import QTimer
from pyqtgraph import dockarea
import pyqtgraph as pg


from myToolbar import myToolbarMenu

import qdarkstyle
import os
os.environ['PYQTGRAPH_QT_LIB'] = 'PyQt5'
###############################################################################
class GuiMainWindow(QMainWindow):
     def __init__(self):
        super().__init__()
        
        self.initUI()
        
     def initUI(self):  
        
        self.win = QtGui.QMainWindow()
        self.win.setWindowTitle('My GUI')
        self.win.setWindowIcon(QtGui.QIcon('snuffles.png'))

    
        self.area = dockarea.DockArea()
        self.win.setCentralWidget(self.area)
        self.cw = QtGui.QWidget()
        self.win.show()
###############################################################################



        # Here I create the layouts
        self.layout397 = pg.LayoutWidget()
        self.layout866 =  pg.LayoutWidget()
        self.layoutPI =  pg.LayoutWidget()
        self.layoutIMG =  pg.LayoutWidget()
        self.layoutWM = pg.LayoutWidget()
        self.layoutWM_coherent = pg.LayoutWidget()
        
        self.layout397_scan = pg.LayoutWidget()
        self.layout866_scan = pg.LayoutWidget()
        self.layout423_scan = pg.LayoutWidget()
        self.layout_trap_electrodes = pg.LayoutWidget()
        self.layout_activate = pg.LayoutWidget()

        # Here I create the docks
        self.s1 = 100
        self.s2 = 100
        self.d397 = dockarea.Dock("Dock397", size=(self.s1, self.s2))  
        self.d866 = dockarea.Dock("Dock866", size=(self.s1, self.s2))  
        self.dPI = dockarea.Dock("DockPI", size=(self.s1, self.s2))   
        self.dWM = dockarea.Dock("DockWM", size=(self.s1, self.s2))
        self.dWM_coherent = dockarea.Dock("DockWM_coherent", size=(self.s1, self.s2))
        
        self.d397_scan = dockarea.Dock("Dock 397 scan", size=(self.s1, self.s2))
        self.d866_scan = dockarea.Dock("Dock 866 scan", size=(self.s1, self.s2))
        self.d423_scan = dockarea.Dock("Dock 423 scan", size=(self.s1, self.s2))
        self.dtrap_electrodes = dockarea.Dock("Dock Trap Electrodes", size=(self.s1, self.s2))
        self.dactivate = dockarea.Dock(" ",  hideTitle=False, size = (self.s1/4, self.s2))
        self.dactivate.hideTitleBar()

        # Here I add the docks
        self.area.addDock( self.dtrap_electrodes)
        self.area.addDock(self.d397, 'bottom', self.dtrap_electrodes)
        self.area.addDock(self.d866, 'bottom', self.d397)
        self.area.addDock(self.dWM)
        self.area.addDock(self.dWM_coherent)
        self.area.addDock(self.dPI, 'bottom', self.dWM)
        
        self.area.addDock(self.d397_scan, 'right', self.d397)
        self.area.addDock(self.d423_scan, 'right', self.dPI)
        self.area.addDock(self.d866_scan, 'right', self.d866)
        #self.area.addDock(self.dactivate, 'right', self.dtrap_electrodes)
        
        self.area.moveDock(self.dWM, 'above', self.dtrap_electrodes)
        self.area.moveDock(self.dWM_coherent, 'above', self.dWM)
        
        self.area.moveDock(self.dPI, 'above', self.d423_scan)


        # Here I add the layouts to the corresponding dock
        self.d397.addWidget(self.layout397)
        self.d866.addWidget(self.layout866)
        self.dPI.addWidget(self.layoutPI)
        self.dWM.addWidget(self.layoutWM)
        self.dWM_coherent.addWidget(self.layoutWM_coherent)
        self.d397_scan.addWidget(self.layout397_scan)
        self.d866_scan.addWidget(self.layout866_scan)
        self.d423_scan.addWidget(self.layout423_scan)
        self.dtrap_electrodes.addWidget(self.layout_trap_electrodes)
        #self.dactivate.addWidget(self.layout_activate)


############ creating the controls ########################
        
        self.piezoA397 = anal_control_signal('piezoA397', 13, ao_type ='cavity_piezo' , out_minimum=0, out_maximum=4, out_step=0.01) 
        self.piezoB397 = anal_control_signal('piezoB397', 7, ao_type ='cavity_piezo', out_step = 0.01)
        self.piezoA866 = anal_control_signal('piezoA866', 14, ao_type ='cavity_piezo', out_minimum=0, out_maximum=4, out_step=0.01)
        self.piezoB866 = anal_control_signal('piezoB866', 9, ao_type ='cavity_piezo', out_step = 0.01, out_minimum= -2, out_maximum= 10)
        self.piezoA423 = anal_control_signal('piezoA423', 8, ao_type ='laser_piezo', out_step = 0.01)
        
        
        self.trapDCA = anal_control_signal('DC A', 2, ao_type ='electrode')
        self.trapDCB = anal_control_signal('DC B', 1, ao_type ='electrode')
        self.trapCompC = anal_control_signal('Comp C', 4, ao_type ='electrode')
        self.trapCompC.sb.setEnabled(False)
        self.trapCompD = anal_control_signal('Comp D', 5, ao_type ='electrode')
        self.trapCompOven = anal_control_signal('Comp Oven', 0, ao_type ='electrode')
        self.trapCompExYb = anal_control_signal('Comp Ex Yb', 6, ao_type ='electrode')
        
        
        
        self.shutter397 = digital_control_signal('shutter397', 0)
        self.shutter866 = digital_control_signal('shutter866', 2)
        self.shutter423 = digital_control_signal('shutter423', 1)
        self.shutterLED = digital_control_signal('shutterLED', 3)


        self.soft_kick_button = QPushButton('kick!')
        self.soft_kick_button.clicked.connect(lambda: kick_ions_soft(self.shutter866, self.trapDCA, self.trapDCB))
        self.hard_kick_button = QPushButton('kick!!')
        self.hard_kick_button.clicked.connect(lambda: kick_ions_hard(self.shutter866, self.trapDCA, self.trapDCB))        
#############Toolbar and initial loading of config ############################
        
        self.toolbar = myToolbarMenu(self.win, anal_control_signal._registry )
        self.toolbar.load(anal_control_signal._registry)
        #print('Defined analog outputs: \n', self.toolbar.aosDicc.keys())
        
        self.autosave_timer = QTimer()
        self.autosave_timer.timeout.connect(lambda: self.toolbar.save(anal_control_signal._registry))
        self.autosave_timer.start(10000)
        
###############################################################################
        #here I connect the spinboxes to the daq analog outputs: 
        for ao in anal_control_signal._registry:
            ao.connectSpinBoxesToDaq()
   
        
        print('Analog control pinout:')
        for ao in anal_control_signal._registry:
            print(ao.name + ' -> ' + 'ao' + str(ao.ch))         


###############################################################################

        #activate button
        self.actB = activation_button()
        self.layout_activate.addWidget(self.actB.button)
###############################################################################

        #Adding the controls:
        
        ######### 397 ###########
        self.layout397.addWidget(QtGui.QLabel('397'), 0, 0)
        self.layout397.addWidget(QtGui.QLabel(self.piezoA397.name), 1, 0), self.layout397.addWidget(self.piezoA397.sb, 1, 1)
        self.layout397.addWidget(QtGui.QLabel(self.piezoB397.name), 2, 0), self.layout397.addWidget(self.piezoB397.sb, 2, 1)
        self.layout397.addWidget(QtGui.QLabel(self.shutter397.name), 3, 0), self.layout397.addWidget(self.shutter397.cb, 3, 1)
        
        self.layout397_scan.addWidget(QtGui.QLabel('397 Scan piezo B'), 0, 0)
        self.layout397_scan.addWidget(QtGui.QLabel('start'), 1, 0), self.layout397_scan.addWidget(self.piezoB397.scan_sb_start, 1, 1)
        self.layout397_scan.addWidget(QtGui.QLabel('stop'), 2, 0), self.layout397_scan.addWidget(self.piezoB397.scan_sb_stop, 2, 1)
        self.layout397_scan.addWidget(QtGui.QLabel('period'), 3, 0), self.layout397_scan.addWidget(self.piezoB397.scan_sb_period, 3, 1)
        self.layout397_scan.addWidget(QtGui.QLabel('Scanning'), 4, 0), self.layout397_scan.addWidget(self.piezoB397.scan_button, 4, 1)
        self.layout397_scan.addWidget(self.piezoB397.scanLabelValue, 5, 0)
        self.layout397_scan.addWidget(self.piezoB397.scanpBar, 5, 1)
        
        #########################
        
        ######### 866 ###########
        self.layout866.addWidget(QtGui.QLabel('866'), 0, 0)
        self.layout866.addWidget(QtGui.QLabel(self.piezoA866.name), 1, 0), self.layout866.addWidget(self.piezoA866.sb, 1, 1)
        self.layout866.addWidget(QtGui.QLabel(self.piezoB866.name), 2, 0), self.layout866.addWidget(self.piezoB866.sb, 2, 1)
        self.layout866.addWidget(QtGui.QLabel(self.shutter866.name), 3, 0), self.layout866.addWidget(self.shutter866.cb, 3, 1)
        self.layout866.addWidget(QtGui.QLabel("866 WM"), 3, 2), self.layout866.addWidget(self.shutterLED.cb, 3, 3)
        self.layout866.addWidget(QtGui.QLabel("Blink"), 4, 0), self.layout866.addWidget(self.shutter866.blink_cb, 4, 1)        
        self.layout866.addWidget(self.layout866.addWidget(self.shutter866.blink_time_sb, 4, 2))   
        
        self.layout866_scan.addWidget(QtGui.QLabel('866 Scan piezo B'), 0, 0)
        self.layout866_scan.addWidget(QtGui.QLabel('start'), 1, 0), self.layout866_scan.addWidget(self.piezoB866.scan_sb_start, 1, 1)
        self.layout866_scan.addWidget(QtGui.QLabel('stop'), 2, 0), self.layout866_scan.addWidget(self.piezoB866.scan_sb_stop, 2, 1)
        self.layout866_scan.addWidget(QtGui.QLabel('period'), 3, 0), self.layout866_scan.addWidget(self.piezoB866.scan_sb_period, 3, 1)
        self.layout866_scan.addWidget(QtGui.QLabel('Scanning'), 4, 0), self.layout866_scan.addWidget(self.piezoB866.scan_button, 4, 1)
        self.layout866_scan.addWidget(self.piezoB866.scanLabelValue, 5, 0)
        self.layout866_scan.addWidget(self.piezoB866.scanpBar, 5, 1)
        #########################
        
        ######### PI ###########
        self.layoutPI.addWidget(QtGui.QLabel('Photoion'), 0, 0)
        self.layoutPI.addWidget(QtGui.QLabel(self.piezoA423.name), 1, 0), self.layoutPI.addWidget(self.piezoA423.sb, 1, 1)
        self.layoutPI.addWidget(QtGui.QLabel(self.shutter423.name), 2, 0), self.layoutPI.addWidget(self.shutter423.cb, 2, 1)
        #self.layoutPI.addWidget(QtGui.QLabel(self.shutterLED.name), 3, 0), self.layoutPI.addWidget(self.shutterLED.cb, 3, 1)
        
        self.layout423_scan.addWidget(QtGui.QLabel('423 Scan piezo A'), 0, 0)
        self.layout423_scan.addWidget(QtGui.QLabel('start'), 1, 0), self.layout423_scan.addWidget(self.piezoA423.scan_sb_start, 1, 1)
        self.layout423_scan.addWidget(QtGui.QLabel('stop'), 2, 0), self.layout423_scan.addWidget(self.piezoA423.scan_sb_stop, 2, 1)
        self.layout423_scan.addWidget(QtGui.QLabel('period'), 3, 0), self.layout423_scan.addWidget(self.piezoA423.scan_sb_period, 3, 1)
        self.layout423_scan.addWidget(QtGui.QLabel('Scanning'), 4, 0), self.layout423_scan.addWidget(self.piezoA423.scan_button, 4, 1)
        self.layout423_scan.addWidget(self.piezoA423.scanLabelValue, 5, 0)
        self.layout423_scan.addWidget(self.piezoA423.scanpBar, 5, 1)
        
        
        #########################
        
        ######### trap electrodes ###########
        self.layout_trap_electrodes.addWidget(QtGui.QLabel('Trap electrodes'), 0, 0)
        self.layout_trap_electrodes.addWidget(QtGui.QLabel(self.trapDCA.name), 1, 1), self.layout_trap_electrodes.addWidget(self.trapDCA.sb, 1, 2)
        self.layout_trap_electrodes.addWidget(QtGui.QLabel(self.trapDCB.name), 2, 1), self.layout_trap_electrodes.addWidget(self.trapDCB.sb, 2, 2)
        self.layout_trap_electrodes.addWidget(self.soft_kick_button, 1, 0)
        self.layout_trap_electrodes.addWidget(self.hard_kick_button, 2, 0)
        
        self.layout_trap_electrodes.addWidget(QtGui.QLabel(self.trapCompC.name), 1, 3), self.layout_trap_electrodes.addWidget(self.trapCompC.sb, 1, 4)
        self.layout_trap_electrodes.addWidget(QtGui.QLabel(self.trapCompD.name), 2, 3), self.layout_trap_electrodes.addWidget(self.trapCompD.sb, 2, 4)
        self.layout_trap_electrodes.addWidget(QtGui.QLabel(self.trapCompOven.name), 1, 5), self.layout_trap_electrodes.addWidget(self.trapCompOven.sb, 1, 6)
        self.layout_trap_electrodes.addWidget(QtGui.QLabel(self.trapCompExYb.name), 2, 5), self.layout_trap_electrodes.addWidget(self.trapCompExYb.sb, 2, 6)
        

###########################################################

        #all shutter start in False: 
        self.shutters = [self.shutter397, self.shutter866, self.shutter423, self.shutterLED]
        try:
            for sh in self.shutters:
                sh.DO.set_out(True)
        except:
            pass    

###############################################################################
        #   read wavemeter

        self.wavemeter = burleighWM(self.layoutWM, self.dWM)
        self.wm_coherent = coherentWM(self.layoutWM_coherent, self.dWM_coherent)

###############################################################################

if __name__ == '__main__':
    app = QtGui.QApplication([])
    myGuiMainWIndow = GuiMainWindow()
    app.setStyleSheet(qdarkstyle.load_stylesheet_from_environment(is_pyqtgraph=True)) # set dark style
    app_icon = QtGui.QIcon()
    app_icon.addFile('snuffles.png')
    app.setWindowIcon(app_icon)
    sys.exit(app.exec_())
    
#if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
#    QtGui.QApplication.instance().exec_()