From fd05842686cfd78ccbef01c2e92196028157dbe2 Mon Sep 17 00:00:00 2001 From: Rena Kunisaki Date: Sat, 22 Feb 2020 03:07:28 -0500 Subject: [PATCH] Add "message at top of screen" screensaver (#5739) Adds a screensaver mode which is just a line of text at the top of the screen. Purpose is to be minimally obstructive while still displaying something to indicate the device is asleep. --- frontend/ui/elements/screensaver_menu.lua | 33 +++++++++++++++++++ frontend/ui/screensaver.lua | 40 +++++++++++++++++++---- 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/frontend/ui/elements/screensaver_menu.lua b/frontend/ui/elements/screensaver_menu.lua index 8bf6a9b2c..01b70b764 100644 --- a/frontend/ui/elements/screensaver_menu.lua +++ b/frontend/ui/elements/screensaver_menu.lua @@ -13,6 +13,7 @@ end local function whiteBackground() return G_reader_settings:isTrue("screensaver_white_background") end local function noBackground() return G_reader_settings:isTrue("screensaver_no_background") end local function stretchImages() return G_reader_settings:isTrue("screensaver_stretch_images") end +local function messagePosition() return G_reader_settings:readSetting("screensaver_message_position") end return { { @@ -177,6 +178,38 @@ return { end, separator = true, }, + { + text = _("Screensaver message position"), + sub_item_table = { + { + text = _("Top"), + checked_func = function() + return messagePosition() == "top" + end, + callback = function() + G_reader_settings:saveSetting("screensaver_message_position", "top") + end + }, + { + text = _("Middle"), + checked_func = function() + return messagePosition() == "middle" or messagePosition() == nil + end, + callback = function() + G_reader_settings:saveSetting("screensaver_message_position", "middle") + end + }, + { + text = _("Bottom"), + checked_func = function() + return messagePosition() == "bottom" + end, + callback = function() + G_reader_settings:saveSetting("screensaver_message_position", "bottom") + end + }, + } + }, { text = _("Delay when exit from screensaver"), sub_item_table = { diff --git a/frontend/ui/screensaver.lua b/frontend/ui/screensaver.lua index 10e477a7e..5359782e5 100644 --- a/frontend/ui/screensaver.lua +++ b/frontend/ui/screensaver.lua @@ -2,14 +2,19 @@ local BD = require("ui/bidi") local Blitbuffer = require("ffi/blitbuffer") local ButtonDialogTitle = require("ui/widget/buttondialogtitle") local BookStatusWidget = require("ui/widget/bookstatuswidget") +local BottomContainer = require("ui/widget/container/bottomcontainer") local DataStorage = require("datastorage") local Device = require("device") local DocSettings = require("docsettings") local DocumentRegistry = require("document/documentregistry") +local Font = require("ui/font") +local Geom = require("ui/geometry") local InfoMessage = require("ui/widget/infomessage") local ImageWidget = require("ui/widget/imagewidget") local Math = require("optmath") local ScreenSaverWidget = require("ui/widget/screensaverwidget") +local TextBoxWidget = require("ui/widget/textboxwidget") +local TopContainer = require("ui/widget/container/topcontainer") local UIManager = require("ui/uimanager") local lfs = require("libs/libkoreader-lfs") local logger = require("logger") @@ -361,6 +366,7 @@ function Screensaver:show(event, fallback_message) end if screensaver_type == "message" then local screensaver_message = G_reader_settings:readSetting(prefix.."screensaver_message") + local message_pos = G_reader_settings:readSetting(prefix.."screensaver_message_position") if not self:whiteBackground() then background = nil -- no background filling, let book text visible covers_fullscreen = false @@ -376,10 +382,34 @@ function Screensaver:show(event, fallback_message) screensaver_message = self:expandSpecial(screensaver_message, fallback) end - widget = InfoMessage:new{ - text = screensaver_message, - readonly = true, - } + if message_pos == "middle" or message_pos == nil then + widget = InfoMessage:new{ + text = screensaver_message, + readonly = true, + } + else + local face = Font:getFace("infofont") + local container + if message_pos == "bottom" then + container = BottomContainer + else + container = TopContainer + end + + local screen_w, screen_h = Screen:getWidth(), Screen:getHeight() + widget = container:new{ + dimen = Geom:new{ + w = screen_w, + h = screen_h, + }, + TextBoxWidget:new{ + text = screensaver_message, + face = face, + width = screen_w, + alignment = "center", + } + } + end -- No overlay needed as we just displayed the message overlay_message = nil end @@ -457,12 +487,10 @@ function Screensaver:close() end function Screensaver:addOverlayMessage(widget, text) - local Font = require("ui/font") local FrameContainer = require("ui/widget/container/framecontainer") local OverlapGroup = require("ui/widget/overlapgroup") local RightContainer = require("ui/widget/container/rightcontainer") local Size = require("ui/size") - local TextBoxWidget = require("ui/widget/textboxwidget") local TextWidget = require("ui/widget/textwidget") local face = Font:getFace("infofont")