From 9e9f3b419dc00176f32c5d6fb38bce8ca03fb999 Mon Sep 17 00:00:00 2001 From: sladflob <52647914+sladflob@users.noreply.github.com> Date: Sun, 7 Jun 2020 01:23:16 +0800 Subject: [PATCH] [feat] Allow message to be overlaid on other screensavers (#6238) --- .gitignore | 2 + frontend/ui/elements/screensaver_menu.lua | 25 ++++----- frontend/ui/screensaver.lua | 62 +++++++++++++++++++---- 3 files changed, 64 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 578b475c2..9654a3c6a 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ *.un~ cscope.* *.orig +*.lua~ lua lua-* .reader.kpdfview.lua @@ -36,3 +37,4 @@ i18n /.cproject /.project +.gitignore~ diff --git a/frontend/ui/elements/screensaver_menu.lua b/frontend/ui/elements/screensaver_menu.lua index 01b70b764..d2abe21e8 100644 --- a/frontend/ui/elements/screensaver_menu.lua +++ b/frontend/ui/elements/screensaver_menu.lua @@ -14,6 +14,7 @@ local function whiteBackground() return G_reader_settings:isTrue("screensaver_wh 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 +local function showMessage() return G_reader_settings:isTrue("screensaver_show_message") end return { { @@ -97,19 +98,6 @@ return { G_reader_settings:saveSetting("screensaver_type", "readingprogress") end }, - { - text = _("Use message as screensaver"), - checked_func = function() - if screensaverType() == "message" or screensaverType() == nil then - return true - else - return false - end - end, - callback = function() - G_reader_settings:saveSetting("screensaver_type", "message") - end - }, { text = _("Leave screen as it is"), checked_func = function() @@ -121,7 +109,16 @@ return { end, callback = function() G_reader_settings:saveSetting("screensaver_type", "disable") - end + end, + separator = true, + }, + { + text = _("Add message to screensaver"), + checked_func = showMessage, + callback = function() + G_reader_settings:saveSetting("screensaver_show_message", not showMessage()) + end, + separator = true, }, { text = _("Settings"), diff --git a/frontend/ui/screensaver.lua b/frontend/ui/screensaver.lua index 5359782e5..c6ca49378 100644 --- a/frontend/ui/screensaver.lua +++ b/frontend/ui/screensaver.lua @@ -12,6 +12,7 @@ local Geom = require("ui/geometry") local InfoMessage = require("ui/widget/infomessage") local ImageWidget = require("ui/widget/imagewidget") local Math = require("optmath") +local OverlapGroup = require("ui/widget/overlapgroup") local ScreenSaverWidget = require("ui/widget/screensaverwidget") local TextBoxWidget = require("ui/widget/textboxwidget") local TopContainer = require("ui/widget/container/topcontainer") @@ -176,6 +177,10 @@ function Screensaver:noBackground() return G_reader_settings:isTrue("screensaver_no_background") end +function Screensaver:showMessage() + return G_reader_settings:isTrue("screensaver_show_message") +end + function Screensaver:excluded() local lastfile = G_reader_settings:readSetting("lastfile") local exclude_ss = false -- consider it not excluded if there's no docsetting @@ -240,12 +245,25 @@ function Screensaver:show(event, fallback_message) -- poweroff (overlay message) overlay_message = fallback_message end + + local show_message = self:showMessage() + if screensaver_type == nil then - screensaver_type = "message" + show_message = true end - if screensaver_type == "disable" then + + if screensaver_type == "message" then + -- obsolete screensaver_type: migrate to new show_message = true + screensaver_type = "disable" + G_reader_settings:saveSetting("screensaver_type", "disable") + G_reader_settings:saveSetting("screensaver_show_message", true) + end + + -- messages can still be shown over "as-is" screensaver + if screensaver_type == "disable" and show_message == false then return end + local widget = nil local background = Blitbuffer.COLOR_BLACK if self:whiteBackground() then @@ -253,6 +271,7 @@ function Screensaver:show(event, fallback_message) elseif self:noBackground() then background = nil end + local lastfile = G_reader_settings:readSetting("lastfile") if screensaver_type == "document_cover" then -- Set lastfile to the document of which we want to show the cover. @@ -307,11 +326,11 @@ function Screensaver:show(event, fallback_message) readonly = true, } else - screensaver_type = "message" + show_message = true end doc:close() else - screensaver_type = "message" + show_message = true end end if screensaver_type == "random_image" then @@ -324,7 +343,7 @@ function Screensaver:show(event, fallback_message) end local image_file = getRandomImage(screensaver_dir) if image_file == nil then - screensaver_type = "message" + show_message = true else widget = ImageWidget:new{ file = image_file, @@ -345,7 +364,7 @@ function Screensaver:show(event, fallback_message) screensaver_image = DataStorage:getDataDir() .. "/resources/koreader.png" end if lfs.attributes(screensaver_image, "mode") ~= "file" then - screensaver_type = "message" + show_message = true else widget = ImageWidget:new{ file = screensaver_image, @@ -361,10 +380,11 @@ function Screensaver:show(event, fallback_message) if Screensaver.getReaderProgress ~= nil then widget = Screensaver.getReaderProgress() else - screensaver_type = "message" + show_message = true end end - if screensaver_type == "message" then + + if show_message == true 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 @@ -382,8 +402,9 @@ function Screensaver:show(event, fallback_message) screensaver_message = self:expandSpecial(screensaver_message, fallback) end + local message_widget if message_pos == "middle" or message_pos == nil then - widget = InfoMessage:new{ + message_widget = InfoMessage:new{ text = screensaver_message, readonly = true, } @@ -397,7 +418,7 @@ function Screensaver:show(event, fallback_message) end local screen_w, screen_h = Screen:getWidth(), Screen:getHeight() - widget = container:new{ + message_widget = container:new{ dimen = Geom:new{ w = screen_w, h = screen_h, @@ -410,8 +431,28 @@ function Screensaver:show(event, fallback_message) } } end + -- No overlay needed as we just displayed the message overlay_message = nil + + -- check if message_widget should be overlaid on another widget + if message_widget then + if widget then -- we have a screensaver widget + -- show message_widget on top of previously created widget + local screen_w, screen_h = Screen:getWidth(), Screen:getHeight() + widget = OverlapGroup:new{ + dimen = { + h = screen_w, + w = screen_h, + }, + widget, + message_widget, + } + else + -- no prevously created widget so just show message widget + widget = message_widget + end + end end if overlay_message then @@ -488,7 +529,6 @@ end function Screensaver:addOverlayMessage(widget, text) 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 TextWidget = require("ui/widget/textwidget")