MqttMonitor/MqttMonitorWidget.py

changeset 50
8e9e83221c15
parent 48
41dd2bfee4e4
child 52
cc8734657162
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
     #######################################################################

eric ide

mercurial