from qt import * from qttable import * from StatusBarDialog import StatusBarDialog from ConnectionSetupDialog import ConnectionSetupDialog from AlertListView import AlertListView from FindDialog import FindDialog from SummaryDialog import SummaryDialog from PopupDialog import popup_error, popup_info from time import localtime import string class FilterTimerHandler(QObject): def __init__(self, callback, value): QObject.__init__(self) self.callback = callback self.value = value def done(self): self.callback(self.value) class Filter: def __init__(self, mainWindow, parent): self.mainWindow = mainWindow self.mainWindow.addLabel(parent, "Filter:") self.comboBox = QComboBox(parent) QObject.connect(self.comboBox, SIGNAL("activated(int)"), self.comboBoxChanged) self.comboBox.insertItem("All") for col in range(self.mainWindow.alertListView.columns()): self.comboBox.insertItem(self.mainWindow.alertListView.columnText(col)) self.lineEdit = QLineEdit(parent) QObject.connect(self.lineEdit, SIGNAL("textChanged(const QString &)"), self.lineEditTimeout) QObject.connect(self.lineEdit, SIGNAL("returnPressed()"), self.lineEditValidate) def lineEditTimeout(self, value): self.timerHandler = FilterTimerHandler(self.apply, str(value)) self.timer = QTimer(self.timerHandler) QObject.connect(self.timer, SIGNAL("timeout()"), self.timerHandler.done) self.timer.start(800, True) def lineEditValidate(self): self.timer.stop() self.apply() def comboBoxChanged(self, value): self.apply(filterCol=value) def setEnabled(self, enabled): if not enabled: self.comboBox.setCurrentItem(0) self.lineEdit.clear() self.comboBox.setEnabled(enabled) self.lineEdit.setEnabled(enabled) def apply(self, filterValue=None, filterCol=None): if not filterValue: filterValue = self.lineEdit.text() if not filterCol: filterCol = self.comboBox.currentItem() filterValue = filterValue.lower() shown = self.mainWindow.alertListView.setFilter(filterValue, filterCol) self.mainWindow.updateAlertCount(shown) class MainWindowDialog(QMainWindow): def __init__(self, interface): QMainWindow.__init__(self) self.setCaption("Pylude") self.setIcon(QPixmap("images/prelude.png")) self.resize(800, 600) self.setCentralWidget(QWidget(self)) layout = QVBoxLayout(self.centralWidget()) self.alertListView = AlertListView(self.centralWidget(), interface) layout.addWidget(self.alertListView) self.statusBarLabel = QLabel(self.centralWidget()) layout.addWidget(self.statusBarLabel) self.alertListView.setAllColumnsShowFocus(True) self.alertListView.setSorting(-1) self.alertListView.setVScrollBarMode(QScrollView.AlwaysOn) self.interface = interface self.summaryWindow = None self.totalAlerts = 0 self.stepOffset = 0 self.createToolbars() self.createStatusBar() def addPixmapButton(self, toolbar, callback, enabledImage, disabledImage=None, toolTip=None): pixmap = QPixmap(enabledImage) icon = QIconSet(pixmap) if disabledImage: for size in (QIconSet.Small, QIconSet.Large): icon.setPixmap(QPixmap(disabledImage), size, QIconSet.Disabled, QIconSet.Off) for size in (QIconSet.Small, QIconSet.Large): icon.setIconSize(size, QSize(32, 32)) button = QToolButton(toolbar) button.setIconSet(icon) button.setTextLabel(toolTip, True) self.connect(button, SIGNAL("clicked()"), callback) return button def addTextButton(self, toolbar, callback, text): button = QToolButton(toolbar) button.setText(text) self.connect(button, SIGNAL("clicked()"), callback) return button def addLabel(self, toolbar, text): label = QLabel(toolbar) label.setText(text) def createMainToolbar(self): mainToolBar = QToolBar(self) mainToolBar.setNewLine(True) self.backButton = self.addPixmapButton(mainToolBar, self.backwardActivated, "images/back.png", "images/back-disabled.png", "Previous Page") self.backButton.setEnabled(False) self.topButton = self.addPixmapButton(mainToolBar, self.topActivated, "images/up.png", "images/up-disabled.png", "First Page") self.topButton.setEnabled(False) self.fwdButton = self.addPixmapButton(mainToolBar, self.forwardActivated, "images/forward.png", "images/forward-disabled.png", "Next Page") self.reloadButton = self.addPixmapButton(mainToolBar, self.updateAlerts, "images/reload.png", "images/reload-disabled.png", "Reload") self.findButton = self.addPixmapButton(mainToolBar, self.findActivated, "images/find.png", "images/find-disabled.png", "Find") self.summaryButton = self.addPixmapButton(mainToolBar, self.summaryActivated, "images/summary.png", "images/summary-disabled.png", "Summary") self.connectionButton = self.addPixmapButton(mainToolBar, self.connectionSetupActivated, "images/disconnect.png", "images/connect.png", "Connection") self.addPixmapButton(mainToolBar, self.quitActivated, "images/quit.png", toolTip="Quit") def createNavigationToolbar(self): navigationToolBar = QToolBar(self) navigationToolBar.setNewLine(True) self.addLabel(navigationToolBar, "Range:") self.stepValueSpinBox = QSpinBox(1, 100, 1, navigationToolBar) navigationToolBar.boxLayout().insertSpacing(3, 100) #self.addLabel(navigationToolBar, " ") self.stepUnitComboBox = QComboBox(navigationToolBar) for unit in ("Minute", "Hour", "Day", "Week", "Month", "Year"): self.stepUnitComboBox.insertItem(unit) self.stepUnitComboBox.setCurrentText("Hour") self.addLabel(navigationToolBar, " ") self.addLabel(navigationToolBar, "Page:") self.pageSpinBox = QSpinBox(1, 999, 1, navigationToolBar) self.pageSpinBox self.addLabel(navigationToolBar, " ") self.goButton = self.addTextButton(navigationToolBar, self.goActivated, "Go") #navigationToolBar.addSeparator() filterToolBar = QToolBar(self) self.filter = Filter(self, filterToolBar) def createStatusBar(self): statusbar = self.statusBar() statusbar.hide() self.statusBarLabel.setAlignment(Qt.AlignHCenter | Qt.AlignBottom) self.updateStatusMessage("Ready...") def createToolbars(self): self.createMainToolbar() self.createNavigationToolbar() def resizeEvent(self, event): self.alertListView.triggerUpdate() def quitActivated(self): self.interface.app.quit() def connected(self): self.connectionButton.setPixmap(QPixmap("images/disconnect.png")) self.connectionButton.setTextLabel("Disconnect", True) self.fwdButton.setEnabled(True) self.reloadButton.setEnabled(True) self.findButton.setEnabled(True) self.summaryButton.setEnabled(True) self.stepValueSpinBox.setEnabled(True) self.stepUnitComboBox.setEnabled(True) self.pageSpinBox.setEnabled(True) self.goButton.setEnabled(True) self.filter.setEnabled(True) def disconnected(self): self.connectionButton.setPixmap(QPixmap("images/connect.png")) self.connectionButton.setTextLabel("Connect", True) self.fwdButton.setEnabled(False) self.backButton.setEnabled(False) self.topButton.setEnabled(False) self.reloadButton.setEnabled(False) self.findButton.setEnabled(False) self.summaryButton.setEnabled(False) self.stepValueSpinBox.setEnabled(False) self.stepValueSpinBox.setValue(1) self.stepUnitComboBox.setEnabled(False) self.stepUnitComboBox.setCurrentItem(1) self.pageSpinBox.setEnabled(False) self.pageSpinBox.setValue(1) self.goButton.setEnabled(False) self.filter.setEnabled(False) self.alertListView.deleteItems() self.totalAlerts = 0 self.stepOffset = 0 def connectionSetupActivated(self): if self.interface.isConnected(): popup_info(self, "Database is now offline") self.interface.db.disconnect() self.interface.setConnectionStatus(False) else: dialog = self.interface.setupDialog.show() def summaryActivated(self): if self.summaryWindow == None: self.summaryWindow = SummaryDialog(self, self.interface) self.summaryWindow.show() self.summaryWindow.update() self.summaryWindow.show() def findActivated(self): findWindow = FindDialog(self, self.interface) findWindow.show() def backwardActivated(self): if self.stepOffset != 0: self.stepOffset -= 1 self.updateAlerts() def forwardActivated(self): self.stepOffset += 1 self.updateAlerts() def topActivated(self): self.stepOffset = 0 self.updateAlerts() def goActivated(self): self.stepOffset = self.getPage() self.updateAlerts() def updateStatusMessage(self, message): self.statusBarLabel.setText("%s" % message) def updateDateTime(self, offset=None): if offset is None: offset = self.stepOffset value = offset * self.stepValueSpinBox.value() dateTime = QDateTime.currentDateTime() unit = self.stepUnitComboBox.currentText() if offset == 0 and unit in ("Minute", "Hour"): if unit == "Minute": dateTime = dateTime.addSecs(- (value * 60)) elif unit == "Hour": dateTime = dateTime.addSecs(- (value * 60 ** 2)) else: time = dateTime.time() date = dateTime.date() time.setHMS(time.hour(), time.minute(), 0) if unit != "Minute": time.setHMS(time.hour(), 0, 0) if unit != "Hour": time.setHMS(0, 0, 0) if unit != "Day" and unit != "Week": date.setYMD(date.year(), date.month(), 0) if unit != "Month": date.setYMD(date.year(), 0, 0) else: date = date.addMonths(- value) else: if unit == "Week" and offset > 0: value = value * 7 + localtime().tm_wday date = date.addDays(- value) else: time = time.addSecs(- ((value - 1) * 60 * 60)) else: time = time.addSecs(- ((value - 1) * 60)) dateTime.setTime(time) dateTime.setDate(date) # tmp = QDateTime() # tmp = tmp.addYears(dateTime.date().year()) # print dateTime.date().year() # print tmp.date().year() # if unit != "Year": # tmp = tmp.addMonths(dateTime.date().month()) # if unit != "Month": # tmp = tmp.addDays(dateTime.date().day()) # if unit != "Day": # tmp = tmp.addSecs(dateTime.time().hour() * 3600) # if unit != "Hour": # tmp = tmp.addSecs(dateTime.time().minute() * 60) # dateTime = tmp self.stepDateTimeLineEdit.setText(dateTime.toString("yyyy/MM/dd hh:mm:ss")) def updateDateTime2(self, offset=None): if offset is None: offset = self.stepOffset value = self.stepValueSpinBox.value() dateTime = QDateTime.currentDateTime() unit = self.stepUnitComboBox.currentText() format = "yyyy/MM/dd hh:mm:ss" if unit in ("Minute", "Hour"): if offset == 0 and value == 1: format = "hh:mm:ss" if unit == "Minute": dateTime = dateTime.addSecs(- 60) else: dateTime = dateTime.addSecs(- 3600) else: dateTime = dateTime.addSecs(- dateTime.time().second()) format = "yyyy/MM/dd hh:mm:ss" if unit == "Minute": dateTime = dateTime.addSecs(- value * offset * 60) else: dateTime = dateTime.addSecs(- (value * offset * 3600 + dateTime.time().minute() * 60 + dateTime.time().second())) self.stepDateTimeLineEdit.setText(dateTime.toString(format)) def updateWidgetsToNewStepOffset(self): self.updatePage() for widget in self.topButton, self.backButton: widget.setEnabled(self.stepOffset > 0) for widget in self.stepValueSpinBox, self.stepUnitComboBox: widget.setEnabled(self.stepOffset == 0) def updatePage(self): return self.pageSpinBox.setValue(self.stepOffset + 1) def getPage(self): return (self.pageSpinBox.value() - 1) def updateAlertCount(self, shown): self.updateStatusMessage("Alerts: %d/%d" % (shown, self.totalAlerts)) def updateAlerts(self, initial=False): self.updateWidgetsToNewStepOffset() self.alertListView.deleteItems() alertIdentList = self.interface.db.getAlertIdentList(self.stepOffset, self.stepValueSpinBox.value(), string.lower(self.stepUnitComboBox.currentText())) if not alertIdentList: self.totalAlerts = 0 self.updateAlertCount(0) return self.totalAlerts, shown = self.alertListView.updateAlerts(alertIdentList) self.updateAlertCount(shown)