diff -r a7e370d20ab3 -r 8e9e83221c15 MqttMonitor/MqttMonitorWidget.py --- a/MqttMonitor/MqttMonitorWidget.py Sat Sep 15 12:01:20 2018 +0200 +++ b/MqttMonitor/MqttMonitorWidget.py Sat Sep 15 12:12:01 2018 +0200 @@ -18,11 +18,11 @@ import collections import copy -from PyQt5.QtCore import pyqtSlot, Qt, QTimer +from PyQt5.QtCore import pyqtSlot, Qt, QTimer, QFileInfo from PyQt5.QtGui import QFont, QTextCursor, QBrush from PyQt5.QtWidgets import QWidget, QDialog -from E5Gui import E5MessageBox +from E5Gui import E5MessageBox, E5FileDialog from E5Gui.E5PathPicker import E5PathPickerModes from .Ui_MqttMonitorWidget import Ui_MqttMonitorWidget @@ -75,7 +75,6 @@ # TODO: Messages Edit improvements: # 1. add capability to search - # 2. add capability to save contents to a file for logLevel in (MqttClient.LogDisabled, MqttClient.LogDebug, @@ -90,7 +89,6 @@ # TODO: Log Edit improvements: # 1. add capability to search - # 2. add configuration capability for colors self.__logMessagesBackgrounds = { MqttClient.LogDebug: QBrush(Qt.white), @@ -555,7 +553,7 @@ f = open(payloadFile, "rb") payloadStr = f.read() f.close() - except (IOError, OSError) as err: + except EnvironmentError as err: E5MessageBox.critical( self, self.tr("Read Payload from File"), @@ -619,6 +617,120 @@ # successfully sent self.__setBrokerStatusSubscribed(True) + @pyqtSlot(int) + def on_messagesEdit_blockCountChanged(self, newBlockCount): + """ + Private slot handling changes of received messages. + + @param newBlockCount (ignored) + @type int + """ + enable = not self.messagesEdit.document().isEmpty() + self.saveMessagesButton.setEnabled(enable) + self.clearMessagesButton.setEnabled(enable) + + @pyqtSlot() + def on_saveMessagesButton_clicked(self): + """ + Private slot to save the received messages. + """ + fn, selectedFilter = E5FileDialog.getSaveFileNameAndFilter( + self, + self.tr("Save Messages"), + "", + self.tr("Messages Files (*.txt);;All Files (*)"), + "", + E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite)) + + if fn: + if fn.endswith("."): + fn = fn[:-1] + + ext = QFileInfo(fn).suffix() + if not ext: + ex = selectedFilter.split("(*")[1].split(")")[0] + if ex: + fn += ex + if QFileInfo(fn).exists(): + res = E5MessageBox.yesNo( + self, + self.tr("Save Messages"), + self.tr("<p>The file <b>{0}</b> already exists." + " Overwrite it?</p>").format(fn), + icon=E5MessageBox.Warning) + if not res: + return + + fn = Utilities.toNativeSeparators(fn) + try: + f = open(fn, "w") + f.write(self.messagesEdit.toPlainText()) + f.close() + except EnvironmentError as err: + E5MessageBox.critical( + self, + self.tr("Save Messages"), + self.tr("""<p>The file <b>{0}</b> could not be written.""" + """</p><p>Reason: {1}</p>""").format( + fn, str(err))) + + @pyqtSlot(int) + def on_logEdit_blockCountChanged(self, newBlockCount): + """ + Private slot handling changes of received messages. + + @param newBlockCount (ignored) + @type int + """ + enable = not self.logEdit.document().isEmpty() + self.saveLogMessagesButton.setEnabled(enable) + self.clearLogMessagesButton.setEnabled(enable) + + @pyqtSlot() + def on_saveLogMessagesButton_clicked(self): + """ + Private slot to save the log messages. + """ + fn, selectedFilter = E5FileDialog.getSaveFileNameAndFilter( + self, + self.tr("Save Log Messages"), + "", + self.tr("Log Files (*.log);;All Files (*)"), + "", + E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite)) + + if fn: + if fn.endswith("."): + fn = fn[:-1] + + ext = QFileInfo(fn).suffix() + if not ext: + ex = selectedFilter.split("(*")[1].split(")")[0] + if ex: + fn += ex + if QFileInfo(fn).exists(): + res = E5MessageBox.yesNo( + self, + self.tr("Save Log Messages"), + self.tr("<p>The file <b>{0}</b> already exists." + " Overwrite it?</p>").format(fn), + icon=E5MessageBox.Warning) + if not res: + return + + fn = Utilities.toNativeSeparators(fn) + try: + f = open(fn, "w") + f.write(self.logEdit.toPlainText()) + f.close() + except EnvironmentError as err: + E5MessageBox.critical( + self, + self.tr("Save Log Messages"), + self.tr("""<p>The file <b>{0}</b> could not be written.""" + """</p><p>Reason: {1}</p>""").format( + fn, str(err))) + ####################################################################### ## Utility methods #######################################################################