diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index de9beb7d8..72a5d234a 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -132,10 +132,20 @@ function UIManager:init() end -- register & show a widget +-- modal widget should be always on the top function UIManager:show(widget, x, y) + DEBUG("show widget", widget.id) self._running = true - -- put widget on top of stack - table.insert(self._window_stack, {x = x or 0, y = y or 0, widget = widget}) + local window = {x = x or 0, y = y or 0, widget = widget} + -- put this window on top of the toppest non-modal window + 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 + table.insert(self._window_stack, i + 1, window) + break + end + end -- and schedule it to be painted self:setDirty(widget) -- tell the widget that it is shown now @@ -148,6 +158,7 @@ end -- unregister a widget function UIManager:close(widget) + DEBUG("close widget", widget.id) Input.disable_double_tap = DGESDETECT_DISABLE_DOUBLE_TAP local dirty = false for i = #self._window_stack, 1, -1 do @@ -226,6 +237,7 @@ end -- signal to quit function UIManager:quit() + DEBUG("quit uimanager") self._running = false for i = #self._window_stack, 1, -1 do table.remove(self._window_stack, i) diff --git a/frontend/ui/widget/confirmbox.lua b/frontend/ui/widget/confirmbox.lua index f21240d9b..fd7a02427 100644 --- a/frontend/ui/widget/confirmbox.lua +++ b/frontend/ui/widget/confirmbox.lua @@ -24,6 +24,7 @@ local Blitbuffer = require("ffi/blitbuffer") Widget that shows a message and OK/Cancel buttons ]] local ConfirmBox = InputContainer:new{ + modal = true, text = _("no text"), face = Font:getFace("infofont", 25), ok_text = _("OK"), diff --git a/frontend/ui/widget/infomessage.lua b/frontend/ui/widget/infomessage.lua index cc006c586..adb8f4731 100644 --- a/frontend/ui/widget/infomessage.lua +++ b/frontend/ui/widget/infomessage.lua @@ -21,6 +21,7 @@ Widget that displays an informational message it vanishes on key press or after a given timeout ]] local InfoMessage = InputContainer:new{ + modal = true, face = Font:getFace("infofont", 25), text = "", timeout = nil, -- in seconds