[LyX/master] Fix selection restoration in quick search (#12779)

Juergen Spitzmueller spitz at lyx.org
Fri Aug 11 07:53:23 UTC 2023


commit 02ba1a1327f8baa0ac582f93036153761ad2f65a
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Fri Aug 11 11:07:53 2023 +0200

    Fix selection restoration in quick search (#12779)
---
 src/lyxfind.cpp |   22 +++++++++++++++-------
 1 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/src/lyxfind.cpp b/src/lyxfind.cpp
index 42efd67..edf21d4 100644
--- a/src/lyxfind.cpp
+++ b/src/lyxfind.cpp
@@ -289,9 +289,11 @@ bool findOne(BufferView * bv, docstring const & searchstr,
 	     bool find_del, bool check_wrap, bool const auto_wrap,
 	     bool instant, bool onlysel)
 {
+	bool const had_selection = bv->cursor().selection();
+
 	// Clean up previous selections with empty searchstr on instant
 	if (searchstr.empty() && instant) {
-		if (bv->cursor().selection()) {
+		if (had_selection) {
 			bv->setCursor(bv->cursor().selectionBegin());
 			bv->clearSelection();
 		}
@@ -301,9 +303,10 @@ bool findOne(BufferView * bv, docstring const & searchstr,
 	if (!searchAllowed(searchstr))
 		return false;
 
-	DocIterator const endcur = forward ? bv->cursor().selectionEnd() : bv->cursor().selectionBegin();
+	DocIterator const startcur = bv->cursor().selectionBegin();
+	DocIterator const endcur = bv->cursor().selectionEnd();
 
-	if (onlysel && bv->cursor().selection()) {
+	if (onlysel && had_selection) {
 		docstring const matchstring = bv->cursor().selectionAsString(false);
 		docstring const lcmatchsting = support::lowercase(matchstring);
 		if (matchstring == searchstr || (!case_sens && lcmatchsting == lowercase(searchstr))) {
@@ -329,11 +332,11 @@ bool findOne(BufferView * bv, docstring const & searchstr,
 
 	int match_len = forward
 		? findForward(cur, endcur, match, find_del, onlysel)
-		: findBackwards(cur, endcur, match, find_del, onlysel);
+		: findBackwards(cur, startcur, match, find_del, onlysel);
 
 	if (match_len > 0)
 		bv->putSelectionAt(cur, match_len, !forward);
-	else if (onlysel && bv->cursor().selection()) {
+	else if (onlysel && had_selection) {
 		docstring q = _("The search string was not found within the selection.\n"
 				"Continue search outside?");
 		int search_answer = frontend::Alert::prompt(_("Search outside selection?"),
@@ -347,7 +350,6 @@ bool findOne(BufferView * bv, docstring const & searchstr,
 		return false;
 	}
 	else if (check_wrap) {
-		DocIterator cur_orig(bv->cursor());
 		bool wrap = auto_wrap;
 		if (!auto_wrap) {
 			docstring q;
@@ -380,7 +382,13 @@ bool findOne(BufferView * bv, docstring const & searchstr,
 				    find_del, false, false, false, false))
 				return true;
 		}
-		bv->cursor().setCursor(cur_orig);
+		bv->setCursor(startcur);
+
+		// restore original selection
+		if (had_selection) {
+			bv->cursor().resetAnchor();
+			bv->setCursorSelectionTo(endcur);
+		}
 		return false;
 	}
 


More information about the lyx-cvs mailing list