2
0
mirror of https://github.com/koreader/koreader synced 2024-10-31 21:20:20 +00:00

A few footer tweaks (allow setting height through UI) (#6257)

* * Refresh the footer instantly when changing the prefix, separator, or
  formatting.
* Allow setting the container height (formerly
  DMINIBAR_CONTAINER_HEIGHT)
* Allow setting the container bottom padding (formerly 1 flex pixel)
* Refactor ReaderFooter:applyFooterMode
  Handle toggling the genFooterText function even in all at once mode
  Make sure the layout is properly reset when changing visibility state,
  to avoid inconsistencies with complex layouts.
This commit is contained in:
NiLuJe 2020-06-11 18:49:51 +02:00 committed by GitHub
parent 23862fd0eb
commit 1384b5e97d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -295,9 +295,9 @@ local ReaderFooter = WidgetContainer:extend{
footer_text = nil,
text_font_face = "ffont",
height = Screen:scaleBySize(DMINIBAR_CONTAINER_HEIGHT),
horizontal_margin = Screen:scaleBySize(10),
text_left_margin = Screen:scaleBySize(10),
bottom_padding = Screen:scaleBySize(1),
horizontal_margin = Size.span.horizontal_default,
text_left_margin = Size.span.horizontal_default,
bottom_padding = Size.padding.tiny,
settings = {},
-- added to expose them to unit tests
textGeneratorMap = footerTextGeneratorMap,
@ -327,6 +327,8 @@ function ReaderFooter:init()
toc_markers_width = DMINIBAR_TOC_MARKER_WIDTH,
text_font_size = DMINIBAR_FONT_SIZE,
text_font_bold = false,
container_height = DMINIBAR_CONTAINER_HEIGHT,
container_bottom_padding = 1, -- unscaled_size_check: ignore
}
-- Remove items not supported by the current device
@ -377,6 +379,16 @@ function ReaderFooter:init()
end
-- require("logger").dbg(self.mode_nb, self.mode_index)
-- Container settings
if not self.settings.container_height then
self.settings.container_height = DMINIBAR_CONTAINER_HEIGHT
end
self.height = Screen:scaleBySize(self.settings.container_height)
if not self.settings.container_bottom_padding then
self.settings.container_bottom_padding = 1 -- unscaled_size_check: ignore
end
self.bottom_padding = Screen:scaleBySize(self.settings.container_bottom_padding)
-- default margin (like self.horizontal_margin)
if not self.settings.progress_margin_width then
local defaults = Device:isAndroid() and material_pixels or 10
@ -452,7 +464,6 @@ function ReaderFooter:init()
self:resetLayout()
self.footer_container.dimen.h = 0
self.footer_text.height = 0
end
if self.settings.all_at_once then
self.view.footer_visible = (self.mode ~= self.mode_list.off)
@ -479,7 +490,7 @@ function ReaderFooter:updateFooterContainer()
h = Size.line.medium,
}
}
local vertical_span = VerticalSpan:new{width = self.bottom_padding *2}
local vertical_span = VerticalSpan:new{width = Size.span.vertical_default}
table.insert(self.vertical_frame, self.separator_line)
table.insert(self.vertical_frame, vertical_span)
end
@ -515,7 +526,7 @@ function ReaderFooter:updateFooterContainer()
}
end
local vertical_span = VerticalSpan:new{width = self.bottom_padding *2}
local vertical_span = VerticalSpan:new{width = Size.span.vertical_default}
if self.settings.progress_bar_position == "above" and not self.settings.disable_progress_bar then
table.insert(self.vertical_frame, self.progress_bar)
@ -932,6 +943,60 @@ function ReaderFooter:addToMainMenu(menu_items)
},
}
},
{
text_func = function()
return T(_("Container height (%1)"), self.settings.container_height)
end,
callback = function(touchmenu_instance)
local SpinWidget = require("ui/widget/spinwidget")
local container_height = self.settings.container_height
local items_font = SpinWidget:new{
width = Screen:getWidth() * 0.6,
value = container_height,
value_min = 7,
value_max = 98,
default_value = DMINIBAR_CONTAINER_HEIGHT,
ok_text = _("Set height"),
title_text = _("Container height"),
keep_shown_on_apply = true,
callback = function(spin)
self.settings.container_height = spin.value
self.height = Screen:scaleBySize(self.settings.container_height)
self:refreshFooter(true, true)
if touchmenu_instance then touchmenu_instance:updateItems() end
end,
}
UIManager:show(items_font)
end,
keep_menu_open = true,
},
{
text_func = function()
return T(_("Container bottom margin (%1)"), self.settings.container_bottom_padding)
end,
callback = function(touchmenu_instance)
local SpinWidget = require("ui/widget/spinwidget")
local container_bottom_padding = self.settings.container_bottom_padding
local items_font = SpinWidget:new{
width = Screen:getWidth() * 0.6,
value = container_bottom_padding,
value_min = 0,
value_max = 49,
default_value = 1,
ok_text = _("Set margin"),
title_text = _("Container bottom margin"),
keep_shown_on_apply = true,
callback = function(spin)
self.settings.container_bottom_padding = spin.value
self.bottom_padding = Screen:scaleBySize(self.settings.container_bottom_padding)
self:refreshFooter(true, true)
if touchmenu_instance then touchmenu_instance:updateItems() end
end,
}
UIManager:show(items_font)
end,
keep_menu_open = true,
},
{
text = _("Maximum width of items"),
sub_item_table = {
@ -991,6 +1056,7 @@ function ReaderFooter:addToMainMenu(menu_items)
},
{
text = _("Alignment"),
separator = true,
enabled_func = function()
return self.settings.disable_progress_bar or self.settings.progress_bar_position ~= nil
end,
@ -1043,8 +1109,7 @@ function ReaderFooter:addToMainMenu(menu_items)
end,
callback = function()
self.settings.item_prefix = "icons"
self:updateFooter()
UIManager:setDirty(nil, "ui")
self:refreshFooter(true)
end,
},
{
@ -1060,8 +1125,7 @@ function ReaderFooter:addToMainMenu(menu_items)
end,
callback = function()
self.settings.item_prefix = "letters"
self:updateFooter()
UIManager:setDirty(nil, "ui")
self:refreshFooter(true)
end,
},
},
@ -1076,8 +1140,7 @@ function ReaderFooter:addToMainMenu(menu_items)
end,
callback = function()
self.settings.items_separator = "bar"
self:updateFooter()
UIManager:setDirty(nil, "ui")
self:refreshFooter(true)
end,
},
{
@ -1087,8 +1150,7 @@ function ReaderFooter:addToMainMenu(menu_items)
end,
callback = function()
self.settings.items_separator = "bullet"
self:updateFooter()
UIManager:setDirty(nil, "ui")
self:refreshFooter(true)
end,
},
{
@ -1098,8 +1160,7 @@ function ReaderFooter:addToMainMenu(menu_items)
end,
callback = function()
self.settings.items_separator = "none"
self:updateFooter()
UIManager:setDirty(nil, "ui")
self:refreshFooter(true)
end,
},
},
@ -1116,8 +1177,7 @@ function ReaderFooter:addToMainMenu(menu_items)
end,
callback = function()
self.settings.progress_pct_format = "0"
self:updateFooter()
UIManager:setDirty(nil, "ui")
self:refreshFooter(true)
end,
},
{
@ -1129,8 +1189,7 @@ function ReaderFooter:addToMainMenu(menu_items)
end,
callback = function()
self.settings.progress_pct_format = "1"
self:updateFooter()
UIManager:setDirty(nil, "ui")
self:refreshFooter(true)
end,
},
{
@ -1142,8 +1201,7 @@ function ReaderFooter:addToMainMenu(menu_items)
end,
callback = function()
self.settings.progress_pct_format = "2"
self:updateFooter()
UIManager:setDirty(nil, "ui")
self:refreshFooter(true)
end,
},
},
@ -1164,8 +1222,7 @@ function ReaderFooter:addToMainMenu(menu_items)
end,
callback = function()
self.settings.time_format = "24"
self:updateFooter()
UIManager:setDirty(nil, "ui")
self:refreshFooter(true)
end,
},
{
@ -1181,8 +1238,7 @@ function ReaderFooter:addToMainMenu(menu_items)
end,
callback = function()
self.settings.time_format = "12"
self:updateFooter()
UIManager:setDirty(nil, "ui")
self:refreshFooter(true)
end,
},
}
@ -1204,8 +1260,7 @@ function ReaderFooter:addToMainMenu(menu_items)
end,
callback = function()
self.settings.duration_format = "modern"
self:updateFooter()
UIManager:setDirty(nil, "ui")
self:refreshFooter(true)
end,
},
{
@ -1222,8 +1277,7 @@ function ReaderFooter:addToMainMenu(menu_items)
end,
callback = function()
self.settings.duration_format = "classic"
self:updateFooter()
UIManager:setDirty(nil, "ui")
self:refreshFooter(true)
end,
},
}
@ -1293,7 +1347,7 @@ function ReaderFooter:addToMainMenu(menu_items)
callback = function()
if self.settings.progress_margin then
self.settings.progress_margin = false
self.settings.progress_margin_width = Screen:scaleBySize(10)
self.settings.progress_margin_width = Size.span.horizontal_default
end
self.settings.progress_bar_position = nil
self:refreshFooter(true, true)
@ -1346,12 +1400,12 @@ function ReaderFooter:addToMainMenu(menu_items)
default_value = PROGRESS_BAR_STYLE_THIN_DEFAULT_HEIGHT
value = self.settings.progress_style_thin_height or default_value
value_min = 1
value_max = 4
value_max = 12
else
default_value = PROGRESS_BAR_STYLE_THICK_DEFAULT_HEIGHT
value = self.settings.progress_style_thick_height or default_value
value_min = 5
value_max = 14
value_max = 28
end
local SpinWidget = require("ui/widget/spinwidget")
local items = SpinWidget:new{
@ -1447,7 +1501,7 @@ function ReaderFooter:addToMainMenu(menu_items)
text_func = function()
local text = _("static margins (10)")
local cur_width = self.settings.progress_margin_width
if cur_width == Screen:scaleBySize(0) then
if cur_width == 0 then
text = _("no margins (0)")
elseif cur_width == Screen:scaleBySize(material_pixels) then
text = T(_("static margins (%1)"), material_pixels)
@ -1465,11 +1519,11 @@ function ReaderFooter:addToMainMenu(menu_items)
{
text = _("No margins (0)"),
checked_func = function()
return self.settings.progress_margin_width == Screen:scaleBySize(0)
return self.settings.progress_margin_width == 0
and not self.settings.progress_margin
end,
callback = function()
self.settings.progress_margin_width = Screen:scaleBySize(0)
self.settings.progress_margin_width = 0
self.settings.progress_margin = false
self:refreshFooter(true)
end,
@ -1746,7 +1800,7 @@ function ReaderFooter:onReaderReady()
self:setupTouchZones()
-- if same as book margins is selected in document with pages (pdf) we enforce static margins
if self.ui.document.info.has_pages and self.settings.progress_margin then
self.settings.progress_margin_width = Screen:scaleBySize(10)
self.settings.progress_margin_width = Size.span.horizontal_default
self:updateFooterContainer()
-- set progress bar margins for current book
elseif self.settings.progress_margin then
@ -1786,24 +1840,35 @@ function ReaderFooter:applyFooterMode(mode)
-- 12 for current chapter
if mode ~= nil then self.mode = mode end
local prev_visible_state = self.view.footer_visible
self.view.footer_visible = (self.mode ~= self.mode_list.off)
-- If all-at-once is enabled, just hide, but the text will keep being processed...
if self.settings.all_at_once then
return
end
-- We're not in all-at-once mode, disable text generation entirely when we're hidden
-- NOTE: _updateFooterText won't actually run the text generator(s) when hidden ;).
-- We're hidden, disable text generation entirely
if not self.view.footer_visible then
self.genFooterText = footerTextGeneratorMap.empty
return
else
if self.settings.all_at_once then
-- If all-at-once is enabled, we only have toggle from empty to All.
self.genFooterText = self.genAllFooterText
else
-- Otherwise, switch to the right text generator for the new mode
local mode_name = self.mode_index[self.mode]
if not self.settings[mode_name] or self.has_no_mode then
-- all modes disabled, only show progress bar
mode_name = "empty"
end
self.genFooterText = footerTextGeneratorMap[mode_name]
end
end
local mode_name = self.mode_index[self.mode]
if not self.settings[mode_name] or self.has_no_mode then
-- all modes disabled, only show progress bar
mode_name = "empty"
-- If we changed visibility state at runtime (as opposed to during init), better make sure the layout has been reset...
if prev_visible_state ~= nil and self.view.footer_visible ~= prev_visible_state then
self:updateFooterContainer()
-- NOTE: _updateFooterText does a resetLayout, but not a forced one!
self:resetLayout(true)
end
self.genFooterText = footerTextGeneratorMap[mode_name]
end
function ReaderFooter:onEnterFlippingMode()