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()
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()