diff --git a/images/images.qrc b/images/images.qrc index 9805a8254fa..c6e005f8515 100644 --- a/images/images.qrc +++ b/images/images.qrc @@ -165,6 +165,7 @@ themes/default/console/iconNewTabEditorConsole.svg themes/default/console/iconRestoreTabsConsole.svg themes/default/console/iconFileTabsMenuConsole.svg + themes/default/console/iconFormatCode.svg themes/default/console/iconShowEditorConsole.svg themes/default/console/iconCommentEditorConsole.svg themes/default/console/iconUncommentEditorConsole.svg diff --git a/images/themes/default/console/iconFormatCode.svg b/images/themes/default/console/iconFormatCode.svg new file mode 100644 index 00000000000..29945572dea --- /dev/null +++ b/images/themes/default/console/iconFormatCode.svg @@ -0,0 +1,47 @@ + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/python/console/console.py b/python/console/console.py index 7f954fb3603..81434aa0e5b 100644 --- a/python/console/console.py +++ b/python/console/console.py @@ -289,6 +289,18 @@ class PythonConsoleWidget(QWidget): self.toggleCommentEditorButton.setToolTip(toggleText + " Ctrl+:") self.toggleCommentEditorButton.setText(toggleText) + # Action Format code + formatCodeText = QCoreApplication.translate("PythonConsole", "Format Code") + self.formatCodeEditorButton = QAction(self) + self.formatCodeEditorButton.setCheckable(False) + self.formatCodeEditorButton.setEnabled(True) + self.formatCodeEditorButton.setIcon(QgsApplication.getThemeIcon("console/iconFormatCode.svg")) + self.formatCodeEditorButton.setMenuRole(QAction.PreferencesRole) + self.formatCodeEditorButton.setIconVisibleInMenu(True) + self.formatCodeEditorButton.setToolTip(formatCodeText + " Ctrl+Alt+F") + self.formatCodeEditorButton.setShortcut("Ctrl+Alt+F") + self.formatCodeEditorButton.setText(formatCodeText) + # Action for Object browser objList = QCoreApplication.translate("PythonConsole", "Object Inspector…") self.objectListButton = QAction(self) @@ -417,6 +429,7 @@ class PythonConsoleWidget(QWidget): self.toolBarEditor.addAction(self.findTextButton) self.toolBarEditor.addSeparator() self.toolBarEditor.addAction(self.toggleCommentEditorButton) + self.toolBarEditor.addAction(self.formatCodeEditorButton) self.toolBarEditor.addSeparator() self.toolBarEditor.addAction(self.objectListButton) @@ -510,6 +523,7 @@ class PythonConsoleWidget(QWidget): self.findTextButton.triggered.connect(self._toggleFind) self.objectListButton.toggled.connect(self.toggleObjectListWidget) self.toggleCommentEditorButton.triggered.connect(self.toggleComment) + self.formatCodeEditorButton.triggered.connect(self.formatCode) self.runScriptEditorButton.triggered.connect(self.runScriptEditor) self.cutEditorButton.triggered.connect(self.cutEditor) self.copyEditorButton.triggered.connect(self.copyEditor) @@ -641,6 +655,9 @@ class PythonConsoleWidget(QWidget): def toggleComment(self): self.tabEditorWidget.currentWidget().toggleComment() + def formatCode(self): + self.tabEditorWidget.currentWidget().newEditor.formatCode() + def openScriptFileExtEditor(self): tabWidget = self.tabEditorWidget.currentWidget() path = tabWidget.path diff --git a/python/console/console_editor.py b/python/console/console_editor.py index 5aa7ea7275c..6fc1944860e 100644 --- a/python/console/console_editor.py +++ b/python/console/console_editor.py @@ -30,6 +30,8 @@ from functools import partial from operator import itemgetter from pathlib import Path +import autopep8 + from qgis.core import Qgis, QgsApplication, QgsBlockingNetworkRequest, QgsFileUtils, QgsSettings from qgis.gui import QgsCodeEditorPython, QgsMessageBar from qgis.PyQt.Qsci import QsciScintilla @@ -229,6 +231,23 @@ class Editor(QgsCodeEditorPython): def findPrevious(self): self.findText(False) + def formatCode(self): + + new_text = autopep8.fix_code(self.text()) + if new_text == self.text(): + return + + # Try to preserve the cursor position and scroll position + old_pos = self.getCursorPosition() + old_scroll_value = self.verticalScrollBar().value() + self.beginUndoAction() + self.selectAll() + self.removeSelectedText() + self.insert(new_text) + self.setCursorPosition(*old_pos) + self.verticalScrollBar().setValue(old_scroll_value) + self.endUndoAction() + def objectListEditor(self): listObj = self.pythonconsole.listClassMethod if listObj.isVisible():