From 511b6c679bd06f2367453506a9b1c87eff34954f Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Sun, 26 Feb 2023 08:31:13 +0800 Subject: [PATCH] - enhancement: Auto close other search/replace dialogs when start to search/replace. - change: Remove "prompt when replace" in the replace. - fix: Search/replace with regex is not correctly handled. --- NEWS.md | 5 +- RedPandaIDE/mainwindow.cpp | 28 +++++-- RedPandaIDE/mainwindow.h | 2 + RedPandaIDE/mainwindow.ui | 1 - RedPandaIDE/widgets/replacedialog.ui | 80 ++++++++----------- libs/qsynedit/qsynedit/qsynedit.cpp | 23 ++++-- .../qsynedit/searcher/regexsearcher.cpp | 2 - 7 files changed, 79 insertions(+), 62 deletions(-) diff --git a/NEWS.md b/NEWS.md index 5e6078df..36b1b4c6 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,11 +3,14 @@ Red Panda C++ Version 2.15 - fix: Static class members is not correctly recognized as static. - fix: Function with reference type return value is not correctly parsed. - enhancement: Add descriptions for x86 registers in the cpu info dialog. - - fix: Search dialog shouldn't have "confirm when replace". + - fix: Search dialog shouldn't have "prompt when replace". - change: Default value for the debugger debugger panel "memory view's columns" is changed from 8 to 16. - change: Default value for the debugger debugger panel "memory view's rows" is changed from 8 to 16. - enhancement: Display hex value as ascii chars in the debugger panel memory view tab. - fix: Word on the last line's end can't be searched. + - enhancement: Auto close other search/replace dialogs when start to search/replace. + - change: Remove "prompt when replace" in the replace. + - fix: Search/replace with regex is not correctly handled. Red Panda C++ Version 2.14 diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 753fb525..49208423 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -1058,6 +1058,16 @@ int MainWindow::calIconSize(const QString &fontName, int fontPointSize) return metrics.ascent(); } +void MainWindow::hideAllSearchDialogs() +{ + if (mReplaceDialog) + mReplaceDialog->hide(); + if (mSearchDialog) + mSearchDialog->hide(); + if (mSearchInFilesDialog) + mSearchInFilesDialog->hide(); +} + void MainWindow::prepareSearchDialog() { if (!mSearchDialog) @@ -1070,6 +1080,13 @@ void MainWindow::prepareReplaceDialog() mReplaceDialog = new ReplaceDialog(this); } +void MainWindow::prepareSearchInFilesDialog() +{ + if (mSearchInFilesDialog==nullptr) { + mSearchInFilesDialog = new SearchInFileDialog(this); + } +} + void MainWindow::updateAppTitle() { Editor *e = mEditorList->getEditor(); @@ -6270,15 +6287,15 @@ void MainWindow::on_actionFind_triggered() if (!e) return; QString s = e->wordAtCursor(); + hideAllSearchDialogs(); prepareSearchDialog(); mSearchDialog->find(s); } void MainWindow::on_actionFind_in_files_triggered() { - if (mSearchInFilesDialog==nullptr) { - mSearchInFilesDialog = new SearchInFileDialog(this); - } + hideAllSearchDialogs(); + prepareSearchInFilesDialog(); Editor *e = mEditorList->getEditor(); if (e) { QString s = e->wordAtCursor(); @@ -6295,6 +6312,7 @@ void MainWindow::on_actionReplace_triggered() return; QString s = e->wordAtCursor(); + hideAllSearchDialogs(); prepareReplaceDialog(); mReplaceDialog->replace(s); } @@ -6341,9 +6359,7 @@ void MainWindow::on_cbSearchHistory_currentIndexChanged(int index) void MainWindow::on_btnSearchAgain_clicked() { - if (mSearchInFilesDialog==nullptr) { - mSearchInFilesDialog = new SearchInFileDialog(this); - } + hideAllSearchDialogs(); PSearchResults results=mSearchResultModel.currentResults(); if (!results) return; diff --git a/RedPandaIDE/mainwindow.h b/RedPandaIDE/mainwindow.h index d1aa2d8b..57ff13e9 100644 --- a/RedPandaIDE/mainwindow.h +++ b/RedPandaIDE/mainwindow.h @@ -274,8 +274,10 @@ public slots: private: int calIconSize(const QString &fontName, int fontPointSize); + void hideAllSearchDialogs(); void prepareSearchDialog(); void prepareReplaceDialog(); + void prepareSearchInFilesDialog(); void prepareProjectForCompile(); void closeProject(bool refreshEditor); void updateProjectView(); diff --git a/RedPandaIDE/mainwindow.ui b/RedPandaIDE/mainwindow.ui index 7418e50e..4affc7e2 100644 --- a/RedPandaIDE/mainwindow.ui +++ b/RedPandaIDE/mainwindow.ui @@ -965,7 +965,6 @@ - 50 false diff --git a/RedPandaIDE/widgets/replacedialog.ui b/RedPandaIDE/widgets/replacedialog.ui index c7555a81..8fe2733c 100644 --- a/RedPandaIDE/widgets/replacedialog.ui +++ b/RedPandaIDE/widgets/replacedialog.ui @@ -7,7 +7,7 @@ 0 0 512 - 242 + 308 @@ -196,12 +196,18 @@ 7 - - - - Whole words only + + + + Qt::Vertical - + + + 20 + 40 + + + @@ -213,6 +219,26 @@ + + + + Case Sensitive + + + + + + + + 0 + 0 + + + + Regular Expression + + + @@ -229,49 +255,13 @@ - - - - - 0 - 0 - - + + - Regular Expression + Whole words only - - - - Prompt on replace - - - true - - - - - - - Case Sensitive - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - diff --git a/libs/qsynedit/qsynedit/qsynedit.cpp b/libs/qsynedit/qsynedit/qsynedit.cpp index 44c9565a..89e1e9d3 100644 --- a/libs/qsynedit/qsynedit/qsynedit.cpp +++ b/libs/qsynedit/qsynedit/qsynedit.cpp @@ -5121,10 +5121,10 @@ int QSynEdit::searchReplace(const QString &sSearch, const QString &sReplace, Sea ptCurrent = ptStart; } } else { - ptStart.ch = 1; + ptStart.ch = 0; ptStart.line = 1; ptEnd.line = mDocument->count(); - ptEnd.ch = mDocument->getLine(ptEnd.line - 1).length(); + ptEnd.ch = mDocument->getLine(ptEnd.line - 1).length()+1; if (bFromCursor) { if (bBackward) ptEnd = caretXY(); @@ -5173,12 +5173,19 @@ int QSynEdit::searchReplace(const QString &sSearch, const QString &sReplace, Sea // Is the search result entirely in the search range? bool isInValidSearchRange = true; int first = nFound; - int last = nFound + nSearchLen -1; + int last = nFound + nSearchLen; if ((mActiveSelectionMode == SelectionMode::Normal) || !sOptions.testFlag(ssoSelectedOnly)) { - if (((ptCurrent.line == ptStart.line) && (first < ptStart.ch)) || - ((ptCurrent.line == ptEnd.line) && (last > ptEnd.ch))) +// qDebug()< ptEnd.ch))) { + isInValidSearchRange = false; + } } else if (mActiveSelectionMode == SelectionMode::Column) { // solves bug in search/replace when smColumn mode active and no selection isInValidSearchRange = ((first >= ptStart.ch) && (last <= ptEnd.ch)) @@ -5249,15 +5256,17 @@ int QSynEdit::searchReplace(const QString &sSearch, const QString &sReplace, Sea break; //search start from cursor, search has finished but no result founds bFromCursor = false; - ptStart.ch = 1; + ptStart.ch = 0; ptStart.line = 1; ptEnd.line = mDocument->count(); - ptEnd.ch = mDocument->getLine(ptEnd.line - 1).length(); + ptEnd.ch = mDocument->getLine(ptEnd.line - 1).length()+1; if (bBackward) { ptStart = originCaretXY; + ptEnd.ch++; ptCurrent = ptEnd; } else { ptEnd= originCaretXY; + ptStart.ch--; ptCurrent = ptStart; } } diff --git a/libs/qsynedit/qsynedit/searcher/regexsearcher.cpp b/libs/qsynedit/qsynedit/searcher/regexsearcher.cpp index 1618b37e..a9c2765c 100644 --- a/libs/qsynedit/qsynedit/searcher/regexsearcher.cpp +++ b/libs/qsynedit/qsynedit/searcher/regexsearcher.cpp @@ -53,8 +53,6 @@ int RegexSearcher::findAll(const QString &text) QRegularExpressionMatchIterator it = mRegex.globalMatch(text); while (it.hasNext()) { QRegularExpressionMatch match = it.next(); - if (match.capturedLength()==0) - continue; mLengths.append(match.capturedLength()); mResults.append(match.capturedStart()); }