mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
KeyValuePage: configurable items per page
Tweak building to start from items per page instead of a fixed item height. Guess the best font size that fit. Update separator specification from using a "----" to the now generic separator=true (this allows not wasting a slot for each separator in the page and not have only 12 items and 2 small lines in a 14 items page).
This commit is contained in:
@@ -64,8 +64,7 @@ function BookInfo:show(file, book_props)
|
||||
table.insert(kv_pairs, { _("Format:"), filetype:upper() })
|
||||
table.insert(kv_pairs, { _("Size:"), size })
|
||||
table.insert(kv_pairs, { _("File date:"), os.date("%Y-%m-%d %H:%M:%S", file_modification) })
|
||||
table.insert(kv_pairs, { _("Directory:"), BD.dirpath(filemanagerutil.abbreviate(directory)) })
|
||||
table.insert(kv_pairs, "----")
|
||||
table.insert(kv_pairs, { _("Directory:"), BD.dirpath(filemanagerutil.abbreviate(directory)), separator = true })
|
||||
|
||||
-- book_props may be provided if caller already has them available
|
||||
-- but it may lack 'pages', that we may get from sidecar file
|
||||
|
||||
@@ -165,8 +165,8 @@ function FileManagerMenu:setUpdateItemTable()
|
||||
- Calibre and OPDS browsers/search results]]),
|
||||
keep_menu_open = true,
|
||||
callback = function()
|
||||
local Menu = require("ui/widget/menu")
|
||||
local SpinWidget = require("ui/widget/spinwidget")
|
||||
local Menu = require("ui/widget/menu")
|
||||
local default_perpage = Menu.items_per_page_default
|
||||
local curr_perpage = G_reader_settings:readSetting("items_per_page") or default_perpage
|
||||
local items = SpinWidget:new{
|
||||
@@ -189,8 +189,8 @@ function FileManagerMenu:setUpdateItemTable()
|
||||
text = _("Item font size"),
|
||||
keep_menu_open = true,
|
||||
callback = function()
|
||||
local Menu = require("ui/widget/menu")
|
||||
local SpinWidget = require("ui/widget/spinwidget")
|
||||
local Menu = require("ui/widget/menu")
|
||||
local curr_perpage = G_reader_settings:readSetting("items_per_page") or Menu.items_per_page_default
|
||||
local default_font_size = Menu.getItemFontSize(curr_perpage)
|
||||
local curr_font_size = G_reader_settings:readSetting("items_font_size") or default_font_size
|
||||
@@ -206,7 +206,7 @@ function FileManagerMenu:setUpdateItemTable()
|
||||
if spin.value == default_font_size then
|
||||
-- We can't know if the user has set a size or hit "Use default", but
|
||||
-- assume that if it is the default font size, he will prefer to have
|
||||
-- our default font size if he later update per-page
|
||||
-- our default font size if he later updates per-page
|
||||
G_reader_settings:delSetting("items_font_size")
|
||||
else
|
||||
G_reader_settings:saveSetting("items_font_size", spin.value)
|
||||
@@ -291,6 +291,41 @@ function FileManagerMenu:setUpdateItemTable()
|
||||
text = _("Auto-remove deleted or purged items from history"),
|
||||
checked_func = function() return G_reader_settings:readSetting("autoremove_deleted_items_from_history") end,
|
||||
callback = function() G_reader_settings:flipNilOrFalse("autoremove_deleted_items_from_history") end,
|
||||
separator = true,
|
||||
},
|
||||
{
|
||||
text = _("Info lists items per page"),
|
||||
help_text = _([[This sets the number of items per page in:
|
||||
- Book information
|
||||
- Dictionary and Wikipedia lookup history
|
||||
- Reading statistics details
|
||||
- A few other plugins]]),
|
||||
keep_menu_open = true,
|
||||
callback = function()
|
||||
local SpinWidget = require("ui/widget/spinwidget")
|
||||
local KeyValuePage = require("ui/widget/keyvaluepage")
|
||||
local default_perpage = KeyValuePage:getDefaultKeyValuesPerPage()
|
||||
local curr_perpage = G_reader_settings:readSetting("keyvalues_per_page") or default_perpage
|
||||
local items = SpinWidget:new{
|
||||
width = math.floor(Screen:getWidth() * 0.6),
|
||||
value = curr_perpage,
|
||||
value_min = 10,
|
||||
value_max = 24,
|
||||
default_value = default_perpage,
|
||||
title_text = _("Info lists items per page"),
|
||||
callback = function(spin)
|
||||
if spin.value == default_perpage then
|
||||
-- We can't know if the user has set a value or hit "Use default", but
|
||||
-- assume that if it is the default, he will prefer to stay with our
|
||||
-- default if he later changes screen DPI
|
||||
G_reader_settings:delSetting("keyvalues_per_page")
|
||||
else
|
||||
G_reader_settings:saveSetting("keyvalues_per_page", spin.value)
|
||||
end
|
||||
end
|
||||
}
|
||||
UIManager:show(items)
|
||||
end,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -498,7 +533,7 @@ function FileManagerMenu:setUpdateItemTable()
|
||||
end,
|
||||
})
|
||||
table.insert(self.menu_items.developer_options.sub_item_table, {
|
||||
text = "UI layout mirroring and text direction",
|
||||
text = _("UI layout mirroring and text direction"),
|
||||
sub_item_table = {
|
||||
{
|
||||
text = _("Reverse UI layout mirroring"),
|
||||
|
||||
@@ -241,6 +241,7 @@ function ReaderDictionary:addToMainMenu(menu_items)
|
||||
end
|
||||
UIManager:show(KeyValuePage:new{
|
||||
title = _("Dictionary lookup history"),
|
||||
value_overflow_align = "right",
|
||||
kv_pairs = kv_pairs,
|
||||
})
|
||||
end,
|
||||
@@ -944,8 +945,7 @@ function ReaderDictionary:showDownload(downloadable_dicts)
|
||||
end
|
||||
table.insert(kv_pairs, {lang, ""})
|
||||
table.insert(kv_pairs, {" ".._("License"), dict.license})
|
||||
table.insert(kv_pairs, {" ".._("Entries"), dict.entries})
|
||||
table.insert(kv_pairs, "----------------------------")
|
||||
table.insert(kv_pairs, {" ".._("Entries"), dict.entries, separator = true})
|
||||
end
|
||||
self.download_window = KeyValuePage:new{
|
||||
title = _("Tap dictionary name to download"),
|
||||
|
||||
@@ -807,7 +807,7 @@ function ReaderTypography:onPreRenderDocument(config)
|
||||
-- Add a menu item to language sub-menu, whether the lang is known or not, so the
|
||||
-- user can see it and switch from and back to it easily
|
||||
table.insert(self.language_submenu, 1, {
|
||||
text = T(_("Book language: %1"), self.book_lang_tag or _("n/a")),
|
||||
text = T(_("Book language: %1"), self.book_lang_tag or _("N/A")),
|
||||
callback = function()
|
||||
UIManager:show(InfoMessage:new{
|
||||
text = T(_("Changed language for typography rules to book language: %1."), BD.wrap(self.book_lang_tag)),
|
||||
|
||||
@@ -106,6 +106,7 @@ function ReaderWikipedia:addToMainMenu(menu_items)
|
||||
end
|
||||
UIManager:show(KeyValuePage:new{
|
||||
title = _("Wikipedia history"),
|
||||
value_overflow_align = "right",
|
||||
kv_pairs = kv_pairs,
|
||||
})
|
||||
end,
|
||||
|
||||
@@ -117,8 +117,9 @@ local KeyValueItem = InputContainer:new{
|
||||
key = nil,
|
||||
value = nil,
|
||||
value_lang = nil,
|
||||
cface = Font:getFace("smallinfofont"),
|
||||
tface = Font:getFace("smallinfofontbold"),
|
||||
font_size = 20, -- will be adjusted depending on keyvalues_per_page
|
||||
key_font_name = "smallinfofontbold",
|
||||
value_font_name = "smallinfofont",
|
||||
width = nil,
|
||||
height = nil,
|
||||
textviewer_width = nil,
|
||||
@@ -151,12 +152,12 @@ function KeyValueItem:init()
|
||||
local key_widget = TextWidget:new{
|
||||
text = self.key,
|
||||
max_width = available_width,
|
||||
face = self.tface,
|
||||
face = Font:getFace(self.key_font_name, self.font_size),
|
||||
}
|
||||
local value_widget = TextWidget:new{
|
||||
text = tvalue,
|
||||
max_width = available_width,
|
||||
face = self.cface,
|
||||
face = Font:getFace(self.value_font_name, self.font_size),
|
||||
lang = self.value_lang,
|
||||
}
|
||||
local key_w_rendered = key_widget:getWidth()
|
||||
@@ -251,6 +252,8 @@ function KeyValueItem:init()
|
||||
|
||||
self[1] = FrameContainer:new{
|
||||
padding = frame_padding,
|
||||
padding_top = 0,
|
||||
padding_bottom = 0,
|
||||
bordersize = 0,
|
||||
background = Blitbuffer.COLOR_WHITE,
|
||||
HorizontalGroup:new{
|
||||
@@ -456,20 +459,32 @@ function KeyValuePage:init()
|
||||
|
||||
local padding = Size.padding.large
|
||||
self.item_width = self.dimen.w - 2 * padding
|
||||
self.item_height = Size.item.height_default
|
||||
-- setup title bar
|
||||
self.title_bar = KeyValueTitle:new{
|
||||
title = self.title,
|
||||
width = self.item_width,
|
||||
height = self.item_height,
|
||||
height = Size.item.height_default,
|
||||
use_top_page_count = self.use_top_page_count,
|
||||
kv_page = self,
|
||||
}
|
||||
-- setup main content
|
||||
self.item_margin = math.floor(self.item_height / 4)
|
||||
local line_height = self.item_height + 2 * self.item_margin
|
||||
local content_height = self.dimen.h - self.title_bar:getSize().h - self.page_info:getSize().h
|
||||
self.items_per_page = math.floor(content_height / line_height)
|
||||
local available_height = self.dimen.h
|
||||
- self.title_bar:getSize().h
|
||||
- self.page_info:getSize().h
|
||||
- 2*Size.line.thick
|
||||
-- account for possibly 2 separator lines added
|
||||
|
||||
self.items_per_page = G_reader_settings:readSetting("keyvalues_per_page") or self:getDefaultKeyValuesPerPage()
|
||||
self.item_height = math.floor(available_height / self.items_per_page)
|
||||
-- Put half of the pixels lost by floor'ing between title and content
|
||||
local span_height = math.floor((available_height - (self.items_per_page * (self.item_height ))) / 2)
|
||||
|
||||
-- Font size is not configurable: we can get a good one from the following
|
||||
local TextBoxWidget = require("ui/widget/textboxwidget")
|
||||
local line_extra_height = 1.0 -- ~ 2em -- unscaled_size_check: ignore
|
||||
-- (gives a font size similar to the fixed one from former implementation at 14 items per page)
|
||||
self.items_font_size = TextBoxWidget:getFontSizeToFitHeight(self.item_height, 1, line_extra_height)
|
||||
|
||||
self.pages = math.ceil(#self.kv_pairs / self.items_per_page)
|
||||
self.main_content = VerticalGroup:new{}
|
||||
|
||||
@@ -485,6 +500,7 @@ function KeyValuePage:init()
|
||||
VerticalGroup:new{
|
||||
align = "left",
|
||||
self.title_bar,
|
||||
VerticalSpan:new{ width = span_height },
|
||||
self.main_content,
|
||||
},
|
||||
footer,
|
||||
@@ -499,6 +515,15 @@ function KeyValuePage:init()
|
||||
}
|
||||
end
|
||||
|
||||
function KeyValuePage:getDefaultKeyValuesPerPage()
|
||||
-- Get a default according to Screen DPI (roughly following
|
||||
-- the former implementation building logic)
|
||||
local default_item_height = Size.item.height_default * 1.5 -- we were adding 1/2 as margin
|
||||
local nb_items = math.floor(Screen:getHeight() / default_item_height)
|
||||
nb_items = nb_items - 3 -- account for title and footer heights
|
||||
return nb_items
|
||||
end
|
||||
|
||||
function KeyValuePage:nextPage()
|
||||
local new_page = math.min(self.show_page+1, self.pages)
|
||||
if new_page > self.show_page then
|
||||
@@ -529,31 +554,37 @@ function KeyValuePage:_populateItems()
|
||||
local entry = self.kv_pairs[idx_offset + idx]
|
||||
if entry == nil then break end
|
||||
|
||||
table.insert(self.main_content,
|
||||
VerticalSpan:new{ width = self.item_margin })
|
||||
if type(entry) == "table" then
|
||||
table.insert(
|
||||
self.main_content,
|
||||
KeyValueItem:new{
|
||||
height = self.item_height,
|
||||
width = self.item_width,
|
||||
key = entry[1],
|
||||
value = entry[2],
|
||||
value_lang = self.values_lang,
|
||||
callback = entry.callback,
|
||||
callback_back = entry.callback_back,
|
||||
textviewer_width = self.textviewer_width,
|
||||
textviewer_height = self.textviewer_height,
|
||||
value_overflow_align = self.value_overflow_align,
|
||||
value_align = self.value_align,
|
||||
show_parent = self,
|
||||
}
|
||||
)
|
||||
table.insert(self.main_content, KeyValueItem:new{
|
||||
height = self.item_height,
|
||||
width = self.item_width,
|
||||
font_size = self.items_font_size,
|
||||
key = entry[1],
|
||||
value = entry[2],
|
||||
value_lang = self.values_lang,
|
||||
callback = entry.callback,
|
||||
callback_back = entry.callback_back,
|
||||
textviewer_width = self.textviewer_width,
|
||||
textviewer_height = self.textviewer_height,
|
||||
value_overflow_align = self.value_overflow_align,
|
||||
value_align = self.value_align,
|
||||
show_parent = self,
|
||||
})
|
||||
if entry.separator then
|
||||
table.insert(self.main_content, LineWidget:new{
|
||||
background = Blitbuffer.COLOR_LIGHT_GRAY,
|
||||
dimen = Geom:new{
|
||||
w = self.item_width,
|
||||
h = Size.line.thick
|
||||
},
|
||||
style = "solid",
|
||||
})
|
||||
end
|
||||
elseif type(entry) == "string" then
|
||||
-- deprecated, use separator=true on a regular k/v table
|
||||
-- (kept in case some user plugins would use this)
|
||||
local c = string.sub(entry, 1, 1)
|
||||
if c == "-" then
|
||||
table.insert(self.main_content,
|
||||
VerticalSpan:new{ width = self.item_margin })
|
||||
table.insert(self.main_content, LineWidget:new{
|
||||
background = Blitbuffer.COLOR_LIGHT_GRAY,
|
||||
dimen = Geom:new{
|
||||
@@ -564,8 +595,6 @@ function KeyValuePage:_populateItems()
|
||||
})
|
||||
end
|
||||
end
|
||||
table.insert(self.main_content,
|
||||
VerticalSpan:new{ width = self.item_margin })
|
||||
end
|
||||
self.page_info_text:setText(T(_("Page %1 of %2"), self.show_page, self.pages))
|
||||
self.page_info_left_chev:showHide(self.pages > 1)
|
||||
|
||||
@@ -63,19 +63,19 @@ function Usage:percentagePerHour()
|
||||
end
|
||||
|
||||
function Usage:remainingHours()
|
||||
if self:percentagePerHour() == 0 then return "n/a" end
|
||||
if self:percentagePerHour() == 0 then return "N/A" end
|
||||
local curr = State:new()
|
||||
return curr.percentage / self:percentagePerHour()
|
||||
end
|
||||
|
||||
function Usage:chargingHours()
|
||||
if self:percentagePerHour() == 0 then return "n/a" end
|
||||
if self:percentagePerHour() == 0 then return "N/A" end
|
||||
local curr = State:new()
|
||||
return math.abs(curr.percentage - 100) / self:percentagePerHour()
|
||||
end
|
||||
|
||||
local function shorten(number)
|
||||
if number == "n/a" then return _("n/a") end
|
||||
if number == "N/A" then return _("N/A") end
|
||||
return string.format("%.2f", number);
|
||||
end
|
||||
|
||||
@@ -199,7 +199,7 @@ function BatteryStat:showStatistics()
|
||||
|
||||
self:accumulate()
|
||||
local kv_pairs = self:dump()
|
||||
table.insert(kv_pairs, "----------")
|
||||
kv_pairs[#kv_pairs].separator = true
|
||||
table.insert(kv_pairs, {_("If you would like to reset the data,"), "",
|
||||
callback = function()
|
||||
UIManager:setDirty(self.kv_page, "fast")
|
||||
|
||||
@@ -1099,8 +1099,8 @@ function ReaderStatistics:statMenu()
|
||||
}
|
||||
UIManager:show(self.kv)
|
||||
end,
|
||||
separator = true,
|
||||
},
|
||||
"----",
|
||||
{ _("Last week"),"",
|
||||
callback = function()
|
||||
local kv = self.kv
|
||||
@@ -1303,8 +1303,7 @@ function ReaderStatistics:getCurrentStat(id_book)
|
||||
{ _("Pages read this session"), tonumber(current_pages) },
|
||||
-- today
|
||||
{ _("Time spent reading today"), util.secondsToClock(today_duration, false) },
|
||||
{ _("Pages read today"), tonumber(today_pages) },
|
||||
"----",
|
||||
{ _("Pages read today"), tonumber(today_pages), separator = true },
|
||||
-- Current book statistics
|
||||
-- Includes re-reads
|
||||
{ _("Total time spent on this book"), util.secondsToClock(total_time_book, false) },
|
||||
@@ -1324,7 +1323,7 @@ function ReaderStatistics:getCurrentStat(id_book)
|
||||
{ _("Estimated reading finished"),
|
||||
T(N_("%1 (1 day)", "%1 (%2 days)", estimate_days_to_read), estimate_end_of_read_date, estimate_days_to_read) },
|
||||
|
||||
{ _("Highlights"), tonumber(highlights) },
|
||||
{ _("Highlights"), tonumber(highlights), separator = true },
|
||||
-- { _("Total notes"), tonumber(notes) }, -- not accurate, don't show it
|
||||
}
|
||||
end
|
||||
@@ -1404,9 +1403,8 @@ function ReaderStatistics:getBookStat(id_book)
|
||||
-- These 2 ones are about page actually read (not the current page and % into book)
|
||||
{ _("Read pages/Total pages"), total_read_pages .. "/" .. pages },
|
||||
{ _("Percentage read"), Math.round(total_read_pages / pages * 100) .. "%" },
|
||||
{ _("Highlights"), highlights },
|
||||
{ _("Highlights"), highlights, separator = true },
|
||||
-- { _("Total notes"), notes }, -- not accurate, don't show it
|
||||
"----",
|
||||
{ _("Show days"), _("Tap to display"),
|
||||
callback = function()
|
||||
local kv = self.kv
|
||||
|
||||
@@ -31,6 +31,10 @@ function SystemStat:put(p)
|
||||
table.insert(self.kv_pairs, p)
|
||||
end
|
||||
|
||||
function SystemStat:putSeparator()
|
||||
self.kv_pairs[#self.kv_pairs].separator = true
|
||||
end
|
||||
|
||||
function SystemStat:appendCounters()
|
||||
self:put({_("KOReader started at"), os.date("%c", self.start_sec)})
|
||||
if self.suspend_sec then
|
||||
@@ -232,8 +236,11 @@ end
|
||||
function SystemStat:showStatistics()
|
||||
self.kv_pairs = {}
|
||||
self:appendCounters()
|
||||
self:putSeparator()
|
||||
self:appendProcessInfo()
|
||||
self:putSeparator()
|
||||
self:appendStorageInfo()
|
||||
self:putSeparator()
|
||||
self:appendSystemInfo()
|
||||
UIManager:show(KeyValuePage:new{
|
||||
title = _("System statistics"),
|
||||
|
||||
Reference in New Issue
Block a user