From 962477e7c679c2724c369536d2a1e941c678ad1d Mon Sep 17 00:00:00 2001 From: hius07 <62179190+hius07@users.noreply.github.com> Date: Sat, 3 Feb 2024 10:32:33 +0200 Subject: [PATCH] TextViewer: make find result bold (#11427) --- frontend/ui/widget/textviewer.lua | 27 ++++++++++++++++++++++++++- frontend/util.lua | 6 +++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/frontend/ui/widget/textviewer.lua b/frontend/ui/widget/textviewer.lua index 82748bbc8..6a2a91851 100644 --- a/frontend/ui/widget/textviewer.lua +++ b/frontend/ui/widget/textviewer.lua @@ -25,6 +25,7 @@ local MovableContainer = require("ui/widget/container/movablecontainer") local Notification = require("ui/widget/notification") local ScrollTextWidget = require("ui/widget/scrolltextwidget") local Size = require("ui/size") +local TextBoxWidget = require("ui/widget/textboxwidget") local TitleBar = require("ui/widget/titlebar") local UIManager = require("ui/uimanager") local VerticalGroup = require("ui/widget/verticalgroup") @@ -38,6 +39,7 @@ local Screen = Device.screen local TextViewer = InputContainer:extend{ title = nil, text = nil, + charlist = nil, -- internal width = nil, height = nil, buttons_table = nil, @@ -507,9 +509,12 @@ function TextViewer:findCallback(input_dialog) start_pos = (charpos or 0) + 1 -- previous search result end end - local char_pos = util.stringSearch(self.text, self.search_value, self.case_sensitive, start_pos) + local char_pos, search_charlist + char_pos, self.charlist, search_charlist = + util.stringSearch(self.charlist or self.text, self.search_value, self.case_sensitive, start_pos) local msg if char_pos > 0 then + self:setTextBold(char_pos, #search_charlist) self.scroll_text_w:moveCursorToCharPos(char_pos, self.find_centered_lines_count) msg = T(_("Found, screen line %1."), self.scroll_text_w:getCharPosLineNum()) self._find_next = true @@ -555,6 +560,26 @@ function TextViewer:reinit() self.scroll_text_w:scrollToRatio(ratio, ratio == 0) end +function TextViewer:setTextBold(start_pos, len) + local end_pos = start_pos + len + local text = self.text + if self.charlist == nil then + self.charlist = util.splitToChars(text) + end + local charlist = { TextBoxWidget.PTF_HEADER } + for i, char in ipairs(self.charlist) do + if i == start_pos then + table.insert(charlist, TextBoxWidget.PTF_BOLD_START) + elseif i == end_pos then + table.insert(charlist, TextBoxWidget.PTF_BOLD_END) + end + table.insert(charlist, char) + end + self.text = table.concat(charlist) + self:reinit() + self.text = text -- restore original text +end + function TextViewer:showMenu() local dialog local buttons = { diff --git a/frontend/util.lua b/frontend/util.lua index c75e7f43b..ca90b556e 100644 --- a/frontend/util.lua +++ b/frontend/util.lua @@ -1415,6 +1415,8 @@ end -- @boolean case_sensitive -- @number start_pos Position number in text to start search from -- @treturn number Position number or 0 if not found +-- @treturn table Text char list +-- @treturn table Search string char list function util.stringSearch(txt, str, case_sensitive, start_pos) if not case_sensitive then str = Utf8Proc.lowercase(util.fixUtf8(str, "?")) @@ -1441,7 +1443,9 @@ function util.stringSearch(txt, str, case_sensitive, start_pos) break end end - return char_pos + -- Returned charlists are used in TextViewer find, + -- to avoid double call of util.splitToChars() + return char_pos, txt_charlist, str_charlist end local WrappedFunction_mt = {