From f765fe3070f6e61d63850456d61824ca890cf1ee Mon Sep 17 00:00:00 2001 From: hius07 <62179190+hius07@users.noreply.github.com> Date: Sat, 16 Dec 2023 10:36:57 +0200 Subject: [PATCH] Screenshot: set as book custom cover (#11227) --- .../apps/filemanager/filemanagerbookinfo.lua | 17 ++- frontend/apps/filemanager/filemanagermenu.lua | 30 ++--- frontend/apps/filemanager/filemanagerutil.lua | 56 ++++++++ frontend/apps/reader/modules/readerfooter.lua | 2 +- .../apps/reader/modules/readerwikipedia.lua | 113 ++--------------- frontend/document/document.lua | 2 +- frontend/ui/screensaver.lua | 120 ++++-------------- frontend/ui/widget/dictquicklookup.lua | 25 ++-- frontend/ui/widget/imageviewer.lua | 8 +- frontend/ui/widget/screenshoter.lua | 116 +++++++++-------- plugins/exporter.koplugin/main.lua | 42 ++---- plugins/statistics.koplugin/main.lua | 1 + 12 files changed, 212 insertions(+), 320 deletions(-) diff --git a/frontend/apps/filemanager/filemanagerbookinfo.lua b/frontend/apps/filemanager/filemanagerbookinfo.lua index 3774db061..3c87d0fdf 100644 --- a/frontend/apps/filemanager/filemanagerbookinfo.lua +++ b/frontend/apps/filemanager/filemanagerbookinfo.lua @@ -295,12 +295,15 @@ function BookInfo:onShowBookInfo() end function BookInfo:showBookProp(prop_key, prop_text) + local text_type if prop_key == "description" then prop_text = util.htmlToPlainTextIfHtml(prop_text) + text_type = "book_info" end UIManager:show(TextViewer:new{ title = self.prop_text[prop_key], text = prop_text, + text_type = text_type, }) end @@ -406,6 +409,19 @@ function BookInfo:setCustomCover(file, book_props) end end +function BookInfo:setCustomCoverFromImage(file, image_file) + local custom_book_cover = DocSettings:findCustomCoverFile(file) + if custom_book_cover then + os.remove(custom_book_cover) + end + DocSettings:flushCustomCover(file, image_file) + if self.ui.doc_settings then + self.ui.doc_settings:getCustomCoverFile(true) -- reset cover file cache + end + UIManager:broadcastEvent(Event:new("InvalidateMetadataCache", file)) + UIManager:broadcastEvent(Event:new("BookMetadataChanged")) +end + function BookInfo:setCustomMetadata(file, book_props, prop_key, prop_value) -- in file local custom_doc_settings, custom_props, display_title, no_custom_metadata @@ -660,7 +676,6 @@ function BookInfo.showBooksWithHashBasedMetadata() UIManager:show(TextViewer:new{ title = T(N_("1 document with hash-based metadata", "%1 documents with hash-based metadata", doc_nb), doc_nb), title_multilines = true, - justified = false, text = table.concat(file_info, "\n"), }) end diff --git a/frontend/apps/filemanager/filemanagermenu.lua b/frontend/apps/filemanager/filemanagermenu.lua index d004e650d..a3bdb95e9 100644 --- a/frontend/apps/filemanager/filemanagermenu.lua +++ b/frontend/apps/filemanager/filemanagermenu.lua @@ -9,6 +9,7 @@ local SetDefaults = require("apps/filemanager/filemanagersetdefaults") local Size = require("ui/size") local UIManager = require("ui/uimanager") local Screen = Device.screen +local filemanagerutil = require("apps/filemanager/filemanagerutil") local dbg = require("dbg") local lfs = require("libs/libkoreader-lfs") local logger = require("logger") @@ -326,29 +327,14 @@ function FileManagerMenu:setUpdateItemTable() { text = _("Set home folder"), callback = function() - local text - local home_dir = G_reader_settings:readSetting("home_dir") - if home_dir then - text = T(_("Home folder is set to:\n%1"), home_dir) - else - text = _("Home folder is not set.") - home_dir = Device.home_dir + local title_header = _("Current home folder:") + local current_path = G_reader_settings:readSetting("home_dir") + local default_path = filemanagerutil.getDefaultDir() + local caller_callback = function(path) + G_reader_settings:saveSetting("home_dir", path) + self.ui:updateTitleBarPath() end - UIManager:show(ConfirmBox:new{ - text = text .. "\n" .. _("Choose new folder to set as home?"), - ok_text = _("Choose folder"), - ok_callback = function() - local path_chooser = require("ui/widget/pathchooser"):new{ - select_file = false, - show_files = false, - path = home_dir, - onConfirm = function(new_path) - G_reader_settings:saveSetting("home_dir", new_path) - end - } - UIManager:show(path_chooser) - end, - }) + filemanagerutil.showChooseDialog(title_header, caller_callback, current_path, default_path) end, }, { diff --git a/frontend/apps/filemanager/filemanagerutil.lua b/frontend/apps/filemanager/filemanagerutil.lua index 738acbfb8..90a1be2d6 100644 --- a/frontend/apps/filemanager/filemanagerutil.lua +++ b/frontend/apps/filemanager/filemanagerutil.lua @@ -335,4 +335,60 @@ function filemanagerutil.genExecuteScriptButton(file, caller_callback) } end +function filemanagerutil.showChooseDialog(title_header, caller_callback, current_path, default_path, file_filter) + local is_file = file_filter and true or false + local path = current_path or default_path + local dialog + local buttons = { + { + { + text = is_file and _("Choose file") or _("Choose folder"), + callback = function() + UIManager:close(dialog) + if path then + if is_file then + path = path:match("(.*/)") + end + if lfs.attributes(path, "mode") ~= "directory" then + path = G_reader_settings:readSetting("home_dir") or filemanagerutil.getDefaultDir() + end + end + local PathChooser = require("ui/widget/pathchooser") + local path_chooser = PathChooser:new{ + select_directory = not is_file, + select_file = is_file, + show_files = is_file, + file_filter = file_filter, + path = path, + onConfirm = function(new_path) + caller_callback(new_path) + end, + } + UIManager:show(path_chooser) + end, + }, + } + } + if default_path then + table.insert(buttons, { + { + text = _("Use default"), + enabled = path ~= default_path, + callback = function() + UIManager:close(dialog) + caller_callback(default_path) + end, + }, + }) + end + local title_value = path and (is_file and BD.filepath(path) or BD.dirpath(path)) + or _("not set") + local ButtonDialog = require("ui/widget/buttondialog") + dialog = ButtonDialog:new{ + title = title_header .. "\n\n" .. title_value .. "\n", + buttons = buttons, + } + UIManager:show(dialog) +end + return filemanagerutil diff --git a/frontend/apps/reader/modules/readerfooter.lua b/frontend/apps/reader/modules/readerfooter.lua index 8f9faeb26..c2bd669a0 100644 --- a/frontend/apps/reader/modules/readerfooter.lua +++ b/frontend/apps/reader/modules/readerfooter.lua @@ -2515,7 +2515,7 @@ function ReaderFooter:onTimeFormatChanged() end function ReaderFooter:onBookMetadataChanged(prop_updated) - if prop_updated.metadata_key_updated == "title" then + if prop_updated and prop_updated.metadata_key_updated == "title" then self:updateFooterText() end end diff --git a/frontend/apps/reader/modules/readerwikipedia.lua b/frontend/apps/reader/modules/readerwikipedia.lua index a38c21a85..af4dcaebc 100644 --- a/frontend/apps/reader/modules/readerwikipedia.lua +++ b/frontend/apps/reader/modules/readerwikipedia.lua @@ -1,5 +1,3 @@ -local BD = require("ui/bidi") -local ButtonDialogTitle = require("ui/widget/buttondialogtitle") local ConfirmBox = require("ui/widget/confirmbox") local DataStorage = require("datastorage") local DictQuickLookup = require("ui/widget/dictquicklookup") @@ -13,6 +11,7 @@ local Trapper = require("ui/trapper") local Translator = require("ui/translator") local UIManager = require("ui/uimanager") local Wikipedia = require("ui/wikipedia") +local filemanagerutil = require("apps/filemanager/filemanagerutil") local lfs = require("libs/libkoreader-lfs") local logger = require("logger") local util = require("util") @@ -175,109 +174,21 @@ function ReaderWikipedia:addToMainMenu(menu_items) { -- setting used by dictquicklookup text = _("Set Wikipedia 'Save as EPUB' folder"), keep_menu_open = true, - callback = function() - local choose_directory = function() - -- Default directory as chosen by DictQuickLookup - local default_dir = G_reader_settings:readSetting("wikipedia_save_dir") - or G_reader_settings:readSetting("home_dir") - or require("apps/filemanager/filemanagerutil").getDefaultDir() - local dialog - dialog = ButtonDialogTitle:new{ - title = T(_("Current Wikipedia 'Save as EPUB' folder:\n\n%1\n"), BD.dirpath(default_dir)), - buttons = { - { - { - text = _("Keep this folder"), - callback = function() - UIManager:close(dialog) - end, - }, - }, - { - { - text = _("Choose other folder"), - callback = function() - UIManager:close(dialog) - -- Use currently read book's directory as starting point, - -- so a user reading a wikipedia article can quickly select - -- it to save related new articles in the same directory - local dir = G_reader_settings:readSetting("wikipedia_save_dir") - or G_reader_settings:readSetting("home_dir") - or require("apps/filemanager/filemanagerutil").getDefaultDir() - or "/" - -- If this directory has no subdirectory, we would be displaying - -- a single "..", so use parent directory in that case. - local has_subdirectory = false - for f in lfs.dir(dir) do - local attributes = lfs.attributes(dir.."/"..f) - if attributes and attributes.mode == "directory" then - if f ~= "." and f ~= ".." and f:sub(-4) ~= ".sdr"then - has_subdirectory = true - break - end - end - end - if not has_subdirectory then - dir = dir:match("(.*)/") - end - local PathChooser = require("ui/widget/pathchooser") - local path_chooser = PathChooser:new{ - select_directory = true, - select_file = false, - path = dir, - onConfirm = function(path) - G_reader_settings:saveSetting("wikipedia_save_dir", path) - UIManager:show(InfoMessage:new{ - text = T(_("Wikipedia 'Save as EPUB' folder set to:\n%1"), BD.dirpath(path)), - }) - end - } - UIManager:show(path_chooser) - end, - }, - }, - }, - } - UIManager:show(dialog) - end - -- If wikipedia_save_dir has not yet been set, propose to use - -- home_dir/Wikipedia/ - if not G_reader_settings:readSetting("wikipedia_save_dir") then - local home_dir = G_reader_settings:readSetting("home_dir") - if not home_dir or lfs.attributes(home_dir, "mode") ~= "directory" then - home_dir = require("apps/filemanager/filemanagerutil").getDefaultDir() - end - home_dir = home_dir:gsub("^(.-)/*$", "%1") -- remove trailing slash - if home_dir and lfs.attributes(home_dir, "mode") == "directory" then - local wikipedia_dir = home_dir.."/Wikipedia" - local text = _([[ + help_text = _([[ Wikipedia articles can be saved as an EPUB for more comfortable reading. -You can choose an existing folder, or use a default folder named "Wikipedia" in your reader's home folder. - -Where do you want them saved?]]) - UIManager:show(ConfirmBox:new{ - text = text, - ok_text = _("Use ~/Wikipedia/"), - ok_callback = function() - if not util.pathExists(wikipedia_dir) then - lfs.mkdir(wikipedia_dir) - end - G_reader_settings:saveSetting("wikipedia_save_dir", wikipedia_dir) - UIManager:show(InfoMessage:new{ - text = T(_("Wikipedia 'Save as EPUB' folder set to:\n%1"), BD.dirpath(wikipedia_dir)), - }) - end, - cancel_text = _("Choose folder"), - cancel_callback = function() - choose_directory() - end, - }) - return +You can choose an existing folder, or use a default folder named "Wikipedia" in your reader's home folder.]]), + callback = function() + local title_header = _("Current Wikipedia 'Save as EPUB' folder:") + local current_path = G_reader_settings:readSetting("wikipedia_save_dir") + local default_path = DictQuickLookup.getWikiSaveEpubDefaultDir() + local caller_callback = function(path) + G_reader_settings:saveSetting("wikipedia_save_dir", path) + if not util.pathExists(path) then + lfs.mkdir(path) end end - -- If setting exists, or no home_dir found, let user choose directory - choose_directory() + filemanagerutil.showChooseDialog(title_header, caller_callback, current_path, default_path) end, }, { -- setting used by dictquicklookup diff --git a/frontend/document/document.lua b/frontend/document/document.lua index 1844eddb0..b4a81674e 100644 --- a/frontend/document/document.lua +++ b/frontend/document/document.lua @@ -152,7 +152,7 @@ end -- this might be overridden by a document implementation function Document:getNativePageDimensions(pageno) - local hash = "pgdim|"..self.file.."|"..pageno + local hash = "pgdim|"..self.file.."|"..self.mod_time.."|"..pageno local cached = DocCache:check(hash) if cached then return cached[1] diff --git a/frontend/ui/screensaver.lua b/frontend/ui/screensaver.lua index bd662578e..94517d082 100644 --- a/frontend/ui/screensaver.lua +++ b/frontend/ui/screensaver.lua @@ -1,6 +1,4 @@ -local BD = require("ui/bidi") local Blitbuffer = require("ffi/blitbuffer") -local ButtonDialog = require("ui/widget/buttondialog") local BookStatusWidget = require("ui/widget/bookstatuswidget") local BottomContainer = require("ui/widget/container/bottomcontainer") local Device = require("device") @@ -29,7 +27,6 @@ local logger = require("logger") local util = require("util") local _ = require("gettext") local Screen = Device.screen -local T = ffiUtil.template -- Default settings if G_reader_settings:hasNot("screensaver_show_message") then @@ -256,99 +253,36 @@ local function addOverlayMessage(widget, widget_height, text) end function Screensaver:chooseFolder() - local buttons = {} - local choose_dialog - table.insert(buttons, { - { - text = _("Choose screensaver folder"), - callback = function() - UIManager:close(choose_dialog) - require("ui/downloadmgr"):new{ - onConfirm = function(path) - logger.dbg("set screensaver directory to", path) - G_reader_settings:saveSetting("screensaver_dir", path) - UIManager:show(InfoMessage:new{ - text = T(_("Screensaver folder set to:\n%1"), BD.dirpath(path)), - timeout = 3, - }) - end, - }:chooseDir() - end, - } - }) - table.insert(buttons, { - { - text = _("Close"), - callback = function() - UIManager:close(choose_dialog) - end, - } - }) - local screensaver_dir = G_reader_settings:readSetting("screensaver_dir") - or _("N/A") - choose_dialog = ButtonDialog:new{ - title = T(_("Current screensaver image folder:\n%1"), BD.dirpath(screensaver_dir)), - buttons = buttons - } - UIManager:show(choose_dialog) + local title_header = _("Current screensaver folder:") + local current_path = G_reader_settings:readSetting("screensaver_dir") + local caller_callback = function(path) + G_reader_settings:saveSetting("screensaver_dir", path) + end + filemanagerutil.showChooseDialog(title_header, caller_callback, current_path) end function Screensaver:chooseFile(document_cover) - local text = document_cover and _("Choose document cover") or _("Choose screensaver image") - local buttons = {} - local choose_dialog - table.insert(buttons, { - { - text = text, - callback = function() - UIManager:close(choose_dialog) - local PathChooser = require("ui/widget/pathchooser") - local path_chooser = PathChooser:new{ - select_directory = false, - file_filter = function(filename) - return document_cover and DocumentRegistry:hasProvider(filename) - or DocumentRegistry:isImageFile(filename) - end, - path = self.root_path, - onConfirm = function(file_path) - if document_cover then - G_reader_settings:saveSetting("screensaver_document_cover", file_path) - UIManager:show(InfoMessage:new{ - text = T(_("Screensaver document cover set to:\n%1"), BD.filepath(file_path)), - timeout = 3, - }) - else - G_reader_settings:saveSetting("screensaver_image", file_path) - UIManager:show(InfoMessage:new{ - text = T(_("Screensaver image set to:\n%1"), BD.filepath(file_path)), - timeout = 3, - }) - end - end - } - UIManager:show(path_chooser) - end, - } - }) - table.insert(buttons, { - { - text = _("Close"), - callback = function() - UIManager:close(choose_dialog) - end, - } - }) - local screensaver_image = G_reader_settings:readSetting("screensaver_image") - or _("N/A") - local screensaver_document_cover = G_reader_settings:readSetting("screensaver_document_cover") - or _("N/A") - local title = document_cover and T(_("Current screensaver document cover:\n%1"), BD.filepath(screensaver_document_cover)) - or T(_("Current screensaver image:\n%1"), BD.filepath(screensaver_image)) - choose_dialog = ButtonDialog:new{ - title = title, - buttons = buttons - } - UIManager:show(choose_dialog) + local title_header, current_path, file_filter, caller_callback + if document_cover then + title_header = _("Current screensaver document cover:") + current_path = G_reader_settings:readSetting("screensaver_document_cover") + file_filter = function(filename) + return DocumentRegistry:hasProvider(filename) + end + caller_callback = function(path) + G_reader_settings:saveSetting("screensaver_document_cover", path) + end + else + title_header = _("Current screensaver image:") + current_path = G_reader_settings:readSetting("screensaver_image") + file_filter = function(filename) + return DocumentRegistry:isImageFile(filename) + end + caller_callback = function(path) + G_reader_settings:saveSetting("screensaver_image", path) + end + end + filemanagerutil.showChooseDialog(title_header, caller_callback, current_path, nil, file_filter) end function Screensaver:isExcluded() diff --git a/frontend/ui/widget/dictquicklookup.lua b/frontend/ui/widget/dictquicklookup.lua index de5e7db34..809f8652c 100644 --- a/frontend/ui/widget/dictquicklookup.lua +++ b/frontend/ui/widget/dictquicklookup.lua @@ -25,6 +25,8 @@ local UIManager = require("ui/uimanager") local VerticalGroup = require("ui/widget/verticalgroup") local VerticalSpan = require("ui/widget/verticalspan") local WidgetContainer = require("ui/widget/container/widgetcontainer") +local filemanagerutil = require("apps/filemanager/filemanagerutil") +local lfs = require("libs/libkoreader-lfs") local logger = require("logger") local util = require("util") local _ = require("gettext") @@ -68,6 +70,14 @@ local highlight_strings = { unhighlight = _("Unhighlight"), } +function DictQuickLookup.getWikiSaveEpubDefaultDir() + local dir = G_reader_settings:readSetting("home_dir") or filemanagerutil.getDefaultDir() + if dir:sub(-1) ~= "/" then + dir = dir .. "/" + end + return dir .. "Wikipedia" +end + function DictQuickLookup:canSearch() if self.is_wiki then -- In the Wiki variant of this widget, the Search button is coopted to cycle between enabled languages. @@ -343,18 +353,11 @@ function DictQuickLookup:init() local dir if G_reader_settings:isTrue("wikipedia_save_in_book_dir") and not self:isDocless() then local last_file = G_reader_settings:readSetting("lastfile") - if last_file then - dir = last_file:match("(.*)/") - end + dir = last_file and last_file:match("(.*)/") end - if not dir then dir = G_reader_settings:readSetting("wikipedia_save_dir") - or G_reader_settings:readSetting("home_dir") - or require("apps/filemanager/filemanagerutil").getDefaultDir() end - if not dir or not util.pathExists(dir) then - UIManager:show(InfoMessage:new{ - text = _("No folder to save article to could be found."), - }) - return + dir = dir or G_reader_settings:readSetting("wikipedia_save_dir") or DictQuickLookup.getWikiSaveEpubDefaultDir() + if not util.pathExists(dir) then + lfs.mkdir(dir) end -- Just to be safe (none of the invalid chars, except ':' for uninteresting -- Portal: or File: wikipedia pages, should be in lookupword) diff --git a/frontend/ui/widget/imageviewer.lua b/frontend/ui/widget/imageviewer.lua index 310788029..ae69cfbd6 100644 --- a/frontend/ui/widget/imageviewer.lua +++ b/frontend/ui/widget/imageviewer.lua @@ -6,7 +6,6 @@ local BD = require("ui/bidi") local Blitbuffer = require("ffi/blitbuffer") local ButtonTable = require("ui/widget/buttontable") local CenterContainer = require("ui/widget/container/centercontainer") -local DataStorage = require("datastorage") local Device = require("device") local Event = require("ui/event") local Geom = require("ui/geometry") @@ -15,6 +14,7 @@ local FrameContainer = require("ui/widget/container/framecontainer") local ImageWidget = require("ui/widget/imagewidget") local InputContainer = require("ui/widget/container/inputcontainer") local ProgressWidget = require("ui/widget/progresswidget") +local Screenshoter = require("ui/widget/screenshoter") local Size = require("ui/size") local TitleBar = require("ui/widget/titlebar") local VerticalGroup = require("ui/widget/verticalgroup") @@ -156,7 +156,7 @@ function ImageViewer:init() self.image = self._scaled_image_func(1) -- native image size, that we need to know end - if G_reader_settings:isTrue("imageviewer_rotate_auto_for_best_fit") then + if self.image and G_reader_settings:isTrue("imageviewer_rotate_auto_for_best_fit") then self.rotated = (Screen:getWidth() > Screen:getHeight()) ~= (self.image:getWidth() > self.image:getHeight()) end @@ -811,8 +811,8 @@ function ImageViewer:onSaveImageView() self:update() UIManager:forceRePaint() end - 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") + local screenshot_dir = Screenshoter:getScreenshotDir() + local screenshot_name = os.date(screenshot_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 da59238e9..e8b4591f0 100644 --- a/frontend/ui/widget/screenshoter.lua +++ b/frontend/ui/widget/screenshoter.lua @@ -1,16 +1,16 @@ local BD = require("ui/bidi") -local ConfirmBox = require("ui/widget/confirmbox") -local MultiConfirmBox = require("ui/widget/multiconfirmbox") +local ButtonDialog = require("ui/widget/buttondialog") local DataStorage = require("datastorage") local GestureRange = require("ui/gesturerange") local InputContainer = require("ui/widget/container/inputcontainer") local UIManager = require("ui/uimanager") +local filemanagerutil = require("apps/filemanager/filemanagerutil") local Screen = require("device").screen -local T = require("ffi/util").template local _ = require("gettext") local Screenshoter = InputContainer:extend{ - prefix = 'Screenshot', + prefix = "Screenshot", + default_dir = DataStorage:getFullDataDir() .. "/screenshots", } function Screenshoter:init() @@ -33,41 +33,43 @@ function Screenshoter:init() } end -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) +function Screenshoter:getScreenshotDir() + local screenshot_dir = G_reader_settings:readSetting("screenshot_dir") + return screenshot_dir and screenshot_dir:gsub("/$", "") or self.default_dir +end + +function Screenshoter:onScreenshot(screenshot_name, caller_callback) + if not screenshot_name then + screenshot_name = os.date(self:getScreenshotDir() .. "/" .. self.prefix .. "_%Y-%m-%d_%H%M%S.png") + end Screen:shot(screenshot_name) - local confirm_box - confirm_box = ConfirmBox:new{ - text = T( _("Screenshot saved to:\n%1"), BD.filepath(screenshot_name)), - keep_dialog_open = true, - flush_events_on_show = true, -- may be invoked with 2-fingers tap, accidental additional events can happen - 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, - other_buttons_first = true, - other_buttons = {{ + local file = self.ui and self.ui.document and self.ui.document.file -- currently opened book + local dialog + local buttons = { + { { text = _("Delete"), callback = function() - local __ = os.remove(screenshot_name) - UIManager:close(confirm_box) - if when_done_func then when_done_func() end + os.remove(screenshot_name) + dialog:onClose() + end, + }, + { + text = _("Set as book cover"), + enabled = file and true or false, + callback = function() + self.ui.bookinfo:setCustomCoverFromImage(file, screenshot_name) + os.remove(screenshot_name) + dialog:onClose() end, }, + }, + { { text = _("View"), callback = function() - local image_viewer = require("ui/widget/imageviewer"):new{ + local ImageViewer = require("ui/widget/imageviewer") + local image_viewer = ImageViewer:new{ file = screenshot_name, modal = true, with_title_bar = false, @@ -76,37 +78,43 @@ function Screenshoter:onScreenshot(filename, when_done_func) UIManager:show(image_viewer) end, }, - }}, + { + text = _("Set as screensaver"), + callback = function() + G_reader_settings:saveSetting("screensaver_type", "image_file") + G_reader_settings:saveSetting("screensaver_image", screenshot_name) + dialog:onClose() + end, + }, + }, + } + dialog = ButtonDialog:new{ + title = _("Screenshot saved to:") .. "\n\n" .. BD.filepath(screenshot_name) .. "\n", + buttons = buttons, + tap_close_callback = function() + if caller_callback then + caller_callback() + end + local current_path = self.ui and self.ui.file_chooser and self.ui.file_chooser.path + if current_path and current_path .. "/" == screenshot_name:match(".*/") then + self.ui.file_chooser:refreshPath() + end + end, } - UIManager:show(confirm_box) + UIManager:show(dialog) -- trigger full refresh UIManager:setDirty(nil, "full") return true end function Screenshoter:chooseFolder() - local screenshot_dir_default = DataStorage:getFullDataDir() .. "/screenshots/" - local screenshot_dir = G_reader_settings:readSetting("screenshot_dir") or screenshot_dir_default - local confirm_box = MultiConfirmBox:new{ - text = T(_("Screenshot folder is set to:\n%1\n\nChoose a new folder for screenshots?"), screenshot_dir), - choice1_text = _("Use default"), - choice1_callback = function() - G_reader_settings:saveSetting("screenshot_dir", screenshot_dir_default) - end, - choice2_text = _("Choose folder"), - choice2_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(confirm_box) + local title_header = _("Current screenshot folder:") + local current_path = G_reader_settings:readSetting("screenshot_dir") + local default_path = self.default_dir + local caller_callback = function(path) + G_reader_settings:saveSetting("screenshot_dir", path) + end + filemanagerutil.showChooseDialog(title_header, caller_callback, current_path, default_path) end function Screenshoter:onTapDiagonal() diff --git a/plugins/exporter.koplugin/main.lua b/plugins/exporter.koplugin/main.lua index 12780f574..766a7d3c5 100644 --- a/plugins/exporter.koplugin/main.lua +++ b/plugins/exporter.koplugin/main.lua @@ -32,6 +32,7 @@ local MyClipping = require("clip") local NetworkMgr = require("ui/network/manager") local UIManager = require("ui/uimanager") local WidgetContainer = require("ui/widget/container/widgetcontainer") +local filemanagerutil = require("apps/filemanager/filemanagerutil") local T = require("ffi/util").template local logger = require("logger") local _ = require("gettext") @@ -308,40 +309,17 @@ function Exporter:addToMainMenu(menu_items) end function Exporter:chooseFolder() - local function set_targets_clipping_dir(dir) - for k in pairs(self.targets) do - self.targets[k].clipping_dir = dir + local settings = G_reader_settings:readSetting("exporter", {}) + local title_header = _("Current export folder:") + local current_path = settings.clipping_dir + local default_path = DataStorage:getFullDataDir() .. "/clipboard" + local caller_callback = function(path) + settings.clipping_dir = path + for _, target in pairs(self.targets) do + target.clipping_dir = path end end - local clipping_dir_default = DataStorage:getFullDataDir() .. "/clipboard" - local settings = G_reader_settings:readSetting("exporter") or {} - local clipping_dir = settings.clipping_dir or clipping_dir_default - local MultiConfirmBox = require("ui/widget/multiconfirmbox") - local confirm_box = MultiConfirmBox:new{ - text = T(_("Export folder is set to:\n%1\n\nChoose new export folder?"), clipping_dir), - choice1_text = _("Use default"), - choice1_callback = function() - settings.clipping_dir = nil - G_reader_settings:saveSetting("exporter", settings) - set_targets_clipping_dir(clipping_dir_default) - end, - choice2_text = _("Choose folder"), - choice2_callback = function() - local PathChooser = require("ui/widget/pathchooser") - local path_chooser = PathChooser:new{ - select_file = false, - show_files = false, - path = clipping_dir, - onConfirm = function(new_path) - settings.clipping_dir = new_path - G_reader_settings:saveSetting("exporter", settings) - set_targets_clipping_dir(new_path) - end - } - UIManager:show(path_chooser) - end, - } - UIManager:show(confirm_box) + filemanagerutil.showChooseDialog(title_header, caller_callback, current_path, default_path) end return Exporter diff --git a/plugins/statistics.koplugin/main.lua b/plugins/statistics.koplugin/main.lua index 6353054e8..34a35228d 100644 --- a/plugins/statistics.koplugin/main.lua +++ b/plugins/statistics.koplugin/main.lua @@ -787,6 +787,7 @@ function ReaderStatistics:getIdBookDB() end function ReaderStatistics:onBookMetadataChanged(prop_updated) + if not prop_updated then return end local log_prefix = "Statistics metadata update:" logger.dbg(log_prefix, "got", prop_updated) -- Some metadata of a book (that we may or may not know about) has been modified