mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
[StatusBar] Allow status bars to be repainted if they are not covered (#9768)
This commit is contained in:
@@ -90,11 +90,26 @@ function ReaderCoptListener:onTimeFormatChanged()
|
||||
self.ui.document._document:setIntProperty("window.status.clock.12hours", G_reader_settings:isTrue("twelve_hour_clock") and 1 or 0)
|
||||
end
|
||||
|
||||
function ReaderCoptListener:shouldHeaderBeRepainted()
|
||||
local n = 1
|
||||
local widget = UIManager:getNthTopWidget(n)
|
||||
while widget do
|
||||
if widget.name == "ReaderUI" then
|
||||
return true
|
||||
elseif widget.covers_fullscreen then
|
||||
return false
|
||||
end
|
||||
n = n + 1
|
||||
widget = UIManager:getNthTopWidget(n)
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function ReaderCoptListener:updateHeader()
|
||||
-- Have crengine display accurate time and battery on its next drawing
|
||||
self.ui.document:resetBufferCache() -- be sure next repaint is a redrawing
|
||||
-- Force a refresh if we're not hidden behind another widget
|
||||
if UIManager:getTopWidget() == "ReaderUI" then
|
||||
if self:shouldHeaderBeRepainted() then
|
||||
UIManager:setDirty(self.view.dialog, "ui",
|
||||
Geom:new{
|
||||
x = 0, y = 0,
|
||||
|
||||
@@ -70,7 +70,7 @@ function ReaderDeviceStatus:init()
|
||||
UIManager:close(self.memory_confirm_box)
|
||||
end
|
||||
if Device:canRestart() then
|
||||
if UIManager:getTopWidget() == "ReaderUI"
|
||||
if UIManager:getNthTopWidget().name == "ReaderUI"
|
||||
and G_reader_settings:isTrue("device_status_memory_auto_restart") then
|
||||
UIManager:show(InfoMessage:new{
|
||||
text = _("High memory usage!\n\nKOReader is restarting…"),
|
||||
|
||||
@@ -771,6 +771,22 @@ function ReaderFooter:unscheduleFooterAutoRefresh()
|
||||
UIManager:unschedule(self.autoRefreshFooter)
|
||||
end
|
||||
|
||||
function ReaderFooter:shouldBeRepainted()
|
||||
local n = 1
|
||||
local widget = UIManager:getNthTopWidget(n)
|
||||
while widget do
|
||||
if widget.name == "ReaderUI" then
|
||||
return true
|
||||
elseif widget.covers_fullscreen or widget.covers_footer then
|
||||
-- (e.g. the virtual keyboard sets widget_covers_footer == true)
|
||||
return false
|
||||
end
|
||||
n = n + 1
|
||||
widget = UIManager:getNthTopWidget(n)
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function ReaderFooter:rescheduleFooterAutoRefreshIfNeeded()
|
||||
if not self.autoRefreshFooter then
|
||||
-- Create this function the first time we're called
|
||||
@@ -779,13 +795,8 @@ function ReaderFooter:rescheduleFooterAutoRefreshIfNeeded()
|
||||
-- (We want to avoid the footer to be painted over a widget covering it - we would
|
||||
-- be fine refreshing it if the widget is not covering it, but this is hard to
|
||||
-- guess from here.)
|
||||
if UIManager:getTopWidget() == "ReaderUI" then
|
||||
self:onUpdateFooter(self.view.footer_visible)
|
||||
else
|
||||
logger.dbg("Skipping ReaderFooter repaint, because ReaderUI is not the top-level widget")
|
||||
-- NOTE: We *do* keep its content up-to-date, though
|
||||
self:onUpdateFooter()
|
||||
end
|
||||
self:onUpdateFooter(self.view.footer_visible and self:shouldBeRepainted())
|
||||
|
||||
self:rescheduleFooterAutoRefreshIfNeeded() -- schedule (or not) next refresh
|
||||
end
|
||||
end
|
||||
@@ -2462,21 +2473,12 @@ end
|
||||
-- Used by event handlers that can trip without direct UI interaction...
|
||||
function ReaderFooter:maybeUpdateFooter()
|
||||
-- ...so we need to avoid stomping over unsuspecting widgets (usually, ScreenSaver).
|
||||
if UIManager:getTopWidget() == "ReaderUI" then
|
||||
self:onUpdateFooter(self.view.footer_visible)
|
||||
else
|
||||
self:onUpdateFooter()
|
||||
end
|
||||
self:onUpdateFooter(self.view.footer_visible and self:shouldBeRepainted())
|
||||
end
|
||||
|
||||
-- is the same as maybeUpdateFooter
|
||||
function ReaderFooter:onFrontlightStateChanged()
|
||||
-- Custom variant of maybeUpdateFooter that *also* whitelists the FL widget...
|
||||
local top_wg = UIManager:getTopWidget()
|
||||
if top_wg == "ReaderUI" or top_wg == "FrontLightWidget" then
|
||||
self:onUpdateFooter(self.view.footer_visible)
|
||||
else
|
||||
self:onUpdateFooter()
|
||||
end
|
||||
self:onUpdateFooter(self.view.footer_visible and self:shouldBeRepainted())
|
||||
end
|
||||
|
||||
function ReaderFooter:onNetworkConnected()
|
||||
|
||||
@@ -54,7 +54,7 @@ function ReaderStatus:onEndOfBook()
|
||||
self:onMarkBook(true)
|
||||
end
|
||||
|
||||
if (settings == "pop-up" or settings == nil) and UIManager:getTopWidget() ~= "end_document" then
|
||||
if (settings == "pop-up" or settings == nil) and UIManager:getNthTopWidget().name ~= "end_document" then
|
||||
local buttons = {
|
||||
{
|
||||
{
|
||||
|
||||
@@ -721,15 +721,16 @@ function UIManager:ToggleNightMode(night_mode)
|
||||
end
|
||||
end
|
||||
|
||||
--- Get top widget (name if possible, ref otherwise).
|
||||
function UIManager:getTopWidget()
|
||||
if not self._window_stack[1] then
|
||||
-- No widgets in the stack, bye!
|
||||
--- Get n.th topmost widget
|
||||
function UIManager:getNthTopWidget(n)
|
||||
n = n and n-1 or 0
|
||||
if #self._window_stack - n < 1 then
|
||||
-- No or not enough widgets in the stack, bye!
|
||||
return nil
|
||||
end
|
||||
|
||||
local widget = self._window_stack[#self._window_stack].widget
|
||||
return widget.name or widget
|
||||
local widget = self._window_stack[#self._window_stack - n].widget
|
||||
return widget
|
||||
end
|
||||
|
||||
--[[--
|
||||
|
||||
@@ -430,7 +430,7 @@ function InputDialog:init()
|
||||
h = self.screen_height - keyboard_height,
|
||||
},
|
||||
ignore_if_over = "height",
|
||||
frame
|
||||
frame,
|
||||
}
|
||||
if Device:isTouchDevice() then -- is used to hide the keyboard with a tap outside of inputbox
|
||||
self.ges_events.Tap = {
|
||||
|
||||
@@ -75,7 +75,7 @@ function SortItemWidget:init()
|
||||
w = self.width,
|
||||
h = self.height,
|
||||
},
|
||||
HorizontalGroup:new {
|
||||
HorizontalGroup:new{
|
||||
align = "center",
|
||||
CenterContainer:new{
|
||||
dimen = Geom:new{ w = checked_widget:getSize().w },
|
||||
@@ -146,6 +146,10 @@ function SortWidget:init()
|
||||
w = self.width or Screen:getWidth(),
|
||||
h = self.height or Screen:getHeight(),
|
||||
}
|
||||
if self.dimen.h == Screen:getHeight() then
|
||||
self.covers_footer = true
|
||||
end
|
||||
|
||||
if Device:hasKeys() then
|
||||
self.key_events.Close = { { Device.input.group.Back } }
|
||||
self.key_events.NextPage = { { Device.input.group.PgFwd } }
|
||||
|
||||
@@ -755,6 +755,7 @@ end
|
||||
|
||||
local VirtualKeyboard = FocusManager:extend{
|
||||
name = "VirtualKeyboard",
|
||||
covers_footer = true,
|
||||
modal = true,
|
||||
disable_double_tap = true,
|
||||
inputbox = nil,
|
||||
|
||||
@@ -5,7 +5,6 @@ Plugin for automatic dimming of the frontlight after an idle period.
|
||||
--]]--
|
||||
|
||||
local Device = require("device")
|
||||
local Event = require("ui/event")
|
||||
local FFIUtil = require("ffi/util")
|
||||
local SpinWidget = require("ui/widget/spinwidget")
|
||||
local UIManager = require("ui/uimanager")
|
||||
@@ -41,8 +40,6 @@ function AutoDim:init()
|
||||
self.isCurrentlyDimming = false -- true during or after the dimming ramp
|
||||
self.last_ramp_scheduling_time = nil -- holds start time of the next scheduled ramp task
|
||||
self.trap_widget = nil
|
||||
|
||||
self.top_widget_before_dim = nil
|
||||
end
|
||||
|
||||
function AutoDim:addToMainMenu(menu_items)
|
||||
@@ -182,7 +179,6 @@ end
|
||||
function AutoDim:restoreFrontlight()
|
||||
if self.autodim_save_fl then
|
||||
Powerd:setIntensity(self.autodim_save_fl)
|
||||
self:updateFooter(true)
|
||||
self.autodim_save_fl = nil
|
||||
end
|
||||
end
|
||||
@@ -272,19 +268,6 @@ function AutoDim:onFrontlightTurnedOff()
|
||||
self:_schedule_autodim_task() -- reschedule
|
||||
end
|
||||
|
||||
function AutoDim:updateFooter(clear)
|
||||
-- update footer only if it is not covered by another widget
|
||||
if self.top_widget_before_dim == "ReaderUI" or
|
||||
(self.top_widget_before_dim ~= "ConfigDialog" and self.top_widget_before_dim ~= "ScreenSaver"
|
||||
and self.top_widget_before_dim ~= "VirtualKeyboard") then
|
||||
|
||||
UIManager:broadcastEvent(Event:new("UpdateFooter", self.view and self.view.footer_visible or false))
|
||||
end
|
||||
if clear then
|
||||
self.top_widget_before_dim = nil
|
||||
end
|
||||
end
|
||||
|
||||
function AutoDim:autodim_task()
|
||||
if self.isCurrentlyDimming then return end
|
||||
if Powerd:isFrontlightOff() then
|
||||
@@ -313,9 +296,6 @@ function AutoDim:autodim_task()
|
||||
end
|
||||
}
|
||||
|
||||
-- This is the active widget before showing self.trap_widget
|
||||
self.top_widget_before_dim = UIManager:getTopWidget()
|
||||
|
||||
UIManager:show(self.trap_widget) -- suppress taps during dimming
|
||||
|
||||
-- calculate time until the next decrease step
|
||||
@@ -344,7 +324,7 @@ function AutoDim:ramp_task()
|
||||
self.ramp_event_countdown = self.ramp_event_countdown - 1
|
||||
if self.ramp_event_countdown <= 0 then
|
||||
-- Update footer on every self.ramp_event_countdown call
|
||||
self:updateFooter()
|
||||
UIManager:broadcastEvent("UpdateFooter")
|
||||
self.ramp_event_countdown = self.ramp_event_countdown_startvalue
|
||||
self.last_ramp_scheduling_time = nil
|
||||
end
|
||||
|
||||
@@ -32,7 +32,7 @@ function AutoTurn:_schedule()
|
||||
local delay = self.last_action_time + time.s(self.autoturn_sec) - UIManager:getTime()
|
||||
|
||||
if delay <= 0 then
|
||||
if UIManager:getTopWidget() == "ReaderUI" then
|
||||
if UIManager:getNthTopWidget().name == "ReaderUI" then
|
||||
logger.dbg("AutoTurn: go to next page")
|
||||
self.ui:handleEvent(Event:new("GotoViewRel", self.autoturn_distance))
|
||||
self.last_action_time = UIManager:getTime()
|
||||
|
||||
@@ -64,8 +64,8 @@ local function resetButtonOnLookupWindow()
|
||||
return
|
||||
elseif obj.is_wiki then
|
||||
-- make wiki window have the same button_tweak as its presenting dictionary window
|
||||
local widget = UIManager:getSecondTopmostWidget()
|
||||
if widget.tweak_buttons_func then
|
||||
local widget = UIManager:getNthTopWidget(2)
|
||||
if widget and widget.tweak_buttons_func then
|
||||
widget:tweak_buttons_func(buttons)
|
||||
end
|
||||
return
|
||||
@@ -1179,6 +1179,10 @@ function VocabularyBuilderWidget:init()
|
||||
w = self.width or Screen:getWidth(),
|
||||
h = self.height or Screen:getHeight(),
|
||||
}
|
||||
if self.dimen.h == Screen:getHeight() then
|
||||
self.covers_footer = true
|
||||
end
|
||||
|
||||
if Device:hasKeys() then
|
||||
self.key_events.Close = { { Device.input.group.Back } }
|
||||
self.key_events.NextPage = { { Device.input.group.PgFwd } }
|
||||
|
||||
@@ -6,6 +6,8 @@ describe("Readerpaging module", function()
|
||||
setup(function()
|
||||
require("commonrequire")
|
||||
UIManager = require("ui/uimanager")
|
||||
stub(UIManager, "getNthTopWidget")
|
||||
UIManager.getNthTopWidget.returns({})
|
||||
Event = require("ui/event")
|
||||
DocumentRegistry = require("document/documentregistry")
|
||||
ReaderUI = require("apps/reader/readerui")
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
describe("Readerrolling module", function()
|
||||
local DocumentRegistry, ReaderUI, Event, Screen
|
||||
local DocumentRegistry, UIManager, ReaderUI, Event, Screen
|
||||
local readerui, rolling
|
||||
|
||||
setup(function()
|
||||
require("commonrequire")
|
||||
UIManager = require("ui/uimanager")
|
||||
stub(UIManager, "getNthTopWidget")
|
||||
UIManager.getNthTopWidget.returns({})
|
||||
DocumentRegistry = require("document/documentregistry")
|
||||
ReaderUI = require("apps/reader/readerui")
|
||||
Event = require("ui/event")
|
||||
|
||||
Reference in New Issue
Block a user