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 @@
+
+
+
\ 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():