From fa4784cf13756ca6886050539888aa8dd7138120 Mon Sep 17 00:00:00 2001 From: hius07 <62179190+hius07@users.noreply.github.com> Date: Sat, 14 Aug 2021 18:52:29 +0300 Subject: [PATCH] Screenshoter: options to View and Delete after screenshot (#8050) Also remove code duplication in ImageViewer. --- frontend/ui/widget/imageviewer.lua | 34 ++--------- frontend/ui/widget/screenshoter.lua | 89 +++++++++++++++++------------ 2 files changed, 56 insertions(+), 67 deletions(-) diff --git a/frontend/ui/widget/imageviewer.lua b/frontend/ui/widget/imageviewer.lua index 7cd9f5cd2..2e6bceaf6 100644 --- a/frontend/ui/widget/imageviewer.lua +++ b/frontend/ui/widget/imageviewer.lua @@ -7,9 +7,9 @@ local Blitbuffer = require("ffi/blitbuffer") local ButtonTable = require("ui/widget/buttontable") local CenterContainer = require("ui/widget/container/centercontainer") local CloseButton = require("ui/widget/closebutton") -local ConfirmBox = require("ui/widget/confirmbox") local DataStorage = require("datastorage") local Device = require("device") +local Event = require("ui/event") local Geom = require("ui/geometry") local GestureRange = require("ui/gesturerange") local Font = require("ui/font") @@ -26,7 +26,6 @@ local VerticalGroup = require("ui/widget/verticalgroup") local WidgetContainer = require("ui/widget/container/widgetcontainer") local UIManager = require("ui/uimanager") local logger = require("logger") -local T = require("ffi/util").template local _ = require("gettext") local Screen = Device.screen @@ -620,7 +619,7 @@ end -- Panning events function ImageViewer:onSwipe(_, ges) -- Panning with swipe is less accurate, as we don't get both coordinates, - -- only start point + direction (with only 45° granularity) + -- only start point + direction (with only 45° granularity) local direction = ges.direction local distance = ges.distance local sq_distance = math.sqrt(distance*distance/2) @@ -755,15 +754,8 @@ function ImageViewer:onTapDiagonal() end function ImageViewer:onSaveImageView() - -- Similar behaviour as in Screenshoter:onScreenshot() -- We save the currently displayed blitbuffer (panned or zoomed) -- after getting fullscreen and removing UI elements if needed. - local screenshots_dir = G_reader_settings:readSetting("screenshot_dir") - if not screenshots_dir then - screenshots_dir = DataStorage:getDataDir() .. "/screenshots/" - end - self.screenshot_fn_fmt = screenshots_dir .. "ImageViewer_%Y-%m-%d_%H%M%S.png" - local screenshot_name = os.date(self.screenshot_fn_fmt) local restore_settings_func if self.with_title_bar or self.buttons_visible or not self.fullscreen then local with_title_bar = self.with_title_bar @@ -781,25 +773,9 @@ function ImageViewer:onSaveImageView() self:update() UIManager:forceRePaint() end - Screen:shot(screenshot_name) - local widget = ConfirmBox:new{ - text = T( _("Saved screenshot to %1.\nWould you like to set it as screensaver?"), BD.filepath(screenshot_name)), - ok_text = _("Yes"), - ok_callback = function() - G_reader_settings:saveSetting("screensaver_type", "image_file") - G_reader_settings:saveSetting("screensaver_image", screenshot_name) - if restore_settings_func then - restore_settings_func() - end - end, - cancel_text = _("No"), - cancel_callback = function() - if restore_settings_func then - restore_settings_func() - end - end - } - UIManager:show(widget) + local screenshots_dir = G_reader_settings:readSetting("screenshot_dir") or DataStorage:getDataDir() .. "/screenshots/" + local screenshot_name = os.date(screenshots_dir .. "ImageViewer" .. "_%Y-%m-%d_%H%M%S.png") + UIManager:sendEvent(Event:new("Screenshot", screenshot_name, restore_settings_func)) return true end diff --git a/frontend/ui/widget/screenshoter.lua b/frontend/ui/widget/screenshoter.lua index c6761f6ed..89ccefb20 100644 --- a/frontend/ui/widget/screenshoter.lua +++ b/frontend/ui/widget/screenshoter.lua @@ -1,9 +1,7 @@ local BD = require("ui/bidi") -local ButtonDialogTitle = require("ui/widget/buttondialogtitle") local ConfirmBox = require("ui/widget/confirmbox") local DataStorage = require("datastorage") local GestureRange = require("ui/gesturerange") -local InfoMessage = require("ui/widget/infomessage") local InputContainer = require("ui/widget/container/inputcontainer") local UIManager = require("ui/uimanager") local Screen = require("device").screen @@ -37,59 +35,74 @@ function Screenshoter:init() } end -function Screenshoter:onScreenshot(filename) +function Screenshoter:onScreenshot(filename, when_done_func) local screenshots_dir = G_reader_settings:readSetting("screenshot_dir") or DataStorage:getDataDir() .. "/screenshots/" self.screenshot_fn_fmt = screenshots_dir .. self.prefix .. "_%Y-%m-%d_%H%M%S.png" local screenshot_name = filename or os.date(self.screenshot_fn_fmt) Screen:shot(screenshot_name) - local widget = ConfirmBox:new{ - text = T( _("Saved screenshot to %1.\nWould you like to set it as screensaver?"), BD.filepath(screenshot_name)), - ok_text = _("Yes"), + local confirm_box + confirm_box = ConfirmBox:new{ + text = T( _("Screenshot saved to:\n%1"), BD.filepath(screenshot_name)), + keep_dialog_open = true, + cancel_text = _("Close"), + cancel_callback = function() + if when_done_func then when_done_func() end + end, + ok_text = _("Set as screensaver"), ok_callback = function() G_reader_settings:saveSetting("screensaver_type", "image_file") G_reader_settings:saveSetting("screensaver_image", screenshot_name) + UIManager:close(confirm_box) + if when_done_func then when_done_func() end end, - cancel_text = _("No"), + other_buttons_first = true, + other_buttons = {{ + { + text = _("Delete"), + callback = function() + local __ = os.remove(screenshot_name) + UIManager:close(confirm_box) + if when_done_func then when_done_func() end + end, + }, + { + text = _("View"), + callback = function() + local image_viewer = require("ui/widget/imageviewer"):new{ + file = screenshot_name, + modal = true, + with_title_bar = false, + buttons_visible = true, + } + UIManager:show(image_viewer) + end, + }, + }}, } - UIManager:show(widget) + UIManager:show(confirm_box) -- trigger full refresh UIManager:setDirty(nil, "full") return true end function Screenshoter:chooseFolder() - local buttons = {} - table.insert(buttons, { - { - text = _("Choose screenshot folder"), - callback = function() - UIManager:close(self.choose_dialog) - require("ui/downloadmgr"):new{ - onConfirm = function(path) - G_reader_settings:saveSetting("screenshot_dir", path .. "/") - UIManager:show(InfoMessage:new{ - text = T(_("Screenshot folder set to:\n%1"), BD.dirpath(path)), - timeout = 3, - }) - end, - }:chooseDir() - end, - } - }) - table.insert(buttons, { - { - text = _("Close"), - callback = function() - UIManager:close(self.choose_dialog) - end, - } - }) local screenshot_dir = G_reader_settings:readSetting("screenshot_dir") or DataStorage:getDataDir() .. "/screenshots/" - self.choose_dialog = ButtonDialogTitle:new{ - title = T(_("Current screenshot folder:\n%1"), BD.dirpath(screenshot_dir)), - buttons = buttons + local confirm_box = ConfirmBox:new{ + text = T(_("Screenshot folder is set to:\n%1\n\nChoose a new folder for screenshots?"), screenshot_dir), + ok_text = _("Choose folder"), + ok_callback = function() + local path_chooser = require("ui/widget/pathchooser"):new{ + select_file = false, + show_files = false, + path = screenshot_dir, + onConfirm = function(new_path) + G_reader_settings:saveSetting("screenshot_dir", new_path .. "/") + end + } + UIManager:show(path_chooser) + end, } - UIManager:show(self.choose_dialog) + UIManager:show(confirm_box) end function Screenshoter:onTapDiagonal()