diff --git a/frontend/ui/screensaver.lua b/frontend/ui/screensaver.lua index 8d93f337d..d1da7b0c3 100644 --- a/frontend/ui/screensaver.lua +++ b/frontend/ui/screensaver.lua @@ -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 diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index b208d503d..c7d4ac873 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -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 diff --git a/spec/unit/uimanager_spec.lua b/spec/unit/uimanager_spec.lua index a15060606..47073ed7e 100644 --- a/spec/unit/uimanager_spec.lua +++ b/spec/unit/uimanager_spec.lua @@ -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 = {