mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
Revamp flash_ui handling, once more, with feeling ;) (#7262)
* Simplify flash_ui handling (by handling the unhighlight pre-callback, c.f., #7262 for more details). * UIManager: Handle translucent window-level widgets (and those wrapped in a translucent MovableContainer) properly in setDirty directly, making sure what's *underneath* them gets repainted to avoid alpha layering glitches. (This was previously handled via localized hacks). * Update UIManager's documentation, and format it properly for ldoc parsing, making the HTML docs more useful. * ReaderView: Reinitialize the various page areas when opening a new document, to prevent poisoning from the previous document. * Event: Handle nils in an event's arguments. * CheckButton/RadioButton: Switch to simple inversion to handle highlighting * CheckButton: Make the highlight span the inner frame's width, instead of just the text's width, if possible. * AlphaContainer: Fix & simplify, given the UIManager alpha handling. * MovableContainer: When translucent, cache the canvas bb used for composition. * Avoid spurious refreshes in a few widgets using various dummy *TextWidgets in order to first compute a text height. * KeyValuePage: Avoid floats in size computations.
This commit is contained in:
@@ -46,6 +46,9 @@ local MovableContainer = InputContainer:new{
|
||||
-- Original painting position from outer widget
|
||||
_orig_x = nil,
|
||||
_orig_y = nil,
|
||||
|
||||
-- We cache a compose canvas for alpha handling
|
||||
compose_bb = nil,
|
||||
}
|
||||
|
||||
function MovableContainer:init()
|
||||
@@ -113,20 +116,42 @@ function MovableContainer:paintTo(bb, x, y)
|
||||
self.dimen.y = y + self._moved_offset_y
|
||||
|
||||
if self.alpha then
|
||||
-- Create private blitbuffer for our child widget to paint to
|
||||
local private_bb = Blitbuffer.new(bb:getWidth(), bb:getHeight(), bb:getType())
|
||||
private_bb:fill(Blitbuffer.COLOR_WHITE) -- for round corners' outside to not stay black
|
||||
self[1]:paintTo(private_bb, self.dimen.x, self.dimen.y)
|
||||
-- And blend our private blitbuffer over the original bb
|
||||
bb:addblitFrom(private_bb, self.dimen.x, self.dimen.y, self.dimen.x, self.dimen.y,
|
||||
self.dimen.w, self.dimen.h, self.alpha)
|
||||
private_bb:free()
|
||||
-- Create/Recreate the compose cache if we changed screen geometry
|
||||
if not self.compose_bb
|
||||
or self.compose_bb:getWidth() ~= bb:getWidth()
|
||||
or self.compose_bb:getHeight() ~= bb:getHeight()
|
||||
then
|
||||
if self.compose_bb then
|
||||
self.compose_bb:free()
|
||||
end
|
||||
-- create a canvas for our child widget to paint to
|
||||
self.compose_bb = Blitbuffer.new(bb:getWidth(), bb:getHeight(), bb:getType())
|
||||
-- fill it with our usual background color
|
||||
self.compose_bb:fill(Blitbuffer.COLOR_WHITE)
|
||||
end
|
||||
|
||||
-- now, compose our child widget's content on our canvas
|
||||
-- NOTE: Unlike AlphaContainer, we aim to support interactive widgets.
|
||||
-- Most InputContainer-based widgets register their touchzones at paintTo time,
|
||||
-- and they rely on the target coordinates fed to paintTo for proper on-screen positioning.
|
||||
-- As such, we have to compose on a target bb sized canvas, at the expected coordinates.
|
||||
self[1]:paintTo(self.compose_bb, self.dimen.x, self.dimen.y)
|
||||
|
||||
-- and finally blit the canvas to the target blitbuffer at the requested opacity level
|
||||
bb:addblitFrom(self.compose_bb, self.dimen.x, self.dimen.y, self.dimen.x, self.dimen.y, self.dimen.w, self.dimen.h, self.alpha)
|
||||
else
|
||||
-- No alpha, just paint
|
||||
self[1]:paintTo(bb, self.dimen.x, self.dimen.y)
|
||||
end
|
||||
end
|
||||
|
||||
function MovableContainer:onCloseWidget()
|
||||
if self.compose_bb then
|
||||
self.compose_bb:free()
|
||||
self.compose_bb = nil
|
||||
end
|
||||
end
|
||||
|
||||
function MovableContainer:_moveBy(dx, dy, restrict_to_screen)
|
||||
logger.dbg("MovableContainer:_moveBy:", dx, dy)
|
||||
if dx and dy then
|
||||
|
||||
Reference in New Issue
Block a user