[fix, UX] Allow modal widget on top of modal widget (#3170)

Fixes #2653.
pull/3181/head
Frans de Jonge 7 years ago committed by Qingping Hou
parent ba7fad2cdf
commit cfaa119c35

@ -1,9 +1,9 @@
local DocumentRegistry = require("document/documentregistry")
local UIManager = require("ui/uimanager")
local Device = require("device")
local Screen = Device.screen
local DocSettings = require("docsettings")
local DocumentRegistry = require("document/documentregistry")
local UIManager = require("ui/uimanager")
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 = {

Loading…
Cancel
Save