Beispiel #1
0
 def addROI(self,roi = None):
     if self.roiwidget is None:
         self.roiwidget = ROIPlotWidget(roi_target = self.p1,
                                        view = self.view,
                                        parent = self)
         roiTab = QDockWidget("roi cam {0}".format(self.iCam), self)
         roiTab.setWidget(self.roiwidget)
         roiTab.setAllowedAreas(Qt.LeftDockWidgetArea |
                                Qt.RightDockWidgetArea |
                                Qt.BottomDockWidgetArea |
                                Qt.TopDockWidgetArea)
         roiTab.setFeatures(QDockWidget.DockWidgetMovable |
                            QDockWidget.DockWidgetFloatable |
                            QDockWidget.DockWidgetClosable)
         self.parent.addDockWidget(Qt.BottomDockWidgetArea
                                   ,roiTab)
         roiTab.setFloating(True)
         roiTab.resize(600,150)
         
         def closetab(ev):
             # This probably does not clean up memory...
             if not self.roiwidget is None:
                 [self.p1.removeItem(r)
                  for r in self.roiwidget.items()]
                 del self.roiwidget
                 self.roiwidget = None
             ev.accept()
         roiTab.closeEvent = closetab
     self.roiwidget.add_roi(roi)
Beispiel #2
0
    def create_dockTabAcciones(self):
        dock = QDockWidget('Tabla de Acciones')

        self.tab_acc = QTableWidget(dock)
        dock.setWidget(self.tab_acc)
        dock.resize(QSize(800, 400))

        self.addDockWidget(Qt.NoDockWidgetArea, dock)
        self.view_menu.addAction(dock.toggleViewAction())

        table = ActionTable()
        table.load('./core/Utils/tbAs.csv')

        ##Inicializa tabla
        self.tab_acc.setColumnCount(table.length)
        self.tab_acc.setHorizontalHeaderLabels(table.column_names)

        ##Inserta datos
        self.tab_acc.setRowCount(len(table.elements))
        c = 0
        for n in table.elements:
            a = 0
            for p in table.column_names:
                self.tab_acc.setItem(c, a, QTableWidgetItem(n[p]))
                a = a + 1
            c = c + 1

        self.tab_acc.resizeColumnsToContents()
Beispiel #3
0
    def create_dockAnalisis(self):
        dock = QDockWidget('Tabla Analisis Sintactico')

        self.tab_ans = QTableWidget(dock)
        dock.setWidget(self.tab_ans)
        dock.resize(QSize(800, 400))

        self.addDockWidget(Qt.NoDockWidgetArea, dock)
        self.view_menu.addAction(dock.toggleViewAction())

        ##Inicializa la tabla.
        headerLabels = ('Pila Acciones', 'Cadena Entrada',
                        'Analisis Sintactico', 'Analisis Semantico')
        self.tab_ans.setColumnCount(4)
        self.tab_ans.setHorizontalHeaderLabels(headerLabels)

        self.tab_ans.resizeColumnsToContents()
Beispiel #4
0
 def histogramWin(self):
     if self.hist is None:
         histTab = QDockWidget("histogram cam {0}".format(self.iCam), self)
         widget = QWidget()
         layout = QGridLayout()
         widget.setLayout(layout)
         win = pg.GraphicsLayoutWidget()
         p1 = win.addPlot()
         p1.getViewBox().invertY(True)
         p1.hideAxis('left')
         p1.hideAxis('bottom')
         
         self.hist = pg.HistogramLUTItem()
         self.hist.axis.setPen('k')
         p1.addItem(self.hist)
         self.hist.setImageItem(self.view)
         layout.addWidget(win,0,0)
         histTab.setWidget(widget)
         histTab.setAllowedAreas(Qt.LeftDockWidgetArea |
                                 Qt.RightDockWidgetArea |
                                 Qt.BottomDockWidgetArea |
                                 Qt.TopDockWidgetArea)
         histTab.setFeatures(QDockWidget.DockWidgetMovable |
                             QDockWidget.DockWidgetFloatable |
                             QDockWidget.DockWidgetClosable)
         self.parent.addDockWidget(Qt.BottomDockWidgetArea
                                   ,histTab)
         histTab.setFloating(True)
     
         histTab.resize(200,200)
     try:
         histstate = self.hist.saveState()
     except Exception as err:
         display('[ERROR] - could not save histogram state. "pip install pyqtgraph --upgrade" might solve it.')
         print(err)
     def closefun(ev):
         try:
             self.hist.restoreState(histstate)
         except Exception as err:
             print(err)
             pass
         self.hist = None
         ev.accept()
     histTab.closeEvent = closefun
Beispiel #5
0
def add_menulist(window, menu_name, button_name, categories, onlaunch,
                 dockarea):
    """
    Add a menu list with action button

    :param menu_name:   displayed name of the list (displayed)
    :param button_name: the name of the button
    :param categories:  categories available for selection
    :param onlaunch:    action to trigger on click to button
    """

    root = window
    panel = QWidget()
    hbox = QHBoxLayout(panel)

    class MenuList(QtWidgets.QListWidget):
        def __init__(self, categories):
            QtWidgets.QListWidget.__init__(self)
            self.add_items(categories)
            self.itemClicked.connect(self.item_click)
            self.selected = categories

        def add_items(self, categories):
            for category in categories:
                item = QtWidgets.QListWidgetItem(category)
                self.addItem(item)

        def item_click(self, item):
            self.selected = str(item.text())

    menulist = MenuList(categories)

    hbox.addWidget(menulist)
    launchButton = QtWidgets.QPushButton(button_name)
    launchButton.clicked.connect(lambda: onlaunch(menulist.selected))
    hbox.addWidget(launchButton)
    panel.setLayout(hbox)

    dock = QDockWidget(menu_name, root)
    root.addDockWidget(dockarea, dock)
    dock.setWidget(panel)
    dock.resize(QtCore.QSize(dock.width(), dock.minimumHeight()))

    return menulist
Beispiel #6
0
class DockDemo(QWidget):
    def __init__(self):
        QWidget.__init__(self)

    def init(self):
        self.setGeometry(300, 300, 300, 250)
        self.setStyleSheet('background-color:white;')

        self.btn1 = QPushButton('Button', self)

        self.dock1 = QDockWidget('My First Dock', self)
        self.dock1.move(20, 20)
        self.dock1.resize(200, 100)
        self.dock1.setWidget(self.btn1)

        self.dock1.setFloating(False)
        self.dock1.setFeatures(self.dock1.DockWidgetClosable
                               | self.dock1.DockWidgetMovable)
        self.dock1.setFeatures(self.dock1.NoDockWidgetFeatures)

        self.show()
Beispiel #7
0
class App(QMainWindow):

    def __init__(self):
        super().__init__()
        self.title = 'QTMatPlot - [email protected]'
        self.left = 10
        self.top = 10
        self.width = 1280
        self.height = 800
        self.mpl_dict = {}
        self.load_yaml()
        self.mpl_dict['FigDefaults']['data'] = {}
        self.mpl_dict['Active'] = str((0,0))
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        # Widgets are movable.
        self.main_widget = QWidget(self)
        self.layout = QVBoxLayout(self.main_widget)
        #kinetics = h5py.File('direct.h5', 'r')
        self.updateFromDict(True, firstrun=True)
        self.dataLoader = dataLoader(self, [])
        self.dc = mplCanvas(self.main_widget, data_parent=self, width=10, height=8, dpi=100, data=self.dataLoader.dataStructure, notify_func=self.notify)
        self.save_button = newButton(self, "Save", "Saves the YAML", (250,self.height-30), self.save_yaml, click_args=None)
        self.render_button = newButton(self, "Render!", "Renders the PDF", (250,self.height-30), self.save_figure, click_args=None)
        self.load_button = newButton(self, "Load Yaml", "Loads the Config", (250,self.height-30), self.dataLoader.loadNewYaml, click_args=None)
        self.text = newTextBox(self, size=(0,30), pos=(self.save_button.button.width()+250, self.height-30), init_text="Welcome!")
        self.text.textBox.setGeometry(self.save_button.button.width()+self.load_button.button.width(), self.height-30, self.width-self.save_button.button.width(), 15)
        self.mplTree = newTree(self, self.mpl_dict, pos=(self.width-250,0), size=(250,self.height-30-100), col=1, function=self.updateFromDict, rows=True, notify_func=self.notify)
        self.dsetTree = newTree(self, self.mpl_dict['Figures'].get(str(self.dc.activeAxes)), pos=(self.width-250,0), size=(250,50), col=1, function=self.updateFromDict, rows=True, dset=str(self.dc.activeAxes))
        self.dataTree = newTree(self, self.dataLoader.dataStructure, pos=(0, 0), size=(250,self.height-30), col=3, clickable=True, editable=False, function=self.text.showText, function2=self.updateFromDict, get_figures=self.mplTree.getFigures, mpl=self.mpl_dict, notify_func=self.notify)
        self.dataTree.tree.setDragEnabled(True)
        self.dataTree.tree.expandToDepth(0)
        self.mplTree.tree.header().resizeSection(0, 175)
        self.dataTree.tree.header().resizeSection(0, 200)
        # Do up some docks for everything!
        self.setCentralWidget(self.main_widget)

        self.mpldock = QDockWidget("Plotting Dictionary", self)
        self.mpllayout = QVBoxLayout(self.mpldock)
        self.mplwidget = QWidget(self)
        # Create buttons...
        self.addValue = newButton(self, "+", "Adds a new key: value", (0,0), self.addToDict, click_args=None)
        self.delValue = newButton(self, "-", "Deletes key: value pair", (0,0), self.delFromDict, click_args=None)
        # Add a new layout for them.
        self.mplButtonlayout = QHBoxLayout(self.mplwidget)
        self.mplButtonwidget = QWidget(self)
        self.mplButtonwidget.setLayout(self.mplButtonlayout)
        self.mplButtonlayout.addWidget(self.addValue.button)
        self.mplButtonlayout.addWidget(self.delValue.button)

        self.mpllayout.addWidget(self.mplTree.tree)
        self.mpllayout.addWidget(self.dsetTree.tree)
        self.mpllayout.addWidget(self.mplButtonwidget)
        self.mplwidget.setLayout(self.mpllayout)
        self.mpldock.setWidget(self.mplwidget)

        # Now the data dock...
        self.datadock = QDockWidget("Dataset", self)
        self.datalayout = QVBoxLayout(self.datadock)
        self.datawidget = QWidget(self)
        # Create buttons
        self.loadData = newButton(self, "Load Data", "Adds a new key: value", (640,0), self.loadNewFile, click_args=None)
        self.sendData = newButton(self, "Plot", "Plot Active Dataset", (640,0), self.dataTree.reassignMplFromHighlightedData, click_args=None)

        # Label and Combobox
        self.dsetBox = newComboBox(self, items=range(0, self.mpl_dict['Datasets']), function=None)
        self.dsetLabel = QLabel()
        self.dsetLabel.setText("DSet: ")
        cboxLayout = QHBoxLayout(self.datadock)
        cboxWidget = QWidget(self)
        cboxLayout.addWidget(self.dsetLabel)
        cboxLayout.addWidget(self.dsetBox.comboBox)
        cboxLayout.addWidget(self.sendData.button)
        cboxWidget.setLayout(cboxLayout)
        #self.dataButtonlayout = QHBoxLayout(self.datawidget)
        #self.dataButtonwidget = QWidget(self)
        #self.dataButtonwidget.setLayout(self.dataButtonlayout)
        #self.dataButtonlayout.addWidget(self.loadData.button)
        #self.dataButtonlayout.addWidget(self.delValue.button)
        self.datalayout.addWidget(self.dataTree.tree)
        #self.datalayout.addWidget(self.dataButtonwidget)
        #self.datalayout.addWidget(self.sendData.button)
        self.datalayout.addWidget(cboxWidget)
        self.datalayout.addWidget(self.loadData.button)
        self.datawidget.setLayout(self.datalayout)
        self.datadock.setWidget(self.datawidget)

        # Create the dock, create a new widget, create a layout for that widget, then add all the widgets into that widget, then add that widget to th dock.  Ha
        self.textdock = QDockWidget("", self)
        self.bwidget = QWidget(self)
        #self.toolbar = NavigationToolbar(self.dc, self.bwidget)
        #self.dc.mpl_connect('key_press_event', self.on_key_press)
        self.blayout = QHBoxLayout(self.textdock)
        self.blayout.addWidget(self.text.textBox)
        self.blayout.addWidget(self.save_button.button)
        self.blayout.addWidget(self.render_button.button)
        self.blayout.addWidget(self.load_button.button)
        #self.blayout.addWidget(self.toolbar)
        #self.bwidget.setMinimumHeight((self.width-self.save_button.button.width(), 30))
        #self.text.textBox.setMinimumHeight((10))
        self.text.textBox.setMaximumHeight((100))
        self.bwidget.resize(400, 30)
        self.bwidget.setLayout(self.blayout)
        # Remove title bar.
        self.textdock.setTitleBarWidget(QWidget())
        self.textdock.setWidget(self.bwidget)
        self.textdock.resize(self.width-self.save_button.button.width(), 30)

        self.addDockWidget(Qt.LeftDockWidgetArea, self.mpldock)
        self.addDockWidget(Qt.RightDockWidgetArea, self.datadock)
        self.addDockWidget(Qt.BottomDockWidgetArea, self.textdock)
        # Try the scroll!
        self.scroll = QScrollArea(self.main_widget)
        #self.scroll.setWidgetResizable(False)
        self.scroll.setWidgetResizable(True)
        scrollContent = QWidget(self.scroll)

        scrollLayout = QVBoxLayout(scrollContent)
        scrollContent.setLayout(scrollLayout)
        scrollLayout.addWidget(self.dc)
        self.scroll.setWidget(scrollContent)
        self.layout.addWidget(self.scroll)

        '''self.main_widget.move(250,0)
        self.main_widget.setGeometry(250, 0, self.width-500, (self.height-25))'''
        self.main_widget.setLayout(self.layout)
        #button = self.newButton(self, "Button!", "Nothing", (100,70), self.button_test, click_args=None)
        testDict = {'0': ['0', '1'], '1': {'A': ['2'], 'B': ['3', '4']}}
        #def __init__(self, parent, size, pos, init_text=""):
        #layout.addChildWidget(self.dataTree)
        self.show()
        self.dc.update_figure()
        self.updateFromDict(True)

    def loadNewFile(self, filename=None):
        # First, load in the new file.
        # Then, refresh the widget.
        self.dataLoader.loadNewFile(filename)
        self.mpl_dict['FilesToLoad'] = str(self.dataLoader.fileList)
        self.dataTree.updateTree()
        self.dataTree.tree.expandToDepth(0)
        self.mplTree.updateTree()

    def addToDict(self):
        try:
            for i in range(0,99):
                if 'New: {}'.format(i) not in self.mpl_dict:
                    self.mplTree.addItem(self.mplTree.tree.selectedItems()[0].parent(), ddict=['New: {}'.format(i), None])
                    break
        except:
            for i in range(0,99):
                if 'New: {}'.format(i) not in self.mpl_dict:
                    self.mplTree.addItem(self.mplTree.tree.topLevelItem(0), ddict=['New: {}'.format(i), None])
                    break
        self.mplTree.updateTree()

    def delFromDict(self):
        self.mplTree.removeItem(self.mplTree.tree.selectedItems()[0])

    def save_figure(self):
        filename, _ = QFileDialog.getSaveFileName(self, 'Save PDF', os.getcwd())
        if filename != '':
            self.mpl_dict['Active'] = None
            self.dc.update_figure()
            self.dc.update_figure()
            self.dc.fig.savefig(filename)

    def save_yaml(self):
        filename, _ = QFileDialog.getSaveFileName(self, 'Save YAML', os.getcwd())
        if filename != '':
            save_dict = remove_trees(self.mpl_dict)
            save_dict['FilesToLoad'] = ast.literal_eval(save_dict['FilesToLoad'])
            with open(filename, 'w') as outfile:
                yaml.dump(save_dict, outfile, default_flow_style=False)


    def load_yaml(self, default='src/default.yaml'):
        test = yaml.load(open(default, 'r'))
        #if test != None:
        # We want to push a lot of this to later.
        self.mpl_dict.update(copy.deepcopy(test))
        self.mpl_dict['Update'] = True
        self.mpl_dict['Active'] = (0,0)
        #print(ast.literal_eval(self.mpl_dict['FilesToLoad']))
        for f in self.mpl_dict['FilesToLoad']:
            print(f)
            try:
                # Does seem to work.
                self.loadNewFile(f)
                # Remove the item, as it automatically loads it right now.
                self.mpl_dict['FilesToLoad'] = self.mpl_dict['FilesToLoad']
            except:
                # We failed.
                pass
        #self.mplTree.tree.clear()
        #self.dataTree.tree.clear()
        #self.mplTree.data = self.mpl_dict
        #self.dataTree.parent.mpl_dict = self.mpl_dict
        #self.dc.parent.mpl_dict = self.mpl_dict
        #self.refreshWidgets(new=True)

    def notify(self, text):
        self.text.showText(str(text))

    def refreshWidgets(self, new=False):
        self.mplTree.parent.mpl_dict = self.mpl_dict
        self.dataTree.parent.mpl_dict = self.mpl_dict
        self.dc.parent.mpl_dict = self.mpl_dict
        self.dsetTree.tree.clear()
        #if 'keyTree' not in self.mpl_dict['Figures'][str(self.mpl_dict['Active'])]:
        # Actually, we basically always need to blow this away.
        self.mpl_dict['Figures'][str(self.mpl_dict['Active'])]['keyTree'] = {}
        self.dsetTree.data = self.mpl_dict['Figures'].get(str(self.mpl_dict['Active']))
        self.dsetTree.activeDset = str(self.mpl_dict['Active'])
        self.dsetBox.reInit(range(0, int(self.mpl_dict['Datasets'])))
        if self.mpl_dict['Active'] is not None:
            self.dc.setOpenDSet(self.mpl_dict['Active'])
        self.dsetBox.comboBox.setCurrentIndex(self.dsetBox.comboBox.findText(str(self.mpl_dict['ActiveDSet'])))
        self.mplTree.updateTree(new)
        #self.dataTree.updateTree(new)
        # It does need to be cleared, but we should try and open the parent item.
        self.dsetTree.updateTree(new)
        # Neat bit of kit that expands stuff out to the first level.
        # Useful for this tree.
        #self.dsetTree.tree.expandToDepth(0)
        # Well, it no longer seems to die, but.
        # If we want to update this, we're going to have to call a clear function.
        #self.dataTree.updateTree(new)
        self.dc.update_figure()
        #pass

    def updateFromDict(self, defaults=False, firstrun=False, updatedKeys=None):
        d = self.mpl_dict
        # Update the comboBox

        for rows in range(0, int(self.mpl_dict['Rows'])):
            for cols in range(0, int(self.mpl_dict['Columns'])):
                if not defaults:
                    # If we haven't changed the defaults, don't upstate the state.
                    if str((rows, cols)) not in self.mpl_dict['Figures']:
                        new_dict = {}
                        for key, val in self.mpl_dict['FigDefaults'].items():
                            new_dict[key] = val
                        self.mpl_dict['Figures'][str((rows,cols))] = copy.deepcopy(new_dict)
                    for dset in range(0, int(self.mpl_dict['Datasets'])):
                        if str(dset) not in self.mpl_dict['Figures'][str((rows,cols))]['data']:
                            new_dict = {}
                            for key, val in self.mpl_dict['DSetDefaults'].items():
                                new_dict[key] = val
                            self.mpl_dict['Figures'][str((rows,cols))]['data'][str(dset)] = copy.deepcopy(new_dict)
                # Here, we're updating the defaults.
                else:
                    # Here, we're updating from the defaults.  Necessary for the first time.
                    new_dict = {}
                    for key, val in self.mpl_dict['FigDefaults'].items():
                        if updatedKeys == None:
                            new_dict[key] = copy.deepcopy(val)
                        else:
                            for uKey in updatedKeys:
                                if key == uKey:
                                    new_dict[key] = copy.deepcopy(val)
                                else:
                                    new_dict[key] = copy.deepcopy(self.mpl_dict['Figures'][str((rows,cols))][key])
                    self.mpl_dict['Figures'][str((rows,cols))] = new_dict
                    self.mpl_dict['Figures'][str((rows,cols))]['Update'] = True
                    for dset in range(0, int(self.mpl_dict['Datasets'])):
                        new_dict = {}
                        for key, val in self.mpl_dict['DSetDefaults'].items():
                            if updatedKeys == None:
                                new_dict[key] = copy.deepcopy(val)
                            else:
                                for uKey in updatedKeys:
                                    if key == uKey:
                                        new_dict[key] = copy.deepcopy(val)
                                    else:
                                        new_dict[key] = copy.deepcopy(self.mpl_dict['Figures'][str((rows,cols))]['data'][str(dset)][key])
                        # We don't really want to create new keys, so.
                        tree_dict = {}
                        self.mpl_dict['Figures'][str((rows,cols))]['data'][str(dset)] = copy.deepcopy(new_dict)

                # Throw in the axes object.
        #self.dc.update_figure(defaults)
        if not firstrun:
            self.refreshWidgets(new=defaults)

    def keyPressEvent(self, e):
        # This is our key press handler.  It's mostly just a stub right now.
        if e.key() == QtCore.Qt.Key_Escape:
            self.close()
Beispiel #8
0
class FROG(QMainWindow) :
    
    isrunning=QtCore.pyqtSignal(bool)
    
    def __init__(self,parent=None):
        super().__init__(parent)
        
        self.confFrog=QtCore.QSettings('confFrog.ini', QtCore.QSettings.IniFormat)
        p = pathlib.Path(__file__)
        sepa=os.sep
        self.icon=str(p.parent) + sepa+'icons'+sepa
        self.setWindowIcon(QIcon(self.icon+'LOA.png'))
        self.left=30
        self.top=30
        self.width=1200
        self.height=750
        self.setGeometry(self.left,self.top,self.width,self.height)
        self.iconPlay=self.icon+'Play.png'
        self.iconSnap=self.icon+'Snap.png'
        self.iconStop=self.icon+'Stop.png'
        self.iconBg=self.icon+'coin.png'
        self.iconPlay=pathlib.Path(self.iconPlay)
        self.iconPlay=pathlib.PurePosixPath(self.iconPlay)
        self.iconStop=pathlib.Path(self.iconStop)
        self.iconStop=pathlib.PurePosixPath(self.iconStop)
        self.iconSnap=pathlib.Path(self.iconSnap)
        self.iconSnap=pathlib.PurePosixPath(self.iconSnap)
        
        self.iconBg=pathlib.Path(self.iconBg)
        self.iconBg=pathlib.PurePosixPath(self.iconBg)
        
        self.setWindowIcon(QIcon(self.icon+'LOA.png'))
        self.setWindowTitle('FROG ')
        
        self.motorName="moteurTest"#"Moteur0A"
        self.motorType='MotorTest'#"A2V"
        self.configPath="./fichiersConfig/"
        self.configMotName='configMoteurTest.ini'#'configMoteurA2V.ini'
        
        self.confpath=str(p.parent) + sepa
        # print('confpath',self.confpath)
        
        self.bg=0
        self.motor=ONEMOTOR(mot0=self.motorName,motorTypeName0=self.motorType,unit=3,jogValue=1)
        self.motor.startThread2()
        
        MOT=self.motor.MOT
        self.scanWidget=SCAN(MOT=MOT,motor=self.motorName,configMotName=self.configPath+self.configMotName) # for the scan)
        
        
        
        listdevice=list_devices() ## open device flame spectrometer 
        try : 
            self.spectrometer=Spectrometer(listdevice[0])
            sh=int(self.confFrog.value('VISU'+'/shutter'))
            try:
                self.spectrometer.integration_time_micros(sh*1000) # en micro
            except: 
                self.spectrometer.integration_time_micros(100*1000)
        except :
            self.spectrometer=[]
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Critical)
            msg.setText("Error connexion Spectrometer")
            msg.setInformativeText("Try to reconnect the USB or resart the program")
            msg.setWindowTitle("Spectrometer not connected...")
            msg.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
            msg.exec_()
            pass
        print('__________  F R O G  __________')
        print('')
        print('  Version  : ',version)
        print("  Spectrometer connected @ ",self.spectrometer)
        self.wavelengths=self.spectrometer.wavelengths() # array Wavelengths of the spectrometer 
        print("  Wavelength : " ,self.wavelengths.min(),self.wavelengths.max())
        print('  Motor name: ',self.motorName,'  Type: ',self.motorType)
        print('')
        self.MatData=[]
        self.MatFs=[]
        self.position=0
        self.moyenne=1
        self.nbShot=1
        self.row=0
        self.setup()
        self.actionButton()
        
    def setup(self):
        
        hbox1=QHBoxLayout() # horizontal layout pour run snap stop
        self.sizebuttonMax=30
        self.sizebuttonMin=30
        self.runButton=QToolButton(self)
        self.runButton.setMaximumWidth(self.sizebuttonMax)
        self.runButton.setMinimumWidth(self.sizebuttonMax)
        self.runButton.setMaximumHeight(self.sizebuttonMax)
        self.runButton.setMinimumHeight(self.sizebuttonMax)
        self.runButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: green;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"% (self.iconPlay,self.iconPlay) )
        self.runButton.setToolTip("Free Run")
        self.snapButton=QToolButton(self)
        self.snapButton.setPopupMode(0)
        menu=QMenu()
        # menu.addAction('acq',self.oneImage)
        menu.addAction('set nb of shot',self.nbShotAction)
        self.snapButton.setMenu(menu)
        self.snapButton.setMaximumWidth(self.sizebuttonMax)
        self.snapButton.setMinimumWidth(self.sizebuttonMax)
        self.snapButton.setMaximumHeight(self.sizebuttonMax)
        self.snapButton.setMinimumHeight(self.sizebuttonMax)
        self.snapButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: green;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"% (self.iconSnap,self.iconSnap) )
        self.snapButton.setToolTip("Snap")
        self.stopButton=QToolButton(self)
        
        self.stopButton.setMaximumWidth(self.sizebuttonMax)
        self.stopButton.setMinimumWidth(self.sizebuttonMax)
        self.stopButton.setMaximumHeight(self.sizebuttonMax)
        self.stopButton.setMinimumHeight(self.sizebuttonMax)
        self.stopButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"% (self.iconStop,self.iconStop) )
        self.stopButton.setEnabled(False)
        self.stopButton.setToolTip("Stop Acquisition")
        self.bgButton=QToolButton(self)
        self.bgButton.setMaximumWidth(self.sizebuttonMax)
        self.bgButton.setMinimumWidth(self.sizebuttonMax)
        self.bgButton.setMaximumHeight(self.sizebuttonMax)
        self.bgButton.setMinimumHeight(self.sizebuttonMax)
        self.bgButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"% (self.iconBg,self.iconBg) )
        self.bgButton.setToolTip("Take a Background")
        
        self.bgLayout=QHBoxLayout()
        self.bgLayout.setContentsMargins(0,0,0,0)
        self.bgLabel=QLabel('Background :')
        self.bgLabel.setStyleSheet('font :bold  8pt')
        self.bgSoustract=QCheckBox()
        self.bgSoustract.setToolTip("Background Soustraction (On/Off)")
        self.bgLayout.addWidget(self.bgLabel)
        self.bgLayout.addWidget(self.bgSoustract)
        
        hbox1.addWidget(self.runButton)
        hbox1.addWidget(self.snapButton)
        hbox1.addWidget(self.stopButton)
        hbox1.addWidget(self.bgButton)
        hbox1.addLayout(self.bgLayout)
        hbox1.setSizeConstraint(QtGui.QLayout.SetFixedSize)
        hbox1.setContentsMargins(5, 24, 0, 10)
        self.widgetControl=QWidget(self)
        
        self.widgetControl.setLayout(hbox1)
        self.dockControl=QDockWidget(self)
        self.dockControl.setWidget(self.widgetControl)
        self.dockControl.resize(80,80)
        
        self.trigg=QComboBox()
        self.trigg.setMaximumWidth(80)
        self.trigg.addItem('OFF')
        self.trigg.addItem('ON')
        self.trigg.setStyleSheet('font :bold  8pt;color: white')
        self.labelTrigger=QLabel('Trig')
        self.labelTrigger.setMaximumWidth(80)
        self.labelTrigger.setStyleSheet('font :bold  12pt')
        self.itrig=self.trigg.currentIndex()
        hbox2=QHBoxLayout()
        hbox2.setSizeConstraint(QtGui.QLayout.SetFixedSize)
        hbox2.setContentsMargins(5, 26, 0, 0)
        hbox2.addWidget(self.labelTrigger)
        hbox2.addWidget(self.trigg)
        self.widgetTrig=QWidget(self)
        
        self.widgetTrig.setLayout(hbox2)
        self.dockTrig=QDockWidget(self)
        self.dockTrig.setWidget(self.widgetTrig)
        
        self.labelExp=QLabel('Exposure (ms)')
        self.labelExp.setStyleSheet('font :bold  10pt')
        self.labelExp.setMaximumWidth(500)
        self.labelExp.setAlignment(Qt.AlignCenter)
        
        self.hSliderShutter=QSlider(Qt.Horizontal)
        self.hSliderShutter.setMaximumWidth(80)
        self.hSliderShutter.setValue(int(self.confFrog.value('VISU'+'/shutter')))
        self.shutterBox=QSpinBox()
        self.shutterBox.setStyleSheet('font :bold  8pt')
        self.shutterBox.setMaximumWidth(200)
        self.hSliderShutter.setMaximum(1100)
        self.shutterBox.setMaximum(1100)
        self.shutterBox.setValue(int(self.confFrog.value('VISU'+'/shutter')))
        hboxShutter=QHBoxLayout()
        hboxShutter.setContentsMargins(5, 0, 0, 0)
        hboxShutter.setSpacing(10)
        vboxShutter=QVBoxLayout()
        vboxShutter.setSpacing(0)
        vboxShutter.addWidget(self.labelExp)#,Qt.AlignLef)
        
        hboxShutter.addWidget(self.hSliderShutter)
        hboxShutter.addWidget(self.shutterBox)
        vboxShutter.addLayout(hboxShutter)
        vboxShutter.setSizeConstraint(QtGui.QLayout.SetFixedSize)
        vboxShutter.setContentsMargins(5, 5, 0, 0)
        
        self.widgetShutter=QWidget(self)
        
        self.widgetShutter.setLayout(vboxShutter)
        self.dockShutter=QDockWidget(self)
        self.dockShutter.setWidget(self.widgetShutter)
        
        
        
        self.labelMoy=QLabel('Average')
        self.labelMoy.setStyleSheet('font :bold  10pt')
        self.labelMoy.setMaximumWidth(120)
        self.labelMoy.setAlignment(Qt.AlignCenter)
        
       
        self.moyBox=QSpinBox()
        self.moyBox.setMaximumWidth(60)
        self.moyBox.setStyleSheet('font :bold  8pt')
        self.moyBox.setMaximum(100)
        self.moyBox.setValue(1)
        
        hboxMoy=QHBoxLayout()

        hboxMoy.addWidget(self.labelMoy)
        hboxMoy.addWidget(self.moyBox)
        
        hboxMoy.setSpacing(1)
        
        hboxMoy.setContentsMargins(5, 17, 200, 0)
        hbox2Moy=QHBoxLayout()
        hbox2Moy.addLayout(hboxMoy)
        hbox2Moy.setSizeConstraint(QtGui.QLayout.SetFixedSize)
        self.widgetMoy=QWidget(self)
        self.widgetMoy.setLayout(hbox2Moy)
        
        self.dockMoy=QDockWidget(self)
        self.dockMoy.setWidget(self.widgetMoy)
        
        
        
        
        
        self.graph=GRAPHCUT(symbol=None,title='Spectra',pen='w',label='Wavelenght (nm)',labelY='int')
        self.widgetRange=self.graph.widgetRange
        self.widgetRange.labelXmin.setText("Wavelenght(nm) Min ")
        self.widgetRange.labelXmax.setText("Wavelenght(nm) Max ")
        self.dockControl.setTitleBarWidget(QWidget()) # to ovoid title
        self.graph.addDockWidget(Qt.TopDockWidgetArea,self.dockControl)
        self.dockTrig.setTitleBarWidget(QWidget())
        self.graph.addDockWidget(Qt.TopDockWidgetArea,self.dockTrig)
        self.dockShutter.setTitleBarWidget(QWidget())
        self.graph.addDockWidget(Qt.TopDockWidgetArea,self.dockShutter)
        self.dockMoy.setTitleBarWidget(QWidget())
        self.graph.addDockWidget(Qt.TopDockWidgetArea,self.dockMoy)
        
        
        
        self.hbox=QHBoxLayout()
        
        
        self.hbox.addWidget(self.graph)
        
        self.vLatBox=QVBoxLayout()
        # hboxRange=QHBoxLayout()
        # hboxRange.setAlignment(Qt.AlignCenter)
        # labelRange=QLabel('Range')
        # labelRange.setStyleSheet("font: bold 20pt;color:white")
        # hboxRange.addWidget(labelRange)
        # self.vLatBox.addLayout(hboxRange)
        self.vLatBox.addWidget(self.widgetRange)
        
        
        self.vLatBox.addStretch(0)
        self.vLatBox.addWidget(self.motor)
        self.vLatBox.addStretch(0)
        
        self.vLatBox.addWidget(self.scanWidget)
        # self.vLatBox.setContentsMargins(0,0,0,0)
        # self.vLatBox.setStretch(5,0)
        self.hbox.addLayout(self.vLatBox)
        self.hbox.setStretch(0, 3)
        #self.scanWidget.setStyleSheet('border-color:w')
        
        WidgetSpectro=QWidget()
        WidgetSpectro.setLayout(self.hbox)
        
        
        self.tabs=QTabWidget()
        self.tab0=WidgetSpectro
        
        self.tabs.addTab(self.tab0,'   Spectro & Motors    ')
        
        
        self.WidgetResult=SEERESULT(confpath=self.confpath+'confFrog.ini') # graph 2D data vs motor position
        
        # self.hresultLayout=QHBoxLayout()
        # # self.hresultLayout.addWidget(self.visualisation)
        # WidgetResult.setLayout(self.hresultLayout)
        self.tab1=self.WidgetResult
        
        self.tabs.addTab(self.tab1,'    Results    ')
        
        
        self.setCentralWidget(self.tabs)
    
        self.threadOneAcq=ThreadOneAcq(self)
        self.threadOneAcq.newDataRun.connect(self.newImageReceived)#,QtCore.Qt.DirectConnection)
        self.threadOneAcq.newStateCam.connect(self.stateCam)
        self.threadRunAcq=ThreadRunAcq(self)
        self.threadRunAcq.newDataRun.connect(self.newImageReceived)
        
        self.threadBgAcq=THREADBGACQ(self)
        self.threadBgAcq.newDataRun.connect(self.newBgReceived)
        self.threadBgAcq.newStateCam.connect(self.stateCam)
        
    def actionButton(self): 
        '''action when button are pressed
        '''
        self.runButton.clicked.connect(self.acquireMultiImage)
        self.snapButton.clicked.connect(self.acquireOneImage)
        self.stopButton.clicked.connect(self.stopAcq)
        self.bgButton.clicked.connect(self.bgAcq)
        
        
        self.shutterBox.editingFinished.connect(self.shutter)    
        self.hSliderShutter.sliderReleased.connect(self.mSliderShutter)
        self.moyBox.editingFinished.connect(self.MoyenneAct)    
        self.scanWidget.acqMain.connect(self.acquireScan)
        
        self.scanWidget.scanStop.connect(self.endScan)
        
        self.scanWidget.startOn.connect(self.ResetData)
        
        # self.trigg.currentIndexChanged.connect(self.trigger)
    
    def MoyenneAct(self):
        self.moyenne=(self.moyBox.value())
        self.scanWidget.val_time.setValue(0.2+self.moyenne*self.shutterBox.value()/1000)
        #print(self.moyenne)
        
    def ResetData(self):
        ##◙ reset data when scan start
        self.MatData=[]
        self.MatFs=[]
        # print('reset DATMAT')
        
    def shutter (self):
        '''
        set exposure time 
        '''
        
        sh=self.shutterBox.value() # 
        self.hSliderShutter.setValue(sh) # set value of slider
        time.sleep(0.1)
        self.spectrometer.integration_time_micros(sh*1000) # en micro
        # print(sh)
        self.confFrog.setValue('VISU'+'/shutter',sh)
        self.MoyenneAct()
    
    
    def mSliderShutter(self): # for shutter slider 
        sh=self.hSliderShutter.value() 
        self.shutterBox.setValue(sh) # 
        self.spectrometer.integration_time_micros(sh*1000)
        self.confFrog.setValue('VISU'+'/shutter',sh)
    
    def acquireMultiImage(self):
        ''' 
            start the acquisition thread
        '''
        
        self.runButton.setEnabled(False)
        self.runButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconPlay,self.iconPlay))
        self.snapButton.setEnabled(False)
        self.snapButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconSnap,self.iconSnap))
        self.stopButton.setEnabled(True)
        self.stopButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconStop,self.iconStop) )
        self.trigg.setEnabled(False)
        self.bgButton.setEnabled(False)
        self.bgButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconBg,self.iconBg))
        
        self.threadRunAcq.newRun() # to set stopRunAcq=False
        self.threadRunAcq.start()
        self.camIsRunnig=True
    
    def acquireScan(self,pos,nbShoot):
        #acquire on image with scan program
        self.scanWidget.AcqRunning(acqRunning=True)
        self.nbShoot=nbShoot # numero du shoot
        
        self.acquireOneImage()
        self.position=pos # on recupere la valeur de la postion moteur a chaque acquisition
       
    
    def acquireOneImage(self):
        '''Start on acquisition
        '''
        # print('acquire on image spectro')
        self.imageReceived=False
        self.runButton.setEnabled(False)
        self.runButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconPlay,self.iconPlay))
        self.snapButton.setEnabled(False)
        self.snapButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color:gray}"%(self.iconSnap,self.iconSnap))
        self.bgButton.setEnabled(False)
        self.bgButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconBg,self.iconBg))
        
        
        self.stopButton.setEnabled(True)
        self.stopButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconStop,self.iconStop) )
        self.trigg.setEnabled(False)
        self.camIsRunnig=True
        self.threadOneAcq.newRun() # to set stopRunAcq=False
        self.threadOneAcq.start()
    
    
    def bgAcq(self):
        
        self.runButton.setEnabled(False)
        self.runButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconPlay,self.iconPlay))
        self.snapButton.setEnabled(False)
        self.snapButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color:gray}"%(self.iconSnap,self.iconSnap))
        
        self.bgButton.setEnabled(False)
        self.bgButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconBg,self.iconBg))
        
        self.stopButton.setEnabled(True)
        self.stopButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconStop,self.iconStop) )
        self.trigg.setEnabled(False)
        self.camIsRunnig=True
        self.threadBgAcq.newRun()
        self.threadBgAcq.start()
    
    def endScan (self):
        # at the end of the scan we plot MatData( 2d matrix of specta) vs MatFs (vector of the position of the motor) 
        self.MatDataNumpy=np.array(self.MatData)
        self.MatFsNumpy=np.array(self.MatFs)
    
        self.wavelengths=np.array(self.wavelengths)
        self.WidgetResult.newDataReceived(self.MatDataNumpy,axisX=self.MatFsNumpy,axisY=self.wavelengths)
        print('  ')
        print('  ')
        print(' ___RESULTS___')
        print('  dim matrice result :',self.MatDataNumpy.shape)
        print('  dim matrice fs :',len(self.MatFsNumpy))
        print('  dim matrice wavelengths : ',len(self.wavelengths))
        print('  ')
        print('  ')
        
        #self.MatFs=[]
        self.tabs.setCurrentIndex(1)
        self.stopAcq()
        
    
    def stateCam(self,state):
        self.camIsRunnig=state
        
    def newBgReceived(self,data):
        
        self.bg=data
        self.bgSoustract.setChecked(True)
        if self.camIsRunnig is False:
            self.stopAcq()
            
    def newImageReceived(self,data):
        
        if self.bgSoustract.isChecked():
            self.data=data-self.bg
            
        else :
            self.data=data
       
        self.graph.PLOT(self.data,axis=self.wavelengths)
       
        # self.MatData=np.append(self.MatData,self.data)
        self.MatData.append(self.data)
        # print(self.position)
        self.MatFs.append(self.position)
        
        self.scanWidget.AcqRunning(acqRunning=False)
        
        if self.camIsRunnig is False:
            self.stopAcq()
    
    def nbShotAction(self):
        '''
        number of snapShot
        '''
        nbShot, ok=QInputDialog.getInt(self,'Number of SnapShot ','Enter the number of snapShot ')
        if ok:
            self.nbShot=int(nbShot)
            if self.nbShot<=0:
                self.nbShot=1
               
               
    def stopAcq(self):
        '''Stop  acquisition
        '''
        
        self.runButton.setEnabled(True)
        self.runButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconPlay,self.iconPlay))
        self.snapButton.setEnabled(True)
        self.snapButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconSnap,self.iconSnap))
        
        self.bgButton.setEnabled(True)
        self.bgButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconBg,self.iconBg))
        
        
        
        self.stopButton.setEnabled(False)
        self.stopButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconStop,self.iconStop) )
        self.trigg.setEnabled(True)  
        
        self.threadRunAcq.stopThreadRunAcq()
    
    def closeEvent(self,event):
        # when the window is closed
        # to do close motor and spectro
        print('close')
class mainWindow(QMainWindow):
    def __init__(self):
        super(mainWindow, self).__init__()
        self.__image = None  # SimpleITK.Image
        self.__grade = None  # Numpy array with shape [num_slice, num_class]
        self.child_stat = statAnalyzeWidget()
        self.cls_SVC = clsABWidget(ifSVC=True)
        self.cls_Logi = clsABWidget(ifSVC=False)
        self.statusBar().showMessage('Initializing UI...')
        self.initUI()
        self.statusBar().showMessage('Initializing Core...')
        self.main = mainLogic()
        self.statusBar().showMessage('Initializing Signal...')
        self.initSignals()
        self.statusBar().showMessage('Ready')

    def initUI(self):
        self.setWindowTitle('Radiomics System')
        screenGeometry = QApplication.desktop().screenGeometry()
        aspectRatio = 4 / 3.0
        blockLen = min(screenGeometry.width()/aspectRatio, \
                screenGeometry.height())
        self.resize(blockLen * aspectRatio, blockLen)
        #qr = self.frameGeometry()
        #cp = QDesktopWidget().availableGeometry().center()
        #qr.moveCenter(cp)
        #self.move(qr.topLeft())
        self.initUI_Menubar()
        self.initUI_Toolbar()
        self.initUI_ContextMenu()
        self.initUI_Layout()
        self.show()

    def initUI_Menubar(self):
        menubar = self.menuBar()
        self.menuLoad = menubar.addMenu('Load')
        # self.menutools = QMenu(menubar)
        # self.menutools.setObjectName("menutools")
        self.menuImage = self.menuLoad.addMenu('Image')
        self.menuROI = self.menuLoad.addMenu('ROI')
        # self.menuload.setObjectName("menuload")
        self.actionimagedir = QAction('DICOM DIR', self)
        self.actionimagedir.triggered.connect(self.actLoadImgDir)
        self.actionimagefiles = QAction('NIfTI File', self)
        self.actionimagefiles.triggered.connect(self.actLoadStudy)

        self.actionROIdir = QAction('DICOM DIR', self)
        self.actionROIdir.triggered.connect(self.actLoadROIDir)
        self.actionROIfiles = QAction('NIfTI File', self)
        self.actionROIfiles.triggered.connect(self.actLoadROI)
        self.menuImage.addAction(self.actionimagedir)
        self.menuImage.addAction(self.actionimagefiles)
        self.menuROI.addAction(self.actionROIdir)
        self.menuROI.addAction(self.actionROIfiles)

        self.menuSave = menubar.addMenu('Save')
        self.actionSaveImg = QAction('Image', self)
        self.actionSaveImg.triggered.connect(self.actSaveImg)
        self.actionSaveSelROI = QAction('Selected ROI', self)
        self.actionSaveSelROI.triggered.connect(self.actSaveSelROI)
        self.actionSaveAllROI = QAction('All ROI', self)
        self.actionSaveAllROI.triggered.connect(self.actSaveAllROI)
        self.menuSave.addAction(self.actionSaveImg)
        self.menuSave.addAction(self.actionSaveSelROI)
        self.menuSave.addAction(self.actionSaveAllROI)

        self.menuRadiomics = menubar.addMenu('Radiomics')
        self.menuExt = self.menuRadiomics.addMenu('Feature Extraction')
        self.actionPyExt = QAction('PyRadiomics', self)
        self.actionPyExt.triggered.connect(self.actFeatureExt)
        self.actionCuExt = QAction('cuRadiomics(2D only)', self)
        self.actionCuExt.triggered.connect(self.actCuFeatureExt)
        self.menuExt.addAction(self.actionPyExt)
        self.menuExt.addAction(self.actionCuExt)

        self.actionFeatSel = QAction('Feature Selection', self)
        self.actionFeatSel.triggered.connect(self.child_stat.show)
        self.menuRadiomics.addAction(self.actionFeatSel)

        LogiRegAct = QAction('Logit Regression', self)
        LogiRegAct.triggered.connect(self.cls_Logi.show)

        SVCAct = QAction('Support Vector Classification', self)
        SVCAct.triggered.connect(self.cls_SVC.show)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('Classification')
        fileMenu.addAction(LogiRegAct)
        fileMenu.addAction(SVCAct)

        DenoiseAct = QAction('Wavelet Denoise', self)
        DenoiseAct.triggered.connect(self.actDenoise)

        ThredAct = QAction('Threshold Seg', self)
        ThredAct.triggered.connect(self.actThreshold)

        GasSmoothAct = QAction('Guassian Smooth', self)
        GasSmoothAct.triggered.connect(self.actGasSmooth)

        MeanSmoothAct = QAction('Mean Smooth', self)
        MeanSmoothAct.triggered.connect(self.actMeanSmooth)

        MedSmoothAct = QAction('Median Smooth', self)
        MedSmoothAct.triggered.connect(self.actMedSmooth)

        ResampleAct = QAction('Resample', self)
        ResampleAct.triggered.connect(self.actResample)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('Pre-processing')
        fileMenu.addAction(DenoiseAct)
        fileMenu.addAction(ThredAct)
        fileMenu.addAction(GasSmoothAct)
        fileMenu.addAction(MeanSmoothAct)
        fileMenu.addAction(MedSmoothAct)
        fileMenu.addAction(ResampleAct)

        SRAct = QAction('Super Resolution', self)
        SRAct.triggered.connect(self.actGetSR)

        DPSegAct = QAction('Segmentation', self)
        DPSegAct.triggered.connect(self.actDPSeg)

        segbar = self.menuBar()
        segMenu = segbar.addMenu('Deep Learning')
        segMenu.addAction(SRAct)
        segMenu.addAction(DPSegAct)

        #loadStudyAct = QAction('Load Dicom Study', self)
        #fileMenu.addAction(loadStudyAct)
        #exitAct = QAction('Quit', self)
        #exitAct.triggered.connect(qApp.quit)
        #fileMenu.addAction(exitAct)

    def initUI_Toolbar(self):
        pass

    def initUI_ContextMenu(self):
        pass

    def initUI_Layout(self):
        self.volumeViewer = volumeViewerWidget(self)
        self.FeatureDisp = featureDispWidget(self)
        self.dicomInfo = dicomInfoWidget(self)
        # self.controlPanel = controlPannelWidget(self)
        self.annotationPanel = annotationPannelWidget(self)
        #self.FeatureSel = featureSelWidget(self)
        #self.gradeDisp = gradeDispWidget(self)
        # self.refViewer = curveWidget(self)
        self.SRViewer = volumeViewerWidget(self)
        colormap = (plt.cm.bwr(np.array( \
                list([x for x in range(256)]), dtype=np.uint8 \
                ))*255).astype(np.uint8).reshape(256,1,4) #RGBA
        colormap[:, 0, 3] = list(range(255, 0, -2)) + list(range(1, 256, 2))
        # dock and central widget
        # volumeViewer
        self.setCentralWidget(self.volumeViewer)

        # dicomInfo
        self.dockDicomInfo = QDockWidget("DICOM Info", self)
        self.dockDicomInfo.setObjectName("dockDicomInfo")
        self.addDockWidget(Qt.RightDockWidgetArea, self.dockDicomInfo)
        self.dockDicomInfo.setWidget(self.dicomInfo)
        # FeatureExtract
        self.dockFeatureDisp = QDockWidget("Extracted Feature", self)
        self.dockFeatureDisp.setObjectName("dockFeatureDisp")
        self.addDockWidget(Qt.RightDockWidgetArea, self.dockFeatureDisp)
        self.dockFeatureDisp.setWidget(self.FeatureDisp)
        self.tabifyDockWidget(self.dockDicomInfo, self.dockFeatureDisp)

        # Annoation
        self.dockAnnotation = QDockWidget("Annotation Tools", self)
        self.dockAnnotation.setObjectName("dockAnnotation")
        self.addDockWidget(Qt.RightDockWidgetArea, self.dockAnnotation)
        self.dockAnnotation.setWidget(self.annotationPanel)
        self.dockAnnotation.showMinimized()
        self.resizeDocks([self.dockAnnotation, self.dockFeatureDisp], \
                [1,10], Qt.Vertical)
        # self.tabifyDockWidget(self.dockAnnotation, self.dockFeatureDisp)

        # controlPanel
        # self.dockControlPanel = QDockWidget("Control Panel", self)
        # self.dockControlPanel.setObjectName("dockControlPanel")
        # self.addDockWidget(Qt.RightDockWidgetArea, self.dockControlPanel)
        # self.dockControlPanel.setWidget(self.controlPanel)
        # self.dockControlPanel.showMinimized()
        # self.resizeDocks([self.dockControlPanel, self.dockFeatureDisp], \
        #         [1,10], Qt.Vertical)
        # FeatureSelection
        # self.dockFeatureSel = QDockWidget("Selected Feature", self)
        # self.dockFeatureSel.setObjectName("dockFeatureSel")
        # self.addDockWidget(Qt.RightDockWidgetArea, self.dockFeatureSel)
        # self.dockFeatureSel.setWidget(self.FeatureSel)
        # self.tabifyDockWidget(self.dockFeatureDisp, self.dockFeatureSel)

        # # gradeDisp
        # self.dockGradeDisp = QDockWidget("Grade (Prediction)", self)
        # self.dockGradeDisp.setObjectName("dockGradeDisp")
        # self.addDockWidget(Qt.RightDockWidgetArea, self.dockGradeDisp)
        # self.dockGradeDisp.setWidget(self.gradeDisp)
        # self.tabifyDockWidget(self.dockDicomInfo, self.dockGradeDisp)

        # reference image and SR image
        # self.dockRefViewer = QDockWidget("Reference", self)
        # self.dockRefViewer.setObjectName("dockRefViewer")
        # self.addDockWidget(Qt.LeftDockWidgetArea, self.dockRefViewer)
        # self.dockRefViewer.setWidget(self.refViewer)
        # self.dockRefViewer.setFloating(True)
        # self.dockRefViewer.setVisible(False)
        self.dockSRViewer = QDockWidget("Super-Resolution", self)
        self.dockSRViewer.setObjectName("dockSRViewer")
        self.addDockWidget(Qt.LeftDockWidgetArea, self.dockSRViewer)
        self.dockSRViewer.setWidget(self.SRViewer)
        self.dockSRViewer.setFloating(True)
        self.dockSRViewer.setVisible(False)

    def initSignals(self):
        # self.controlPanel.btnLoad.clicked.connect(self.actLoadStudy)
        # self.controlPanel.btnROI.clicked.connect(self.actLoadROI)
        # self.controlPanel.btnExt.clicked.connect(self.actFeatureExt)
        # self.controlPanel.btnSel.clicked.connect(self.child_stat.show)

        self.annotationPanel.btnDoAnn.clicked.connect(self.actDoAnn)
        self.annotationPanel.btnDoAnn.setIcon(
            QIcon("./qdarkstyle/polygon.png"))

        self.annotationPanel.btnPoly.clicked.connect(self.actSetPoly)
        self.annotationPanel.btnPoly.setIcon(
            (QIcon("./qdarkstyle/polygon.png")))
        # self.annotationPanel.btnPoly.setStyleSheet("QPushButton{border-image: url(./qdarkstyle/polygon.png)}")

        self.annotationPanel.btnCircle.clicked.connect(self.actSetCircle)
        self.annotationPanel.btnCircle.setIcon(
            (QIcon("./qdarkstyle/circle.png")))

        # self.annotationPanel.btnTri.clicked.connect(self.actSetTri)
        # self.annotationPanel.btnTri.setIcon((QIcon("./qdarkstyle/tri.png")))

        self.annotationPanel.btnJux.clicked.connect(self.actSetJux)
        self.annotationPanel.btnJux.setIcon((QIcon("./qdarkstyle/juxing.png")))

        # childBoxGeo.addWidget(self.btnPoly)
        # childBoxGeo.addWidget(self.btnCircle)
        # childBoxGeo.addWidget(self.btnTri)
        # childBoxGeo.addWidget(self.btnJux)

        self.annotationPanel.btnAccROI.clicked.connect(self.actAccROI)
        self.annotationPanel.btnClrSelROI.clicked.connect(self.actClrSelROI)
        self.annotationPanel.btnClrAllROI.clicked.connect(self.actClrAllROI)
        # self.annotationPanel.btnSaveSelROI.clicked.connect(self.actSaveSelROI)
        # self.annotationPanel.btnSaveAllROI.clicked.connect(self.actSaveAllROI)

        # self.controlPanel.btnCla.clicked.connect(self.actGetGrade)
        # self.controlPanel.btnSeg.clicked.connect(self.actGetSeg)
        # self.controlPanel.btnRef.clicked.connect(self.actGetReference)
        # self.controlPanel.btnSR.clicked.connect(self.actGetSR)
        #self.volumeViewer.sliderIndex.valueChanged.connect( \
        #        lambda x: self.refViewer.setIndex(x-1))
        self.FeatureDisp.cellPressed.connect( \
                lambda row, col: self.volumeViewer.sliderIndex.setValue(row+1))

    def actSetPoly(self):
        self.__type = 'Poly'
        self.actDoAnn()
        return

    def actSetCircle(self):
        self.__type = 'Circle'
        self.actDoAnn()
        return

    # def actSetTri(self):
    #     self.__type ='Tri'
    #     self.actDoAnn()
    #     return

    def actSetJux(self):
        self.__type = 'Jux'
        self.actDoAnn()
        return

    def actDoAnn(self):
        if self.annotationPanel.rbS.isChecked() == True:
            self.volumeViewer.setROI(ax='S', type=self.__type)
        if self.annotationPanel.rbA.isChecked() == True:
            self.volumeViewer.setROI(ax='A', type=self.__type)
        if self.annotationPanel.rbC.isChecked() == True:
            self.volumeViewer.setROI(ax='C', type=self.__type)
        return

    def actAccROI(self):
        # labelArr=self.volumeViewer.accROI()
        # print(np.unique(labelArr))
        # print(labelArr.dtype)
        self.main.setROI(self.volumeViewer.accROI())
        # self.volumeViewer.setLabel(ROI)
        return

    def actSaveSelROI(self):
        self.volumeViewer.saveSelROI()
        return

    def actSaveAllROI(self):
        self.volumeViewer.saveAllROI()
        return

    def actClrSelROI(self):
        self.volumeViewer.clrSelROI()
        return

    def actClrAllROI(self):
        self.volumeViewer.clrAllROI()
        return

    def actDenoise(self):
        self.volumeViewer.denoise()
        return

    def actGasSmooth(self):
        self.volumeViewer.setPreprocessMethod(method='Gaussian')
        return

    def actMeanSmooth(self):
        self.volumeViewer.setPreprocessMethod(method='Mean')
        return

    def actMedSmooth(self):
        self.volumeViewer.setPreprocessMethod(method='Median')
        return

    def actResample(self):
        self.volumeViewer.setPreprocessMethod(method='Resample')
        return

    def actThreshold(self):
        self.volumeViewer.setSegMethod(method='Threshold')
        return

    def actDPSeg(self):
        pass

    @pyqtSlot()
    def actLoadImgDir(self, directory=None):
        start = time.time()
        self.statusBar().showMessage('Loading Study...')
        if directory is None:
            dialog = QFileDialog(self)
            dialog.setFileMode(QFileDialog.DirectoryOnly)
            dialog.setViewMode(QFileDialog.List)
            dialog.setOption(QFileDialog.ShowDirsOnly, True)
            if dialog.exec_():
                directory = str(dialog.selectedFiles()[0])
            else:
                self.statusBar().showMessage( \
                    'Ready ({:.2f}s)'.format(time.time() - start))
                return
        try:
            images = ReadSagittalPDs(directory)
        except Exception as err:
            msgBox = QMessageBox(self)
            msgBox.setText(str(type(err)) + str(err))
            msgBox.exec()
            self.statusBar().showMessage( \
                'Ready ({:.2f}s)'.format(time.time() - start))
            return
        selectDialog = dicomSelectDialog(images)
        if selectDialog.exec_():
            image = images[selectDialog.selectedIndex]
        else:
            self.statusBar().showMessage( \
                'Ready ({:.2f}s)'.format(time.time() - start))
            return

        # get image data
        # image_out = sitk.GetImageFromArray(sitk.GetArrayFromImage(image))
        #
        # # setup other image characteristics
        # image_out.SetOrigin(image.GetOrigin())
        # image_out.SetSpacing(image.GetSpacing())
        # # set to RAI
        # image_out.SetDirection(tuple(-0.0, 0.0, -1.0, 1.0, -0.0, 0.0, 0.0, -1.0, 0.0))
        # # sitk.WriteImage(image_out, 'test.mha')
        # image = image_out
        self.main.setImage(image)
        self.volumeViewer.setImage(image)
        self.dicomInfo.setImage(image)
        self.dockDicomInfo.setVisible(True)
        # self.dockRefViewer.setVisible(False)
        self.dockSRViewer.setVisible(False)
        # self.gradeDisp.setGrade(None)
        self.statusBar().showMessage( \
            'Ready ({:.2f}s)'.format(time.time() - start))
        return

    def actLoadStudy(self, directory=None):
        start = time.time()
        self.statusBar().showMessage('Loading Study...')
        directory = QFileDialog.getOpenFileName(self,
                                                "Select one file to open",
                                                "./", "Files (*.nii *.dcm)")
        print(directory)
        directory = str(directory[0])
        #if directory is None:
        #dialog = QFileDialog(self)
        # dialog.setFileMode(QFileDialog.DirectoryOnly)
        # dialog.setViewMode(QFileDialog.List)
        # dialog.setOption(QFileDialog.ShowDirsOnly, True)
        # if dialog.exec_():
        #     directory = str(dialog.selectedFiles()[0])
        # else:
        #     self.statusBar().showMessage( \
        #             'Ready ({:.2f}s)'.format(time.time() - start))
        #     return
        try:
            #images = ReadSagittalPDs(directory)
            image = ReadImage(directory)
        except Exception as err:
            msgBox = QMessageBox(self)
            msgBox.setText(str(type(err)) + str(err))
            msgBox.exec()
            self.statusBar().showMessage( \
                    'Ready ({:.2f}s)'.format(time.time() - start))
            return
        # selectDialog = dicomSelectDialog(images)
        # if selectDialog.exec_():
        #     image = images[selectDialog.selectedIndex]
        # else:
        #     self.statusBar().showMessage( \
        #             'Ready ({:.2f}s)'.format(time.time() - start))
        #     return
        self.main.setImage(image)
        self.volumeViewer.setImage(image)
        self.dicomInfo.setImage(image)
        self.dockDicomInfo.setVisible(True)
        # self.dockRefViewer.setVisible(False)
        self.dockSRViewer.setVisible(False)
        # self.gradeDisp.setGrade(None)
        self.statusBar().showMessage( \
                'Ready ({:.2f}s)'.format(time.time() - start))
        return

    def actLoadROIDir(self, directory=None):
        start = time.time()
        self.statusBar().showMessage('Loading Study...')
        if directory is None:
            dialog = QFileDialog(self)
            dialog.setFileMode(QFileDialog.DirectoryOnly)
            dialog.setViewMode(QFileDialog.List)
            dialog.setOption(QFileDialog.ShowDirsOnly, True)
            if dialog.exec_():
                directory = str(dialog.selectedFiles()[0])
            else:
                self.statusBar().showMessage( \
                    'Ready ({:.2f}s)'.format(time.time() - start))
                return
        try:
            ROIs = ReadSagittalPDs(directory)
        except Exception as err:
            msgBox = QMessageBox(self)
            msgBox.setText(str(type(err)) + str(err))
            msgBox.exec()
            self.statusBar().showMessage( \
                'Ready ({:.2f}s)'.format(time.time() - start))
            return
        selectDialog = dicomSelectDialog(images)
        if selectDialog.exec_():
            ROI = ROIs[selectDialog.selectedIndex]
        else:
            self.statusBar().showMessage( \
                'Ready ({:.2f}s)'.format(time.time() - start))
            return
        self.main.setROI(ROI)
        self.volumeViewer.setLabel(ROI)
        # self.dockRefViewer.setVisible(False)
        self.dockSRViewer.setVisible(False)
        # self.gradeDisp.setGrade(None)
        self.statusBar().showMessage( \
            'Ready ({:.2f}s)'.format(time.time() - start))
        return

    def actLoadROI(self, directory=None):
        start = time.time()
        self.statusBar().showMessage('Loading ROI...')
        directory = QFileDialog.getOpenFileName(self,
                                                "Select one file to open",
                                                "./", "Files (*.nii *.dcm)")
        print(directory)
        directory = str(directory[0])
        try:
            ROI = ReadROI(directory)
        except Exception as err:
            msgBox = QMessageBox(self)
            msgBox.setText(str(type(err)) + str(err))
            msgBox.exec()
            self.statusBar().showMessage( \
                    'Ready ({:.2f}s)'.format(time.time() - start))
            return

        self.main.setROI(ROI)
        self.volumeViewer.setLabel(ROI)
        self.dockSRViewer.setVisible(False)

        self.statusBar().showMessage( \
                'Ready ({:.2f}s)'.format(time.time() - start))
        return

    def actFeatureExt(self):
        start = time.time()
        self.statusBar().showMessage('Extracting Feature...')
        try:
            feature_extracted = self.main.getFeature()
        except Exception as err:
            msgBox = QMessageBox(self)
            msgBox.setText(str(type(err)) + str(err))
            msgBox.exec()
            self.statusBar().showMessage( \
                    'Ready ({:.2f}s)'.format(time.time() - start))
            return
        self.FeatureDisp.setFeature(feature_extracted)
        self.dockFeatureDisp.setVisible(True)
        self.statusBar().showMessage( \
                'Ready ({:.2f}s)'.format(time.time() - start))

        return

    def actCuFeatureExt(self):
        start = time.time()
        self.statusBar().showMessage('Extracting Feature...')
        try:
            feature_extracted = self.main.getCuFeature()
        except Exception as err:
            msgBox = QMessageBox(self)
            msgBox.setText(str(type(err)) + str(err))
            msgBox.exec()
            self.statusBar().showMessage( \
                    'Ready ({:.2f}s)'.format(time.time() - start))
            return
        self.FeatureDisp.setFeature(feature_extracted)
        self.dockFeatureDisp.setVisible(True)
        self.statusBar().showMessage( \
                'Ready ({:.2f}s)'.format(time.time() - start))

        return

    def actSaveImg(self):
        pass

    # def actFeatureSel(self):
    #     start = time.time()
    #     self.statusBar().showMessage('Statistical Analyzing...')
    #     directory = QFileDialog.getOpenFileName(self,
    #                                          "Select the feature folder",
    #                                          "./",
    #                                          "Files (*.nii *.dcm)")
    #     print(directory)
    #     directory = str(directory[0])
    #     try:
    #         feature_selected = self.main.featureSel()
    #     except Exception as err:
    #         msgBox = QMessageBox(self)
    #         msgBox.setText(str(type(err)) + str(err))
    #         msgBox.exec()
    #         self.statusBar().showMessage( \
    #                 'Ready ({:.2f}s)'.format(time.time() - start))
    #         return
    #     msgBox = QMessageBox(self)
    #     if feature_selected is True:
    #         msgBox.setText('Done! Please check the folder.')
    #     return

    @pyqtSlot()
    def actGetGrade(self):
        start = time.time()
        self.statusBar().showMessage('Predicting Grade...')
        try:
            grade = self.main.getGrade()
        except Exception as err:
            msgBox = QMessageBox(self)
            msgBox.setText(str(type(err)) + str(err))
            msgBox.exec()
            self.statusBar().showMessage( \
                    'Ready ({:.2f}s)'.format(time.time() - start))
            return
        self.gradeDisp.setGrade(grade)
        self.dockGradeDisp.setVisible(True)
        self.statusBar().showMessage( \
                'Ready ({:.2f}s)'.format(time.time() - start))
        msgBox = QMessageBox(self)
        msgBox.setText('得出诊断意见:'+
                '我们从四千多个膝关节测共振图层(健康人和患者)'+\
                '与医生的诊断结果中,利用深度学习的方法,'+\
                '提取图像的特征及其与诊断结果的关系。'+\
                '利用训练出的模型,'+\
                '计算机可以自动从图像中预测诊断意见。'+'\n'+\
                '提示水肿区域:'+\
                '我们从三百多层带有水肿区域的磁共振图像'+\
                '与医生手工勾勒出的水肿区域中,'+\
                '利用深度学习的方法提取特征。利用训练出的模型,'+\
                '计算机可以自动从图像中预测图像是否有水肿,'+\
                '以及水肿区域的位置。')
        #msgBox.exec()
        return

    @pyqtSlot()
    def actGetSeg(self):
        start = time.time()
        self.statusBar().showMessage('Predicting Segmentation...')
        try:
            seg = self.main.getSeg()
        except Exception as err:
            msgBox = QMessageBox(self)
            msgBox.setText(str(type(err)) + str(err))
            msgBox.exec()
            self.statusBar().showMessage( \
                    'Ready ({:.2f}s)'.format(time.time() - start))
            return
        self.volumeViewer.setLabel(seg)
        self.statusBar().showMessage( \
                'Ready ({:.2f}s)'.format(time.time() - start))
        msgBox = QMessageBox(self)
        msgBox.setText('生成分割结果:'+\
                '我们从100多例患者膝关节磁共振的手工标记结果中,'+\
                '利用深度学习的方法提取特征。利用训练出的模型,'+\
                '计算机可以自动从图像中得到膝关节结构的分割结果。')
        #msgBox.exec()

    @pyqtSlot()
    def actGetSR(self):
        start = time.time()
        self.statusBar().showMessage('Enhancing Resolution...')
        try:
            SR = self.main.getSuperResolution()
        except Exception as err:
            msgBox = QMessageBox(self)
            msgBox.setText(str(type(err)) + str(err))
            msgBox.exec()
            self.statusBar().showMessage( \
                    'Ready ({:.2f}s)'.format(time.time() - start))
            return
        self.SRViewer.setImage(SR)
        if not self.dockSRViewer.isVisible():
            self.dockSRViewer.setVisible(True)
            if self.dockSRViewer.isFloating():
                self.dockSRViewer.resize( \
                        self.SRViewer.viewerSlice.viewportSizeHint()*1.4)
        self.statusBar().showMessage( \
                'Ready ({:.2f}s)'.format(time.time() - start))
        msgBox = QMessageBox(self)
        msgBox.setText('分辨率增强(层间距)')
        #msgBox.exec()

    @pyqtSlot()
    def actGetReference(self):
        start = time.time()
        self.statusBar().showMessage('Predicting Reference...')
        try:
            #'PatientAge': '0010|1010', \
            img = self.main.getImage()
            self.refViewer.openCSV(os.path.join( \
                    os.path.dirname(__file__), 'plot.csv'))
            age = img.GetMetaData('0010|1010')
            age = int(age[0:3])
            thickness = self.main.getThickness()
        except Exception as err:
            msgBox = QMessageBox(self)
            msgBox.setText(str(type(err)) + str(err))
            msgBox.exec()
            self.statusBar().showMessage( \
                    'Ready ({:.2f}s)'.format(time.time() - start))
            return
        #print(age, *thickness)
        self.refViewer.plotCurve(age, *thickness)
        if not self.dockRefViewer.isVisible():
            self.dockRefViewer.setVisible(True)
            if self.dockRefViewer.isFloating():
                self.dockRefViewer.resize( \
                        self.refViewer.sizeHint()*1.1)
        self.statusBar().showMessage( \
                'Ready ({:.2f}s)'.format(time.time() - start))
        msgBox = QMessageBox(self)
        msgBox.setText('生成参考')
Beispiel #10
0
class CAMERA(QWidget):
    datareceived = QtCore.pyqtSignal(bool)  # signal emited when receive image

    def __init__(self, cam='choose', confFile='confCamera.ini', **kwds):
        '''
        Parameters
        ----------
        cam : TYPE str, optional
            DESCRIPTION. 
                cam='choose' : generate a input dialog box which the list of all the camera connected (allied,basler,imagingSource) 
                cam='cam1' : open the camera by the ID and type save in the confFile.ini 
                ncam='menu': generate a input dialog box with a menu with all the camera name present in the .ini file
                cam='firstGuppy' open the first allied vision camera
                cam='firstBasler' open the first Basler camera
                cam='firstImgSource' open the first ImagingSource camera
            The default is 'choose'.
        confFile : TYPE str, optional
            DESCRIPTION. 
                confFile= path to file.initr
                The default is 'confCamera.ini'.
        **kwds:
            affLight : TYPE boolean, optional
                DESCRIPTION.
                    affLight=False all the option are show for the visualisation
                    affLight= True only few option (save  open cross)
                    The default is True.
            multi add time sleep to access QApplication.processEvents() 
            + all kwds of VISU class
            
        '''

        super(CAMERA, self).__init__()

        p = pathlib.Path(__file__)
        self.nbcam = cam

        self.kwds = kwds
        if "affLight" in kwds:
            self.light = kwds["affLight"]
        else:
            self.light = True
        if "multi" in kwds:
            self.multi = kwds["multi"]
        else:
            self.multi = False

        if "separate" in kwds:
            self.separate = kwds["separate"]
        else:
            self.separate = True

        if "aff" in kwds:  #  affi of Visu
            self.aff = kwds["aff"]
        else:
            self.aff = "right"

        # self.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5()) # qdarkstyle :  black windows style
        self.confPath = str(p.parent / confFile)  # ini file path
        self.conf = QtCore.QSettings(str(p.parent / self.confPath),
                                     QtCore.QSettings.IniFormat)  # ini file
        self.kwds["confpath"] = self.confPath
        sepa = os.sep

        self.icon = str(p.parent) + sepa + 'icons' + sepa
        self.setWindowIcon(QIcon(self.icon + 'LOA.png'))
        self.iconPlay = self.icon + 'Play.png'
        self.iconSnap = self.icon + 'Snap.png'
        self.iconStop = self.icon + 'Stop.png'
        self.iconPlay = pathlib.Path(self.iconPlay)
        self.iconPlay = pathlib.PurePosixPath(self.iconPlay)
        self.iconStop = pathlib.Path(self.iconStop)
        self.iconStop = pathlib.PurePosixPath(self.iconStop)
        self.iconSnap = pathlib.Path(self.iconSnap)
        self.iconSnap = pathlib.PurePosixPath(self.iconSnap)
        self.nbShot = 1
        self.isConnected = False
        self.version = str(__version__)

        self.openCam()
        self.setup()
        self.setCamPara()
        #self.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())

    def openID(self):
        '''
        open a camera by id camera typ and ID must be known and saved in the ini file 

        '''
        self.ccdName = self.conf.value(self.nbcam + "/nameCDD")
        self.cameraType = self.conf.value(self.nbcam + "/camType")
        self.camID = self.conf.value(self.nbcam + "/camId")

        if self.cameraType == "guppy":
            try:
                import guppyCam
                print('ici')
                self.CAM = guppyCam.GUPPY(cam=self.nbcam, conf=self.conf)
                print('ici2')
                self.CAM.openCamByID(self.camID)
                print('ici3')
                self.isConnected = self.CAM.isConnected
            except:
                print(
                    "no allied vision camera detected or vimba is not installed"
                )
                pass

        elif self.cameraType == "basler":
            try:
                import baslerCam
                self.CAM = baslerCam.BASLER(cam=self.nbcam,
                                            conf=self.conf,
                                            **self.kwds)
                self.CAM.openCamByID(self.camID)
                self.isConnected = self.CAM.isConnected
            except:
                print("no basler camera detected or pypylon is not installed")
                pass

        elif self.cameraType == "imgSource":

            try:
                import ImgSourceCamCallBack
                self.CAM = ImgSourceCamCallBack.IMGSOURCE(cam=self.nbcam,
                                                          conf=self.conf,
                                                          **self.kwds)
                self.CAM.openCamByID(self.camID)
                # print('openID',self.camID)
                self.isConnected = self.CAM.isConnected
            except:
                print(
                    "no imaging source camera detected or Tisgrabber is not installed"
                )
                pass
        elif self.cameraType == "pixelink":

            try:
                import pixelinkCam
                self.CAM = pixelinkCam.PIXELINK(cam=self.nbcam,
                                                conf=self.conf,
                                                **self.kwds)
                self.CAM.openCamByID(self.camID)
                self.isConnected = self.CAM.isConnected
            except:
                print(
                    "no imaging source camera detected or Tisgrabber is not installed"
                )
                pass
        else:
            print('no camera')
            self.isConnected = False
            self.ccdName = "no camera"
            self.cameraType = ""
            self.camID = ""
            self.nbcam = 'camDefault'

    def openCam(self):
        '''open a camera with different way  
        '''

        if self.nbcam == "choose":  # create menu widget with all camera present

            self.nbcam = 'camDefault'
            try:
                import guppyCam
                self.itemsGuppy = guppyCam.camAvailable()
                # print(self.itemsGuppy)
                self.lenGuppy = len(self.itemsGuppy)

            except:
                print('No allied vision camera connected')
                self.itemsGuppy = []
                self.lenGuppy = 0
                pass
            try:
                import baslerCam
                self.itemsBasler = baslerCam.camAvailable()
                self.lenBasler = len(self.itemsBasler)

            except:
                print('No Basler camera connected')
                self.itemsBasler = []
                self.lenBasler = 0
                pass

            try:
                import ImgSourceCamCallBack
                self.itemsImgSource = ImgSourceCamCallBack.camAvailable()
                self.lenImgSource = len(self.itemsImgSource)

            except:
                print('No ImagingSource camera connected')
                self.itemsImgSource = []
                self.lenImgSource = 0
                pass

            try:
                import pixelinkCam
                self.itemsPixelink = pixelinkCam.PIXELINK.camAvailable()
                self.lenImgPixelink = len(self.itemsPixelink)

            except:
                print('No pixelink camera connected')
                self.itemsPixelink = []
                self.lenPixelink = 0
                pass

            items = self.itemsGuppy + list(
                self.itemsBasler) + self.itemsImgSource + self.itemsPixelink

            item, ok = QInputDialog.getItem(
                self,
                "Select a camera",
                "List of avaible camera",
                items,
                0,
                False,
                flags=QtCore.Qt.WindowStaysOnTopHint)

            if ok and item:

                indexItem = items.index(item)

                if indexItem < self.lenGuppy:
                    indexItem = indexItem
                    self.cameraType = "guppy"
                    self.camID = guppyCam.getCamID(indexItem)

                    self.CAM = guppyCam.GUPPY(cam=self.nbcam, conf=self.conf)
                    self.CAM.openCamByID(self.camID)
                    self.isConnected = self.CAM.isConnected
                    self.ccdName = self.camID
                elif indexItem >= self.lenGuppy and indexItem < self.lenBasler + self.lenGuppy:
                    indexItem = indexItem - self.lenGuppy
                    self.cameraType = "basler"
                    self.camID = baslerCam.getCamID(indexItem)
                    self.CAM = baslerCam.BASLER(cam=self.nbcam,
                                                conf=self.conf,
                                                **self.kwds)
                    self.CAM.openCamByID(self.camID)
                    self.isConnected = self.CAM.isConnected
                    self.ccdName = self.camID

                elif indexItem >= self.lenBasler + self.lenGuppy and indexItem < self.lenBasler + self.lenGuppy + self.lenImgSource:
                    indexItem = indexItem - self.lenGuppy - self.lenBasler
                    self.cameraType = "imgSource"
                    self.camID = ImgSourceCamCallBack.getCamID(indexItem)
                    self.camID = self.camID.decode()
                    self.CAM = ImgSourceCamCallBack.IMGSOURCE(cam=self.nbcam,
                                                              conf=self.conf,
                                                              **self.kwds)
                    self.CAM.openCamByID(self.camID)
                    self.isConnected = self.CAM.isConnected
                    self.ccdName = self.camID

                elif indexItem >= self.lenBasler + self.lenGuppy + self.lenImgSource and indexItem < self.lenBasler + self.lenGuppy + self.lenImgSource + self.lenPixelink:
                    indexItem = indexItem - self.lenGuppy - self.lenBasler - self.lenImgSource
                    self.cameraType = "pixelink"
                    self.camID = pixelinkCam.getCamID(indexItem)

                    self.CAM = pixelinkCam.PIXELINK(cam=self.nbcam,
                                                    conf=self.conf,
                                                    **self.kwds)
                    self.CAM.openCamByID(self.camID)
                    self.isConnected = self.CAM.isConnected
                    self.ccdName = self.camID

                else:
                    self.isconnected = False
                    print('No camera choosen')
                    self.ccdName = "no camera"
                    self.nbcam = 'camDefault'
            else:
                self.isconnected = False
                print('No camera choosen')
                self.ccdName = "no camera"
                self.cameraType = ""
                self.camID = ""
                self.nbcam = 'camDefault'

        elif self.nbcam == None:
            self.isconnected = False
            print('No camera')
            self.ccdName = "no camera"
            self.cameraType = ""
            self.camID = ""
            self.nbcam = 'camDefault'

        elif self.nbcam == "firstGuppy":  # open the first guppy cam in the list
            self.nbcam = 'camDefault'
            self.cameraType = "guppy"
            self.ccdName = 'First guppy Cam'
            import guppyCam
            self.CAM = guppyCam.GUPPY(cam=self.nbcam, conf=self.conf)
            self.CAM.openFirstCam()
            self.isConnected = self.CAM.isConnected

        elif self.nbcam == "firstBasler":  # open the first basler cam in the list
            self.ccdName = 'First basler Cam'
            self.nbcam = 'camDefault'
            self.cameraType = "basler"
            import baslerCam
            self.CAM = baslerCam.BASLER(cam=self.nbcam,
                                        conf=self.conf,
                                        **self.kwds)
            self.CAM.openFirstCam()
            self.isConnected = self.CAM.isConnected

        elif self.nbcam == "firstImgSource":  # open the first imgSource cam in the list
            self.ccdName = 'First ImSource Cam'
            self.nbcam = 'camDefault'
            self.cameraType = "imgSource"
            import ImgSourceCamCallBack
            self.CAM = ImgSourceCamCallBack.IMGSOURCE(cam=self.nbcam,
                                                      conf=self.conf,
                                                      **self.kwds)
            self.CAM.openFirstCam()
            self.isConnected = self.CAM.isConnected

        elif self.nbcam == "firstPixelink":  # open the first pixelink cam in the list
            self.ccdName = 'First Pixelink Cam'
            self.nbcam = 'camDefault'
            self.cameraType = "pixelink"
            import pixelinkCam
            self.CAM = pixelinkCam.PIXELINK(cam=self.nbcam,
                                            conf=self.conf,
                                            **self.kwds)
            self.CAM.openFirstCam()
            self.isConnected = self.CAM.isConnected

        elif self.nbcam == 'menu':  # Qdialog with a menu with all the camera name present in the inifile
            self.groupsName = []
            self.groups = self.conf.childGroups()
            for groups in self.groups:
                self.groupsName.append(self.conf.value(groups + "/nameCDD"))
            item, ok = QInputDialog.getItem(
                self,
                "Select a camera",
                "List of avaible camera",
                self.groupsName,
                0,
                False,
                flags=QtCore.Qt.WindowStaysOnTopHint)
            if ok and item:
                indexItem = self.groupsName.index(item)
                self.nbcam = self.groups[indexItem]
                self.openID()

        else:  #open the camera by ID : nbcam return ID of the ini file
            try:
                self.openID()
            except:
                self.isConnected = False

    def setCamPara(self):
        '''set min max gain and exp value of cam in the widget
        '''

        if self.isConnected == True:  # if camera is connected we address min and max value  and value to the shutter and gain box
            # print('camshutter',self.CAM.camParameter["exposureTime"])
            if self.CAM.camParameter[
                    "expMax"] > 1500:  # we limit exposure time at 1500ms
                self.hSliderShutter.setMaximum(1500)
                self.shutterBox.setMaximum(1500)
            else:
                self.hSliderShutter.setMaximum(self.CAM.camParameter["expMax"])
                self.shutterBox.setMaximum(self.CAM.camParameter["expMax"])
            self.hSliderShutter.setValue(
                int(self.CAM.camParameter["exposureTime"]))
            self.shutterBox.setValue(int(
                self.CAM.camParameter["exposureTime"]))
            self.hSliderShutter.setMinimum(
                int(self.CAM.camParameter["expMin"] + 1))
            self.shutterBox.setMinimum(int(self.CAM.camParameter["expMin"] +
                                           1))

            self.hSliderGain.setMinimum(int(self.CAM.camParameter["gainMin"]))
            self.hSliderGain.setMaximum(int(self.CAM.camParameter["gainMax"]))
            self.hSliderGain.setValue(int(self.CAM.camParameter["gain"]))
            self.gainBox.setMinimum(int(self.CAM.camParameter["gainMin"]))
            self.gainBox.setMaximum(int(self.CAM.camParameter["gainMax"]))
            self.gainBox.setValue(int(self.CAM.camParameter["gain"]))

            self.actionButton()

        if self.isConnected == False:
            self.setWindowTitle(
                'Visualization         No camera connected      ' + 'v.  ' +
                self.version)
            self.runButton.setEnabled(False)
            self.snapButton.setEnabled(False)
            self.trigg.setEnabled(False)
            self.hSliderShutter.setEnabled(False)
            self.shutterBox.setEnabled(False)
            self.gainBox.setEnabled(False)
            self.hSliderGain.setEnabled(False)
            self.runButton.setStyleSheet(
                "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
                "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
                % (self.iconPlay, self.iconPlay))
            self.snapButton.setStyleSheet(
                "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
                "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
                % (self.iconSnap, self.iconSnap))

    def setup(self):
        """ user interface definition 
            """
        self.setWindowTitle('Visualization    ' + self.cameraType + "   " +
                            self.ccdName + '       v.' + self.version)

        hbox1 = QHBoxLayout()  # horizontal layout pour run snap stop
        self.sizebuttonMax = 30
        self.sizebuttonMin = 30
        self.runButton = QToolButton(self)
        self.runButton.setMaximumWidth(self.sizebuttonMax)
        self.runButton.setMinimumWidth(self.sizebuttonMax)
        self.runButton.setMaximumHeight(self.sizebuttonMax)
        self.runButton.setMinimumHeight(self.sizebuttonMax)
        self.runButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: green;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconPlay, self.iconPlay))

        self.snapButton = QToolButton(self)
        self.snapButton.setPopupMode(0)
        menu = QMenu()
        #menu.addAction('acq',self.oneImage)
        menu.addAction('set nb of shot', self.nbShotAction)
        self.snapButton.setMenu(menu)
        self.snapButton.setMaximumWidth(self.sizebuttonMax)
        self.snapButton.setMinimumWidth(self.sizebuttonMax)
        self.snapButton.setMaximumHeight(self.sizebuttonMax)
        self.snapButton.setMinimumHeight(self.sizebuttonMax)
        self.snapButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: green;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconSnap, self.iconSnap))

        self.stopButton = QToolButton(self)

        self.stopButton.setMaximumWidth(self.sizebuttonMax)
        self.stopButton.setMinimumWidth(self.sizebuttonMax)
        self.stopButton.setMaximumHeight(self.sizebuttonMax)
        self.stopButton.setMinimumHeight(self.sizebuttonMax)
        self.stopButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconStop, self.iconStop))
        self.stopButton.setEnabled(False)

        hbox1.addWidget(self.runButton)
        hbox1.addWidget(self.snapButton)
        hbox1.addWidget(self.stopButton)
        hbox1.setSizeConstraint(QtGui.QLayout.SetFixedSize)
        hbox1.setContentsMargins(0, 10, 0, 10)
        self.widgetControl = QWidget(self)

        self.widgetControl.setLayout(hbox1)
        self.dockControl = QDockWidget(self)
        self.dockControl.setWidget(self.widgetControl)
        self.dockControl.resize(80, 80)
        self.trigg = QComboBox()
        self.trigg.setMaximumWidth(80)
        self.trigg.addItem('OFF')
        self.trigg.addItem('ON')
        self.trigg.setStyleSheet('font :bold  10pt;color: white')
        self.labelTrigger = QLabel('Trigger')
        self.labelTrigger.setMaximumWidth(70)
        self.labelTrigger.setStyleSheet('font :bold  10pt')
        self.itrig = self.trigg.currentIndex()
        hbox2 = QHBoxLayout()
        hbox2.setSizeConstraint(QtGui.QLayout.SetFixedSize)
        hbox2.setContentsMargins(5, 15, 0, 0)
        hbox2.addWidget(self.labelTrigger)

        hbox2.addWidget(self.trigg)
        self.widgetTrig = QWidget(self)

        self.widgetTrig.setLayout(hbox2)
        self.dockTrig = QDockWidget(self)
        self.dockTrig.setWidget(self.widgetTrig)

        self.labelExp = QLabel('Exposure (ms)')
        self.labelExp.setStyleSheet('font :bold  10pt')
        self.labelExp.setMaximumWidth(140)
        self.labelExp.setAlignment(Qt.AlignCenter)

        self.hSliderShutter = QSlider(Qt.Horizontal)
        self.hSliderShutter.setMaximumWidth(80)
        self.shutterBox = QSpinBox()
        self.shutterBox.setStyleSheet('font :bold  8pt')
        self.shutterBox.setMaximumWidth(120)

        hboxShutter = QHBoxLayout()
        hboxShutter.setContentsMargins(5, 0, 0, 0)
        hboxShutter.setSpacing(10)
        vboxShutter = QVBoxLayout()
        vboxShutter.setSpacing(0)
        vboxShutter.addWidget(self.labelExp)  #,Qt.AlignLef)

        hboxShutter.addWidget(self.hSliderShutter)
        hboxShutter.addWidget(self.shutterBox)
        vboxShutter.addLayout(hboxShutter)
        vboxShutter.setSizeConstraint(QtGui.QLayout.SetFixedSize)
        vboxShutter.setContentsMargins(5, 5, 0, 0)

        self.widgetShutter = QWidget(self)

        self.widgetShutter.setLayout(vboxShutter)
        self.dockShutter = QDockWidget(self)
        self.dockShutter.setWidget(self.widgetShutter)

        self.labelGain = QLabel('Gain')
        self.labelGain.setStyleSheet('font :bold  10pt')
        self.labelGain.setMaximumWidth(120)
        self.labelGain.setAlignment(Qt.AlignCenter)

        self.hSliderGain = QSlider(Qt.Horizontal)
        self.hSliderGain.setMaximumWidth(80)
        self.gainBox = QSpinBox()
        self.gainBox.setMaximumWidth(60)
        self.gainBox.setStyleSheet('font :bold  8pt')
        self.gainBox.setMaximumWidth(120)

        hboxGain = QHBoxLayout()
        hboxGain.setContentsMargins(5, 0, 0, 0)
        hboxGain.setSpacing(10)
        vboxGain = QVBoxLayout()
        vboxGain.setSpacing(0)
        vboxGain.addWidget(self.labelGain)

        hboxGain.addWidget(self.hSliderGain)
        hboxGain.addWidget(self.gainBox)
        vboxGain.addLayout(hboxGain)
        vboxGain.setSizeConstraint(QtGui.QLayout.SetFixedSize)
        vboxGain.setContentsMargins(5, 5, 0, 0)

        self.widgetGain = QWidget(self)
        self.widgetGain.setLayout(vboxGain)
        self.dockGain = QDockWidget(self)
        self.dockGain.setWidget(self.widgetGain)

        # self.TrigSoft=QPushButton('Trig Soft',self)
        # self.TrigSoft.setMaximumWidth(100)
        # self.vbox1.addWidget(self.TrigSoft)

        # self.vbox1.addStretch(1)
        # self.cameraWidget.setLayout(self.vbox1)
        # self.cameraWidget.setMinimumSize(150,200)
        # self.cameraWidget.setMaximumSize(200,900)

        hMainLayout = QHBoxLayout()

        if self.light == False:
            #from visu.visual2 import SEE
            from visu import SEE2
            self.visualisation = SEE2(
                name=self.nbcam, **self.kwds
            )  ## Widget for visualisation and tools  self.confVisu permet d'avoir plusieurs camera et donc plusieurs fichier ini de visualisation
            self.visualisation.setWindowTitle('Visualization    ' +
                                              self.cameraType + "   " +
                                              self.ccdName + '       v.' +
                                              self.version)
            if self.separate == True:
                print('ici')
                self.vbox2 = QVBoxLayout()
                self.vbox2.addWidget(self.visualisation)
                if self.aff == 'left':
                    hMainLayout.addLayout(self.vbox2)
                    hMainLayout.addWidget(self.cameraWidget)
                else:
                    hMainLayout.addWidget(self.cameraWidget)
                    hMainLayout.addLayout(self.vbox2)
            else:

                self.dockControl.setTitleBarWidget(
                    QWidget())  # to avoid tittle

                #self.dockControl.setFeatures(QDockWidget.DockWidgetMovable)
                self.visualisation.addDockWidget(Qt.TopDockWidgetArea,
                                                 self.dockControl)
                self.dockTrig.setTitleBarWidget(QWidget())
                self.visualisation.addDockWidget(Qt.TopDockWidgetArea,
                                                 self.dockTrig)
                self.dockShutter.setTitleBarWidget(QWidget())
                self.visualisation.addDockWidget(Qt.TopDockWidgetArea,
                                                 self.dockShutter)
                self.dockGain.setTitleBarWidget(QWidget())
                self.visualisation.addDockWidget(Qt.TopDockWidgetArea,
                                                 self.dockGain)
                hMainLayout.addWidget(self.visualisation)

        else:
            from visu import SEELIGHT
            self.visualisation = SEELIGHT(confpath=self.confPath,
                                          name=self.nbcam,
                                          **self.kwds)
            self.visualisation.hbox0.addWidget(self.cameraWidget)
            hMainLayout.addWidget(self.visualisation)

        self.setLayout(hMainLayout)
        self.setContentsMargins(0, 0, 0, 0)
        #self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) # set window on the top
        #self.activateWindow()
        #self.raise_()
        #self.showNormal()

    def actionButton(self):
        '''action when button are pressed
        '''
        self.runButton.clicked.connect(self.acquireMultiImage)
        self.snapButton.clicked.connect(self.acquireOneImage)
        self.stopButton.clicked.connect(self.stopAcq)
        self.shutterBox.editingFinished.connect(self.shutter)
        self.hSliderShutter.sliderReleased.connect(self.mSliderShutter)

        self.gainBox.editingFinished.connect(self.gain)
        self.hSliderGain.sliderReleased.connect(self.mSliderGain)
        self.trigg.currentIndexChanged.connect(self.trigger)
        self.CAM.newData.connect(self.Display)  #,QtCore.Qt.DirectConnection)
        # self.TrigSoft.clicked.connect(self.softTrigger)

    def oneImage(self):
        #self.nbShot=1
        self.acquireOneImage()

    def nbShotAction(self):
        '''
        number of snapShot
        '''
        nbShot, ok = QInputDialog.getInt(self, 'Number of SnapShot ',
                                         'Enter the number of snapShot ')
        if ok:
            self.nbShot = int(nbShot)
            if self.nbShot <= 0:
                self.nbShot = 1

    def wait(self, seconds):
        time_end = time.time() + seconds
        while time.time() < time_end:
            QtGui.QApplication.processEvents()

    def Display(self, data):
        '''Display data with visualisation module
        
        '''
        if self.multi == True:
            self.wait(0.1)

        self.data = data  #np.rot90(data,1)
        self.visualisation.newDataReceived(self.data)
        self.imageReceived = True
        self.datareceived.emit(True)
        if self.CAM.camIsRunnig == False:
            self.stopAcq()

    def shutter(self):
        '''
        set exposure time 
        '''

        sh = self.shutterBox.value()  #
        self.hSliderShutter.setValue(sh)  # set value of slider
        time.sleep(0.1)
        self.CAM.setExposure(sh)  # Set shutter CCD in ms
        self.conf.setValue(self.nbcam + "/shutter", float(sh))
        self.CAM.camParameter["exposureTime"] = sh
        self.conf.sync()

    def mSliderShutter(self):  # for shutter slider
        sh = self.hSliderShutter.value()
        self.shutterBox.setValue(sh)  #
        self.CAM.setExposure(sh)  # Set shutter CCD in ms
        self.conf.setValue(self.nbcam + "/shutter", float(sh))
        self.CAM.camParameter["exposureTime"] = sh
        # self.conf.sync()

    def gain(self):
        '''
        set gain
        '''
        g = self.gainBox.value()  #
        self.hSliderGain.setValue(g)  # set slider value
        time.sleep(0.1)
        self.CAM.setGain(g)
        self.conf.setValue(self.nbcam + "/gain", float(g))
        self.conf.sync()

    def mSliderGain(self):
        '''
        set slider

        '''
        g = self.hSliderGain.value()
        self.gainBox.setValue(g)  # set valeur de la box
        time.sleep(0.1)
        self.CAM.setGain(g)
        self.conf.setValue(self.nbcam + "/gain", float(g))
        self.conf.sync()

    def trigger(self):
        ''' select trigger mode
         trigger on
         trigger off
        '''
        self.itrig = self.trigg.currentIndex()

        if self.itrig == 1:
            self.CAM.setTrigger("on")
        else:
            self.CAM.setTrigger("off")

    def acquireOneImage(self):
        '''Start on acquisition
        '''
        self.imageReceived = False
        self.runButton.setEnabled(False)
        self.runButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconPlay, self.iconPlay))
        self.snapButton.setEnabled(False)
        self.snapButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color:gray}"
            % (self.iconSnap, self.iconSnap))
        self.stopButton.setEnabled(True)
        self.stopButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconStop, self.iconStop))
        self.trigg.setEnabled(False)

        self.CAM.startOneAcq(self.nbShot)

    def acquireMultiImage(self):
        ''' 
            start the acquisition thread
        '''

        self.runButton.setEnabled(False)
        self.runButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconPlay, self.iconPlay))
        self.snapButton.setEnabled(False)
        self.snapButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconSnap, self.iconSnap))
        self.stopButton.setEnabled(True)
        self.stopButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconStop, self.iconStop))
        self.trigg.setEnabled(False)

        self.CAM.startAcq()  # start mutli image acquisition thread

    def stopAcq(self):
        '''Stop  acquisition
        '''
        if self.isConnected == True:
            self.CAM.stopAcq()

        self.runButton.setEnabled(True)
        self.runButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconPlay, self.iconPlay))
        self.snapButton.setEnabled(True)
        self.snapButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconSnap, self.iconSnap))

        self.stopButton.setEnabled(False)
        self.stopButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconStop, self.iconStop))
        self.trigg.setEnabled(True)

    def close(self):
        if self.isConnected == True:
            self.CAM.closeCamera()

    def closeEvent(self, event):
        ''' closing window event (cross button)
        '''
        if self.isConnected == True:
            self.stopAcq()
            time.sleep(0.1)
            self.close()
class CAMERAMOTOR(QWidget):
    datareceived = QtCore.pyqtSignal(bool)  # signal emited when receive image

    def __init__(self, cam=None, confFile='confCamera.ini', **kwds):
        '''
        Parameters
        ----------
        cam : TYPE str, optional
            DESCRIPTION. 
                cam='choose' : generate a input dialog box which the list of all the camera connected (allied,basler,imagingSource) 
                cam='cam1' : open the camera by the ID and type save in the confFile.ini 
                ncam='menu': generate a input dialog box with a menu with all the camera name present in the .ini file
                cam='firstGuppy' open the first allied vision camera
                cam='firstBasler' open the first Basler camera
                cam='firstImgSource' open the first ImagingSource camera
            The default is 'choose'.
        confFile : TYPE str, optional
            DESCRIPTION. 
                confFile= path to file.initr
                The default is 'confCamera.ini'.
        **kwds:
            affLight : TYPE boolean, optional
                DESCRIPTION.
                    affLight=False all the option are show for the visualisation
                    affLight= True only few option (save  open cross)
                    The default is True.
            multi add time sleep to access QApplication.processEvents() 
            + all kwds of VISU class
            
        '''

        super(CAMERAMOTOR, self).__init__()

        p = pathlib.Path(__file__)
        self.nbcam = cam
        self.maxMvtY = 500
        self.maxMvtX = 500

        self.nbImage = 0
        self.kwds = kwds

        if "confPath" in kwds:
            self.conf = QtCore.QSettings(kwds["confPath"],
                                         QtCore.QSettings.IniFormat)

        else:
            print('path', str(p.parent / confFile))
            self.conf = QtCore.QSettings(str(
                p.parent / confFile), QtCore.QSettings.IniFormat)  # ini file
        # self.confPath=str(p.parent / confFile) # ini file path

        if "conf" in kwds:
            self.conf = kwds["conf"]

        self.kwds["conf"] = self.conf

        if "affLight" in kwds:
            self.light = kwds["affLight"]
        else:
            self.light = True
        if "multi" in kwds:
            self.multi = kwds["multi"]
        else:
            self.multi = False

        if "separate" in kwds:
            self.separate = kwds["separate"]
        else:
            self.separate = True

        if "aff" in kwds:  #  affi of Visu
            self.aff = kwds["aff"]
        else:
            self.aff = "right"

        if "loop" in kwds:  #  affi of Visu
            self.loop = kwds["loop"]
            self.kwds["roiCross"] = True  # set circle on visu cross
        else:
            self.loop = False

        if "nbLoop" in kwds:
            self.nbImageMax = kwds["nbLoop"]
        else:
            self.nbImageMax = 3

        # Si les moteurs ne sont pas renseignés on prend ceux renseigné dans le fichier ini de la cam
        if "motLat" in kwds:
            self.motLat = kwds["motLat"]
        else:
            self.motLat = (self.conf.value(self.nbcam + "/motLat"))
        if "motVert" in kwds:
            self.motVert = kwds["motVert"]
        else:
            self.motVert = (self.conf.value(self.nbcam + "/motVert"))
        if "motorTypeName0" in kwds:
            self.motorTypeName0 = kwds["motorTypeName0"]
        else:
            self.motorTypeName0 = (self.conf.value(self.nbcam +
                                                   "/motorTypeName0"))
        if "motorTypeName1" in kwds:
            self.motorTypeName1 = kwds["motorTypeName1"]
        else:
            self.motorTypeName1 = (self.conf.value(self.nbcam +
                                                   "/motorTypeName1"))

        self.motor = TILTMOTORGUI(motLat=self.motLat,
                                  motorTypeName0=self.motorTypeName0,
                                  motVert=self.motVert,
                                  motorTypeName1=self.motorTypeName1,
                                  nomWin='',
                                  nomTilt='',
                                  unit=1,
                                  jogValue=100)
        self.motor.startThread2()

        # self.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5()) # qdarkstyle :  black windows style

        sepa = os.sep
        self.icon = str(p.parent) + sepa + 'icons' + sepa
        self.setWindowIcon(QIcon(self.icon + 'LOA.png'))
        self.iconPlay = self.icon + 'Play.png'
        self.iconSnap = self.icon + 'Snap.png'
        self.iconStop = self.icon + 'Stop.png'
        self.iconPlay = pathlib.Path(self.iconPlay)
        self.iconPlay = pathlib.PurePosixPath(self.iconPlay)
        self.iconStop = pathlib.Path(self.iconStop)
        self.iconStop = pathlib.PurePosixPath(self.iconStop)
        self.iconSnap = pathlib.Path(self.iconSnap)
        self.iconSnap = pathlib.PurePosixPath(self.iconSnap)
        self.nbShot = 1
        self.isConnected = False
        self.version = str(__version__)
        self.pasY = float(self.conf.value(self.nbcam + "/pasY"))
        self.pasX = float(self.conf.value(self.nbcam + "/pasX"))

        self.openCam()
        self.kwds["name"] = self.nbcam
        self.setup()
        self.setCamPara()
        self.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
        self.xr = int(self.conf.value(self.nbcam + "/xc"))
        self.yr = int(self.conf.value(self.nbcam + "/yc"))
        self.xlim = int(self.conf.value(self.nbcam + "/rx")) / 2
        self.ylim = int(self.conf.value(self.nbcam + "/ry")) / 2
        self.Xec = []
        self.Yec = []
        self.vLine = pg.InfiniteLine(angle=90, movable=True, pen='b')
        self.hLine = pg.InfiniteLine(angle=0, movable=True, pen='b')

    def openID(self):
        '''
        open a camera by id camera typ and ID must be known and saved in the ini file 

        '''
        self.ccdName = self.conf.value(self.nbcam + "/nameCDD")
        self.cameraType = self.conf.value(self.nbcam + "/camType")
        self.camID = self.conf.value(self.nbcam + "/camId")

        if self.cameraType == "guppy":
            try:
                import guppyCam
                self.CAM = guppyCam.GUPPY(cam=self.nbcam, **self.kwds)
                self.CAM.openCamByID(self.camID)
                self.isConnected = self.CAM.isConnected
            except:
                print(
                    "no allied vision camera detected or vimba is not installed"
                )
                pass
        if self.cameraType == "allied":
            try:

                import alliedCam

                self.CAM = alliedCam.ALLIEDVISION(cam=self.nbcam,
                                                  conf=self.conf)
                self.CAM.openCamByID(self.camID)
                self.isConnected = self.CAM.isConnected
            except:
                print(
                    "no allied vision camera detected or vimba is not installed"
                )
                pass
        elif self.cameraType == "basler":
            try:
                import baslerCam
                self.CAM = baslerCam.BASLER(cam=self.nbcam, **self.kwds)
                self.CAM.openCamByID(self.camID)
                self.isConnected = self.CAM.isConnected
            except:
                print("no basler camera detected or pypylon is not installed")
                pass

        elif self.cameraType == "imgSource":

            try:
                import ImgSourceCamCallBack
                self.CAM = ImgSourceCamCallBack.IMGSOURCE(cam=self.nbcam,
                                                          **self.kwds)
                self.CAM.openCamByID(self.camID)
                # print('openID',self.camID)
                self.isConnected = self.CAM.isConnected
            except:
                print(
                    "no imaging source camera detected or Tisgrabber is not installed"
                )
                pass
        elif self.cameraType == "pixelink":

            try:
                import pixelinkCam

                self.CAM = pixelinkCam.PIXELINK(cam=self.nbcam, **self.kwds)

                self.CAM.openCamByID(self.camID)

                self.isConnected = self.CAM.isConnected
            except:
                print(
                    "no pixellink camera detected or pillelink dll  is not installed"
                )
                pass

        elif self.cameraType == "ids":

            try:
                import idsCam
                self.CAM = idsCam.IDS(cam=self.nbcam,
                                      conf=self.conf,
                                      **self.kwds)
                self.CAM.openCamByID(self.camID)
                self.isConnected = self.CAM.isConnected
            except:
                print(
                    "no imaging source camera detected or Tisgrabber is not installed"
                )
                pass
        else:
            print('no camera')
            self.isConnected = False
            self.ccdName = "no camera"
            self.cameraType = ""
            self.camID = ""
            self.nbcam = 'camDefault'

    def openCam(self):
        '''open a camera with different way  
        '''

        if self.nbcam == "choose":  # create menu widget with all camera present

            self.nbcam = 'camDefault'
            try:
                import guppyCam
                self.itemsGuppy = guppyCam.camAvailable()
                # print(self.itemsGuppy)
                self.lenGuppy = len(self.itemsGuppy)

            except:
                print('No allied vision camera connected')
                self.itemsGuppy = []
                self.lenGuppy = 0
                pass
            try:
                import baslerCam
                self.itemsBasler = baslerCam.camAvailable()
                self.lenBasler = len(self.itemsBasler)

            except:
                print('No Basler camera connected')
                self.itemsBasler = []
                self.lenBasler = 0
                pass

            try:
                import ImgSourceCamCallBack
                self.itemsImgSource = ImgSourceCamCallBack.camAvailable()
                self.lenImgSource = len(self.itemsImgSource)

            except:
                print('No ImagingSource camera connected')
                self.itemsImgSource = []
                self.lenImgSource = 0
                pass

            try:
                import pixelinkCam
                self.itemsPixelink = pixelinkCam.PIXELINK.camAvailable()
                self.lenImgPixelink = len(self.itemsPixelink)

            except:
                print('No pixelink camera connected')
                self.itemsPixelink = []
                self.lenPixelink = 0
                pass

            items = self.itemsGuppy + list(
                self.itemsBasler) + self.itemsImgSource + self.itemsPixelink

            item, ok = QInputDialog.getItem(
                self,
                "Select a camera",
                "List of avaible camera",
                items,
                0,
                False,
                flags=QtCore.Qt.WindowStaysOnTopHint)

            if ok and item:

                indexItem = items.index(item)

                if indexItem < self.lenGuppy:
                    indexItem = indexItem
                    self.cameraType = "guppy"
                    self.camID = guppyCam.getCamID(indexItem)

                    self.CAM = guppyCam.GUPPY(cam=self.nbcam, **self.kwds)
                    self.CAM.openCamByID(self.camID)
                    self.isConnected = self.CAM.isConnected
                    self.ccdName = self.camID
                elif indexItem >= self.lenGuppy and indexItem < self.lenBasler + self.lenGuppy:
                    indexItem = indexItem - self.lenGuppy
                    self.cameraType = "basler"
                    self.camID = baslerCam.getCamID(indexItem)
                    self.CAM = baslerCam.BASLER(cam=self.nbcam, **self.kwds)
                    self.CAM.openCamByID(self.camID)
                    self.isConnected = self.CAM.isConnected
                    self.ccdName = self.camID

                elif indexItem >= self.lenBasler + self.lenGuppy and indexItem < self.lenBasler + self.lenGuppy + self.lenImgSource:
                    indexItem = indexItem - self.lenGuppy - self.lenBasler
                    self.cameraType = "imgSource"
                    self.camID = ImgSourceCamCallBack.getCamID(indexItem)
                    self.camID = self.camID.decode()
                    self.CAM = ImgSourceCamCallBack.IMGSOURCE(cam=self.nbcam,
                                                              **self.kwds)
                    self.CAM.openCamByID(self.camID)
                    self.isConnected = self.CAM.isConnected
                    self.ccdName = self.camID

                elif indexItem >= self.lenBasler + self.lenGuppy + self.lenImgSource and indexItem < self.lenBasler + self.lenGuppy + self.lenImgSource + self.lenPixelink:
                    indexItem = indexItem - self.lenGuppy - self.lenBasler - self.lenImgSource
                    self.cameraType = "pixelink"
                    self.camID = pixelinkCam.getCamID(indexItem)

                    self.CAM = pixelinkCam.PIXELINK(cam=self.nbcam,
                                                    **self.kwds)
                    self.CAM.openCamByID(self.camID)
                    self.isConnected = self.CAM.isConnected
                    self.ccdName = self.camID

                else:
                    self.isconnected = False
                    print('No camera choosen')
                    self.ccdName = "no camera"
                    self.nbcam = 'camDefault'
            else:
                self.isconnected = False
                print('No camera choosen')
                self.ccdName = "no camera"
                self.cameraType = ""
                self.camID = ""
                self.nbcam = 'camDefault'

        elif self.nbcam == None:
            self.isconnected = False
            print('No camera')
            self.ccdName = "no camera"
            self.cameraType = ""
            self.camID = ""
            self.nbcam = 'camDefault'

        elif self.nbcam == "firstGuppy":  # open the first guppy cam in the list
            self.nbcam = 'camDefault'
            self.cameraType = "guppy"
            self.ccdName = 'First guppy Cam'
            import guppyCam
            self.CAM = guppyCam.GUPPY(cam=self.nbcam, **self.kwds)
            self.CAM.openFirstCam()
            self.isConnected = self.CAM.isConnected
        elif self.nbcam == "firstAllied":  # open the first guppy cam in the list
            self.nbcam = 'camDefault'

            self.cameraType = "allied"
            self.ccdName = 'First allied Cam'
            import alliedCam3

            self.CAM = alliedCam3.ALLIEDVISION(cam=self.nbcam, conf=self.conf)
            self.CAM.openFirstCam()
            self.isConnected = self.CAM.isConnected
        elif self.nbcam == "firstBasler":  # open the first basler cam in the list
            self.ccdName = 'First basler Cam'
            self.nbcam = 'camDefault'
            self.cameraType = "basler"
            import baslerCam
            self.CAM = baslerCam.BASLER(cam=self.nbcam, **self.kwds)
            self.CAM.openFirstCam()
            self.isConnected = self.CAM.isConnected

        elif self.nbcam == "firstImgSource":  # open the first imgSource cam in the list
            self.ccdName = 'First ImSource Cam'
            self.nbcam = 'camDefault'
            self.cameraType = "imgSource"
            import ImgSourceCamCallBack
            self.CAM = ImgSourceCamCallBack.IMGSOURCE(cam=self.nbcam,
                                                      **self.kwds)
            self.CAM.openFirstCam()
            self.isConnected = self.CAM.isConnected

        elif self.nbcam == "firstPixelink":  # open the first pixelink cam in the list
            self.ccdName = 'First Pixelink Cam'
            self.nbcam = 'camDefault'
            self.cameraType = "pixelink"
            import pixelinkCam
            self.CAM = pixelinkCam.PIXELINK(cam=self.nbcam, **self.kwds)
            self.CAM.openFirstCam()
            self.isConnected = self.CAM.isConnected

        elif self.nbcam == "firstIds":  # open the first guppy cam in the list
            self.nbcam = 'camDefault'

            self.cameraType = "ids"
            self.ccdName = 'First ids Cam'
            import idsCam

            self.CAM = idsCam.IDS(cam=self.nbcam, conf=self.conf)
            self.CAM.openFirstCam()
            self.isConnected = self.CAM.isConnected
        elif self.nbcam == 'menu':  # Qdialog with a menu with all the camera name present in the inifile
            self.groupsName = []
            self.groups = self.conf.childGroups()
            for groups in self.groups:
                self.groupsName.append(self.conf.value(groups + "/nameCDD"))
            item, ok = QInputDialog.getItem(
                self,
                "Select a camera",
                "List of avaible camera",
                self.groupsName,
                0,
                False,
                flags=QtCore.Qt.WindowStaysOnTopHint)
            if ok and item:
                indexItem = self.groupsName.index(item)
                self.nbcam = self.groups[indexItem]
                self.openID()

        else:  #open the camera by ID : nbcam return ID of the ini file
            try:
                self.openID()
            except:
                self.isConnected = False

    def setCamPara(self):
        '''set min max gain and exp value of cam in the widget
        '''
        # print("connected",self.isConnected)
        if self.isConnected == True:  # if camera is connected we address min and max value  and value to the shutter and gain box
            # print('camshutter',self.CAM.camParameter["exposureTime"])
            if self.CAM.camParameter[
                    "expMax"] > 1500:  # we limit exposure time at 1500ms
                self.hSliderShutter.setMaximum(1500)
                self.shutterBox.setMaximum(1500)
            else:
                self.hSliderShutter.setMaximum(self.CAM.camParameter["expMax"])
                self.shutterBox.setMaximum(self.CAM.camParameter["expMax"])
            self.hSliderShutter.setValue(
                int(self.CAM.camParameter["exposureTime"]))
            self.shutterBox.setValue(int(
                self.CAM.camParameter["exposureTime"]))
            self.hSliderShutter.setMinimum(
                int(self.CAM.camParameter["expMin"] + 1))
            self.shutterBox.setMinimum(int(self.CAM.camParameter["expMin"] +
                                           1))

            self.hSliderGain.setMinimum(self.CAM.camParameter["gainMin"])
            self.hSliderGain.setMaximum(self.CAM.camParameter["gainMax"])
            self.hSliderGain.setValue(self.CAM.camParameter["gain"])
            self.gainBox.setMinimum(self.CAM.camParameter["gainMin"])
            self.gainBox.setMaximum(self.CAM.camParameter["gainMax"])
            self.gainBox.setValue(self.CAM.camParameter["gain"])

            self.actionButton()

        if self.isConnected == False:
            self.setWindowTitle(
                'Visualization         No camera connected      ' + 'v.  ' +
                self.version)
            self.runButton.setEnabled(False)
            self.snapButton.setEnabled(False)
            self.trigg.setEnabled(False)
            self.hSliderShutter.setEnabled(False)
            self.shutterBox.setEnabled(False)
            self.gainBox.setEnabled(False)
            self.hSliderGain.setEnabled(False)
            self.runButton.setStyleSheet(
                "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
                "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
                % (self.iconPlay, self.iconPlay))
            self.snapButton.setStyleSheet(
                "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
                "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
                % (self.iconSnap, self.iconSnap))

    def setup(self):
        """ user interface definition 
            """
        self.setWindowTitle('Visualization    ' + self.cameraType + "   " +
                            self.ccdName + '       v.' + self.version)

        hbox1 = QHBoxLayout()  # horizontal layout pour run snap stop
        self.sizebuttonMax = 30
        self.sizebuttonMin = 30
        self.runButton = QToolButton(self)
        self.runButton.setMaximumWidth(self.sizebuttonMax)
        self.runButton.setMinimumWidth(self.sizebuttonMax)
        self.runButton.setMaximumHeight(self.sizebuttonMax)
        self.runButton.setMinimumHeight(self.sizebuttonMax)
        self.runButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: green;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconPlay, self.iconPlay))

        self.snapButton = QToolButton(self)
        self.snapButton.setPopupMode(0)
        menu = QMenu()
        #menu.addAction('acq',self.oneImage)
        menu.addAction('set nb of shot', self.nbShotAction)
        self.snapButton.setMenu(menu)
        self.snapButton.setMaximumWidth(self.sizebuttonMax)
        self.snapButton.setMinimumWidth(self.sizebuttonMax)
        self.snapButton.setMaximumHeight(self.sizebuttonMax)
        self.snapButton.setMinimumHeight(self.sizebuttonMax)
        self.snapButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: green;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconSnap, self.iconSnap))

        self.stopButton = QToolButton(self)

        self.stopButton.setMaximumWidth(self.sizebuttonMax)
        self.stopButton.setMinimumWidth(self.sizebuttonMax)
        self.stopButton.setMaximumHeight(self.sizebuttonMax)
        self.stopButton.setMinimumHeight(self.sizebuttonMax)
        self.stopButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconStop, self.iconStop))
        self.stopButton.setEnabled(False)

        hbox1.addWidget(self.runButton)
        hbox1.addWidget(self.snapButton)
        hbox1.addWidget(self.stopButton)
        hbox1.setSizeConstraint(QtGui.QLayout.SetFixedSize)
        hbox1.setContentsMargins(0, 10, 0, 10)
        self.widgetControl = QWidget(self)

        self.widgetControl.setLayout(hbox1)
        self.dockControl = QDockWidget(self)
        self.dockControl.setWidget(self.widgetControl)
        self.dockControl.resize(80, 80)

        self.trigg = QComboBox()
        self.trigg.setMaximumWidth(70)
        self.trigg.addItem('OFF')
        self.trigg.addItem('ON')
        self.trigg.setStyleSheet('font :bold  8pt;color: white')
        self.labelTrigger = QLabel('Trig')
        self.labelTrigger.setMaximumWidth(60)
        self.labelTrigger.setStyleSheet('font :bold  8pt')
        self.itrig = self.trigg.currentIndex()

        hbox2 = QHBoxLayout()
        hbox2.setSizeConstraint(QtGui.QLayout.SetFixedSize)
        hbox2.setContentsMargins(5, 10, 0, 0)
        hbox2.addWidget(self.labelTrigger)

        hbox2.addWidget(self.trigg)
        self.widgetTrig = QWidget(self)

        self.widgetTrig.setLayout(hbox2)
        self.dockTrig = QDockWidget(self)
        self.dockTrig.setWidget(self.widgetTrig)

        self.labelExp = QLabel('Exp(ms)')
        self.labelExp.setStyleSheet('font :bold  10pt')
        self.labelExp.setMaximumWidth(140)
        self.labelExp.setAlignment(Qt.AlignCenter)

        self.hSliderShutter = QSlider(Qt.Horizontal)
        self.hSliderShutter.setMaximumWidth(50)
        self.shutterBox = QSpinBox()
        self.shutterBox.setStyleSheet('font :bold  8pt')
        self.shutterBox.setMaximumWidth(120)

        hboxShutter = QHBoxLayout()
        hboxShutter.setContentsMargins(5, 0, 0, 0)
        hboxShutter.setSpacing(10)
        vboxShutter = QVBoxLayout()
        vboxShutter.setSpacing(0)
        vboxShutter.addWidget(self.labelExp)  #,Qt.AlignLef)

        hboxShutter.addWidget(self.hSliderShutter)
        hboxShutter.addWidget(self.shutterBox)
        vboxShutter.addLayout(hboxShutter)
        vboxShutter.setSizeConstraint(QtGui.QLayout.SetFixedSize)
        vboxShutter.setContentsMargins(5, 0, 0, 0)

        self.widgetShutter = QWidget(self)

        self.widgetShutter.setLayout(vboxShutter)
        self.dockShutter = QDockWidget(self)
        self.dockShutter.setWidget(self.widgetShutter)

        self.labelGain = QLabel('Gain')
        self.labelGain.setStyleSheet('font :bold  10pt')
        self.labelGain.setMaximumWidth(100)
        self.labelGain.setAlignment(Qt.AlignCenter)

        self.hSliderGain = QSlider(Qt.Horizontal)
        self.hSliderGain.setMaximumWidth(50)
        self.gainBox = QSpinBox()
        self.gainBox.setMaximumWidth(60)
        self.gainBox.setStyleSheet('font :bold  8pt')
        self.gainBox.setMaximumWidth(60)

        hboxGain = QHBoxLayout()
        hboxGain.setContentsMargins(5, 0, 0, 0)
        hboxGain.setSpacing(10)
        vboxGain = QVBoxLayout()
        vboxGain.setSpacing(0)
        vboxGain.addWidget(self.labelGain)

        hboxGain.addWidget(self.hSliderGain)
        hboxGain.addWidget(self.gainBox)
        vboxGain.addLayout(hboxGain)
        vboxGain.setSizeConstraint(QtGui.QLayout.SetFixedSize)
        vboxGain.setContentsMargins(5, 5, 0, 0)

        self.widgetGain = QWidget(self)
        self.widgetGain.setLayout(vboxGain)
        self.dockGain = QDockWidget(self)
        self.dockGain.setWidget(self.widgetGain)

        # self.TrigSoft=QPushButton('Trig Soft',self)
        # self.TrigSoft.setMaximumWidth(100)
        # self.vbox1.addWidget(self.TrigSoft)

        # self.vbox1.addStretch(1)
        # self.cameraWidget.setLayout(self.vbox1)
        # self.cameraWidget.setMinimumSize(150,200)
        # self.cameraWidget.setMaximumSize(200,900)

        hMainLayout = QHBoxLayout()

        if self.light == False:
            #from visu.visual2 import SEE
            from visu import SEE2

            self.visualisation = SEE2(
                **self.kwds
            )  ## Widget for visualisation and tools  self.confVisu permet d'avoir plusieurs camera et donc plusieurs fichier ini de visualisation

        else:
            from visu import visualLight2
            self.visualisation = visualLight2.SEELIGHT(**self.kwds)

        self.visualisation.setWindowTitle('Visualization    ' +
                                          self.cameraType + "   " +
                                          self.ccdName + '       v.' +
                                          self.version)

        self.dockControl.setTitleBarWidget(QWidget())
        self.dockTrig.setTitleBarWidget(QWidget())
        self.dockShutter.setTitleBarWidget(QWidget())
        self.dockGain.setTitleBarWidget(QWidget())

        MotorLayout = QVBoxLayout()
        MotorLayout.addStretch(1)
        MotorLayout.addWidget(self.motor)
        MotorLayout.addStretch(1)

        if self.separate == True:

            self.dockMotor = QDockWidget(self)
            self.dockMotor.setTitleBarWidget(QWidget())
            self.WidgetMotor = QWidget()
            #self.WidgetMotor.setStyleSheet("border : blue ")
            self.WidgetMotor.setLayout(MotorLayout)

            self.dockMotor.setWidget(self.WidgetMotor)

            hbox1.setContentsMargins(0, 10, 0, 0)
            hbox2.setContentsMargins(0, 10, 0, 5)
            hboxShutter.setContentsMargins(0, 5, 0, 5)
            hboxGain.setContentsMargins(0, 5, 0, 5)

            if self.aff == 'left':
                # to avoid tittle
                #self.dockControl.setFeatures(QDockWidget.DockWidgetMovable)
                self.visualisation.addDockWidget(Qt.LeftDockWidgetArea,
                                                 self.dockControl)
                self.visualisation.addDockWidget(Qt.LeftDockWidgetArea,
                                                 self.dockTrig)
                self.visualisation.addDockWidget(Qt.LeftDockWidgetArea,
                                                 self.dockShutter)
                self.visualisation.addDockWidget(Qt.LeftDockWidgetArea,
                                                 self.dockGain)
                self.visualisation.addDockWidget(Qt.LeftDockWidgetArea,
                                                 self.dockMotor)
            else:
                self.visualisation.addDockWidget(Qt.RightDockWidgetArea,
                                                 self.dockControl)
                self.visualisation.addDockWidget(Qt.RightDockWidgetArea,
                                                 self.dockTrig)
                self.visualisation.addDockWidget(Qt.RightDockWidgetArea,
                                                 self.dockShutter)
                self.visualisation.addDockWidget(Qt.RightDockWidgetArea,
                                                 self.dockGain)
                self.visualisation.addDockWidget(Qt.RightDockWidgetArea,
                                                 self.dockMotor)

            hMainLayout.addWidget(self.visualisation)
        else:

            # to avoid tittle
            #self.dockControl.setFeatures(QDockWidget.DockWidgetMovable)
            self.visualisation.addDockWidget(Qt.TopDockWidgetArea,
                                             self.dockControl)
            self.visualisation.addDockWidget(Qt.TopDockWidgetArea,
                                             self.dockTrig)
            self.visualisation.addDockWidget(Qt.TopDockWidgetArea,
                                             self.dockShutter)
            self.visualisation.addDockWidget(Qt.TopDockWidgetArea,
                                             self.dockGain)
            hMainLayout.addWidget(self.visualisation)
            hMainLayout.addLayout(MotorLayout)

        if self.loop == True:
            self.hloopLayout = QHBoxLayout()
            self.closeLoop = QCheckBox('Close Loop')
            self.hloopLayout.addWidget(self.closeLoop)
            self.closeLoopRadio = QRadioButton()
            self.closeLoopRadio.setStyleSheet(
                "QRadioButton::indicator:checked{background-color: red ;border-color: red }"
            )
            self.hloopLayout.addWidget(self.closeLoopRadio)
            MotorLayout.addLayout(self.hloopLayout)
            MotorLayout.addStretch(1)
        MotorLayout.setContentsMargins(0, 0, 0, 0)

        hMainLayout.setContentsMargins(1, 0, 0, 0)
        self.setLayout(hMainLayout)
        self.setContentsMargins(0, 0, 2, 0)

        #self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) # set window on the top
        #self.activateWindow()
        #self.raise_()
        #self.showNormal()

    def actionButton(self):
        '''action when button are pressed
        '''
        self.runButton.clicked.connect(self.acquireMultiImage)
        self.snapButton.clicked.connect(self.acquireOneImage)
        self.stopButton.clicked.connect(self.stopAcq)
        self.shutterBox.editingFinished.connect(self.shutter)
        self.hSliderShutter.sliderReleased.connect(self.mSliderShutter)

        self.gainBox.editingFinished.connect(self.gain)
        self.hSliderGain.sliderReleased.connect(self.mSliderGain)
        self.trigg.currentIndexChanged.connect(self.trigger)
        self.CAM.newData.connect(self.Display)  #,QtCore.Qt.DirectConnection)
        # self.TrigSoft.clicked.connect(self.softTrigger)
        if self.loop == True:
            self.closeLoop.stateChanged.connect(self.closeLoopState)

    def closeLoopState(self):
        if self.closeLoop.isChecked():
            self.visualisation.p1.addItem(self.vLine)
            self.visualisation.p1.addItem(self.hLine)
        else:
            self.visualisation.p1.removeItem(self.vLine)
            self.visualisation.p1.removeItem(self.hLine)

    def oneImage(self):
        #self.nbShot=1
        self.acquireOneImage()

    def nbShotAction(self):
        '''
        number of snapShot
        '''
        nbShot, ok = QInputDialog.getInt(self, 'Number of SnapShot ',
                                         'Enter the number of snapShot ')
        if ok:
            self.nbShot = int(nbShot)
            if self.nbShot <= 0:
                self.nbShot = 1

    def wait(self, seconds):
        time_end = time.time() + seconds
        while time.time() < time_end:
            QtGui.QApplication.processEvents()

    @pyqtSlot(object)
    def Display(self, data):
        '''Display data with visualisation module
        
        '''
        if self.multi == True:
            self.wait(0.1)

        self.data = data
        self.visualisation.newDataReceived(self.data)
        self.imageReceived = True
        self.datareceived.emit(True)
        time.sleep(0.01)
        if self.CAM.camIsRunnig == False:
            self.stopAcq()
        if self.loop == True:
            if self.closeLoop.isChecked():
                # position de la croix de reference:
                self.xr = self.visualisation.xc  #int(self.conf.value(self.CAM.nbcam+"/xc")) # point vise
                self.yr = self.visualisation.yc  #int(self.conf.value(self.CAM.nbcam+"/yc"))
                #taille du cercle
                self.xlim = self.visualisation.rx / 2  #int(self.conf.value(self.nbcam+"/rx"))/2 # taille cercle
                self.ylim = self.visualisation.ry / 2  #int(self.conf.value(self.nbcam+"/ry"))/2
                self.dimy = np.shape(self.data)[1]
                self.dimx = np.shape(self.data)[0]
                self.summ = round(data.sum(), 3)
                self.maxSum = self.dimy * self.dimx * 255 / 3  # si un trier de la camera sature
                self.maxx = round(self.data.max(), 3)

                dataF = gaussian_filter(self.data, 5)
                thresholded_image = np.copy(dataF)
                threshold = 0.1
                # remove possible offset
                minn = thresholded_image.min()  # remove any offset
                thresholded_image -= minn

                # remove all values less than threshold*max
                minn = int(self.maxx * threshold)
                np.place(thresholded_image, thresholded_image < minn, 0)

                #self.xec, self.yec= ndimage.center_of_mass(thresholded_image)
                (self.xec,
                 self.yec) = pylab.unravel_index(thresholded_image.argmax(),
                                                 self.data.shape)

                self.vLine.setPos(self.xec)

                self.hLine.setPos(self.yec)

                self.deltaX = int(self.xr) - int(self.xec)
                self.deltaY = int(self.yr) - int(self.yec)

                if self.maxx < 30 or self.summ > self.maxSum:
                    print('signal too low or too high')
                    self.nbImage = 0
                else:

                    self.closeLoopRadio.setChecked(True)
                    if (abs(self.deltaX) >= self.xlim or abs(self.deltaY) >
                            self.ylim) and self.nbImage == self.nbImageMax:

                        # print('xec',self.xec,self.yec,self.xr,self.yr)
                        self.deltaXMoy = int(self.xr) - int(np.mean(self.Xec))

                        if abs(self.deltaXMoy) >= self.xlim and (abs(
                                self.deltaXMoy) < self.maxMvtX):

                            print('X move the',
                                  time.strftime("%Y %m %d %H %M %S"), 'of ',
                                  self.deltaXMoy * self.pasX)
                            if self.motor.inv[0] == True:
                                self.motor.MOT[0].rmove(-self.deltaXMoy *
                                                        self.pasX)
                            else:
                                self.motor.MOT[0].rmove(self.deltaXMoy *
                                                        self.pasX)

                        self.deltaYMoy = int(self.yr) - int(np.mean(self.Yec))

                        if abs(self.deltaYMoy) > self.ylim and (abs(
                                self.deltaYMoy) < self.maxMvtY):

                            print('Y move the',
                                  time.strftime("%Y %m %d %H %M %S"), 'of',
                                  self.deltaYMoy * self.pasY)
                            if self.motor.inv[1] == True:
                                self.motor.MOT[1].rmove(-self.deltaMoy *
                                                        self.pasY)
                            else:
                                self.motor.MOT[1].rmove(self.deltaYMoy *
                                                        self.pasY)
                        self.nbImage = 0
                        self.Xec = []
                        self.Yec = []
                    elif (abs(self.deltaX) >= self.xlim or abs(self.deltaY) >
                          self.ylim) and self.nbImage < self.nbImageMax:
                        self.Xec.append(self.xec)
                        self.Yec.append(self.yec)

                        self.nbImage = self.nbImage + 1
                    else:
                        self.nbImage = 0
                        self.Xec = []
                        self.Yec = []
                        self.closeLoopRadio.setChecked(False)

            else:
                self.closeLoopRadio.setChecked(False)

    def shutter(self):
        '''
        set exposure time 
        '''
        sh = self.shutterBox.value()  #
        self.hSliderShutter.setValue(sh)  # set value of slider
        time.sleep(0.1)
        self.CAM.setExposure(sh)  # Set shutter CCD in ms
        self.conf.setValue(self.nbcam + "/shutter", float(sh))
        self.CAM.camParameter["exposureTime"] = sh
        self.conf.sync()

    def mSliderShutter(self):  # for shutter slider
        sh = self.hSliderShutter.value()
        self.shutterBox.setValue(sh)  #
        self.CAM.setExposure(sh)  # Set shutter CCD in ms
        self.conf.setValue(self.nbcam + "/shutter", float(sh))
        self.CAM.camParameter["exposureTime"] = sh
        # self.conf.sync()

    def gain(self):
        '''
        set gain
        '''
        g = self.gainBox.value()  #
        self.hSliderGain.setValue(g)  # set slider value
        time.sleep(0.1)
        self.CAM.setGain(g)
        self.conf.setValue(self.nbcam + "/gain", float(g))
        self.conf.sync()

    def mSliderGain(self):
        '''
        set slider

        '''
        g = self.hSliderGain.value()
        self.gainBox.setValue(g)  # set valeur de la box
        time.sleep(0.1)
        self.CAM.setGain(g)
        self.conf.setValue(self.nbcam + "/gain", float(g))
        self.conf.sync()

    def trigger(self):
        ''' select trigger mode
         trigger on
         trigger off
        '''
        self.itrig = self.trigg.currentIndex()

        if self.itrig == 1:
            self.CAM.setTrigger("on")
        else:
            self.CAM.setTrigger("off")

    def acquireOneImage(self):
        '''Start on acquisition
        '''
        self.imageReceived = False
        self.runButton.setEnabled(False)
        self.runButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconPlay, self.iconPlay))
        self.snapButton.setEnabled(False)
        self.snapButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color:gray}"
            % (self.iconSnap, self.iconSnap))
        self.stopButton.setEnabled(True)
        self.stopButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconStop, self.iconStop))
        self.trigg.setEnabled(False)

        self.CAM.startOneAcq(self.nbShot)

    def acquireMultiImage(self):
        ''' 
            start the acquisition thread
        '''

        self.runButton.setEnabled(False)
        self.runButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconPlay, self.iconPlay))
        self.snapButton.setEnabled(False)
        self.snapButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconSnap, self.iconSnap))
        self.stopButton.setEnabled(True)
        self.stopButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconStop, self.iconStop))
        self.trigg.setEnabled(False)

        self.CAM.startAcq()  # start mutli image acquisition thread

    def stopAcq(self):
        '''Stop  acquisition
        '''
        if self.isConnected == True:
            self.CAM.stopAcq()

        self.runButton.setEnabled(True)
        self.runButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconPlay, self.iconPlay))
        self.snapButton.setEnabled(True)
        self.snapButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconSnap, self.iconSnap))

        self.stopButton.setEnabled(False)
        self.stopButton.setStyleSheet(
            "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}"
            "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"
            % (self.iconStop, self.iconStop))
        self.trigg.setEnabled(True)

    def close(self):
        if self.isConnected == True:
            self.CAM.closeCamera()
        # self.motor.close()

    def closeEvent(self, event):
        ''' closing window event (cross button)
        '''
        if self.isConnected == True:
            self.stopAcq()
            time.sleep(0.1)
            self.close()
Beispiel #12
0
class MainForm(QMainWindow):
    areas = []
    toolBoxs = []
    tab = 0
    ui_ = None
    debugLevel = 100
    mPAreas = {}  # Almacena los nombre de submenus areas de menú pineboo
    mPModulos = {}  # Almacena los nombre de submenus modulos de menú pineboo
    openTabs = []
    favoritosW = None
    wid = None  # widget principal

    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)
        self.ui_ = None

    @classmethod
    def setDebugLevel(self, q):
        MainForm.debugLevel = q

    def load(self):

        self.ui_ = pineboolib.project.conn.managerModules().createUI(
            filedir('plugins/mainform/pineboo/mainform.ui'), None, self)

        self.w_ = self
        frameGm = self.frameGeometry()
        screen = QApplication.desktop().screenNumber(
            QApplication.desktop().cursor().pos())
        centerPoint = QApplication.desktop().screenGeometry(screen).center()
        frameGm.moveCenter(centerPoint)
        self.move(frameGm.topLeft())

        self.areasTab = QTabWidget()
        self.areasTab.setTabPosition(QTabWidget.West)
        self.formTab = QTabWidget()
        try:
            self.areasTab.removeItem = self.areasTab.removeTab
            self.areasTab.addItem = self.areasTab.addTab
        except Exception:
            pass

        self.dockAreasTab = QDockWidget()
        self.dockAreasTab.setWindowTitle("Módulos")
        #self.dockAreas = QtWidgets.QDockWidget()
        self.dockFavoritos = QDockWidget()
        self.dockFavoritos.setWindowTitle("Favoritos")

        self.dockForm = QDockWidget()

        self.dockConsole = None

        self.dockAreasTab.setWidget(self.areasTab)
        self.dockAreasTab.setMaximumWidth(400)
        self.dockFavoritos.setMaximumWidth(400)
        self.dockFavoritos.setMaximumHeight(500)
        # self.dockAreasTab.setMinimumWidth(400)
        # self.dockAreasTab.setMaximumHeight(500)

        self.dockForm.setWidget(self.formTab)

        self.addDockWidget(Qt.RightDockWidgetArea, self.dockForm)
        # self.dockForm.setMaximumWidth(950)
        self.addDockWidget(Qt.LeftDockWidgetArea, self.dockFavoritos)
        self.addDockWidget(Qt.LeftDockWidgetArea, self.dockAreasTab)
        # self.dockAreasTab.show()
        # self.dockForm.show()

        # self.areasTab.removeItem(0) #Borramos tab de ejemplo.

        self.formTab.setTabsClosable(True)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.formTab.tabCloseRequested[int].connect(self.closeFormTab)
        self.formTab.removeTab(0)
        #app_icon = QtGui.QIcon('share/icons/pineboo-logo-16.png')
        # app_icon.addFile(filedir('share/icons/pineboo-logo-16.png'),
        #                 QtCore.QSize(16, 16))
        # app_icon.addFile(filedir('share/icons/pineboo-logo-24.png'),
        #                 QtCore.QSize(24, 24))
        # app_icon.addFile(filedir('share/icons/pineboo-logo-32.png'),
        #                 QtCore.QSize(32, 32))
        # app_icon.addFile(filedir('share/icons/pineboo-logo-48.png'),
        #                 QtCore.QSize(48, 48))
        # app_icon.addFile(filedir('share/icons/pineboo-logo-64.png'),
        #                 QtCore.QSize(64, 64))
        # app_icon.addFile(filedir('share/icons/pineboo-logo-128.png'),
        #                 QtCore.QSize(128, 128))
        # app_icon.addFile(filedir('share/icons/pineboo-logo-256.png'),
        #                 QtCore.QSize(256, 256))
        # self.setWindowIcon(app_icon)
        self.setWindowIcon(QtGui.QIcon('share/icons/pineboo-logo-16.png'))
        self.actionAcercaQt.triggered.connect(pineboolib.project.aboutQt)
        self.actionAcercaPineboo.triggered.connect(pineboolib.project.aboutPineboo)
        self.actionFavoritos.triggered.connect(self.changeStateDockFavoritos)
        self.dockFavoritos.visibilityChanged.connect(self.changeStateActionFavoritos)
        self.actionModulos.triggered.connect(self.changeStateDockAreas)
        self.dockAreasTab.visibilityChanged.connect(self.changeStateActionAreas)
        self.actionTipografia.triggered.connect(pineboolib.project.chooseFont)
        self.menuPineboo.addSeparator()
        # self.actionEstilo.triggered.connect(pineboolib.main.styleDialog)
        # pineboolib.pnapplication.initStyle(self.configMenu)
        self.setWindowTitle("Pineboo")

        logger.info("Módulos y pestañas ...")
        for k, area in sorted(pineboolib.project.areas.items()):
            self.loadArea(area)
        for k, module in sorted(pineboolib.project.modules.items()):
            self.loadModule(module)

        # Cargando Area desarrollo si procede ...
        sett_ = FLSettings()
        if (sett_.readBoolEntry("application/isDebuggerMode", False)):
            areaDevelop = Struct(idarea="dvl", descripcion="Desarrollo")
            self.loadArea(areaDevelop)

            self.loadDevelop()

        self.restoreOpenedTabs()

        self.loadState()
        # Cargamos nombre de vertical
        util = FLUtil()
        verticalName = util.sqlSelect("flsettings", "valor", "flkey='verticalName'")
        cbPosInfo = util.sqlSelect("flsettings", "valor", "flkey='PosInfo'")

        statusText = ""

        if verticalName != None:
            statusText = verticalName

        if cbPosInfo == 'True':
            from pineboolib.pncontrolsfactory import SysType
            sys_ = SysType()
            statusText += "\t\t\t" + sys_.nameUser() + "@" + sys_.nameBD()

        self.statusBar().showMessage(statusText)

    def closeFormTab(self, numero):
        if isinstance(numero, str):
            i = 0
            name = numero
            numero = None
            for n in self.openTabs:
                if name == n:
                    numero = i
                    break
                i = i + 1

        if numero is not None:
            logger.debug("Cerrando pestaña número %s ", numero)
            self.formTab.removeTab(numero)

            i = 0
            for name in self.openTabs:
                if i == numero:
                    self.openTabs.remove(name)
                    break
                i = i + 1

    def addFormTab(self, action):
        widget = action.mainform_widget
        if action.name in self.openTabs:
            self.closeFormTab(action.name)
        logger.debug("Añadiendo Form a pestaña %s", action)
        icon = None
        try:
            icon = action.mod.mod.mainform.actions[action.name].icon
            self.formTab.addTab(widget, icon, widget.windowTitle())
        except Exception as e:
            logger.warning("addFormTab: No pude localizar icono para %s: %s", action.name, e)
            self.formTab.addTab(widget, widget.windowTitle())

        self.formTab.setCurrentWidget(widget)
        self.openTabs.append(action.name)

    def loadArea(self, area):
        assert area.idarea not in self.areas
        vl = QWidget()
        vl.layout = QVBoxLayout()  # layout de la pestaña
        vl.layout.setSpacing(0)
        vl.layout.setContentsMargins(0, 0, 0, 0)
        vl.layout.setSizeConstraint(QLayout.SetMinAndMaxSize)

        moduleToolBox = QToolBox(self)  # toolbox de cada módulo

        self.areas.append(area.idarea)
        self.toolBoxs.append(moduleToolBox)
        self.tab = self.tab + 1
        vl.setLayout(vl.layout)
        vl.layout.addWidget(moduleToolBox)
        self.areasTab.addItem(vl, area.descripcion)

    def loadModule(self, module):
        logger.debug("loadModule: Procesando %s ", module.name)
        # Creamos pestañas de areas y un vBLayout por cada módulo. Despues ahí metemos los actions de cada módulo
        if module.areaid not in self.areas:
            self.loadArea(Struct(idarea=module.areaid,
                                 descripcion=module.areaid))

        moduleToolBox = self.toolBoxs[self.areas.index(module.areaid)]

        vBLayout = QWidget()
        vBLayout.layout = QVBoxLayout()  # layout de cada módulo.
        vBLayout.layout.setSizeConstraint(QLayout.SetMinAndMaxSize)

        vBLayout.layout.setSpacing(0)
        vBLayout.layout.setContentsMargins(0, 0, 0, 0)

        vBLayout.setLayout(vBLayout.layout)
        if module.icon[0] != "":
            pixmap = QtGui.QPixmap(module.icon)
            moduleToolBox.addItem(vBLayout, QtGui.QIcon(pixmap), module.description)
        else:
            moduleToolBox.addItem(vBLayout, module.description)

        try:
            self.moduleLoad(vBLayout.layout, module)
        except Exception:
            logger.exception("ERROR al procesar modulo %s", module.name)

    def moduleLoad(self, vBLayout, module):
        if not module.loaded:
            module.load()
        if not module.loaded:
            logger.warning("moduleLoad: Ignorando modulo %s por fallo al cargar", module.name)
            return False
        logger.trace("moduleLoad: Running module %s . . . ", module.name)
        iconsize = QtCore.QSize(22, 22)
        iconsize = QtCore.QSize(16, 16)
        vBLayout.setSpacing(0)
        vBLayout.setContentsMargins(0, 0, 0, 0)
        for key in module.mainform.toolbar:
            action = module.mainform.actions[key]
            button = QToolButton()
            button.setText(action.text)
            button.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
            button.setIconSize(iconsize)
            button.setAutoRaise(True)
            if action.icon:
                button.setIcon(action.icon)
            button.clicked.connect(action.run)
            vBLayout.addWidget(button)
            self.addToMenuPineboo(action, module)
        vBLayout.addStretch()

    def closeEvent(self, evnt):

        res = QMessageBox.information(
            QApplication.activeWindow(),
            "Salir de Pineboo",
            "¿ Desea salir ?",
            QMessageBox.Yes, QMessageBox.No)

        if res == QMessageBox.No:
            evnt.ignore()

        self.saveState()

    def saveState(self):
        if self:
            sett_ = FLSettings()
            sett_.writeEntryList("application/mainForm/tabsOpened", self.openTabs)
            sett_.writeEntry("application/mainForm/viewFavorites", self.dockFavoritos.isVisible())
            sett_.writeEntry("application/mainForm/FavoritesSize", self.dockFavoritos.size())
            sett_.writeEntry("application/mainForm/viewAreas", self.dockAreasTab.isVisible())
            sett_.writeEntry("application/mainForm/AreasSize", self.dockFavoritos.size())
            sett_.writeEntry("application/mainForm/mainFormSize", self.size())

    def addToMenuPineboo(self, ac, mod):
        #print(mod.name, ac.name, pineboolib.project.areas[mod.areaid].descripcion)
        # Comprueba si el area ya se ha creado
        if mod.areaid not in self.mPAreas.keys():
            areaM = self.menuPineboo.addMenu(QtGui.QIcon('share/icons/gtk-open.png'),
                                             pineboolib.project.areas[mod.areaid].descripcion)
            self.mPAreas[mod.areaid] = areaM
        else:
            areaM = self.mPAreas[mod.areaid]

        # Comprueba si el modulo ya se ha creado
        if mod.name not in self.mPModulos.keys():
            pixmap = None
            if mod.icon[0] != "":
                pixmap = QtGui.QPixmap(mod.icon)
            if pixmap:
                moduloM = areaM.addMenu(QtGui.QIcon(pixmap), mod.description)
            else:
                moduloM = areaM.addMenu(mod.description)

            self.mPModulos[mod.name] = moduloM
        else:
            moduloM = self.mPModulos[mod.name]

        action_ = moduloM.addAction(ac.icon, ac.text)
        action_.triggered.connect(ac.run)

    def restoreOpenedTabs(self):
        # Cargamos pestañas abiertas
        sett_ = FLSettings()
        tabsOpened_ = sett_.readListEntry("application/mainForm/tabsOpened")
        if tabsOpened_:
            for t in tabsOpened_:
                for k, module in sorted(pineboolib.project.modules.items()):
                    if hasattr(module, "mainform"):
                        if t in module.mainform.actions:
                            module.mainform.actions[t].run()
                            break

    def loadState(self):
        sett_ = FLSettings()
        viewFavorites_ = sett_.readBoolEntry("application/mainForm/viewFavorites", True)
        viewAreas_ = sett_.readBoolEntry("application/mainForm/viewAreas", True)
        sizeF_ = sett_.readEntry("application/mainForm/FavoritesSize", None)
        sizeA_ = sett_.readEntry("application/mainForm/AreasSize", None)
        sizeMF_ = sett_.readEntry("application/mainForm/mainFormSize", None)
        if sizeF_ is not None:
            self.dockFavoritos.resize(sizeF_)

        if sizeA_ is not None:
            self.dockAreasTab.resize(sizeA_)

        if sizeMF_ is not None:
            self.resize(sizeMF_)
        else:
            self.showMaximized()

        """
        self.dockFavoritos.setVisible(viewFavorites_)
        self.actionFavoritos.setChecked(viewFavorites_)
        self.dockAreasTab.setVisible(viewAreas_)
        self.actionModulos.setChecked(viewAreas_)
        """

    def changeStateDockFavoritos(self):
        visible_ = self.actionFavoritos.isChecked()
        if visible_:
            sett_ = FLSettings()
            sizeF_ = sett_.readEntry("application/mainForm/FavoritesSize", None)
            if sizeF_ is not None:
                self.dockFavoritos.resize(sizeF_)

        self.dockFavoritos.setVisible(visible_)

    def changeStateActionFavoritos(self):
        if self.dockFavoritos.isVisible():
            self.actionFavoritos.setChecked(True)
        else:
            self.actionFavoritos.setChecked(False)

    def changeStateDockAreas(self):
        visible_ = self.actionModulos.isChecked()
        if visible_:
            sett_ = FLSettings()
            sizeA_ = sett_.readEntry("application/mainForm/AreasSize", None)
            if sizeA_ is not None:
                self.dockAreasTab.resize(sizeA_)
        self.dockAreasTab.setVisible(visible_)

    def changeStateActionAreas(self):
        if self.dockAreasTab.isVisible():
            self.actionModulos.setChecked(True)
        else:
            self.actionModulos.setChecked(False)

    def loadDevelop(self):
        moduleToolBox = self.toolBoxs[self.areas.index("dvl")]
        vBLayout = QWidget()
        vBLayout.layout = QVBoxLayout()  # layout de cada módulo.
        vBLayout.layout.setSizeConstraint(QLayout.SetMinAndMaxSize)
        vBLayout.layout.setSpacing(0)
        vBLayout.layout.setContentsMargins(0, 0, 0, 0)
        vBLayout.setLayout(vBLayout.layout)

        button = QToolButton()
        button.setText("Consola")
        button.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
        iconsize = QtCore.QSize(16, 16)
        button.setIconSize(iconsize)
        button.setAutoRaise(True)
        button.setIcon(QtGui.QIcon('share/icons/terminal.png'))
        button.clicked.connect(self.showConsole)
        vBLayout.layout.addWidget(button)
        moduleToolBox.addItem(vBLayout, "Desarrollo")

        #self.addToMenuPineboo(action, module)

    def showConsole(self):
        if not self.dockConsole:
            self.dockConsole = QDockWidget()
            self.dockConsole.setWindowTitle("Consola")
            self.addDockWidget(Qt.BottomDockWidgetArea, self.dockConsole)
            self.teo_ = OutputWindow()
            self.dockConsole.setWidget(self.teo_)

        self.dockConsole.setVisible(True)
Beispiel #13
0
class Jigsaw(QMainWindow, Ui_MainWindow):
    """
    拼图主程序
    """
    saveData = []

    def __init__(self, parent=None):
        """
        界面初始化
        载入历史时间
        记录时间初始化
        载入游戏
        """
        super(Jigsaw, self).__init__(parent)
        self.setupUi(self)
        self.initUi()
        self.puzzleImage = QPixmap("./img/Peppa.png")
        self.saveData = self.loadTime()
        self.dock2 = QDockWidget("完整的图片", self)
        self.dock2.resize(400, 400)
        self.setupPuzzle()
        self.initTimeUi()

    def initUi(self):
        """
        一些简单布局
        """
        self.setWindowFlags(Qt.Dialog)
        self.setWhatsThis("这是一个拼图小游戏")
        frameLayout = QHBoxLayout(self.frame)
        self.puzzleshow = PuzzleShow(400)
        self.puzzlepiece = PuzzlePiece(self.puzzleshow.pieceSize())
        frameLayout.addWidget(self.puzzlepiece)
        frameLayout.addWidget(self.puzzleshow)
        self.setCentralWidget(self.frame)

        self.puzzleshow.puzzleCompleted.connect(self.setCompleted)
        # 当我们完成游戏的时候会发出puzzleCompleted信号,这个信号是连接setCompleted()函数的

    def initTimeUi(self):
        """
        游戏时间初始化
        """
        self.dock = QDockWidget("游戏时间", self)
        self.label = QLabel("当前游戏用时:0秒,最佳时间:0秒")
        self.label.setStyleSheet("color: rgb(255, 0, 0);font: 14pt \"微软雅黑\";")
        self.dock.setWidget(self.label)
        self.addDockWidget(Qt.BottomDockWidgetArea, self.dock)

    def setCompleted(self):
        """
        完成后弹出游戏结果对话框
        """
        self.timer.stop()
        self.saveData.append(self.time)
        self.saveTime()
        info = "恭喜通关成功!用时:{}秒,继续努力吧!\n按下OK继续!".format(self.time)
        QMessageBox.information(self, "通过成功", info, QMessageBox.Ok)
        self.setupPuzzle()
        # 游戏完成后,我们的定时器会停止。保存当前游戏时间。弹出恭喜对话框。游戏重新初始化(setupPuzzle())

    def setupPuzzle(self):
        """
        游戏初始化
        """

        size = min(self.puzzleImage.width(), self.puzzleImage.height())
        #游戏图片尺寸

        self.puzzleImage = self.puzzleImage.copy(
            (self.puzzleImage.width() - size) / 2,
            (self.puzzleImage.height() - size) / 2, size,
            size).scaled(self.puzzleshow.width(), self.puzzleshow.height(),
                         Qt.IgnoreAspectRatio, Qt.SmoothTransformation)
        #得到压缩尺寸后的图形

        if self.puzzlepiece.count() > 1:
            self.puzzlepiece.clear()
            #只有在当前拼图列表存在拼图的情况下才能清空列表

        for y in range(5):
            for x in range(5):
                pieceSize = self.puzzleshow.pieceSize()
                piece = self.puzzleImage.copy(x * pieceSize, y * pieceSize,
                                              pieceSize, pieceSize)
                self.puzzlepiece.addPiece(piece, QPoint(x, y))
        #切割图片并添加到列表中

        for i in range(self.puzzlepiece.count()):
            if random.random() * 10 > 3:
                item = self.puzzlepiece.takeItem(i)
                self.puzzlepiece.insertItem(0, item)
        #图片随机排序

        self.puzzleshow.clear()
        #还原的图形展示小部件清空

        self.setDock(self.puzzleImage)
        #完整的图形刷新

        self.time = 0
        self.timing()

    def loadTime(self):
        """
        载入游戏时间数据
        """
        pathname = "m.dat"

        if not (os.path.exists(pathname) and os.path.isfile(pathname)):
            data = [100000]
            with codecs.open("m.dat", "wb") as f:
                pickle.dump(data, f)

        with codecs.open("m.dat", "rb") as f:
            data = pickle.load(f)
        return data

    def saveTime(self):
        """
        保存游戏时间
        """
        with codecs.open("m.dat", "wb") as f:
            pickle.dump(self.saveData, f)

    def timing(self):
        """
        开始计时
        """
        self.timer = QTimer()
        self.timer.start(1000)
        self.timer.timeout.connect(self.second)

    def second(self):
        """
        显示游戏时间
        """
        self.time += 1
        timeinfo = "当前游戏用时:{}秒,最佳时间:{}秒".format(self.time, min(self.saveData))
        self.label.setText(timeinfo)

    def setDock(self, pix):
        """
        显示还原后的图片
        """
        label2 = QLabel()
        label2.setScaledContents(True)
        label2.setPixmap(pix)
        self.dock2.setWidget(label2)
        self.dock2.setFloating(True)

    @pyqtSlot()
    def on_action_O_triggered(self):
        """
        选择图片并开始游戏
        """
        fileName = QFileDialog.getOpenFileName(self, "打开文件", "./img",
                                               ("Images (*.png *.jpg)"))
        filepath = fileName[0]
        if filepath:
            self.puzzleImage = QPixmap(filepath)
            self.dock2.close()
            # 完成的拼图

            self.setupPuzzle()
            # 游戏初始化

            self.dock2.show()

            # 刷新一下这个画面,否则画面可能不会变
        else:
            QMessageBox.warning(self, "打开图片", "图片加载失败!", QMessageBox.Cancel)
            return

    @pyqtSlot()
    def on_action_E_triggered(self):
        """
        退出游戏
        """
        self.close()

    @pyqtSlot()
    def on_action_R_triggered(self):
        """
        重新开始游戏
        """
        self.setupPuzzle()

    @pyqtSlot()
    def on_action_P_triggered(self):
        """
        重新显示完成的图片
        """
        self.dock2.close()
        self.dock2.show()

    @pyqtSlot()
    def on_action_J_triggered(self):
        """
        关于
        """
        QMessageBox.information(self, "关于", "学点编程吧出品,必属精品!")
Beispiel #14
0
 def init_ui(self):
     self.setWindowTitle(self.title)
     self.setGeometry(self.left, self.top, self.width, self.height)
     '''
      QText Edits
     '''
     
     self.listing_gui = QLineEdit('', self)
     self.listing_gui.setFont(QFont('Arial', 12))
     self.listing_gui.setPlaceholderText('Listing: ')
     self.listing_gui.resize(200, 30)
     self.listing_gui.move(0, 30)
     self.listing_gui.returnPressed.connect(self.get_listing)
     
     #width = listing_gui.frameGeometry().width()
     #height = listing_gui.frameGeometry().height()
     #print(width)
     #print(height)
     
     
     self.website_gui = QLineEdit('', self)
     self.website_gui.setFont(QFont('Arial', 12))
     self.website_gui.setPlaceholderText('Website: ')
     self.website_gui.resize(200, 30)
     self.website_gui.move(0, 60)
     self.website_gui.returnPressed.connect(self.get_website)
     
     self.email_gui = QLineEdit('', self)
     self.email_gui.setFont(QFont('Arial', 12))
     self.email_gui.setPlaceholderText('Email Address: ')
     self.email_gui.resize(200, 30)
     self.email_gui.move(0, 90)
     self.email_gui.returnPressed.connect(self.get_email)
     
     self.username_gui = QLineEdit('', self)
     self.username_gui.setFont(QFont('Arial', 12))
     self.username_gui.setPlaceholderText('Username: '******'', self)
     self.password_gui.setFont(QFont('Arial', 12))
     self.password_gui.setPlaceholderText('Password: '******'''
      End QText Edits
     '''
     
     table = QTableWidget(self)
     table.setColumnCount(5)
     table.setRowCount(1)
     table.setHorizontalHeaderLabels('Listing;Website;Email Address;Username;Password'.split(";"))
     table.setItem(0, 0, QTableWidgetItem('Example Listing'))
     table.setItem(0, 1, QTableWidgetItem('https://example_website.com'))
     table.setItem(0, 2, QTableWidgetItem('*****@*****.**'))
     table.setItem(0, 3, QTableWidgetItem('ExampleUser66'))
     table.setItem(0, 4, QTableWidgetItem('ExAmPlEpassW0rd872@##@1'))
     table.resizeColumnsToContents()
     table.resizeRowsToContents()
     
     
     dock = QDockWidget('Table', self)
     dock.setWidget(table)
     dock.resize(800, 650 - 200)
     dock.move(0, 180)
     
     
     
     '''
       Menu
     '''
     mainMenu = self.menuBar() 
     
     fileMenu = mainMenu.addMenu('File')
     
     exitButton = QAction('Exit', self)
     exitButton.setShortcut('Ctrl+Q')
     exitButton.setStatusTip('Exit application')
     exitButton.triggered.connect(self.close)
  
     printButton = QAction('Print File', self)
     printButton.setShortcut('Ctrl+P')
     printButton.setStatusTip('Print File')
     #printButton.triggered.connect()
     
     fileMenu.addAction(printButton)
     fileMenu.addAction(exitButton)
     
     
     
     editMenu = mainMenu.addMenu('Edit')
     
     
     
     viewMenu = mainMenu.addMenu('View')
     
     displayButton = QAction('Display All', self)
     displayButton.setShortcut('Ctrl+V')
     displayButton.setStatusTip('Display Entire File')
     #displayButton.triggered.connect()
     
     viewMenu.addAction(displayButton)
     
     
     
     
     searchMenu = mainMenu.addMenu('Search')
     searchStringButton = QAction('Search String', self)
     searchStringButton.setShortcut('Ctrl+S')
     searchStringButton.setStatusTip('Enter listing name in text box to search for that listing')
     #searchStringButton.triggered.connect()
     
     searchRowButton = QAction('Search Row', self)
     searchRowButton.setShortcut('Ctrl+R')
     searchRowButton.setStatusTip('Search a specific row')
     #searchRowButton.triggered.connect()
     
     searchColumnButton = QAction('Search Column', self)
     searchColumnButton.setShortcut('Ctrl+Y')
     searchColumnButton.setStatusTip('Enter the specific column you wish to search')
     #searchColumnButton.triggered.connect()
     
     searchMenu.addAction(searchStringButton)
     searchMenu.addAction(searchRowButton)
     searchMenu.addAction(searchColumnButton)
     
     toolsMenu = mainMenu.addMenu('Tools')
     
     
     
     helpMenu = mainMenu.addMenu('Help')
     
     '''
      End Menu
     '''
     self.show()
Beispiel #15
0
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        maxWidth = QDesktopWidget().availableGeometry().width()
        maxHeight = QDesktopWidget().availableGeometry().height()
        workSpace = QWidget(self)

        ####    MainWindow Configuration
        self.setWindowTitle("Application")
        self.setWindowIcon(QIcon("icon.png"))

        self.tray_icon = QSystemTrayIcon(QIcon("icon.png"))
        self.tray_icon.show()

        ####    Tray MENU   #################
        trayIconMenu = QMenu(self)
        trayIconMenu.setTitle("Main menu")
        trayIconMenu.addAction("Show Main Window", self.showMainWindow)
        trayIconMenu.addAction("Switch chat", self.toggleDockWidget)
        trayIconMenu.addSeparator()
        trayIconMenu.addAction("Quit", self.close)
        self.tray_icon.setContextMenu(trayIconMenu)

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

        ####     MENUBAR description:    #################
        mainmenu = self.menuBar()
        file = mainmenu.addMenu("File")
        file.addAction("isFloating", self.floatingInfo)
        file.addAction("Toggle Chat", self.toggleDockWidget)
        file.addAction("Close", self.close)
        ######################

        self.dockWidget = QDockWidget("Messenger", self)
        self.dockWidget.setFloating(True)
        self.dockWidget.setVisible(True)
        self.dockWidget.setMinimumSize(300, 460)
        self.dockWidget.setMaximumSize(maxWidth / 2, maxHeight)
        self.dockWidget.setBaseSize(maxWidth / 2, maxHeight)
        self.dockWidget.resize(maxWidth / 4, maxHeight / 1.5)
        self.dockWidget.setFeatures(QDockWidget.NoDockWidgetFeatures)
        self.dockWidget.setVisible(False)

        ####    TODO:" set dockWidget widgets"      ################

        messengerWidget = QWidget()

        masterVertical = QVBoxLayout()
        messengerWidget.setLayout(masterVertical)

        slaveHorizont = QHBoxLayout()
        subSlaveVertical = QVBoxLayout()

        msgSpace = QListView()
        textEdit = QTextEdit()
        sendBtn = QPushButton("Send")

        masterVertical.addWidget(msgSpace)
        masterVertical.addLayout(slaveHorizont)

        slaveHorizont.addWidget(textEdit)
        slaveHorizont.addLayout(subSlaveVertical)

        subSlaveVertical.addWidget(sendBtn)

        # self.dockWidget.setLayout(QVBoxLayout())
        # print(self.dockWidget.setLayout(QVBoxLayout()))

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

        # self.statusBar()

        toggleDockWidgetBtn = QPushButton("Show geomerty", workSpace)
        toggleDockWidgetBtn.move(10, 40)
        toggleDockWidgetBtn.clicked.connect(self.showGeometry)

        ####     TEST BUTONS     ####
        hideBtn = QPushButton("hide main", workSpace)
        hideBtn.move(10, 70)
        hideBtn.clicked.connect(self.hideMainWindow)
        #######################################################

        self.setGeometry(300, 300, 300, 500)
        self.dockWidget.resize(333, 1000)
        self.setCentralWidget(workSpace)
        self.addDockWidget(Qt.RightDockWidgetArea, self.dockWidget)

    def toggleDockWidget(self):
        flag = False if self.dockWidget.isVisible() else True
        text = "Messenger status was changed to {}".format(
            "visible" if flag else "hide")
        self.dockWidget.setVisible(flag)

        # self.dockWidget.setGeometry(650, 300, 200, 500)

        ####     SET DOCKWINDOW GEAMETRY AND POSITION
        qtRect = self.dockWidget.frameGeometry()
        rightPoint = QDesktopWidget().availableGeometry().bottomRight()

        ####    FOR LINUX POSITION    ###############################
        # qtRect.moveBottomRight(rightPoint)
        # self.dockWidget.move(qtRect.bottomRight())
        ####    FOR WINDOWS POSITION    #############################
        qtRect.moveBottomRight(rightPoint)
        self.dockWidget.move(qtRect.topLeft())
        ##############################################################

        self.statusBar().showMessage(text, 500)

    ####    test functionality
    def showGeometry(self):
        availGeometry = QDesktopWidget().availableGeometry()
        self.statusBar().showMessage("Available geometry.")
        print("Available geometry: ", availGeometry)
        print("Right point: ",
              QDesktopWidget().availableGeometry().bottomRight())
        print("DockWidget frame bottomRight: ",
              self.dockWidget.frameGeometry().bottomRight())
        print("DockWidget frame topLeft: ",
              self.dockWidget.frameGeometry().topLeft())
        print("\n" + "|---|" * 15 + "\n")

    def hideMainWindow(self):
        self.hide()

    def showMainWindow(self):
        self.show()

    def floatingInfo(self):
        flag = False if self.dockWidget.isFloating() else True
        print("dockWidget status is: ", flag)
        self.dockWidget.setFloating(flag)