summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOskar Linde <oskar.linde@gmail.com>2014-02-01 14:53:18 (GMT)
committerMarius Kintel <marius@kintel.net>2014-02-06 05:46:26 (GMT)
commit197e8955a4e78cc0eea94181ed0034f11320c0cc (patch)
tree9afbad19d583709a3e48786a2109cf52f8983f85
parentf04378c129ba27ae4551aeb87e16ecd64350b78d (diff)
Editor: Implement Search & Replace
Conflicts: src/MainWindow.h
-rw-r--r--src/MainWindow.h6
-rw-r--r--src/MainWindow.ui62
-rw-r--r--src/mainwin.cc44
3 files changed, 101 insertions, 11 deletions
diff --git a/src/MainWindow.h b/src/MainWindow.h
index a908be0..e16f5b4 100644
--- a/src/MainWindow.h
+++ b/src/MainWindow.h
@@ -117,12 +117,16 @@ private slots:
private slots:
void actionRenderCSG();
+ void selectFindType(int);
void find();
+ void findAndReplace();
void findNext();
void findPrev();
void useSelectionForFind();
+ void replace();
+ void replaceAll();
protected:
- void findOperation(QTextDocument::FindFlags options = 0);
+ bool findOperation(QTextDocument::FindFlags options = 0);
virtual bool eventFilter(QObject* obj, QEvent *event);
private slots:
diff --git a/src/MainWindow.ui b/src/MainWindow.ui
index 75635b7..ddd69ee 100644
--- a/src/MainWindow.ui
+++ b/src/MainWindow.ui
@@ -60,7 +60,7 @@
<property name="lineWidth">
<number>0</number>
</property>
- <layout class="QHBoxLayout" name="horizontalLayout">
+ <layout class="QGridLayout" name="horizontalLayout">
<property name="leftMargin">
<number>5</number>
</property>
@@ -73,37 +73,72 @@
<property name="bottomMargin">
<number>0</number>
</property>
- <item>
- <widget class="QLabel" name="label">
+ <property name="verticalSpacing">
+ <number>0</number>
+ </property>
+ <item row="1" column="3" colspan="2">
+ <widget class="QPushButton" name="replaceButton">
<property name="text">
- <string>Find</string>
+ <string>Replace</string>
</property>
</widget>
</item>
- <item>
- <widget class="QLineEdit" name="findInputField"/>
+ <item row="1" column="5">
+ <widget class="QPushButton" name="replaceAllButton">
+ <property name="text">
+ <string>All</string>
+ </property>
+ </widget>
</item>
- <item>
+ <item row="0" column="2">
+ <widget class="QLineEdit" name="findInputField">
+ <property name="placeholderText">
+ <string>Search string</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLineEdit" name="replaceInputField">
+ <property name="placeholderText">
+ <string>Replacement string</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
<widget class="QPushButton" name="prevButton">
<property name="text">
<string>&lt;</string>
</property>
</widget>
</item>
- <item>
+ <item row="0" column="4">
<widget class="QPushButton" name="nextButton">
<property name="text">
<string>&gt;</string>
</property>
</widget>
</item>
- <item>
+ <item row="0" column="5">
<widget class="QPushButton" name="hideFindButton">
<property name="text">
<string>Done</string>
</property>
</widget>
</item>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="findTypeComboBox">
+ <item>
+ <property name="text">
+ <string>Find</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Replace</string>
+ </property>
+ </item>
+ </widget>
+ </item>
</layout>
</widget>
</item>
@@ -263,6 +298,7 @@
<addaction name="editActionPasteVPR"/>
<addaction name="separator"/>
<addaction name="editActionFind"/>
+ <addaction name="editActionFindAndReplace"/>
<addaction name="editActionFindNext"/>
<addaction name="editActionFindPrevious"/>
<addaction name="editActionUseSelectionForFind"/>
@@ -763,6 +799,14 @@
<string>Ctrl+F</string>
</property>
</action>
+ <action name="editActionFindAndReplace">
+ <property name="text">
+ <string>Find and Replace...</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+Alt+F</string>
+ </property>
+ </action>
<action name="editActionFindNext">
<property name="text">
<string>Find Next</string>
diff --git a/src/mainwin.cc b/src/mainwin.cc
index 07dff73..2c70102 100644
--- a/src/mainwin.cc
+++ b/src/mainwin.cc
@@ -287,6 +287,7 @@ MainWindow::MainWindow(const QString &filename)
connect(this->editActionPreferences, SIGNAL(triggered()), this, SLOT(preferences()));
// Edit->Find
connect(this->editActionFind, SIGNAL(triggered()), this, SLOT(find()));
+ connect(this->editActionFindAndReplace, SIGNAL(triggered()), this, SLOT(findAndReplace()));
connect(this->editActionFindNext, SIGNAL(triggered()), this, SLOT(findNext()));
connect(this->editActionFindPrevious, SIGNAL(triggered()), this, SLOT(findPrev()));
connect(this->editActionUseSelectionForFind, SIGNAL(triggered()), this, SLOT(useSelectionForFind()));
@@ -379,12 +380,16 @@ MainWindow::MainWindow(const QString &filename)
this, SLOT(setSyntaxHighlight(const QString&)));
Preferences::inst()->apply();
+ connect(this->findTypeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(selectFindType(int)));
connect(this->findInputField, SIGNAL(returnPressed()), this, SLOT(findNext()));
find_panel->installEventFilter(this);
connect(this->prevButton, SIGNAL(clicked()), this, SLOT(findPrev()));
connect(this->nextButton, SIGNAL(clicked()), this, SLOT(findNext()));
connect(this->hideFindButton, SIGNAL(clicked()), find_panel, SLOT(hide()));
+ connect(this->replaceButton, SIGNAL(clicked()), this, SLOT(replace()));
+ connect(this->replaceAllButton, SIGNAL(clicked()), this, SLOT(replaceAll()));
+ connect(this->replaceInputField, SIGNAL(returnPressed()), this, SLOT(replace()));
// make sure it looks nice..
QSettings settings;
@@ -1106,12 +1111,32 @@ void MainWindow::pasteViewportRotation()
void MainWindow::find()
{
+ findTypeComboBox->setCurrentIndex(0);
+ replaceInputField->hide();
+ replaceButton->hide();
+ replaceAllButton->hide();
find_panel->show();
findInputField->setFocus();
findInputField->selectAll();
}
-void MainWindow::findOperation(QTextDocument::FindFlags options) {
+void MainWindow::findAndReplace()
+{
+ findTypeComboBox->setCurrentIndex(1);
+ replaceInputField->show();
+ replaceButton->show();
+ replaceAllButton->show();
+ find_panel->show();
+ findInputField->setFocus();
+ findInputField->selectAll();
+}
+
+void MainWindow::selectFindType(int type) {
+ if (type == 0) find();
+ if (type == 1) findAndReplace();
+}
+
+bool MainWindow::findOperation(QTextDocument::FindFlags options) {
bool success = editor->find(findInputField->text(), options);
if (!success) { // Implement wrap-around search behavior
QTextCursor old_cursor = editor->textCursor();
@@ -1122,6 +1147,23 @@ void MainWindow::findOperation(QTextDocument::FindFlags options) {
if (!success) {
editor->setTextCursor(old_cursor);
}
+ return success;
+ }
+ return true;
+}
+
+void MainWindow::replace() {
+ QTextCursor cursor = editor->textCursor();
+ QString selectedText = cursor.selectedText();
+ if (selectedText == findInputField->text()) {
+ cursor.insertText(replaceInputField->text());
+ }
+ findNext();
+}
+
+void MainWindow::replaceAll() {
+ while (findOperation()) {
+ editor->textCursor().insertText(replaceInputField->text());
}
}
contact: Jan Huwald // Impressum