Просмотр исходного кода

- added a new menu entry in the context menu of the Tcl Shell: 'Save Log' which will save the content of the Tcl Shell browser window to a file

Marius Stanciu 5 лет назад
Родитель
Сommit
b569fa1748
5 измененных файлов с 84 добавлено и 10 удалено
  1. 2 0
      CHANGELOG.md
  2. 62 1
      FlatCAMApp.py
  3. 12 2
      flatcamGUI/GUIElements.py
  4. 6 5
      flatcamTools/ToolShell.py
  5. 2 2
      tclCommands/TclCommandHelp.py

+ 2 - 0
CHANGELOG.md

@@ -11,6 +11,8 @@ CHANGELOG for FlatCAM beta
 
 
 - some PEP changes, some method descriptions updated
 - some PEP changes, some method descriptions updated
 - added a placeholder text to 2Sided Tool
 - added a placeholder text to 2Sided Tool
+- added a new menu entry in the context menu of the Tcl Shell: 'Save Log' which will save the content of the Tcl Shell browser window to a file
+
 
 
 23.04.2020 
 23.04.2020 
 
 

+ 62 - 1
FlatCAMApp.py

@@ -3971,7 +3971,7 @@ class App(QtCore.QObject):
         self.date = ''.join(c for c in self.date if c not in ':-')
         self.date = ''.join(c for c in self.date if c not in ':-')
         self.date = self.date.replace(' ', '_')
         self.date = self.date.replace(' ', '_')
 
 
-        filter__ = "Config File (*.FlatConfig);;All Files (*.*)"
+        filter__ = "Config File .FlatConfig (*.FlatConfig);;All Files (*.*)"
         try:
         try:
             filename, _f = FCFileSaveDialog.get_saved_filename(
             filename, _f = FCFileSaveDialog.get_saved_filename(
                 caption=_("Export FlatCAM Preferences"),
                 caption=_("Export FlatCAM Preferences"),
@@ -4032,6 +4032,67 @@ class App(QtCore.QObject):
         self.file_saved.emit("preferences", filename)
         self.file_saved.emit("preferences", filename)
         self.inform.emit('[success] %s: %s' % (_("Exported preferences to"), filename))
         self.inform.emit('[success] %s: %s' % (_("Exported preferences to"), filename))
 
 
+    def save_to_file(self, content_to_save):
+        """
+        Save something to a file.
+
+        :return: None
+        """
+        self.report_usage("save_to_file")
+        App.log.debug("save_to_file()")
+
+        self.date = str(datetime.today()).rpartition('.')[0]
+        self.date = ''.join(c for c in self.date if c not in ':-')
+        self.date = self.date.replace(' ', '_')
+
+        filter__ = "HTML File .html (*.html);;All Files (*.*)"
+        path_to_save = self.defaults["global_last_save_folder"] if\
+            self.defaults["global_last_save_folder"] is not None else self.data_path
+        try:
+            filename, _f = FCFileSaveDialog.get_saved_filename(
+                caption=_("Save to file"),
+                directory=path_to_save + '/file_' + self.date,
+                filter=filter__
+            )
+        except TypeError:
+            filename, _f = FCFileSaveDialog.get_saved_filename(caption=_("Save to file"), filter=filter__)
+
+        filename = str(filename)
+
+        if filename == "":
+            self.inform.emit('[WARNING_NOTCL] %s' % _("Saving to file cancelled."))
+            return
+        else:
+            try:
+                f = open(filename, 'w')
+                defaults_file_content = f.read()
+                f.close()
+            except PermissionError:
+                self.inform.emit('[WARNING] %s' %
+                                 _("Permission denied, saving not possible.\n"
+                                   "Most likely another app is holding the file open and not accessible."))
+                return
+            except IOError:
+                App.log.debug('Creating a new file ...')
+                f = open(filename, 'w')
+                f.close()
+            except Exception:
+                e = sys.exc_info()[0]
+                App.log.error("Could not load the file.")
+                App.log.error(str(e))
+                self.inform.emit('[ERROR_NOTCL] %s' % _("Could not load the file."))
+                return
+
+            # Save content
+            try:
+                with open(filename, "w") as f:
+                    f.write(content_to_save)
+            except Exception:
+                self.inform.emit('[ERROR_NOTCL] %s %s' % (_("Failed to write defaults to file."), str(filename)))
+                return
+
+        self.inform.emit('[success] %s: %s' % (_("Exported file to"), filename))
+
     def save_geometry(self, x, y, width, height, notebook_width):
     def save_geometry(self, x, y, width, height, notebook_width):
         """
         """
         Will save the application geometry and positions in the defaults discitionary to be restored at the next
         Will save the application geometry and positions in the defaults discitionary to be restored at the next

+ 12 - 2
flatcamGUI/GUIElements.py

@@ -2568,13 +2568,19 @@ class _BrowserTextEdit(QTextEdit):
 
 
     def contextMenuEvent(self, event):
     def contextMenuEvent(self, event):
         self.menu = self.createStandardContextMenu(event.pos())
         self.menu = self.createStandardContextMenu(event.pos())
-        clear_action = QAction("Clear", self)
+
+        if self.app:
+            save_action = QAction(_("Save Log"), self)
+            self.menu.addAction(save_action)
+            save_action.triggered.connect(lambda: self.save_log(app=self.app))
+
+        clear_action = QAction(_("Clear"), self)
         clear_action.setShortcut(QKeySequence(Qt.Key_Delete))   # it's not working, the shortcut
         clear_action.setShortcut(QKeySequence(Qt.Key_Delete))   # it's not working, the shortcut
         self.menu.addAction(clear_action)
         self.menu.addAction(clear_action)
         clear_action.triggered.connect(self.clear)
         clear_action.triggered.connect(self.clear)
 
 
         if self.app:
         if self.app:
-            close_action = QAction("Close", self)
+            close_action = QAction(_("Close"), self)
             self.menu.addAction(close_action)
             self.menu.addAction(close_action)
             close_action.triggered.connect(lambda: self.app.ui.shell_dock.hide())
             close_action.triggered.connect(lambda: self.app.ui.shell_dock.hide())
 
 
@@ -2588,6 +2594,10 @@ class _BrowserTextEdit(QTextEdit):
         self.moveCursor(QTextCursor.End)
         self.moveCursor(QTextCursor.End)
         self.insertHtml(text)
         self.insertHtml(text)
 
 
+    def save_log(self, app):
+        html_content = self.toHtml()
+        app.save_to_file(content_to_save=html_content)
+
 
 
 class _ExpandableTextEdit(QTextEdit):
 class _ExpandableTextEdit(QTextEdit):
     """
     """

+ 6 - 5
flatcamTools/ToolShell.py

@@ -118,7 +118,7 @@ class TermWidget(QWidget):
 
 
         scrollbar = self._browser.verticalScrollBar()
         scrollbar = self._browser.verticalScrollBar()
         old_value = scrollbar.value()
         old_value = scrollbar.value()
-        scrollattheend = old_value == scrollbar.maximum()
+        # scrollattheend = old_value == scrollbar.maximum()
 
 
         self._browser.moveCursor(QTextCursor.End)
         self._browser.moveCursor(QTextCursor.End)
         self._browser.insertHtml(text)
         self._browser.insertHtml(text)
@@ -251,11 +251,12 @@ class FCShell(TermWidget):
         self._sysShell = sysShell
         self._sysShell = sysShell
 
 
     def is_command_complete(self, text):
     def is_command_complete(self, text):
-        def skipQuotes(text):
-            quote = text[0]
-            text = text[1:]
-            endIndex = str(text).index(quote)
+        def skipQuotes(txt):
+            quote = txt[0]
+            text_val = txt[1:]
+            endIndex = str(text_val).index(quote)
             return text[endIndex:]
             return text[endIndex:]
+
         while text:
         while text:
             if text[0] in ('"', "'"):
             if text[0] in ('"', "'"):
                 try:
                 try:

+ 2 - 2
tclCommands/TclCommandHelp.py

@@ -9,7 +9,6 @@
 from tclCommands.TclCommand import TclCommand
 from tclCommands.TclCommand import TclCommand
 
 
 import collections
 import collections
-import math
 
 
 import gettext
 import gettext
 import FlatCAMTranslation as fcTranslate
 import FlatCAMTranslation as fcTranslate
@@ -109,6 +108,7 @@ class TclCommandHelp(TclCommand):
                     displayed_text = ['> %s\n' % cmd for cmd in sorted(self.app.tcl_commands_storage)]
                     displayed_text = ['> %s\n' % cmd for cmd in sorted(self.app.tcl_commands_storage)]
 
 
                 cmd_enum += '<br>'.join(displayed_text)
                 cmd_enum += '<br>'.join(displayed_text)
-                cmd_enum += '<br><br>%s<br>%s' % (_("Type help <command_name> for usage."), _("Example: help open_gerber"))
+                cmd_enum += '<br><br>%s<br>%s<br>' % (
+                    _("Type help <command_name> for usage."), _("Example: help open_gerber"))
 
 
                 self.app.shell.append_raw(cmd_enum)
                 self.app.shell.append_raw(cmd_enum)