Skip to content

Commit e9feeaa

Browse files
authored
Merge pull request #5875 from alexbruy/processing-editor
[FEATURE][processing][needs-docs] add find and replace functionality to script editor
2 parents 4f570ce + 5016c21 commit e9feeaa

File tree

5 files changed

+217
-11
lines changed

5 files changed

+217
-11
lines changed

images/images.qrc

+1
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,7 @@
599599
<file>themes/default/mActionRegularPolygon2Points.svg</file>
600600
<file>themes/default/mActionCircle3Tangents.svg</file>
601601
<file>themes/default/mActionAddGeoPackageLayer.svg</file>
602+
<file>themes/default/mActionFindReplace.svg</file>
602603
<file>icons/qgis_icon.svg</file>
603604
<file>themes/default/mActionCircle2TangentsPoint.svg</file>
604605
<file>themes/default/mActionRegularPolygonCenterPoint.svg</file>
Loading
Loading

python/plugins/processing/gui/ScriptEditorDialog.py

+25
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ def __init__(self, algType, alg):
6464
Qt.WindowMaximizeButtonHint |
6565
Qt.WindowCloseButtonHint)
6666

67+
self.searchWidget.setVisible(False)
68+
6769
settings = QgsSettings()
6870
self.restoreState(settings.value("/Processing/stateScriptEditor", QByteArray()))
6971
self.restoreGeometry(settings.value("/Processing/geometryScriptEditor", QByteArray()))
@@ -90,6 +92,8 @@ def __init__(self, algType, alg):
9092
QgsApplication.getThemeIcon('/mActionUndo.svg'))
9193
self.actionRedo.setIcon(
9294
QgsApplication.getThemeIcon('/mActionRedo.svg'))
95+
self.actionFindReplace.setIcon(
96+
QgsApplication.getThemeIcon('/mActionFindReplace.svg'))
9397
self.actionIncreaseFontSize.setIcon(
9498
QgsApplication.getThemeIcon('/mActionIncreaseFont.svg'))
9599
self.actionDecreaseFontSize.setIcon(
@@ -106,10 +110,15 @@ def __init__(self, algType, alg):
106110
self.actionPaste.triggered.connect(self.editor.paste)
107111
self.actionUndo.triggered.connect(self.editor.undo)
108112
self.actionRedo.triggered.connect(self.editor.redo)
113+
self.actionFindReplace.toggled.connect(self.toggleSearchBox)
109114
self.actionIncreaseFontSize.triggered.connect(self.editor.zoomIn)
110115
self.actionDecreaseFontSize.triggered.connect(self.editor.zoomOut)
111116
self.editor.textChanged.connect(lambda: self.setHasChanged(True))
112117

118+
self.btnFind.clicked.connect(self.find)
119+
self.btnReplace.clicked.connect(self.replace)
120+
self.lastSearch = None
121+
113122
self.alg = alg
114123
self.algType = algType
115124

@@ -287,3 +296,19 @@ def runAlgorithm(self):
287296
except:
288297
pass
289298
canvas.setMapTool(prevMapTool)
299+
300+
def find(self):
301+
textToFind = self.leFindText.text()
302+
caseSensitive = self.chkCaseSensitive.isChecked()
303+
wholeWord = self.chkWholeWord.isChecked()
304+
if self.lastSearch is None or textToFind != self.lastSearch:
305+
self.editor.findFirst(textToFind, False, caseSensitive, wholeWord, True)
306+
else:
307+
self.editor.findNext()
308+
309+
def replace(self):
310+
textToReplace = self.leReplaceText.text()
311+
self.editor.replaceSelectedText(textToReplace)
312+
313+
def toggleSearchBox(self, checked):
314+
self.searchWidget.setVisible(checked)

python/plugins/processing/ui/DlgScriptEditor.ui

+83
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,79 @@
1818
<item row="0" column="0">
1919
<widget class="ScriptEdit" name="editor"/>
2020
</item>
21+
<item row="1" column="0">
22+
<widget class="QWidget" name="searchWidget" native="true">
23+
<layout class="QGridLayout" name="gridLayout_2">
24+
<property name="leftMargin">
25+
<number>0</number>
26+
</property>
27+
<property name="topMargin">
28+
<number>5</number>
29+
</property>
30+
<property name="rightMargin">
31+
<number>0</number>
32+
</property>
33+
<property name="bottomMargin">
34+
<number>5</number>
35+
</property>
36+
<item row="0" column="0">
37+
<widget class="QCheckBox" name="chkCaseSensitive">
38+
<property name="text">
39+
<string>Case sensitive</string>
40+
</property>
41+
</widget>
42+
</item>
43+
<item row="1" column="0">
44+
<widget class="QCheckBox" name="chkWholeWord">
45+
<property name="text">
46+
<string>Whole word</string>
47+
</property>
48+
</widget>
49+
</item>
50+
<item row="1" column="4" colspan="2">
51+
<widget class="QPushButton" name="btnReplace">
52+
<property name="text">
53+
<string>Replace</string>
54+
</property>
55+
</widget>
56+
</item>
57+
<item row="0" column="2">
58+
<widget class="QLabel" name="label">
59+
<property name="text">
60+
<string>Find what:</string>
61+
</property>
62+
</widget>
63+
</item>
64+
<item row="1" column="2">
65+
<widget class="QLabel" name="label_2">
66+
<property name="text">
67+
<string>Replace with:</string>
68+
</property>
69+
</widget>
70+
</item>
71+
<item row="1" column="3">
72+
<widget class="QLineEdit" name="leReplaceText"/>
73+
</item>
74+
<item row="0" column="4" colspan="2">
75+
<widget class="QPushButton" name="btnFind">
76+
<property name="text">
77+
<string>Find</string>
78+
</property>
79+
</widget>
80+
</item>
81+
<item row="0" column="3">
82+
<widget class="QLineEdit" name="leFindText"/>
83+
</item>
84+
<item row="0" column="1" rowspan="2">
85+
<widget class="Line" name="line_8">
86+
<property name="orientation">
87+
<enum>Qt::Vertical</enum>
88+
</property>
89+
</widget>
90+
</item>
91+
</layout>
92+
</widget>
93+
</item>
2194
</layout>
2295
</widget>
2396
<widget class="QToolBar" name="toolBar">
@@ -45,6 +118,8 @@
45118
<addaction name="actionUndo"/>
46119
<addaction name="actionRedo"/>
47120
<addaction name="separator"/>
121+
<addaction name="actionFindReplace"/>
122+
<addaction name="separator"/>
48123
<addaction name="actionIncreaseFontSize"/>
49124
<addaction name="actionDecreaseFontSize"/>
50125
</widget>
@@ -171,6 +246,14 @@
171246
<string>Decrease font size</string>
172247
</property>
173248
</action>
249+
<action name="actionFindReplace">
250+
<property name="checkable">
251+
<bool>true</bool>
252+
</property>
253+
<property name="text">
254+
<string>FindReplace</string>
255+
</property>
256+
</action>
174257
</widget>
175258
<customwidgets>
176259
<customwidget>

0 commit comments

Comments
 (0)