From 958213ee5211f3b81597c56e49c453c82a340ad1 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Mon, 15 Feb 2021 14:12:07 +0100 Subject: [PATCH] Improve instant search --- src/BufferView.cpp | 7 +++-- src/frontends/qt/GuiSearch.cpp | 9 +++---- src/frontends/qt/GuiSpellchecker.cpp | 2 +- src/lyxfind.cpp | 38 ++++++++++++++++++---------- src/lyxfind.h | 8 +++--- 5 files changed, 40 insertions(+), 24 deletions(-) diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 81b76916e1..534e3bc2d9 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -459,7 +459,9 @@ void BufferView::setSearchRequestCache(docstring const & text) bool matchword; bool forward; bool wrap; - docstring const search = string2find(text, casesensitive, matchword, forward, wrap); + bool instant; + docstring const search = string2find(text, casesensitive, matchword, + forward, wrap, instant); theClipboard().setFindBuffer(search); } @@ -1645,7 +1647,8 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) break; docstring const data = - find2string(searched_string, false, false, act == LFUN_WORD_FIND_FORWARD, false); + find2string(searched_string, false, false, + act == LFUN_WORD_FIND_FORWARD, false, false); bool found = lyxfind(this, FuncRequest(LFUN_WORD_FIND, data)); if (found) dr.screenUpdate(Update::Force | Update::FitCursor); diff --git a/src/frontends/qt/GuiSearch.cpp b/src/frontends/qt/GuiSearch.cpp index 6c72ab86f9..1658804cd1 100644 --- a/src/frontends/qt/GuiSearch.cpp +++ b/src/frontends/qt/GuiSearch.cpp @@ -230,13 +230,12 @@ void GuiSearchWidget::replaceallClicked() void GuiSearchWidget::find(docstring const & search, bool casesensitive, - bool matchword, bool forward, bool instant, bool wrap) + bool matchword, bool forward, bool instant, + bool wrap) { docstring const sdata = - find2string(search, casesensitive, matchword, forward, wrap); - if (instant) - // re-query current match - dispatch(FuncRequest(LFUN_WORD_BACKWARD)); + find2string(search, casesensitive, matchword, + forward, wrap, instant); dispatch(FuncRequest(LFUN_WORD_FIND, sdata)); } diff --git a/src/frontends/qt/GuiSpellchecker.cpp b/src/frontends/qt/GuiSpellchecker.cpp index 40ad72c557..d36f5627c9 100644 --- a/src/frontends/qt/GuiSpellchecker.cpp +++ b/src/frontends/qt/GuiSpellchecker.cpp @@ -467,7 +467,7 @@ void SpellcheckerWidget::on_findNextPB_clicked() return; docstring const textfield = qstring_to_ucs4(d->ui.wordED->text()); docstring const datastring = find2string(textfield, - true, true, true, false); + true, true, true, false, false); LYXERR(Debug::GUI, "Spellchecker: find next (" << textfield << ")"); dispatch(FuncRequest(LFUN_WORD_FIND, datastring)); d->canCheck(); diff --git a/src/lyxfind.cpp b/src/lyxfind.cpp index 8c671414eb..8487c01326 100644 --- a/src/lyxfind.cpp +++ b/src/lyxfind.cpp @@ -267,14 +267,15 @@ bool searchAllowed(docstring const & str) bool findOne(BufferView * bv, docstring const & searchstr, bool case_sens, bool whole, bool forward, - bool find_del, bool check_wrap, bool auto_wrap) + bool find_del, bool check_wrap, bool auto_wrap, + bool instant) { if (!searchAllowed(searchstr)) return false; DocIterator cur = forward - ? bv->cursor().selectionEnd() - : bv->cursor().selectionBegin(); + ? (instant ? bv->cursor().selectionBegin() : bv->cursor().selectionEnd()) + : (instant ? bv->cursor().selectionEnd() : bv->cursor().selectionBegin()); MatchString const match(searchstr, case_sens, whole); @@ -307,7 +308,8 @@ bool findOne(BufferView * bv, docstring const & searchstr, bv->cursor().backwardPos(); } bv->clearSelection(); - if (findOne(bv, searchstr, case_sens, whole, forward, find_del, false, false)) + if (findOne(bv, searchstr, case_sens, whole, forward, + find_del, false, false, false)) return true; } bv->cursor().setCursor(cur_orig); @@ -390,7 +392,8 @@ pair replaceOne(BufferView * bv, docstring searchstr, if (!cur.selection()) { // no selection, non-empty search string: find it if (!searchstr.empty()) { - bool const found = findOne(bv, searchstr, case_sens, whole, forward, true, findnext, wrap); + bool const found = findOne(bv, searchstr, case_sens, whole, + forward, true, findnext, wrap, false); return make_pair(found, 0); } // empty search string @@ -419,7 +422,8 @@ pair replaceOne(BufferView * bv, docstring searchstr, // no selection or current selection is not search word: // just find the search word if (!have_selection || !match) { - bool const found = findOne(bv, searchstr, case_sens, whole, forward, true, findnext, wrap); + bool const found = findOne(bv, searchstr, case_sens, whole, forward, + true, findnext, wrap, false); return make_pair(found, 0); } @@ -435,7 +439,8 @@ pair replaceOne(BufferView * bv, docstring searchstr, cur.pos() = cur.lastpos()); } if (findnext) - findOne(bv, searchstr, case_sens, whole, forward, false, findnext, wrap); + findOne(bv, searchstr, case_sens, whole, + forward, false, findnext, wrap, false); return make_pair(true, 1); } @@ -445,14 +450,15 @@ pair replaceOne(BufferView * bv, docstring searchstr, docstring const find2string(docstring const & search, bool casesensitive, bool matchword, - bool forward, bool wrap) + bool forward, bool wrap, bool instant) { odocstringstream ss; ss << search << '\n' << int(casesensitive) << ' ' << int(matchword) << ' ' << int(forward) << ' ' - << int(wrap); + << int(wrap) << ' ' + << int(instant); return ss.str(); } @@ -479,7 +485,8 @@ docstring const string2find(docstring const & argument, bool &casesensitive, bool &matchword, bool &forward, - bool &wrap) + bool &wrap, + bool &instant) { // data is of the form // " @@ -490,7 +497,8 @@ docstring const string2find(docstring const & argument, casesensitive = parse_bool(howto); matchword = parse_bool(howto); forward = parse_bool(howto, true); - wrap = parse_bool(howto, true); + wrap = parse_bool(howto); + instant = parse_bool(howto); return search; } @@ -506,9 +514,13 @@ bool lyxfind(BufferView * bv, FuncRequest const & ev) bool matchword; bool forward; bool wrap; - docstring search = string2find(ev.argument(), casesensitive, matchword, forward, wrap); + bool instant; + + docstring search = string2find(ev.argument(), casesensitive, + matchword, forward, wrap, instant); - return findOne(bv, search, casesensitive, matchword, forward, false, true, wrap); + return findOne(bv, search, casesensitive, matchword, forward, + false, true, wrap, instant); } diff --git a/src/lyxfind.h b/src/lyxfind.h index b6e9ec9113..484754944c 100644 --- a/src/lyxfind.h +++ b/src/lyxfind.h @@ -35,7 +35,8 @@ docstring const string2find(docstring const & argument, bool &casesensitive, bool &matchword, bool &forward, - bool &wrap); + bool &wrap, + bool &instant); /** Encode the parameters needed to find \c search as a string * that can be dispatched to the LyX core in a FuncRequest wrapper. @@ -44,7 +45,8 @@ docstring const find2string(docstring const & search, bool casesensitive, bool matchword, bool forward, - bool wrap); + bool wrap, + bool instant); /** Encode the parameters needed to replace \c search with \c replace * as a string that can be dispatched to the LyX core in a FuncRequest @@ -69,7 +71,7 @@ bool lyxfind(BufferView * bv, FuncRequest const & ev); bool findOne(BufferView * bv, docstring const & searchstr, bool case_sens, bool whole, bool forward, bool find_del = true, bool check_wrap = false, - bool auto_wrap = false); + bool auto_wrap = false, bool instant = false); /** Parse the string encoding of the replace request that is found in * \c ev.argument and act on it. -- 2.39.2