From 888d3591b29259884a4d87f0386e0e31154967d3 Mon Sep 17 00:00:00 2001 From: NiLuJe Date: Wed, 1 May 2019 02:09:01 +0200 Subject: [PATCH] Give more control over CRe margins (#4945) Without having to resort to weird custom defaults. * Split the current margins setting in three: * Horizontal margins (because you generally want those two to be balanced). * Top margin & Bottom margin (because you may want to tweak those separately to deal with quirky status bar/final line shenanigans). * Also, add a "Reclaim bar height from bottom margin" toggle to the status bar menu, to optionally make sure the status bar won't eat into the bottom margin. * Includes a free fix to diacritics popup refresh handling in the keyboard ;). --- .luacheckrc | 35 ++++-- defaults.lua | 41 +++++-- frontend/apps/reader/modules/readerdogear.lua | 15 ++- frontend/apps/reader/modules/readerfooter.lua | 14 ++- .../apps/reader/modules/readertypeset.lua | 48 +++++++- frontend/apps/reader/readerui.lua | 3 + frontend/ui/data/creoptions.lua | 113 ++++++++++++++---- frontend/ui/data/optionsutil.lua | 34 +++--- frontend/ui/data/settings_migration.lua | 40 +++++++ frontend/ui/data/strings.lua | 4 +- frontend/ui/widget/buttonprogresswidget.lua | 69 ++++++++++- frontend/ui/widget/configdialog.lua | 109 +++++++++++++++-- frontend/ui/widget/virtualkeyboard.lua | 11 +- reader.lua | 4 + spec/unit/defaults_spec.lua | 74 +++++------- 15 files changed, 488 insertions(+), 126 deletions(-) create mode 100644 frontend/ui/data/settings_migration.lua diff --git a/.luacheckrc b/.luacheckrc index 66421b049..e4ccc04b9 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -64,14 +64,33 @@ read_globals = { "DKOPTREADER_CONFIG_DOC_DEFAULT_LANG_CODE", "DCREREADER_CONFIG_FONT_SIZES", "DCREREADER_CONFIG_DEFAULT_FONT_SIZE", - "DCREREADER_CONFIG_MARGIN_SIZES_SMALL", - "DCREREADER_CONFIG_MARGIN_SIZES_MEDIUM", - "DCREREADER_CONFIG_MARGIN_SIZES_LARGE", - "DCREREADER_CONFIG_MARGIN_SIZES_X_LARGE", - "DCREREADER_CONFIG_MARGIN_SIZES_XX_LARGE", - "DCREREADER_CONFIG_MARGIN_SIZES_XXX_LARGE", - "DCREREADER_CONFIG_MARGIN_SIZES_HUGE", - "DCREREADER_CONFIG_MARGIN_SIZES_X_HUGE", + "DCREREADER_CONFIG_H_MARGIN_SIZES_SMALL", + "DCREREADER_CONFIG_H_MARGIN_SIZES_MEDIUM", + "DCREREADER_CONFIG_H_MARGIN_SIZES_LARGE", + "DCREREADER_CONFIG_H_MARGIN_SIZES_X_LARGE", + "DCREREADER_CONFIG_H_MARGIN_SIZES_XX_LARGE", + "DCREREADER_CONFIG_H_MARGIN_SIZES_XXX_LARGE", + "DCREREADER_CONFIG_H_MARGIN_SIZES_HUGE", + "DCREREADER_CONFIG_H_MARGIN_SIZES_X_HUGE", + "DCREREADER_CONFIG_H_MARGIN_SIZES_XX_HUGE", + "DCREREADER_CONFIG_T_MARGIN_SIZES_SMALL", + "DCREREADER_CONFIG_T_MARGIN_SIZES_MEDIUM", + "DCREREADER_CONFIG_T_MARGIN_SIZES_LARGE", + "DCREREADER_CONFIG_T_MARGIN_SIZES_X_LARGE", + "DCREREADER_CONFIG_T_MARGIN_SIZES_XX_LARGE", + "DCREREADER_CONFIG_T_MARGIN_SIZES_XXX_LARGE", + "DCREREADER_CONFIG_T_MARGIN_SIZES_HUGE", + "DCREREADER_CONFIG_T_MARGIN_SIZES_X_HUGE", + "DCREREADER_CONFIG_T_MARGIN_SIZES_XX_HUGE", + "DCREREADER_CONFIG_B_MARGIN_SIZES_SMALL", + "DCREREADER_CONFIG_B_MARGIN_SIZES_MEDIUM", + "DCREREADER_CONFIG_B_MARGIN_SIZES_LARGE", + "DCREREADER_CONFIG_B_MARGIN_SIZES_X_LARGE", + "DCREREADER_CONFIG_B_MARGIN_SIZES_XX_LARGE", + "DCREREADER_CONFIG_B_MARGIN_SIZES_XXX_LARGE", + "DCREREADER_CONFIG_B_MARGIN_SIZES_HUGE", + "DCREREADER_CONFIG_B_MARGIN_SIZES_X_HUGE", + "DCREREADER_CONFIG_B_MARGIN_SIZES_XX_HUGE", "DCREREADER_CONFIG_LIGHTER_FONT_GAMMA", "DCREREADER_CONFIG_DEFAULT_FONT_GAMMA", "DCREREADER_CONFIG_DARKER_FONT_GAMMA", diff --git a/defaults.lua b/defaults.lua index 2116b9ebc..590086e4f 100644 --- a/defaults.lua +++ b/defaults.lua @@ -114,15 +114,38 @@ DCREREADER_CONFIG_FONT_SIZES = {12, 16, 20, 22, 24, 26, 28, 30, 34, 38, 44} -- DCREREADER_CONFIG_DEFAULT_FONT_SIZE = 22 -- default font size -- crereader margin sizes --- margin {left, top, right, bottom} in pixels -DCREREADER_CONFIG_MARGIN_SIZES_SMALL = {5, 10, 5, 10} -DCREREADER_CONFIG_MARGIN_SIZES_MEDIUM = {10, 15, 10, 15} -DCREREADER_CONFIG_MARGIN_SIZES_LARGE = {20, 20, 20, 20} -DCREREADER_CONFIG_MARGIN_SIZES_X_LARGE = {30, 30, 30, 30} -DCREREADER_CONFIG_MARGIN_SIZES_XX_LARGE = {50, 50, 50, 50} -DCREREADER_CONFIG_MARGIN_SIZES_XXX_LARGE = {70, 70, 70, 70} -DCREREADER_CONFIG_MARGIN_SIZES_HUGE = {100, 100, 100, 100} -DCREREADER_CONFIG_MARGIN_SIZES_X_HUGE = {140, 140, 140, 140} +-- horizontal margins {left, right} in (relative) pixels +DCREREADER_CONFIG_H_MARGIN_SIZES_SMALL = {5, 5} +DCREREADER_CONFIG_H_MARGIN_SIZES_MEDIUM = {10, 10} +DCREREADER_CONFIG_H_MARGIN_SIZES_LARGE = {15, 15} +DCREREADER_CONFIG_H_MARGIN_SIZES_X_LARGE = {20, 20} +DCREREADER_CONFIG_H_MARGIN_SIZES_XX_LARGE = {30, 30} +DCREREADER_CONFIG_H_MARGIN_SIZES_XXX_LARGE = {50, 50} +DCREREADER_CONFIG_H_MARGIN_SIZES_HUGE = {70, 70} +DCREREADER_CONFIG_H_MARGIN_SIZES_X_HUGE = {100, 100} +DCREREADER_CONFIG_H_MARGIN_SIZES_XX_HUGE = {140, 140} + +-- top margin in (relative) pixels +DCREREADER_CONFIG_T_MARGIN_SIZES_SMALL = 5 +DCREREADER_CONFIG_T_MARGIN_SIZES_MEDIUM = 10 +DCREREADER_CONFIG_T_MARGIN_SIZES_LARGE = 15 +DCREREADER_CONFIG_T_MARGIN_SIZES_X_LARGE = 20 +DCREREADER_CONFIG_T_MARGIN_SIZES_XX_LARGE = 30 +DCREREADER_CONFIG_T_MARGIN_SIZES_XXX_LARGE = 50 +DCREREADER_CONFIG_T_MARGIN_SIZES_HUGE = 70 +DCREREADER_CONFIG_T_MARGIN_SIZES_X_HUGE = 100 +DCREREADER_CONFIG_T_MARGIN_SIZES_XX_HUGE = 140 + +-- bottom margin in (relative) pixels +DCREREADER_CONFIG_B_MARGIN_SIZES_SMALL = 5 +DCREREADER_CONFIG_B_MARGIN_SIZES_MEDIUM = 10 +DCREREADER_CONFIG_B_MARGIN_SIZES_LARGE = 15 +DCREREADER_CONFIG_B_MARGIN_SIZES_X_LARGE = 20 +DCREREADER_CONFIG_B_MARGIN_SIZES_XX_LARGE = 30 +DCREREADER_CONFIG_B_MARGIN_SIZES_XXX_LARGE = 50 +DCREREADER_CONFIG_B_MARGIN_SIZES_HUGE = 70 +DCREREADER_CONFIG_B_MARGIN_SIZES_X_HUGE = 100 +DCREREADER_CONFIG_B_MARGIN_SIZES_XX_HUGE = 140 -- crereader font gamma (no longer used) -- DCREREADER_CONFIG_LIGHTER_FONT_GAMMA = 10 diff --git a/frontend/apps/reader/modules/readerdogear.lua b/frontend/apps/reader/modules/readerdogear.lua index ce29ee29c..51c562242 100644 --- a/frontend/apps/reader/modules/readerdogear.lua +++ b/frontend/apps/reader/modules/readerdogear.lua @@ -43,10 +43,17 @@ end function ReaderDogear:onReadSettings(config) if not self.ui.document.info.has_pages then -- Adjust to CreDocument margins (as done in ReaderTypeset) - self:onSetPageMargins( - config:readSetting("copt_page_margins") or - G_reader_settings:readSetting("copt_page_margins") or - DCREREADER_CONFIG_MARGIN_SIZES_MEDIUM) + local h_margins = config:readSetting("copt_h_page_margins") or + G_reader_settings:readSetting("copt_h_page_margins") or + DCREREADER_CONFIG_H_MARGIN_SIZES_MEDIUM + local t_margin = config:readSetting("copt_t_page_margin") or + G_reader_settings:readSetting("copt_t_page_margin") or + DCREREADER_CONFIG_T_MARGIN_SIZES_LARGE + local b_margin = config:readSetting("copt_b_page_margin") or + G_reader_settings:readSetting("copt_b_page_margin") or + DCREREADER_CONFIG_B_MARGIN_SIZES_LARGE + local margins = { h_margins[1], t_margin, h_margins[2], b_margin } + self:onSetPageMargins(margins) end end diff --git a/frontend/apps/reader/modules/readerfooter.lua b/frontend/apps/reader/modules/readerfooter.lua index 005312468..fe030f6b0 100644 --- a/frontend/apps/reader/modules/readerfooter.lua +++ b/frontend/apps/reader/modules/readerfooter.lua @@ -137,6 +137,7 @@ function ReaderFooter:init() -- disable_progress_bar = true, disabled = false, all_at_once = false, + reclaim_height = false, toc_markers = true, battery = true, time = true, @@ -158,6 +159,7 @@ function ReaderFooter:init() self.pageno = self.view.state.page self.has_no_mode = true + self.reclaim_height = self.settings.reclaim_height or false for _, m in ipairs(MODE_INDEX) do if self.settings[m] then self.has_no_mode = false @@ -337,6 +339,7 @@ end local option_titles = { all_at_once = _("Show all at once"), + reclaim_height = _("Reclaim bar height from bottom margin"), toc_markers = _("Show chapter markers"), page_progress = _("Current page"), time = _("Current time"), @@ -387,6 +390,7 @@ function ReaderFooter:addToMainMenu(menu_items) local should_update = false local first_enabled_mode_num local prev_has_no_mode = self.has_no_mode + local prev_reclaim_height = self.reclaim_height self.has_no_mode = true for mode_num, m in pairs(MODE_INDEX) do if self.settings[m] then @@ -395,14 +399,18 @@ function ReaderFooter:addToMainMenu(menu_items) break end end + self.reclaim_height = self.settings.reclaim_height or false -- refresh margins position if self.has_no_mode then - self.ui:handleEvent(Event:new("SetPageMargins", self.view.document.configurable.page_margins)) + self.ui:handleEvent(Event:new("SetPageBottomMargin", self.view.document.configurable.b_page_margin)) self.genFooterText = footerTextGeneratorMap.empty self.mode = MODE.off elseif prev_has_no_mode then - self.ui:handleEvent(Event:new("SetPageMargins", self.view.document.configurable.page_margins)) + self.ui:handleEvent(Event:new("SetPageBottomMargin", self.view.document.configurable.b_page_margin)) G_reader_settings:saveSetting("reader_footer_mode", first_enabled_mode_num) + elseif self.reclaim_height ~= prev_reclaim_height then + self.ui:handleEvent(Event:new("SetPageBottomMargin", self.view.document.configurable.b_page_margin)) + should_update = true end if callback then should_update = callback(self) @@ -429,6 +437,8 @@ function ReaderFooter:addToMainMenu(menu_items) table.insert(sub_items, getMinibarOption("all_at_once", self.updateFooterTextGenerator)) + table.insert(sub_items, + getMinibarOption("reclaim_height")) table.insert(sub_items, { text = _("Progress bar"), sub_item_table = { diff --git a/frontend/apps/reader/modules/readertypeset.lua b/frontend/apps/reader/modules/readertypeset.lua index 1fa8b6b23..15c1ce173 100644 --- a/frontend/apps/reader/modules/readertypeset.lua +++ b/frontend/apps/reader/modules/readertypeset.lua @@ -1,5 +1,6 @@ local ConfirmBox = require("ui/widget/confirmbox") local Event = require("ui/event") +local InfoMessage = require("ui/widget/infomessage") local InputContainer = require("ui/widget/container/inputcontainer") local UIManager = require("ui/uimanager") local lfs = require("libs/libkoreader-lfs") @@ -11,6 +12,7 @@ local ReaderTypeset = InputContainer:new{ css_menu_title = _("Style"), css = nil, internal_css = true, + unscaled_margins = nil, } function ReaderTypeset:init() @@ -58,10 +60,17 @@ function ReaderTypeset:onReadSettings(config) -- self.ui.document:setRenderScaleFontWithDPI(1) -- set page margins - self:onSetPageMargins( - config:readSetting("copt_page_margins") or - G_reader_settings:readSetting("copt_page_margins") or - DCREREADER_CONFIG_MARGIN_SIZES_MEDIUM) + local h_margins = config:readSetting("copt_h_page_margins") or + G_reader_settings:readSetting("copt_h_page_margins") or + DCREREADER_CONFIG_H_MARGIN_SIZES_MEDIUM + local t_margin = config:readSetting("copt_t_page_margin") or + G_reader_settings:readSetting("copt_t_page_margin") or + DCREREADER_CONFIG_T_MARGIN_SIZES_LARGE + local b_margin = config:readSetting("copt_b_page_margin") or + G_reader_settings:readSetting("copt_b_page_margin") or + DCREREADER_CONFIG_B_MARGIN_SIZES_LARGE + self.unscaled_margins = { h_margins[1], t_margin, h_margins[2], b_margin } + self:onSetPageMargins(self.unscaled_margins, true) -- default to disable floating punctuation -- the floating punctuation should not be boolean value for the following @@ -336,18 +345,45 @@ function ReaderTypeset:makeDefaultStyleSheet(css, text, touchmenu_instance) }) end -function ReaderTypeset:onSetPageMargins(margins) +function ReaderTypeset:onSetPageHorizMargins(h_margins) + self.unscaled_margins = { h_margins[1], self.unscaled_margins[2], h_margins[2], self.unscaled_margins[4] } + self:onSetPageMargins(self.unscaled_margins) +end + +function ReaderTypeset:onSetPageTopMargin(t_margin) + self.unscaled_margins = { self.unscaled_margins[1], t_margin, self.unscaled_margins[3], self.unscaled_margins[4] } + self:onSetPageMargins(self.unscaled_margins) +end + +function ReaderTypeset:onSetPageBottomMargin(b_margin) + self.unscaled_margins = { self.unscaled_margins[1], self.unscaled_margins[2], self.unscaled_margins[3], b_margin } + self:onSetPageMargins(self.unscaled_margins) +end + +function ReaderTypeset:onSetPageMargins(margins, silent) local left = Screen:scaleBySize(margins[1]) local top = Screen:scaleBySize(margins[2]) local right = Screen:scaleBySize(margins[3]) local bottom - if self.view.footer.has_no_mode then + if self.view.footer.has_no_mode or self.view.footer.reclaim_height then bottom = Screen:scaleBySize(margins[4]) else bottom = Screen:scaleBySize(margins[4] + DMINIBAR_HEIGHT) end self.ui.document:setPageMargins(left, top, right, bottom) self.ui:handleEvent(Event:new("UpdatePos")) + if not silent then + -- Show a toast on set, with the unscaled & scaled values + UIManager:show(InfoMessage:new{ + text = T(_([[ + Margins set to: + horizontal: %1 (%2px) + top: %3 (%4px) + bottom: %5 (%6px)]]), + margins[1], left, margins[2], top, margins[4], bottom), + timeout = 4, + }) + end return true end diff --git a/frontend/apps/reader/readerui.lua b/frontend/apps/reader/readerui.lua index 047331acf..783427a40 100644 --- a/frontend/apps/reader/readerui.lua +++ b/frontend/apps/reader/readerui.lua @@ -49,6 +49,7 @@ local ReaderView = require("apps/reader/modules/readerview") local ReaderWikipedia = require("apps/reader/modules/readerwikipedia") local ReaderZooming = require("apps/reader/modules/readerzooming") local Screenshoter = require("ui/widget/screenshoter") +local SettingsMigration = require("ui/data/settings_migration") local UIManager = require("ui/uimanager") local lfs = require("libs/libkoreader-lfs") local logger = require("logger") @@ -100,6 +101,8 @@ function ReaderUI:init() end self.doc_settings = DocSettings:open(self.document.file) + -- Handle local settings migration + SettingsMigration:migrateSettings(self.doc_settings) if Device:hasKeys() then self.key_events.Home = { {"Home"}, doc = "open file browser" } diff --git a/frontend/ui/data/creoptions.lua b/frontend/ui/data/creoptions.lua index de4d0ec7d..46bc7c472 100644 --- a/frontend/ui/data/creoptions.lua +++ b/frontend/ui/data/creoptions.lua @@ -131,34 +131,105 @@ Note that your selected font size is not affected by this setting.]]), name_text_suffix = "%", name_text_true_values = true, }, + } + }, + { + icon = "resources/icons/appbar.crop.large.png", + options = { { - name = "page_margins", - name_text = S.PAGE_MARGIN, + name = "h_page_margins", + name_text = S.H_PAGE_MARGINS, buttonprogress = true, values = { - DCREREADER_CONFIG_MARGIN_SIZES_SMALL, - DCREREADER_CONFIG_MARGIN_SIZES_MEDIUM, - DCREREADER_CONFIG_MARGIN_SIZES_LARGE, - DCREREADER_CONFIG_MARGIN_SIZES_X_LARGE, - DCREREADER_CONFIG_MARGIN_SIZES_XX_LARGE, - DCREREADER_CONFIG_MARGIN_SIZES_XXX_LARGE, - DCREREADER_CONFIG_MARGIN_SIZES_HUGE, - DCREREADER_CONFIG_MARGIN_SIZES_X_HUGE, + DCREREADER_CONFIG_H_MARGIN_SIZES_SMALL, + DCREREADER_CONFIG_H_MARGIN_SIZES_MEDIUM, + DCREREADER_CONFIG_H_MARGIN_SIZES_LARGE, + DCREREADER_CONFIG_H_MARGIN_SIZES_X_LARGE, + DCREREADER_CONFIG_H_MARGIN_SIZES_XX_LARGE, + DCREREADER_CONFIG_H_MARGIN_SIZES_XXX_LARGE, + DCREREADER_CONFIG_H_MARGIN_SIZES_HUGE, + DCREREADER_CONFIG_H_MARGIN_SIZES_X_HUGE, + DCREREADER_CONFIG_H_MARGIN_SIZES_XX_HUGE, }, default_pos = 2, - default_value = DCREREADER_CONFIG_MARGIN_SIZES_MEDIUM, - event = "SetPageMargins", + default_value = DCREREADER_CONFIG_H_MARGIN_SIZES_MEDIUM, + event = "SetPageHorizMargins", + args = { + DCREREADER_CONFIG_H_MARGIN_SIZES_SMALL, + DCREREADER_CONFIG_H_MARGIN_SIZES_MEDIUM, + DCREREADER_CONFIG_H_MARGIN_SIZES_LARGE, + DCREREADER_CONFIG_H_MARGIN_SIZES_X_LARGE, + DCREREADER_CONFIG_H_MARGIN_SIZES_XX_LARGE, + DCREREADER_CONFIG_H_MARGIN_SIZES_XXX_LARGE, + DCREREADER_CONFIG_H_MARGIN_SIZES_HUGE, + DCREREADER_CONFIG_H_MARGIN_SIZES_X_HUGE, + DCREREADER_CONFIG_H_MARGIN_SIZES_XX_HUGE, + }, + name_text_hold_callback = optionsutil.showValuesHMargins, + }, + { + name = "t_page_margin", + name_text = S.T_PAGE_MARGIN, + buttonprogress = true, + fine_tune = true, + values = { + DCREREADER_CONFIG_T_MARGIN_SIZES_SMALL, + DCREREADER_CONFIG_T_MARGIN_SIZES_MEDIUM, + DCREREADER_CONFIG_T_MARGIN_SIZES_LARGE, + DCREREADER_CONFIG_T_MARGIN_SIZES_X_LARGE, + DCREREADER_CONFIG_T_MARGIN_SIZES_XX_LARGE, + DCREREADER_CONFIG_T_MARGIN_SIZES_XXX_LARGE, + DCREREADER_CONFIG_T_MARGIN_SIZES_HUGE, + DCREREADER_CONFIG_T_MARGIN_SIZES_X_HUGE, + DCREREADER_CONFIG_T_MARGIN_SIZES_XX_HUGE, + }, + default_pos = 3, + default_value = DCREREADER_CONFIG_T_MARGIN_SIZES_LARGE, + event = "SetPageTopMargin", + args = { + DCREREADER_CONFIG_T_MARGIN_SIZES_SMALL, + DCREREADER_CONFIG_T_MARGIN_SIZES_MEDIUM, + DCREREADER_CONFIG_T_MARGIN_SIZES_LARGE, + DCREREADER_CONFIG_T_MARGIN_SIZES_X_LARGE, + DCREREADER_CONFIG_T_MARGIN_SIZES_XX_LARGE, + DCREREADER_CONFIG_T_MARGIN_SIZES_XXX_LARGE, + DCREREADER_CONFIG_T_MARGIN_SIZES_HUGE, + DCREREADER_CONFIG_T_MARGIN_SIZES_X_HUGE, + DCREREADER_CONFIG_T_MARGIN_SIZES_XX_HUGE, + }, + name_text_hold_callback = optionsutil.showValues, + }, + { + name = "b_page_margin", + name_text = S.B_PAGE_MARGIN, + buttonprogress = true, + fine_tune = true, + values = { + DCREREADER_CONFIG_B_MARGIN_SIZES_SMALL, + DCREREADER_CONFIG_B_MARGIN_SIZES_MEDIUM, + DCREREADER_CONFIG_B_MARGIN_SIZES_LARGE, + DCREREADER_CONFIG_B_MARGIN_SIZES_X_LARGE, + DCREREADER_CONFIG_B_MARGIN_SIZES_XX_LARGE, + DCREREADER_CONFIG_B_MARGIN_SIZES_XXX_LARGE, + DCREREADER_CONFIG_B_MARGIN_SIZES_HUGE, + DCREREADER_CONFIG_B_MARGIN_SIZES_X_HUGE, + DCREREADER_CONFIG_B_MARGIN_SIZES_XX_HUGE, + }, + default_pos = 3, + default_value = DCREREADER_CONFIG_B_MARGIN_SIZES_LARGE, + event = "SetPageBottomMargin", args = { - DCREREADER_CONFIG_MARGIN_SIZES_SMALL, - DCREREADER_CONFIG_MARGIN_SIZES_MEDIUM, - DCREREADER_CONFIG_MARGIN_SIZES_LARGE, - DCREREADER_CONFIG_MARGIN_SIZES_X_LARGE, - DCREREADER_CONFIG_MARGIN_SIZES_XX_LARGE, - DCREREADER_CONFIG_MARGIN_SIZES_XXX_LARGE, - DCREREADER_CONFIG_MARGIN_SIZES_HUGE, - DCREREADER_CONFIG_MARGIN_SIZES_X_HUGE, + DCREREADER_CONFIG_B_MARGIN_SIZES_SMALL, + DCREREADER_CONFIG_B_MARGIN_SIZES_MEDIUM, + DCREREADER_CONFIG_B_MARGIN_SIZES_LARGE, + DCREREADER_CONFIG_B_MARGIN_SIZES_X_LARGE, + DCREREADER_CONFIG_B_MARGIN_SIZES_XX_LARGE, + DCREREADER_CONFIG_B_MARGIN_SIZES_XXX_LARGE, + DCREREADER_CONFIG_B_MARGIN_SIZES_HUGE, + DCREREADER_CONFIG_B_MARGIN_SIZES_X_HUGE, + DCREREADER_CONFIG_B_MARGIN_SIZES_XX_HUGE, }, - name_text_hold_callback = optionsutil.showValuesMargins, + name_text_hold_callback = optionsutil.showValues, }, } }, diff --git a/frontend/ui/data/optionsutil.lua b/frontend/ui/data/optionsutil.lua index b86247d71..e09aa74ad 100644 --- a/frontend/ui/data/optionsutil.lua +++ b/frontend/ui/data/optionsutil.lua @@ -73,35 +73,29 @@ function optionsutil.showValues(configurable, option, prefix) UIManager:show(InfoMessage:new{ text=text }) end -function optionsutil.showValuesMargins(configurable, option) +function optionsutil.showValuesHMargins(configurable, option) local default = G_reader_settings:readSetting("copt_"..option.name) local current = configurable[option.name] if not default then UIManager:show(InfoMessage:new{ text = T(_([[ -Current margin: - left: %1 - top: %2 - right: %3 - bottom: %4 -Default margin: not set]]), - current[1], current[2], current[3], current[4]) +Current margins: + left: %1 + right: %2 +Default margins: not set]]), + current[1], current[2]) }) else UIManager:show(InfoMessage:new{ text = T(_([[ -Current margin: - left: %1 - top: %2 - right: %3 - bottom: %4 -Default margin: - left: %5 - top: %6 - right: %7 - bottom: %8]]), - current[1], current[2], current[3], current[4], - default[1], default[2], default[3], default[4]) +Current margins: + left: %1 + right: %2 +Default margins: + left: %3 + right: %4]]), + current[1], current[2], + default[1], default[2]) }) end end diff --git a/frontend/ui/data/settings_migration.lua b/frontend/ui/data/settings_migration.lua new file mode 100644 index 000000000..66d931242 --- /dev/null +++ b/frontend/ui/data/settings_migration.lua @@ -0,0 +1,40 @@ +--[[ +Centralizes migration concerns for LuaSettings & DocSettings +--]] + +local DocSettings = require("docsettings") +local LuaSettings = require("luasettings") +local logger = require("logger") + +local SettingsMigration = {} + +-- Shockingly, handles settings migration +-- NOTE: supports LuaSettings & DocSettings objects as input, as both implement the same API +function SettingsMigration:migrateSettings(config) + -- Figure out what kind of object we were passed, to make the logging more precise + local cfg_mt_idx = getmetatable(config).__index + local cfg_class + if cfg_mt_idx == DocSettings then + cfg_class = "book" + elseif cfg_mt_idx == LuaSettings then + cfg_class = "global" + else + -- Input object isn't a supported *Settings class, warn & abort instead of going kablooey. + logger.warn("Passed an unsupported object class to SettingsMigration!") + return + end + + -- Fine-grained CRe margins (#4945) + local old_margins = config:readSetting("copt_page_margins") + if old_margins then + logger.info("Migrating old", cfg_class, "CRe margin settings: L", old_margins[1], "T", old_margins[2], "R", old_margins[3], "B", old_margins[4]) + -- Format was: {left, top, right, bottom} + config:saveSetting("copt_h_page_margins", {old_margins[1], old_margins[3]}) + config:saveSetting("copt_t_page_margin", old_margins[2]) + config:saveSetting("copt_b_page_margin", old_margins[4]) + -- Wipe it + config:delSetting("copt_page_margins") + end +end + +return SettingsMigration diff --git a/frontend/ui/data/strings.lua b/frontend/ui/data/strings.lua index c6564ef4e..0788d1831 100644 --- a/frontend/ui/data/strings.lua +++ b/frontend/ui/data/strings.lua @@ -8,7 +8,9 @@ S.PAGE_CROP = _("Page Crop") S.FULL_SCREEN = _("Full Screen") S.SCROLL_MODE = _("Scroll Mode") S.ZOOM_DPI = _("Zoom (dpi)") -S.PAGE_MARGIN = _("Margin") +S.H_PAGE_MARGINS = _("L/R Margins") +S.T_PAGE_MARGIN = _("Top Margin") +S.B_PAGE_MARGIN = _("Bottom Margin") S.LINE_SPACING = _("Line Spacing") S.COLUMNS = _("Columns") S.TEXT_ALIGN = _("Text Align") diff --git a/frontend/ui/widget/buttonprogresswidget.lua b/frontend/ui/widget/buttonprogresswidget.lua index 6adb7b3b2..018538066 100644 --- a/frontend/ui/widget/buttonprogresswidget.lua +++ b/frontend/ui/widget/buttonprogresswidget.lua @@ -21,6 +21,7 @@ local ButtonProgressWidget = InputContainer:new{ position = 1, default_position = nil, thin_grey_style = false, -- default to black + fine_tune = false, -- no -/+ buttons on the extremities by default } function ButtonProgressWidget:init() @@ -45,7 +46,43 @@ function ButtonProgressWidget:update() local button_margin = Size.margin.tiny local button_padding = Size.padding.button local button_bordersize = self.thin_grey_style and Size.border.thin or Size.border.button - local button_width = math.floor(self.width / self.num_buttons) - 2*button_padding - 2*button_margin - 2*button_bordersize + local buttons_count = self.num_buttons + if self.fine_tune then + buttons_count = buttons_count + 2 + end + local button_width = math.floor(self.width / buttons_count) - 2*button_padding - 2*button_margin - 2*button_bordersize + + -- Minus button on the left + if self.fine_tune then + local margin = button_margin * 2 + local extra_border_size = 0 + local button = Button:new{ + text = "-", + radius = 0, + margin = margin, + padding = button_padding, + bordersize = button_bordersize + extra_border_size, + enabled = true, + width = button_width - 2*extra_border_size, + preselect = false, + text_font_face = self.font_face, + text_font_size = self.font_size, + callback = function() + self.callback("-") + self:update() + end, + no_focus = true, + hold_callback = function() + self.hold_callback("-") + end, + } + if self.thin_grey_style then + button.frame.color = Blitbuffer.COLOR_DARK_GRAY + end + table.insert(self.buttonprogress_content, button) + end + + -- Actual progress bar for i = 1, self.num_buttons do local highlighted = i <= self.position local is_default = i == self.default_position @@ -103,6 +140,36 @@ function ButtonProgressWidget:update() table.insert(self.buttonprogress_content, button) end + -- Plus button on the right + if self.fine_tune then + local margin = button_margin * 2 + local extra_border_size = 0 + local button = Button:new{ + text = "+", + radius = 0, + margin = margin, + padding = button_padding, + bordersize = button_bordersize + extra_border_size, + enabled = true, + width = button_width - 2*extra_border_size, + preselect = false, + text_font_face = self.font_face, + text_font_size = self.font_size, + callback = function() + self.callback("+") + self:update() + end, + no_focus = true, + hold_callback = function() + self.hold_callback("+") + end, + } + if self.thin_grey_style then + button.frame.color = Blitbuffer.COLOR_DARK_GRAY + end + table.insert(self.buttonprogress_content, button) + end + UIManager:setDirty(self.show_parrent, function() return "ui", self.dimen end) diff --git a/frontend/ui/widget/configdialog.lua b/frontend/ui/widget/configdialog.lua index 748476c8b..c43ae8046 100644 --- a/frontend/ui/widget/configdialog.lua +++ b/frontend/ui/widget/configdialog.lua @@ -539,18 +539,29 @@ function ConfigOption:init() num_buttons = #self.options[c].values, position = self.options[c].default_pos, callback = function(arg) - self.config:onConfigChoose(self.options[c].values, self.options[c].name, + if arg == "-" or arg == "+" then + self.config:onConfigFineTuneChoose(self.options[c].values, self.options[c].name, self.options[c].event, self.options[c].args, self.options[c].events, arg) + else + self.config:onConfigChoose(self.options[c].values, self.options[c].name, + self.options[c].event, self.options[c].args, self.options[c].events, arg) + end UIManager:setDirty(self.config, function() return "fast", switch.dimen end) end, hold_callback = function(arg) - self.config:onMakeDefault(self.options[c].name, self.options[c].name_text, self.options[c].values, - self.options[c].labels or self.options[c].args, arg) + if arg == "-" or arg == "+" then + self.config:onMakeFineTuneDefault(self.options[c].name, self.options[c].name_text, self.options[c].values, + self.options[c].labels or self.options[c].args, arg) + else + self.config:onMakeDefault(self.options[c].name, self.options[c].name_text, self.options[c].values, + self.options[c].labels or self.options[c].args, arg) + end end, show_parrent = self.config, enabled = enabled, + fine_tune = self.options[c].fine_tune, } switch:setPosition(current_item, default_item) table.insert(option_items_group, switch) @@ -889,20 +900,77 @@ function ConfigDialog:onConfigChoose(values, name, event, args, events, position end) end +-- Tweaked variant used with the fine_tune variant of buttonprogress (direction can only be "-" or "+") +function ConfigDialog:onConfigFineTuneChoose(values, name, event, args, events, direction) + UIManager:tickAfterNext(function() + if values then + local value + if direction == "-" then + value = self.configurable[name] or values[1] + value = value - 1 + if value < 0 then + value = 0 + end + else + value = self.configurable[name] or values[#values] + value = value + 1 + end + self:onConfigChoice(name, value) + end + if event then + args = args or {} + local arg + if direction == "-" then + arg = self.configurable[name] or args[1] + if not values then + arg = arg - 1 + if arg < 0 then + arg = 0 + end + end + else + arg = self.configurable[name] or args[#args] + if not values then + arg = arg + 1 + end + end + self:onConfigEvent(event, arg) + end + if events then + self:onConfigEvents(events, direction) + end + -- Even if each toggle refreshes itself when toggled, we still + -- need to update and repaint the whole config panel, as other + -- toggles may have their state (enabled/disabled) modified + -- after this toggle update. + self:update() + if self.config_options.needs_redraw_on_change then + -- Some Kopt document event handlers just save their setting, + -- and need a full repaint for kopt to load these settings, + -- notice the change, and redraw the document + UIManager:setDirty("all", "partial") + else + -- CreDocument event handlers do their own refresh: + -- we can just redraw our frame + UIManager:setDirty(self, function() + return "ui", self.dialog_frame.dimen + end) + end + end) +end + function ConfigDialog:onMakeDefault(name, name_text, values, labels, position) local display_value = labels[position] if name == "font_fine_tune" then return -- known table value, make it pretty - elseif name == "page_margins" then + elseif name == "h_page_margins" then display_value = T(_([[ - left: %1 - top: %2 - right: %3 - bottom: %4 + left: %1 + right: %2 ]]), - display_value[1], display_value[2], display_value[3], display_value[4]) + display_value[1], display_value[2]) end -- generic fallback to support table values if type(display_value) == "table" then @@ -927,6 +995,29 @@ function ConfigDialog:onMakeDefault(name, name_text, values, labels, position) }) end +-- Tweaked variant used with the fine_tune variant of buttonprogress (direction can only be "-" or "+") +-- NOTE: This sets the defaults to the *current* value, as the -/+ buttons have no fixed value ;). +function ConfigDialog:onMakeFineTuneDefault(name, name_text, values, labels, direction) + local display_value = self.configurable[name] or direction == "-" and labels[1] or labels[#labels] + + UIManager:show(ConfirmBox:new{ + text = T( + _("Set default %1 to %2?"), + (name_text or ""), + display_value + ), + ok_text = T(_("Set default")), + ok_callback = function() + name = self.config_options.prefix.."_"..name + G_reader_settings:saveSetting(name, self.configurable[name]) + self:update() + UIManager:setDirty(self, function() + return "ui", self.dialog_frame.dimen + end) + end, + }) +end + function ConfigDialog:closeDialog() UIManager:close(self) if self.close_callback then diff --git a/frontend/ui/widget/virtualkeyboard.lua b/frontend/ui/widget/virtualkeyboard.lua index d170027c5..e2c40b32a 100644 --- a/frontend/ui/widget/virtualkeyboard.lua +++ b/frontend/ui/widget/virtualkeyboard.lua @@ -204,10 +204,13 @@ function VirtualKey:onHoldSelect() if self.flash_keyboard and not self.skiphold then self[1].inner_bordersize = self.focused_bordersize self:update_keyboard(false, true) + -- Don't refresh the key region if we're going to show a popup on top of it ;). if self.hold_callback then + self[1].inner_bordersize = 0 self.hold_callback() + else + UIManager:tickAfterNext(function() self:invert(false, true) end) end - UIManager:tickAfterNext(function() self:invert(false, true) end) else if self.hold_callback then self.hold_callback() @@ -223,7 +226,7 @@ function VirtualKey:onSwipeKey(arg, ges) if self.swipe_callback then self.swipe_callback(ges) end - UIManager:tickAfterNext(function() self:invert(false, true) end) + UIManager:tickAfterNext(function() self:invert(false, false) end) else if self.swipe_callback then self.swipe_callback(ges) @@ -266,7 +269,7 @@ end function VirtualKeyPopup:onCloseWidget() UIManager:setDirty(nil, function() - return "partial", self[1][1].dimen + return "ui", self[1][1].dimen end) end @@ -541,7 +544,7 @@ function VirtualKeyboard:onPressKey() end function VirtualKeyboard:_refresh(want_flash) - local refresh_type = "partial" + local refresh_type = "ui" if want_flash then refresh_type = "flashui" end diff --git a/reader.lua b/reader.lua index 90ad6c29f..2697d5a11 100755 --- a/reader.lua +++ b/reader.lua @@ -195,6 +195,10 @@ if Device:hasColorScreen() and not G_reader_settings:has("color_rendering") then }) end +-- Handle global settings migration +local SettingsMigration = require("ui/data/settings_migration") +SettingsMigration:migrateSettings(G_reader_settings) + local exit_code if ARGV[argidx] and ARGV[argidx] ~= "" then diff --git a/spec/unit/defaults_spec.lua b/spec/unit/defaults_spec.lua index 2c81487c9..af032573e 100644 --- a/spec/unit/defaults_spec.lua +++ b/spec/unit/defaults_spec.lua @@ -8,8 +8,8 @@ describe("defaults module", function() it("should load all defaults from defaults.lua", function() Defaults:init() - assert.is_same(94, #Defaults.defaults_name) - assert.is_same("DFULL_SCREEN", Defaults.defaults_name[38]) + assert.is_same(113, #Defaults.defaults_name) + assert.is_same("DFULL_SCREEN", Defaults.defaults_name[57]) end) it("should save changes to defaults.persistent.lua", function() @@ -18,17 +18,17 @@ describe("defaults module", function() -- not in persistent but checked in defaults Defaults.changed[21] = true - Defaults.changed[29] = true - Defaults.changed[38] = true - Defaults.changed[73] = true - Defaults.changed[89] = true + Defaults.changed[48] = true + Defaults.changed[57] = true + Defaults.changed[92] = true + Defaults.changed[108] = true Defaults:saveSettings() - assert.is_same(94, #Defaults.defaults_name) - assert.is_same("DFULL_SCREEN", Defaults.defaults_name[38]) - assert.is_same("SEARCH_LIBRARY_PATH", Defaults.defaults_name[89]) - assert.is_same("DTAP_ZONE_BACKWARD", Defaults.defaults_name[73]) - assert.is_same("DCREREADER_CONFIG_WORD_GAP_LARGE", Defaults.defaults_name[29]) - assert.is_same("DCREREADER_CONFIG_MARGIN_SIZES_HUGE", Defaults.defaults_name[21]) + assert.is_same(113, #Defaults.defaults_name) + assert.is_same("DFULL_SCREEN", Defaults.defaults_name[57]) + assert.is_same("SEARCH_LIBRARY_PATH", Defaults.defaults_name[108]) + assert.is_same("DTAP_ZONE_BACKWARD", Defaults.defaults_name[92]) + assert.is_same("DCREREADER_CONFIG_WORD_GAP_LARGE", Defaults.defaults_name[48]) + assert.is_same("DCREREADER_CONFIG_H_MARGIN_SIZES_XXX_LARGE", Defaults.defaults_name[21]) local fd = io.open(persistent_filename, "r") assert.Equals( [[-- For configuration changes that persists between updates @@ -40,23 +40,21 @@ DTAP_ZONE_BACKWARD = { ["w"] = 0.25 } DCREREADER_CONFIG_WORD_GAP_LARGE = 100 -DFULL_SCREEN = 1 -DCREREADER_CONFIG_MARGIN_SIZES_HUGE = { - [1] = 100, - [2] = 100, - [3] = 100, - [4] = 100 +DCREREADER_CONFIG_H_MARGIN_SIZES_XXX_LARGE = { + [1] = 50, + [2] = 50 } +DFULL_SCREEN = 1 ]], fd:read("*a")) fd:close() -- in persistent Defaults:init() - Defaults.changed[38] = true - Defaults.defaults_value[38] = 2 - Defaults.changed[73] = true - Defaults.defaults_value[73] = { + Defaults.changed[57] = true + Defaults.defaults_value[57] = 2 + Defaults.changed[92] = true + Defaults.defaults_value[92] = { y = 10, x = 10.125, h = 20.25, @@ -74,13 +72,11 @@ DTAP_ZONE_BACKWARD = { ["w"] = 20.75 } DCREREADER_CONFIG_WORD_GAP_LARGE = 100 -DFULL_SCREEN = 2 -DCREREADER_CONFIG_MARGIN_SIZES_HUGE = { - [1] = 100, - [2] = 100, - [3] = 100, - [4] = 100 +DCREREADER_CONFIG_H_MARGIN_SIZES_XXX_LARGE = { + [2] = 50, + [1] = 50 } +DFULL_SCREEN = 2 ]], fd:read("*a")) fd:close() @@ -93,11 +89,9 @@ DCREREADER_CONFIG_MARGIN_SIZES_HUGE = { fd:write( [[-- For configuration changes that persists between updates SEARCH_TITLE = true -DCREREADER_CONFIG_MARGIN_SIZES_LARGE = { - [1] = 20, - [2] = 20, - [3] = 20, - [4] = 20 +DCREREADER_CONFIG_H_MARGIN_SIZES_LARGE = { + [1] = 15, + [2] = 15 } DCREREADER_VIEW_MODE = "page" DHINTCOUNT = 2 @@ -106,20 +100,18 @@ DHINTCOUNT = 2 -- in persistent Defaults:init() - Defaults.changed[38] = true - Defaults.defaults_value[38] = 1 + Defaults.changed[57] = true + Defaults.defaults_value[57] = 1 Defaults:saveSettings() fd = io.open(persistent_filename) assert.Equals( [[-- For configuration changes that persists between updates SEARCH_TITLE = true -DHINTCOUNT = 2 -DCREREADER_CONFIG_MARGIN_SIZES_LARGE = { - [1] = 20, - [2] = 20, - [3] = 20, - [4] = 20 +DCREREADER_CONFIG_H_MARGIN_SIZES_LARGE = { + [2] = 15, + [1] = 15 } +DHINTCOUNT = 2 DFULL_SCREEN = 1 DCREREADER_VIEW_MODE = "page" ]],