mirror of
https://github.com/koreader/koreader.git
synced 2025-12-13 20:36:53 +01:00
* UIManager: Let the fb backend deal with Kaleido wfm promotion. This fixes a number of quirks that poisoned the refresh queue with spurious full-screen refreshes. See https://github.com/koreader/koreader-base/pull/1865 for more details. * This also means we now disable Kaleido waveform modes when color rendering is disabled (remember to trash your thumbnail cache if you don't want to mix color w/ grayscale thumbnails, though). * UIManager: Merge refreshes that share an edge, because that was driving me nuts (and would have most likely been merged by the kernel anyway). A perfect test-case is the FM, which trips two separate refreshes because of its title bar. * ReaderFlipping: Use sensible dimensions, so that we only refresh the icon's region. * ReaderBookmark: Only refresh the dogear instead of the whole page when toggling bookmarks. * NetworkSetting: Make it a real boy, so it consistently refreshes properly on dismiss instead of relying on UIManager saving the day. * Kobo: Aggressively prevent *both* suspend & standby while MTK devices are plugged-in, as both will horribly implode the kernel (we previously only prevent standby while charging). * Kobo: Switch to 8bpp on B&W MTK devices (or when color rendering is disabled on Kaleido panels).
118 lines
4.4 KiB
Lua
118 lines
4.4 KiB
Lua
local Geom = require("ui/geometry")
|
|
local IconWidget = require("ui/widget/iconwidget")
|
|
local LeftContainer = require("ui/widget/container/leftcontainer")
|
|
local WidgetContainer = require("ui/widget/container/widgetcontainer")
|
|
local Screen = require("device").screen
|
|
|
|
local ReaderFlipping = WidgetContainer:extend{
|
|
-- Icons to show during crengine partial rerendering automation
|
|
rolling_rendering_state_icons = {
|
|
PARTIALLY_RERENDERED = "cre.render.partial",
|
|
FULL_RENDERING_IN_BACKGROUND = "cre.render.working",
|
|
FULL_RENDERING_READY = "cre.render.ready",
|
|
RELOADING_DOCUMENT = "cre.render.reload",
|
|
},
|
|
}
|
|
|
|
function ReaderFlipping:init()
|
|
local icon_size = Screen:scaleBySize(32)
|
|
self.flipping_widget = IconWidget:new{
|
|
icon = "book.opened",
|
|
width = icon_size,
|
|
height = icon_size,
|
|
}
|
|
self.bookmark_flipping_widget = IconWidget:new{
|
|
icon = "bookmark",
|
|
width = icon_size,
|
|
height = icon_size,
|
|
}
|
|
self.long_hold_widget = IconWidget:new{
|
|
icon = "appbar.pokeball",
|
|
width = icon_size,
|
|
height = icon_size,
|
|
alpha = true,
|
|
}
|
|
icon_size = Screen:scaleBySize(36)
|
|
self.select_mode_widget = IconWidget:new{
|
|
icon = "texture-box",
|
|
width = icon_size,
|
|
height = icon_size,
|
|
alpha = true,
|
|
}
|
|
self[1] = LeftContainer:new{
|
|
dimen = Geom:new{w = Screen:getWidth(), h = self.flipping_widget:getSize().h},
|
|
self.flipping_widget,
|
|
}
|
|
end
|
|
|
|
function ReaderFlipping:resetLayout()
|
|
-- NOTE: LeftContainer aligns to the left of its *own* width (and will handle RTL mirroring, so we can't cheat)...
|
|
self[1].dimen.w = Screen:getWidth()
|
|
end
|
|
|
|
function ReaderFlipping:getRefreshRegion()
|
|
-- We can't use self.dimen because of the width/height quirks of Left/RightContainer, so use the IconWidget's...
|
|
return self[1][1].dimen
|
|
end
|
|
|
|
function ReaderFlipping:getRollingRenderingStateIconWidget()
|
|
if not self.rolling_rendering_state_widgets then
|
|
self.rolling_rendering_state_widgets = {}
|
|
end
|
|
local widget = self.rolling_rendering_state_widgets[self.ui.rolling.rendering_state]
|
|
if widget == nil then -- not met yet
|
|
local icon_size = Screen:scaleBySize(32)
|
|
for k, v in pairs(self.ui.rolling.RENDERING_STATE) do -- known states
|
|
if v == self.ui.rolling.rendering_state then -- current state
|
|
local icon = self.rolling_rendering_state_icons[k] -- our icon (or none) for this state
|
|
if icon then
|
|
self.rolling_rendering_state_widgets[v] = IconWidget:new{
|
|
icon = icon,
|
|
width = icon_size,
|
|
height = icon_size,
|
|
alpha = not self.ui.rolling.cre_top_bar_enabled,
|
|
-- if top status bar enabled, have them opaque, as they
|
|
-- will be displayed over the bar
|
|
-- otherwise, keep their alpha so some bits of text is
|
|
-- visible if displayed over the text when small margins
|
|
}
|
|
else
|
|
self.rolling_rendering_state_widgets[v] = false
|
|
end
|
|
break
|
|
end
|
|
end
|
|
widget = self.rolling_rendering_state_widgets[self.ui.rolling.rendering_state]
|
|
end
|
|
return widget or nil -- return nil if cached widget is false
|
|
end
|
|
|
|
function ReaderFlipping:onSetStatusLine()
|
|
-- Reset these widgets: we want new ones with proper alpha/opaque
|
|
self.rolling_rendering_state_widgets = nil
|
|
end
|
|
|
|
function ReaderFlipping:paintTo(bb, x, y)
|
|
local widget
|
|
if self.ui.paging and self.view.flipping_visible then
|
|
-- pdf page flipping or bookmark browsing mode
|
|
widget = self.ui.paging.bookmark_flipping_mode and self.bookmark_flipping_widget or self.flipping_widget
|
|
elseif self.ui.highlight.select_mode then
|
|
-- highlight select mode
|
|
widget = self.select_mode_widget
|
|
elseif self.ui.highlight.long_hold_reached then
|
|
widget = self.long_hold_widget
|
|
elseif self.ui.rolling and self.ui.rolling.rendering_state then
|
|
-- epub rerendering
|
|
widget = self:getRollingRenderingStateIconWidget()
|
|
end
|
|
if widget then
|
|
if self[1][1] ~= widget then
|
|
self[1][1] = widget
|
|
end
|
|
WidgetContainer.paintTo(self, bb, x, y)
|
|
end
|
|
end
|
|
|
|
return ReaderFlipping
|