diff options
author | Oskar Linde <oskar.linde@gmail.com> | 2014-02-01 14:53:18 (GMT) |
---|---|---|
committer | Marius Kintel <marius@kintel.net> | 2014-02-06 05:46:26 (GMT) |
commit | 197e8955a4e78cc0eea94181ed0034f11320c0cc (patch) | |
tree | 9afbad19d583709a3e48786a2109cf52f8983f85 | |
parent | f04378c129ba27ae4551aeb87e16ecd64350b78d (diff) |
Editor: Implement Search & Replace
Conflicts:
src/MainWindow.h
-rw-r--r-- | src/MainWindow.h | 6 | ||||
-rw-r--r-- | src/MainWindow.ui | 62 | ||||
-rw-r--r-- | src/mainwin.cc | 44 |
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><</string> </property> </widget> </item> - <item> + <item row="0" column="4"> <widget class="QPushButton" name="nextButton"> <property name="text"> <string>></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()); } } |