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 ;).
pull/4988/head
NiLuJe 5 years ago committed by GitHub
parent 9b41adb2f1
commit 888d3591b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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",

@ -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

@ -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

@ -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 = {

@ -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

@ -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" }

@ -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,
},
}
},

@ -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

@ -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

@ -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")

@ -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)

@ -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

@ -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

@ -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

@ -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"
]],

Loading…
Cancel
Save