Add `search.delay` config and implementation which delays search-in-page input until

a specified amount of time since last keystroke to help with search performance on large
documents.
This commit is contained in:
Ryan Lanny Jenkins 2024-06-16 20:40:59 -05:00
parent 167d7ac87d
commit adac5dfdb0
2 changed files with 27 additions and 1 deletions

View File

@ -150,6 +150,8 @@ class WebEngineSearch(browsertab.AbstractSearch):
self._pending_searches = 0
self.match = browsertab.SearchMatch()
self._old_match = browsertab.SearchMatch()
self._debounce_timer = usertypes.Timer(self)
self._debounce_timer.setSingleShot(True)
def _store_flags(self, reverse, ignore_case):
self._flags.case_sensitive = self._is_case_sensitive(ignore_case)
@ -212,7 +214,7 @@ class WebEngineSearch(browsertab.AbstractSearch):
log.webview.debug(f"Active search match: {self.match}")
self.match_changed.emit(self.match)
def search(self, text, *, ignore_case=usertypes.IgnoreCase.never,
def _search(self, text, *, ignore_case=usertypes.IgnoreCase.never,
reverse=False, result_cb=None):
# Don't go to next entry on duplicate search
if self.text == text and self.search_displayed:
@ -227,6 +229,20 @@ class WebEngineSearch(browsertab.AbstractSearch):
self._find(text, self._flags, result_cb, 'search')
def search(self, *args, **kwargs):
delay = config.val.search.delay
if delay:
self._debounce_timer.stop()
self._debounce_timer.timeout.disconnect()
self._debounce_timer.timeout.connect(
lambda: self._search(*args, **kwargs)
)
self._debounce_timer.start(delay)
else:
self._search(*args, **kwargs)
def clear(self):
if self.search_displayed:
self.cleared.emit()

View File

@ -50,6 +50,16 @@ changelog_after_upgrade:
ignore_case:
renamed: search.ignore_case
search.delay:
type:
name: Int
minval: 0
maxval: maxint
default: 400
desc: Delay (in milliseconds) between last keystroke when searching and the
search being submitted. Larger values produce fewer redundant searches but
also delay receiving search results.
search.ignore_case:
type: IgnoreCase
default: smart