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:
NiLuJe
2021-02-20 18:22:48 +01:00
committed by GitHub
parent 1cdc6c61e0
commit fe10d0bce5
25 changed files with 707 additions and 685 deletions

View File

@@ -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