From 29908800b9a1cd6aebe88b0e6edd7e9327e2c4d0 Mon Sep 17 00:00:00 2001 From: David <97603719+Commodore64user@users.noreply.github.com> Date: Tue, 25 Mar 2025 06:44:21 +0000 Subject: [PATCH] [UnderlineContainer] "fix" focus underline for RTL UI (#13454) see #13362 generally and https://github.com/koreader/koreader/pull/13362#issuecomment-2749434009 --- frontend/ui/widget/container/underlinecontainer.lua | 13 +++++++++++-- frontend/ui/widget/touchmenu.lua | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/frontend/ui/widget/container/underlinecontainer.lua b/frontend/ui/widget/container/underlinecontainer.lua index de130e34c..9b3f4e0c6 100644 --- a/frontend/ui/widget/container/underlinecontainer.lua +++ b/frontend/ui/widget/container/underlinecontainer.lua @@ -4,6 +4,7 @@ a line under its child node. --]] +local BD = require("ui/bidi") local Blitbuffer = require("ffi/blitbuffer") local Geom = require("ui/geometry") local Size = require("ui/size") @@ -15,6 +16,7 @@ local UnderlineContainer = WidgetContainer:extend{ -- We default to white to be invisible by default for FocusManager use-cases (only switching to black @ onFocus) color = Blitbuffer.COLOR_WHITE, vertical_align = "top", + line_width = nil, -- (Don't use this, it's there because of the complex and ugly layout in TouchMenuItem) } function UnderlineContainer:getSize() @@ -37,6 +39,13 @@ function UnderlineContainer:paintTo(bb, x, y) self.dimen.x = x self.dimen.y = y end + + local line_width = self.line_width or self.dimen.w + local line_x = x + if BD.mirroredUILayout() then + line_x = line_x + self.dimen.w - line_width + end + local content_size = self[1]:getSize() local p_y = y if self.vertical_align == "center" then @@ -45,8 +54,8 @@ function UnderlineContainer:paintTo(bb, x, y) p_y = (container_size.h - content_size.h) + y end self[1]:paintTo(bb, x, p_y) - bb:paintRect(x, y + container_size.h - self.linesize, - container_size.w, self.linesize, self.color) + bb:paintRect(line_x, y + container_size.h - self.linesize, + line_width, self.linesize, self.color) end return UnderlineContainer diff --git a/frontend/ui/widget/touchmenu.lua b/frontend/ui/widget/touchmenu.lua index 0b3bd3ac2..fbece57e0 100644 --- a/frontend/ui/widget/touchmenu.lua +++ b/frontend/ui/widget/touchmenu.lua @@ -146,6 +146,7 @@ function TouchMenuItem:init() self._underline_container = UnderlineContainer:new{ vertical_align = "center", dimen = self.dimen:copy(), + line_width = self.item_frame:getSize().w, -- we'll draw a shorter line self.item_frame, }