diff --git a/python/plugins/processing/gui/ScriptEditorDialog.py b/python/plugins/processing/gui/ScriptEditorDialog.py
index c8dc5cad73c..31f994e3d82 100644
--- a/python/plugins/processing/gui/ScriptEditorDialog.py
+++ b/python/plugins/processing/gui/ScriptEditorDialog.py
@@ -16,7 +16,6 @@
* *
***************************************************************************
"""
-from processing.modeler.ModelerUtils import ModelerUtils
__author__ = 'Alexander Bruy'
__date__ = 'December 2012'
@@ -29,6 +28,7 @@ __revision__ = '$Format:%H$'
import codecs
import sys
import json
+import os
from PyQt4.QtCore import *
from PyQt4.QtGui import *
@@ -37,12 +37,13 @@ from PyQt4.Qsci import *
from qgis.core import *
from qgis.utils import iface
+from processing.modeler.ModelerUtils import ModelerUtils
from processing.gui.AlgorithmDialog import AlgorithmDialog
from processing.gui.HelpEditionDialog import HelpEditionDialog
from processing.algs.r.RAlgorithm import RAlgorithm
from processing.algs.r.RUtils import RUtils
from processing.script.ScriptAlgorithm import ScriptAlgorithm
-from processing.script.ScriptUtils import ScriptUtils
+from processing.script import ScriptUtils
from processing.ui.ui_DlgScriptEditor import Ui_DlgScriptEditor
import processing.resources_rc
@@ -62,7 +63,6 @@ class ScriptEditorDialog(QDialog, Ui_DlgScriptEditor):
self.setWindowFlags(Qt.WindowMinimizeButtonHint |
Qt.WindowMaximizeButtonHint |
Qt.WindowCloseButtonHint)
-
# Set icons
self.btnOpen.setIcon(
QgsApplication.getThemeIcon('/mActionFileOpen.svg'))
@@ -79,6 +79,7 @@ class ScriptEditorDialog(QDialog, Ui_DlgScriptEditor):
QgsApplication.getThemeIcon('/mActionEditPaste.png'))
self.btnUndo.setIcon(QgsApplication.getThemeIcon('/mActionUndo.png'))
self.btnRedo.setIcon(QgsApplication.getThemeIcon('/mActionRedo.png'))
+ self.btnSnippets.setIcon(QgsApplication.getThemeIcon('/mActionHelpAPI.png'))
# Connect signals and slots
self.btnOpen.clicked.connect(self.openScript)
@@ -86,6 +87,7 @@ class ScriptEditorDialog(QDialog, Ui_DlgScriptEditor):
self.btnSaveAs.clicked.connect(self.saveAs)
self.btnEditHelp.clicked.connect(self.editHelp)
self.btnRun.clicked.connect(self.runAlgorithm)
+ self.btnSnippets.clicked.connect(self.showSnippets)
self.btnCut.clicked.connect(self.editor.cut)
self.btnCopy.clicked.connect(self.editor.copy)
self.btnPaste.clicked.connect(self.editor.paste)
@@ -96,6 +98,27 @@ class ScriptEditorDialog(QDialog, Ui_DlgScriptEditor):
self.alg = alg
self.algType = algType
+ self.snippets = {}
+ if self.algType == self.SCRIPT_PYTHON:
+ path = os.path.join(os.path.dirname(ScriptUtils.__file__), "snippets.py")
+ with open(path) as f:
+ lines = f.readlines()
+ snippetlines = []
+ name = None
+ for line in lines:
+ if line.startswith("##"):
+ if snippetlines:
+ self.snippets[name] = "".join(snippetlines)
+ name = line[2:]
+ snippetlines = []
+ else:
+ snippetlines.append(line)
+ if snippetlines:
+ self.snippets[name] = "".join(snippetlines)
+
+ if not self.snippets:
+ self.btnSnippets.setVisible(False)
+
if self.alg is not None:
self.filename = self.alg.descriptionFile
self.editor.setText(self.alg.script)
@@ -109,6 +132,14 @@ class ScriptEditorDialog(QDialog, Ui_DlgScriptEditor):
self.editor.setLexerType(self.algType)
+ def showSnippets(self, evt):
+ popupmenu = QMenu()
+ for name, snippet in self.snippets.iteritems():
+ action = QAction(self.tr(name), self.btnSnippets)
+ action.triggered[()].connect(lambda snippet=snippet: self.editor.insert(snippet))
+ popupmenu.addAction(action)
+ popupmenu.exec_(QCursor.pos())
+
def closeEvent(self, evt):
if self.hasChanged:
ret = QMessageBox.question(self, self.tr('Unsaved changes'),
diff --git a/python/plugins/processing/script/snippets.py b/python/plugins/processing/script/snippets.py
new file mode 100644
index 00000000000..df639acd01e
--- /dev/null
+++ b/python/plugins/processing/script/snippets.py
@@ -0,0 +1,16 @@
+##Iterate over the features of a layer.
+feats = processing.features(layer)
+n = len(feats)
+for i, feat in enumerate(feats):
+ progress.setPercentage(int(100 * i / n))
+ #do something with 'feat'
+
+##Create a new layer from another one, with an extra field
+fields = processing.fields(layer)
+# int, float and bool can be used as well as types
+fields.append(('NEW_FIELD', str))
+writer = processing.VectorWriter(output_file, None, fields,
+ processing.geomtype(layer), layer.crs())
+
+##Create a new table
+writer = processing.TableWriter(output_file, None, ['field1', 'field2'])
\ No newline at end of file
diff --git a/python/plugins/processing/ui/DlgScriptEditor.ui b/python/plugins/processing/ui/DlgScriptEditor.ui
index b88d7b81767..ac49db0a597 100644
--- a/python/plugins/processing/ui/DlgScriptEditor.ui
+++ b/python/plugins/processing/ui/DlgScriptEditor.ui
@@ -219,6 +219,23 @@
+ -
+
+
+ Qt::Vertical
+
+
+
+ -
+
+
+ ...
+
+
+ true
+
+
+
-