mirror of
https://github.com/koreader/koreader.git
synced 2025-12-13 20:36:53 +01:00
[fix, UX] Allow modal widget on top of modal widget (#3170)
Fixes #2653.
This commit is contained in:
committed by
Qingping Hou
parent
ba7fad2cdf
commit
cfaa119c35
@@ -1,9 +1,9 @@
|
||||
local Device = require("device")
|
||||
local DocSettings = require("docsettings")
|
||||
local DocumentRegistry = require("document/documentregistry")
|
||||
local UIManager = require("ui/uimanager")
|
||||
local Device = require("device")
|
||||
local Screen = Device.screen
|
||||
local DocSettings = require("docsettings")
|
||||
local logger = require("logger")
|
||||
local Screen = Device.screen
|
||||
|
||||
local Screensaver = {
|
||||
}
|
||||
@@ -28,13 +28,13 @@ local function createWidgetFromFile(file)
|
||||
if lfs.attributes(file, "mode") == "file" then
|
||||
local ImageWidget = require("ui/widget/imagewidget")
|
||||
return createWidgetFromImage(
|
||||
ImageWidget:new{
|
||||
file = file,
|
||||
file_do_cache = false,
|
||||
height = Screen:getHeight(),
|
||||
width = Screen:getWidth(),
|
||||
scale_factor = 0, -- scale to fit height/width
|
||||
})
|
||||
ImageWidget:new{
|
||||
file = file,
|
||||
file_do_cache = false,
|
||||
height = Screen:getHeight(),
|
||||
width = Screen:getWidth(),
|
||||
scale_factor = 0, -- scale to fit height/width
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
@@ -134,6 +134,9 @@ function Screensaver:show(kind, default_msg)
|
||||
UIManager:show(self.left_msg)
|
||||
end
|
||||
else
|
||||
-- set modal to put screensaver on top of everything else
|
||||
-- NB InfoMessage (in case of no image) defaults to modal
|
||||
self.left_msg.modal = true
|
||||
-- refresh whole screen for other types
|
||||
UIManager:show(self.left_msg, "full")
|
||||
end
|
||||
|
||||
@@ -191,7 +191,7 @@ function UIManager:show(widget, refreshtype, refreshregion, x, y)
|
||||
for i = #self._window_stack, 0, -1 do
|
||||
local top_window = self._window_stack[i]
|
||||
-- skip modal window
|
||||
if not top_window or not top_window.widget.modal then
|
||||
if widget.modal or not top_window or not top_window.widget.modal then
|
||||
table.insert(self._window_stack, i + 1, window)
|
||||
break
|
||||
end
|
||||
|
||||
@@ -162,6 +162,43 @@ describe("UIManager spec", function()
|
||||
assert.is_true(UIManager._task_queue_dirty)
|
||||
end)
|
||||
|
||||
describe("modal widgets", function()
|
||||
it("should insert modal widget on top", function()
|
||||
-- first modal widget
|
||||
UIManager:show({
|
||||
x_prefix_test_number = 1,
|
||||
modal = true,
|
||||
handleEvent = function()
|
||||
return true
|
||||
end
|
||||
})
|
||||
-- regular widget, should go under modal widget
|
||||
UIManager:show({
|
||||
x_prefix_test_number = 2,
|
||||
modal = nil,
|
||||
handleEvent = function()
|
||||
return true
|
||||
end
|
||||
})
|
||||
|
||||
assert.equals(UIManager._window_stack[1].widget.x_prefix_test_number, 2)
|
||||
assert.equals(UIManager._window_stack[2].widget.x_prefix_test_number, 1)
|
||||
end)
|
||||
it("should insert second modal widget on top of first modal widget", function()
|
||||
UIManager:show({
|
||||
x_prefix_test_number = 3,
|
||||
modal = true,
|
||||
handleEvent = function()
|
||||
return true
|
||||
end
|
||||
})
|
||||
|
||||
assert.equals(UIManager._window_stack[1].widget.x_prefix_test_number, 2)
|
||||
assert.equals(UIManager._window_stack[2].widget.x_prefix_test_number, 1)
|
||||
assert.equals(UIManager._window_stack[3].widget.x_prefix_test_number, 3)
|
||||
end)
|
||||
end)
|
||||
|
||||
it("should check active widgets in order", function()
|
||||
local call_signals = {false, false, false}
|
||||
UIManager._window_stack = {
|
||||
|
||||
Reference in New Issue
Block a user