Ejemplo n.º 1
0
    def initUI(self):      
        # bottom left frame (hosts)
        hostsArea = QFrame(self)
        self.hostTable = hostsTable.hostsTable()
 
        # bottom right frame (KPIs)
        self.kpisTable = kpiTable.kpiTable()
        kpisTable = self.kpisTable


        # top (main chart area)
        self.chartArea = chartArea.chartArea()

        # establish hard links:
        kpisTable.kpiScales = self.chartArea.widget.nscales
        self.chartArea.widget.hosts = self.hostTable.hosts
        
        kpisTable.hosts = self.chartArea.widget.hosts #why do we have hosts inside widget? because we have all data there...
        kpisTable.hostKPIs = self.chartArea.hostKPIs
        kpisTable.srvcKPIs = self.chartArea.srvcKPIs
        kpisTable.nkpis = self.chartArea.widget.nkpis
        
        # bottm part left+right
        kpiSplitter = QSplitter(Qt.Horizontal)
        kpiSplitter.addWidget(self.hostTable)
        kpiSplitter.addWidget(kpisTable)
        kpiSplitter.setSizes([200, 380])
        
        
        self.tabs = QTabWidget()
        
        console = sqlConsole.sqlConsole()
        
        # main window splitter
        mainSplitter = QSplitter(Qt.Vertical)
        
        kpisWidget = QWidget()
        lo = QVBoxLayout(kpisWidget)
        lo.addWidget(kpiSplitter)
        
        mainSplitter.addWidget(self.chartArea)
        mainSplitter.addWidget(kpisWidget)
        mainSplitter.setSizes([300, 90])
        
        mainSplitter.setAutoFillBackground(True)

        # central widget
        #self.setCentralWidget(mainSplitter)
        
        kpisWidget.autoFillBackground = True
        
        self.tabs.addTab(mainSplitter, 'Chart')
        
        if cfg('experimental-notnow'):
            self.tabs.addTab(console, 'Sql')
        
        self.setCentralWidget(self.tabs)
        
        # service stuff
        self.statusbar = self.statusBar()

        #menu
        iconPath = resourcePath('ico\\favicon.ico')

        exitAct = QAction('&Exit', self)        
        exitAct.setShortcut('Alt+Q')
        exitAct.setStatusTip('Exit application')
        exitAct.triggered.connect(self.menuQuit)


        aboutAct = QAction(QIcon(iconPath), '&About', self)
        aboutAct.setStatusTip('About this app')
        aboutAct.triggered.connect(self.menuAbout)

        dummyAct = QAction('&Dummy', self)
        dummyAct.setShortcut('Alt+D')
        dummyAct.setStatusTip('Dummy Data provider')
        dummyAct.triggered.connect(self.menuDummy)

        configAct = QAction('&Connect', self)
        configAct.setShortcut('Alt+C')
        configAct.setStatusTip('Configure connection')
        configAct.triggered.connect(self.menuConfig)

        importAct = QAction('&Import', self)
        importAct.setShortcut('Ctrl+I')
        importAct.setStatusTip('Import nameserver.trc')
        importAct.triggered.connect(self.menuImport)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(aboutAct)
        fileMenu.addAction(configAct)

        if cfg('experimental'):
            fileMenu.addAction(importAct)
            fileMenu.addAction(dummyAct)

        fileMenu.addAction(exitAct)
        
        if cfg('experimental'):
            actionsMenu = menubar.addMenu('&Actions')
            fileMenu.addAction(aboutAct)

            fontAct = QAction('&Adjust Fonts', self)
            fontAct.setStatusTip('Adjust margins after font change (for example after move to secondary screen)')
            fontAct.triggered.connect(self.menuFont)

            reloadConfigAct = QAction('Reload &Config', self)
            reloadConfigAct.setStatusTip('Reload configuration file. Note: some values used during the connect or other one-time-actions')
            reloadConfigAct.triggered.connect(self.menuReloadConfig)
            
            actionsMenu.addAction(fontAct)
            
            actionsMenu.addAction(reloadConfigAct)

            reloadCustomKPIsAct = QAction('Reload Custom &KPIs', self)
            reloadCustomKPIsAct.setStatusTip('Reload definition of custom KPIs')
            reloadCustomKPIsAct.triggered.connect(self.menuReloadCustomKPIs)

            actionsMenu.addAction(reloadCustomKPIsAct)

        # finalization
        self.setGeometry(200, 200, 1400, 800)
        #self.setWindowTitle('SAP HANA Studio Light')
        # self.setWindowTitle('HANA Army Knife')
        self.setWindowTitle('Ryba Fish Charts')
        
        self.setWindowIcon(QIcon(iconPath))
        
        self.show()

        '''
            set up some interactions
        '''
        # bind kpi checkbox signal
        kpisTable.checkboxToggle.connect(self.chartArea.checkboxToggle)
        
        # bind change scales signal
        kpisTable.adjustScale.connect(self.chartArea.adjustScale)
        kpisTable.setScale.connect(self.chartArea.setScale)

        # host table row change signal
        self.hostTable.hostChanged.connect(kpisTable.refill)

        # to fill hosts
        self.chartArea.hostsUpdated.connect(self.hostTable.hostsUpdated)

        # refresh
        self.chartArea.kpiToggled.connect(kpisTable.refill)
        # update scales signal
        self.chartArea.scalesUpdated.connect(kpisTable.updateScales)
        self.chartArea.scalesUpdated.emit() # it really not supposed to have any to update here

        #bind statusbox updating signals
        self.chartArea.statusMessage_.connect(self.statusMessage)
        self.chartArea.widget.statusMessage_.connect(self.statusMessage)

        self.chartArea.connected.connect(self.setTabName)
        log('init finish()')
        
        if self.chartArea.dp:
            self.chartArea.initDP()
Ejemplo n.º 2
0
    def initUI(self):

        if cfg('saveLayout', True):
            self.layout = Layout(True)

            if self.layout['running']:
                answer = utils.yesNoDialog(
                    'Warning',
                    'Another RybaFish is already running, all the layout and autosave features will be disabled.\n\nExit now?',
                    ignore=True)
                #answer = utils.yesNoDialog('Warning', 'RybaFish is already running or crashed last time, all the layout and autosave features will be disabled.\n\nExit now?', ignore = True)

                if answer == True or answer is None:
                    exit(0)

                if answer == 'ignore':
                    log('Ignoring the layout')
                else:
                    self.layout = None
            else:
                self.layout['running'] = True
                self.layout.dump()
        else:
            self.layout = Layout()

        # bottom left frame (hosts)
        hostsArea = QFrame(self)
        self.hostTable = hostsTable.hostsTable()

        # bottom right frame (KPIs)
        self.kpisTable = kpiTable.kpiTable()
        kpisTable = self.kpisTable

        # top (main chart area)
        self.chartArea = chartArea.chartArea()

        ind = indicator()
        self.chartArea.indicator = ind

        # establish hard links:
        kpisTable.kpiScales = self.chartArea.widget.nscales
        self.chartArea.widget.hosts = self.hostTable.hosts

        kpisTable.hosts = self.chartArea.widget.hosts  #why do we have hosts inside widget? because we have all data there...
        kpisTable.hostKPIs = self.chartArea.hostKPIs
        kpisTable.srvcKPIs = self.chartArea.srvcKPIs
        kpisTable.nkpis = self.chartArea.widget.nkpis

        # bottm part left+right
        self.kpiSplitter = QSplitter(Qt.Horizontal)
        self.kpiSplitter.addWidget(self.hostTable)
        self.kpiSplitter.addWidget(kpisTable)
        self.kpiSplitter.setSizes([200, 380])

        self.tabs = QTabWidget()

        # self.tabs.currentChanged.connect(self.tabChanged)

        # main window splitter
        self.mainSplitter = QSplitter(Qt.Vertical)

        kpisWidget = QWidget()
        lo = QVBoxLayout(kpisWidget)
        lo.addWidget(self.kpiSplitter)

        self.mainSplitter.addWidget(self.chartArea)
        self.mainSplitter.addWidget(kpisWidget)

        if self.layout is not None:
            if self.layout['mainSplitter']:
                self.mainSplitter.setSizes(self.layout['mainSplitter'])
            else:
                self.mainSplitter.setSizes([300, 90])

            if self.layout['kpiSplitter']:
                self.kpiSplitter.setSizes(self.layout['kpiSplitter'])
            else:
                self.kpiSplitter.setSizes([200, 380])

            if self.layout['hostTableWidth']:
                hostTableWidth = self.layout['hostTableWidth']

                for i in range(self.hostTable.columnCount()):
                    if i > len(hostTableWidth) - 1:
                        break
                    self.hostTable.setColumnWidth(i, hostTableWidth[i])

            if self.layout['KPIsTableWidth']:
                KPIsTableWidth = self.layout['KPIsTableWidth']

                for i in range(self.kpisTable.columnCount()):
                    if i > len(KPIsTableWidth) - 1:
                        break
                    self.kpisTable.setColumnWidth(i, KPIsTableWidth[i])
        else:
            self.mainSplitter.setSizes([300, 90])
            self.kpiSplitter.setSizes([200, 380])

        self.mainSplitter.setAutoFillBackground(True)

        # central widget
        #self.setCentralWidget(mainSplitter)

        kpisWidget.autoFillBackground = True

        self.tabs.addTab(self.mainSplitter, 'Chart')

        self.chartArea.selfRaise.connect(self.raiseTab)
        ind.iClicked.connect(self.chartArea.indicatorSignal)

        self.setCentralWidget(self.tabs)

        # service stuff
        self.statusbar = self.statusBar()
        self.statusbar.addPermanentWidget(ind)

        #menu
        iconPath = resourcePath('ico\\favicon.ico')

        exitAct = QAction('&Exit', self)
        exitAct.setShortcut('Alt+Q')
        exitAct.setStatusTip('Exit application')
        exitAct.triggered.connect(self.menuQuit)

        dummyAct = QAction('&Dummy', self)
        dummyAct.setShortcut('Alt+D')
        dummyAct.setStatusTip('Dummy Data provider')
        dummyAct.triggered.connect(self.menuDummy)

        configAct = QAction('&Connect', self)
        configAct.setShortcut('Alt+C')
        configAct.setStatusTip('Configure connection')
        configAct.triggered.connect(self.menuConfig)

        importAct = QAction('&Import nameserver history trace', self)
        importAct.setShortcut('Ctrl+I')
        importAct.setStatusTip('Import nameserver.trc')
        importAct.triggered.connect(self.menuImport)

        sqlConsAct = QAction('New &SQL Console', self)
        sqlConsAct.setShortcut('Alt+S')
        sqlConsAct.setStatusTip('Create SQL Console')
        sqlConsAct.triggered.connect(self.menuSQLConsole)

        openAct = QAction('&Open file in new sql console', self)
        openAct.setShortcut('Ctrl+O')
        openAct.setStatusTip('Open new console with the file')
        openAct.triggered.connect(self.menuOpen)

        saveAct = QAction('&Save sql to a file', self)
        saveAct.setShortcut('Ctrl+S')
        saveAct.setStatusTip('Saves sql from current console to a file')
        saveAct.triggered.connect(self.menuSave)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(configAct)

        fileMenu.addAction(importAct)
        fileMenu.addAction(sqlConsAct)
        fileMenu.addAction(openAct)
        fileMenu.addAction(saveAct)

        if cfg('experimental'):
            fileMenu.addAction(dummyAct)

        fileMenu.addAction(exitAct)

        actionsMenu = menubar.addMenu('&Actions')

        if cfg('experimental'):
            # fileMenu.addAction(aboutAct) -- print not sure why its here

            fontAct = QAction('&Adjust Fonts', self)
            fontAct.setStatusTip(
                'Adjust margins after font change (for example after move to secondary screen)'
            )
            fontAct.triggered.connect(self.menuFont)

            actionsMenu.addAction(fontAct)

        # issue #255
        reloadConfigAct = QAction('Reload &Config', self)
        reloadConfigAct.setStatusTip(
            'Reload configuration file. Note: some values used during the connect or other one-time-actions (restart required).'
        )
        reloadConfigAct.triggered.connect(self.menuReloadConfig)
        actionsMenu.addAction(reloadConfigAct)

        reloadCustomKPIsAct = QAction('Reload Custom &KPIs', self)
        reloadCustomKPIsAct.setStatusTip('Reload definition of custom KPIs')
        reloadCustomKPIsAct.triggered.connect(self.menuReloadCustomKPIs)

        actionsMenu.addAction(reloadCustomKPIsAct)

        # help menu part
        aboutAct = QAction(QIcon(iconPath), '&About', self)
        aboutAct.setStatusTip('About this app')
        aboutAct.triggered.connect(self.menuAbout)

        confHelpAct = QAction('Configuration', self)
        confHelpAct.setStatusTip('Configuration options description')
        confHelpAct.triggered.connect(self.menuConfHelp)

        confCustomHelpAct = QAction('Custom KPIs', self)
        confCustomHelpAct.setStatusTip('Short manual on custom KPIs')
        confCustomHelpAct.triggered.connect(self.menuCustomConfHelp)

        confTipsAct = QAction('Tips and tricks', self)
        confTipsAct.setStatusTip('Tips and tricks description')
        confTipsAct.triggered.connect(self.menuTips)

        helpMenu = menubar.addMenu('&Help')
        helpMenu.addAction(confHelpAct)

        helpMenu.addAction(confCustomHelpAct)
        helpMenu.addAction(confTipsAct)

        helpMenu.addAction(aboutAct)

        # finalization

        if self.layout is not None and self.layout['pos'] and self.layout[
                'size']:
            pos = self.layout['pos']
            size = self.layout['size']

            #print('screen number', QApplication.desktop().screenNumber())
            #print('number of screens', QApplication.desktop().screenCount())
            #print('available geometry:', QApplication.desktop().availableGeometry())
            #print('screen geometry:', QApplication.desktop().screenGeometry())

            r = QRect(pos[0], pos[1], size[0], size[1])

            if QApplication.desktop().screenCount() == 1:
                # only when just one screen is available...
                if not QApplication.desktop().screenGeometry().contains(
                        r) and not cfg('dontAutodetectScreen'):
                    #the window will not be visible so jump to the main screen:
                    (pos[0], pos[1]) = (100, 50)

            #self.setGeometry(pos[0] + 8, pos[1] + 31, size[0], size[1])
            #self.setGeometry(pos[0], pos[1], size[0], size[1])

            self.move(pos[0], pos[1])
            self.resize(size[0], size[1])
        else:
            self.setGeometry(200, 200, 1400, 800)

        self.setWindowTitle('RybaFish Charts')

        self.setWindowIcon(QIcon(iconPath))

        scrollPosition = []

        if cfg('saveOpenTabs',
               True) and self.layout is not None and self.layout['tabs']:
            for t in self.layout['tabs']:
                if len(t) != 4:
                    continue

                console = sqlConsole.sqlConsole(self, None, '?')

                console.nameChanged.connect(self.changeActiveTabName)
                console.cons.closeSignal.connect(self.closeTab)

                self.tabs.addTab(console, console.tabname)

                ind = indicator()
                console.indicator = ind

                console.selfRaise.connect(self.raiseTab)
                ind.iClicked.connect(console.reportRuntime)

                self.statusbar.addPermanentWidget(ind)

                self.tabs.setCurrentIndex(self.tabs.count() - 1)

                if t[0] is not None or t[1] is not None:
                    # such a tab should not ever be saved (this call will just open fileOpen dialog), anyway...
                    # should we even create such a tab?
                    console.openFile(t[0], t[1])

                    pos = t[2]
                    block = t[3]

                    scrollPosition.append(block)

                    if isinstance(pos, int) and isinstance(block, int):
                        cursor = console.cons.textCursor()
                        cursor.setPosition(pos, cursor.MoveAnchor)
                        console.cons.setTextCursor(cursor)

            indx = self.layout['currentTab']

            if isinstance(indx, int):
                self.tabs.setCurrentIndex(indx)

                w = self.tabs.widget(indx)

                if isinstance(w, sqlConsole.sqlConsole):
                    w.cons.setFocus()

            else:
                self.tabs.setCurrentIndex(0)

        self.show()

        #scroll everything to stored position
        for i in range(self.tabs.count() - 1, 0, -1):
            w = self.tabs.widget(i)
            if isinstance(w, sqlConsole.sqlConsole):

                if i - 1 < len(scrollPosition):
                    block = scrollPosition[i - 1]
                    w.cons.edit.verticalScrollBar().setValue(block)
                else:
                    log('[w] scroll position list out of range, ignoring scrollback...'
                        )
        '''
            set up some interactions
        '''
        # bind kpi checkbox signal
        kpisTable.checkboxToggle.connect(self.chartArea.checkboxToggle)

        # bind change scales signal
        kpisTable.adjustScale.connect(self.chartArea.adjustScale)
        kpisTable.setScale.connect(self.chartArea.setScale)

        # host table row change signal
        self.hostTable.hostChanged.connect(kpisTable.refill)

        # to fill hosts
        self.chartArea.hostsUpdated.connect(self.hostTable.hostsUpdated)

        # refresh
        self.chartArea.kpiToggled.connect(kpisTable.refill)
        # update scales signal
        self.chartArea.scalesUpdated.connect(kpisTable.updateScales)

        log('self.scalesUpdated.emit() #0', 5)
        self.chartArea.scalesUpdated.emit(
        )  # it really not supposed to have any to update here

        #bind statusbox updating signals
        self.chartArea.statusMessage_.connect(self.statusMessage)
        self.chartArea.widget.statusMessage_.connect(self.statusMessage)

        self.chartArea.connected.connect(self.setTabName)
        log('init finish()')

        # offline console tests

        if cfg('developmentMode'):

            #tname = sqlConsole.generateTabName()

            #idx = self.tabs.count()
            self.sqlTabCounter += 1
            idx = self.sqlTabCounter

            if idx > 1:
                tname = 'sql' + str(idx)
            else:
                tname = 'sql'

            console = sqlConsole.sqlConsole(self, None, tname)
            console.nameChanged.connect(self.changeActiveTabName)

            from SQLSyntaxHighlighter import SQLSyntaxHighlighter

            self.tabs.addTab(console, tname)

            console.selfRaise.connect(self.raiseTab)

            self.tabs.setCurrentIndex(self.tabs.count() - 1)

            self.SQLSyntax = SQLSyntaxHighlighter(console.cons.document())
            #console.cons.setPlainText('select * from dummy;\n\nselect \n    *\n    from dummy;\n\nselect * from m_host_information;');

            ind = indicator()
            console.indicator = ind
            self.statusbar.addPermanentWidget(ind)

            ind.iClicked.connect(console.reportRuntime)

            if cfg('developmentMode'):
                console.cons.setPlainText('''select 0 from dummy;
create procedure ...
(
(as begin)
select * from dummy);
end;

where timestamp between '2020-02-10 00:00:00' and '2020-02-16 23:59:59' -- test comment

where not "NAME1" = '' and "DOKST" in ('D0', 'D2') and (1 = 2)

select 1 from dummy;
select 2 from dummy;
select 3 from dummy;''')

            console.dummyResultTable()

        self.statusMessage('', False)

        if self.chartArea.dp:
            self.chartArea.initDP()