summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2022-06-13 16:55:32 +0200
committerFlorian Bruhin <me@the-compiler.org>2022-06-13 18:05:37 +0200
commit8ed08eb213f6218f779f5e79884aba6f3a594397 (patch)
treedb62c5b6698f9ed1c35ab621be9bf771af3f2db8
parentf326e0d96973aace648aad0976721ee2b2dbfa3c (diff)
downloadqutebrowser-8ed08eb213f6218f779f5e79884aba6f3a594397.tar.gz
qutebrowser-8ed08eb213f6218f779f5e79884aba6f3a594397.zip
search: Move wrap argument to next/prev_result
The fact that we need to specify this while searching rather than when "zapping" through the results make no sense. It makes both the API as well as our own code more complex.
-rw-r--r--qutebrowser/browser/browsertab.py8
-rw-r--r--qutebrowser/browser/commands.py11
-rw-r--r--qutebrowser/browser/webengine/webenginetab.py31
-rw-r--r--qutebrowser/browser/webkit/webkittab.py26
4 files changed, 36 insertions, 40 deletions
diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py
index 7745cff4b..f2ed3f084 100644
--- a/qutebrowser/browser/browsertab.py
+++ b/qutebrowser/browser/browsertab.py
@@ -377,7 +377,6 @@ class AbstractSearch(QObject):
def search(self, text: str, *,
ignore_case: usertypes.IgnoreCase = usertypes.IgnoreCase.never,
reverse: bool = False,
- wrap: bool = True,
result_cb: _Callback = None) -> None:
"""Find the given text on the page.
@@ -385,7 +384,6 @@ class AbstractSearch(QObject):
text: The text to search for.
ignore_case: Search case-insensitively.
reverse: Reverse search direction.
- wrap: Allow wrapping at the top or bottom of the page.
result_cb: Called with a bool indicating whether a match was found.
"""
raise NotImplementedError
@@ -394,18 +392,20 @@ class AbstractSearch(QObject):
"""Clear the current search."""
raise NotImplementedError
- def prev_result(self, *, result_cb: _Callback = None) -> None:
+ def prev_result(self, *, wrap: bool = False, result_cb: _Callback = None) -> None:
"""Go to the previous result of the current search.
Args:
+ wrap: Allow wrapping at the top or bottom of the page.
result_cb: Called with a bool indicating whether a match was found.
"""
raise NotImplementedError
- def next_result(self, *, result_cb: _Callback = None) -> None:
+ def next_result(self, *, wrap: bool = False, result_cb: _Callback = None) -> None:
"""Go to the next result of the current search.
Args:
+ wrap: Allow wrapping at the top or bottom of the page.
result_cb: Called with a bool indicating whether a match was found.
"""
raise NotImplementedError
diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py
index 50dae13ea..073fe1c49 100644
--- a/qutebrowser/browser/commands.py
+++ b/qutebrowser/browser/commands.py
@@ -1597,7 +1597,6 @@ class CommandDispatcher:
options = {
'ignore_case': config.val.search.ignore_case,
'reverse': reverse,
- 'wrap': config.val.search.wrap,
}
self._tabbed_browser.search_text = text
@@ -1641,10 +1640,11 @@ class CommandDispatcher:
old_match=tab.search.match,
options=window_options, text=window_text,
prev=False)
+ wrap = config.val.search.wrap
for _ in range(count - 1):
- tab.search.next_result()
- tab.search.next_result(result_cb=cb)
+ tab.search.next_result(wrap=wrap)
+ tab.search.next_result(result_cb=cb, wrap=wrap)
@cmdutils.register(instance='command-dispatcher', scope='window')
@cmdutils.argument('count', value=cmdutils.Value.count)
@@ -1675,10 +1675,11 @@ class CommandDispatcher:
old_match=tab.search.match,
options=window_options, text=window_text,
prev=True)
+ wrap = config.val.search.wrap
for _ in range(count - 1):
- tab.search.prev_result()
- tab.search.prev_result(result_cb=cb)
+ tab.search.prev_result(wrap=wrap)
+ tab.search.prev_result(result_cb=cb, wrap=wrap)
def _jseval_cb(self, out):
"""Show the data returned from JS."""
diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py
index 3ad1d99a7..f1d1a0cbb 100644
--- a/qutebrowser/browser/webengine/webenginetab.py
+++ b/qutebrowser/browser/webengine/webenginetab.py
@@ -103,10 +103,6 @@ class WebEngineSearch(browsertab.AbstractSearch):
Attributes:
_flags: The QWebEnginePage.FindFlags of the last search.
- _flag_wrap: An additional flag indicating whether the last search
- used wrapping.
- _nowrap_available: Whether the functionality to prevent wrapping
- is available.
_pending_searches: How many searches have been started but not called
back yet.
@@ -118,8 +114,6 @@ class WebEngineSearch(browsertab.AbstractSearch):
super().__init__(tab, parent)
self._flags = self._empty_flags()
self._pending_searches = 0
- self._flag_wrap = None
- self._nowrap_available = False # gets set in connect_signals
def _empty_flags(self):
return QWebEnginePage.FindFlags(0)
@@ -150,7 +144,6 @@ class WebEngineSearch(browsertab.AbstractSearch):
"to rebuild PyQtWebEngine.")
return
- self._nowrap_available = True
self._widget.page().findTextFinished.connect(self._on_find_finished)
def _find(self, text, flags, callback, caller):
@@ -199,7 +192,7 @@ class WebEngineSearch(browsertab.AbstractSearch):
self.match_changed.emit(self.match)
def search(self, text, *, ignore_case=usertypes.IgnoreCase.never,
- reverse=False, wrap=True, result_cb=None):
+ reverse=False, result_cb=None):
# Don't go to next entry on duplicate search
if self.text == text and self.search_displayed:
log.webview.debug("Ignoring duplicate search request"
@@ -210,7 +203,6 @@ class WebEngineSearch(browsertab.AbstractSearch):
self.text = text
self._flags = self._args_to_flags(reverse, ignore_case)
self.match.reset()
- self._flag_wrap = wrap
self._find(text, self._flags, result_cb, 'search')
@@ -222,33 +214,26 @@ class WebEngineSearch(browsertab.AbstractSearch):
self.match.reset()
self._widget.page().findText('')
- def _prevent_wrapping(self, going_up: bool) -> bool:
- """Whether wrapping should be prevented."""
- assert self._flag_wrap is not None
- return (
- self._nowrap_available and
- not self._flag_wrap and
- self.match.at_limit(going_up)
- )
-
- def prev_result(self, *, result_cb=None):
+ def prev_result(self, *, wrap=False, result_cb=None):
# The int() here makes sure we get a copy of the flags.
flags = QWebEnginePage.FindFlags(int(self._flags))
+
if flags & QWebEnginePage.FindBackward:
- if self._prevent_wrapping(going_up=False):
+ if self.match.at_limit(going_up=False) and not wrap:
result_cb(True)
return
flags &= ~QWebEnginePage.FindBackward
else:
- if self._prevent_wrapping(going_up=True):
+ if self.match.at_limit(going_up=True) and not wrap:
result_cb(True)
return
flags |= QWebEnginePage.FindBackward
+
self._find(self.text, flags, result_cb, 'prev_result')
- def next_result(self, *, result_cb=None):
+ def next_result(self, *, wrap=False, result_cb=None):
going_up = self._flags & QWebEnginePage.FindBackward
- if self._prevent_wrapping(going_up=going_up):
+ if self.match.at_limit(going_up=going_up) and not wrap:
result_cb(True)
return
self._find(self.text, self._flags, result_cb, 'next_result')
diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py
index 24d232c9c..05e48b2f6 100644
--- a/qutebrowser/browser/webkit/webkittab.py
+++ b/qutebrowser/browser/webkit/webkittab.py
@@ -115,14 +115,12 @@ class WebKitSearch(browsertab.AbstractSearch):
def _empty_flags(self):
return QWebPage.FindFlags(0) # type: ignore[call-overload]
- def _args_to_flags(self, reverse, ignore_case, wrap):
+ def _args_to_flags(self, reverse, ignore_case):
flags = self._empty_flags()
if self._is_case_sensitive(ignore_case):
flags |= QWebPage.FindCaseSensitively
if reverse:
flags |= QWebPage.FindBackward
- if wrap:
- flags |= QWebPage.FindWrapsAroundDocument
return flags
def _call_cb(self, callback, found, text, flags, caller):
@@ -164,12 +162,12 @@ class WebKitSearch(browsertab.AbstractSearch):
'', QWebPage.HighlightAllOccurrences) # type: ignore[arg-type]
def search(self, text, *, ignore_case=usertypes.IgnoreCase.never,
- reverse=False, wrap=True, result_cb=None):
+ reverse=False, result_cb=None):
# Don't go to next entry on duplicate search
if self.text == text and self.search_displayed:
log.webview.debug("Ignoring duplicate search request"
" for {}, but resetting flags".format(text))
- self._flags = self._args_to_flags(reverse, ignore_case, wrap)
+ self._flags = self._args_to_flags(reverse, ignore_case)
return
# Clear old search results, this is done automatically on QtWebEngine.
@@ -177,7 +175,7 @@ class WebKitSearch(browsertab.AbstractSearch):
self.text = text
self.search_displayed = True
- self._flags = self._args_to_flags(reverse, ignore_case, wrap)
+ self._flags = self._args_to_flags(reverse, ignore_case)
# We actually search *twice* - once to highlight everything, then again
# to get a mark so we can navigate.
found = self._widget.findText(text, self._flags)
@@ -185,20 +183,32 @@ class WebKitSearch(browsertab.AbstractSearch):
self._flags | QWebPage.HighlightAllOccurrences)
self._call_cb(result_cb, found, text, self._flags, 'search')
- def next_result(self, *, result_cb=None):
+ def next_result(self, *, wrap=False, result_cb=None):
self.search_displayed = True
+ # The int() here makes sure we get a copy of the flags.
+ flags = QWebPage.FindFlags(
+ int(self._flags)) # type: ignore[call-overload]
+
+ if wrap:
+ flags |= QWebPage.FindWrapsAroundDocument
+
found = self._widget.findText(self.text, self._flags) # type: ignore[arg-type]
self._call_cb(result_cb, found, self.text, self._flags, 'next_result')
- def prev_result(self, *, result_cb=None):
+ def prev_result(self, *, wrap=False, result_cb=None):
self.search_displayed = True
# The int() here makes sure we get a copy of the flags.
flags = QWebPage.FindFlags(
int(self._flags)) # type: ignore[call-overload]
+
if flags & QWebPage.FindBackward:
flags &= ~QWebPage.FindBackward
else:
flags |= QWebPage.FindBackward
+
+ if wrap:
+ flags |= QWebPage.FindWrapsAroundDocument
+
found = self._widget.findText(self.text, flags) # type: ignore[arg-type]
self._call_cb(result_cb, found, self.text, flags, 'prev_result')