Merge branch 'koreader:master' into annotations-read-save

reviewable/pr11563/r5
hius07 2 months ago committed by GitHub
commit cbd30e456c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1 +1 @@
Subproject commit 64f30427a338f75902c3e099ffbc21759cb701df
Subproject commit 366d9c9ca842748be76eaf948cc8719c9e51e494

@ -142,6 +142,7 @@ function ReaderLink:init()
return {
text = _("Copy"),
callback = function()
Device.input.setClipboardText(link_url)
UIManager:close(this.external_link_dialog)
end,
}

@ -565,7 +565,7 @@ function ReaderPaging:onGotoPercent(percent)
if dest > self.number_of_pages then
dest = self.number_of_pages
end
self:_gotoPage(dest)
self:onGotoPage(dest)
return true
end
@ -575,6 +575,7 @@ function ReaderPaging:onGotoViewRel(diff)
else
self:onGotoPageRel(diff)
end
self.ui:handleEvent(Event:new("PageChangeAnimation", diff > 0))
self:setPagePosition(self:getTopPage(), self:getTopPosition())
return true
end
@ -1127,8 +1128,11 @@ function ReaderPaging:_gotoPage(number, orig_mode)
end
function ReaderPaging:onGotoPage(number, pos)
local same_page = number == self.current_page;
local animation_direction = number > self.current_page;
self:setPagePosition(number, 0)
self:_gotoPage(number)
self.ui:handleEvent(Event:new("PageChangeAnimation", animation_direction))
if pos then
local rect_p = Geom:new{ x = pos.x or 0, y = pos.y or 0 }
local rect_s = Geom:new(rect_p):copy()
@ -1138,7 +1142,7 @@ function ReaderPaging:onGotoPage(number, pos)
else
self.view:PanningUpdate(rect_s.x - self.view.visible_area.x, rect_s.y - self.view.visible_area.y)
end
elseif number == self.current_page then
elseif same_page then
-- gotoPage emits this event only if the page changes
self.ui:handleEvent(Event:new("PageUpdate", self.current_page))
end
@ -1157,14 +1161,14 @@ function ReaderPaging:onGotoRelativePage(number)
end
new_page = test_page
end
self:_gotoPage(new_page)
self:onGotoPage(new_page)
return true
end
function ReaderPaging:onGotoPercentage(percentage)
if percentage < 0 then percentage = 0 end
if percentage > 1 then percentage = 1 end
self:_gotoPage(math.floor(percentage*self.number_of_pages))
self:onGotoPage(math.floor(percentage*self.number_of_pages))
return true
end

@ -219,6 +219,7 @@ end
-- Otherwise we change status from reading/abandoned to complete or from complete to reading.
function ReaderStatus:onMarkBook(mark_read)
self.summary.status = (not mark_read and self.summary.status == "complete") and "reading" or "complete"
self.summary.modified = os.date("%Y-%m-%d", os.time())
-- If History is called over Reader, it will read the file to get the book status, so save and flush
self.settings:saveSetting("summary", self.summary)
self.settings:flush()

@ -104,6 +104,7 @@ end
function ReaderToc:resetToc()
self.toc = nil
self.toc_menu_items_built = false
self.toc_depth = nil
self.ticks = nil
self.ticks_flattened = nil
@ -314,6 +315,37 @@ function ReaderToc:validateAndFixToc()
self.toc_depth = max_depth
end
function ReaderToc:completeTocWithChapterLengths()
local toc = self.toc
local first = 1
local last = #toc
if last == 0 then
return
end
local prev_item_by_level = {}
for i = first, last do
local item = toc[i]
local page = item.page
local depth = item.depth
for j=#prev_item_by_level, depth, -1 do
local prev_item = prev_item_by_level[j]
if prev_item then
prev_item.chapter_length = page - prev_item.page
end
prev_item_by_level[j] = nil
end
prev_item_by_level[depth] = item
end
-- Set the length of the last ones
local page = self.ui.document:getPageCount()
for j=#prev_item_by_level, 0, -1 do
local prev_item = prev_item_by_level[j]
if prev_item then
prev_item.chapter_length = page - prev_item.page
end
end
end
function ReaderToc:getTocIndexByPage(pn_or_xp, skip_ignored_ticks)
self:fillToc()
if #self.toc == 0 then return end
@ -661,11 +693,16 @@ function ReaderToc:onShowToc()
local items_per_page = G_reader_settings:readSetting("toc_items_per_page") or self.toc_items_per_page_default
local items_font_size = G_reader_settings:readSetting("toc_items_font_size") or Menu.getItemFontSize(items_per_page)
local items_show_chapter_length = G_reader_settings:isTrue("toc_items_show_chapter_length")
local items_with_dots = G_reader_settings:nilOrTrue("toc_items_with_dots")
self:fillToc()
-- build menu items
if #self.toc > 0 and not self.toc[1].text then
if #self.toc > 0 and not self.toc_menu_items_built then
self.toc_menu_items_built = true
if items_show_chapter_length then
self:completeTocWithChapterLengths()
end
-- Have the width of 4 spaces be the unit of indentation
local tmp = TextWidget:new{
text = " ",
@ -679,6 +716,11 @@ function ReaderToc:onShowToc()
v.index = k
v.indent = toc_indent * (v.depth-1)
v.text = self:cleanUpTocTitle(v.title, true)
if items_show_chapter_length then
v.post_text = T("(%1)", v.chapter_length)
else
v.post_text = nil
end
v.bidi_wrap_func = BD.auto
v.mandatory = v.page
if has_hidden_flows then
@ -1147,6 +1189,17 @@ Enabling this option will restrict display to the chapter titles of progress bar
UIManager:show(items_font)
end,
}
menu_items.toc_items_show_chapter_length = {
text = _("Show chapter length"),
keep_menu_open = true,
checked_func = function()
return not G_reader_settings:nilOrFalse("toc_items_show_chapter_length")
end,
callback = function()
G_reader_settings:flipNilOrFalse("toc_items_show_chapter_length")
self.toc_menu_items_built = false
end
}
menu_items.toc_items_with_dots = {
text = _("With dots"),
keep_menu_open = true,

@ -84,9 +84,9 @@ local LANGUAGES = {
{ "pt-BR", {}, "HB ", _("Portuguese (BR)"), "Portuguese_BR.pattern" },
{ "rm", {"roh"}, "H ", _("Romansh"), "Romansh.pattern" },
{ "ro", {"ron"}, "H ", _("Romanian"), "Romanian.pattern" },
{ "ru", {"rus"}, "Hb ", _("Russian"), "Russian.pattern" },
{ "ru-GB", {}, "Hb ", _("Russian + English (UK)"), "Russian_EnGB.pattern" },
{ "ru-US", {}, "Hb ", _("Russian + English (US)"), "Russian_EnUS.pattern" },
{ "ru", {"rus"}, "HB ", _("Russian"), "Russian.pattern" },
{ "ru-GB", {}, "HB ", _("Russian + English (UK)"), "Russian_EnGB.pattern" },
{ "ru-US", {}, "HB ", _("Russian + English (US)"), "Russian_EnUS.pattern" },
{ "sr", {"srp"}, "HB ", _("Serbian"), "Serbian.pattern" },
{ "sk", {"slk"}, "HB ", _("Slovak"), "Slovak.pattern" },
{ "sl", {"slv"}, "H ", _("Slovenian"), "Slovenian.pattern" },

@ -616,7 +616,7 @@ function ReaderView:drawHighlightRect(bb, _x, _y, rect, drawer, draw_note_mark)
if drawer == "lighten" then
bb:lightenRect(x, y, w, h, self.highlight.lighten_factor)
elseif drawer == "underscore" then
bb:paintRect(x, y + h - 1, w, Size.line.medium, Blitbuffer.COLOR_GRAY)
bb:paintRect(x, y + h - 1, w, Size.line.thick, Blitbuffer.COLOR_GRAY_4)
elseif drawer == "strikeout" then
local line_y = y + math.floor(h / 2) + 1
if self.ui.paging then
@ -679,7 +679,8 @@ function ReaderView:recalculate()
-- start from right of page_area
self.visible_area.x = self.page_area.x + self.page_area.w - self.visible_area.w
end
if self.document.configurable.zoom_direction >= 2 and self.document.configurable.zoom_direction <= 5 then -- zoom_bottom_to_top
-- Check if we are in zoom_bottom_to_top
if self.document.configurable.zoom_direction and self.document.configurable.zoom_direction >= 2 and self.document.configurable.zoom_direction <= 5 then
-- starts from bottom of page_area
self.visible_area.y = self.page_area.y + self.page_area.h - self.visible_area.h
else

@ -598,7 +598,6 @@ local PocketBook632 = PocketBook:extend{
local PocketBook633 = PocketBook:extend{
model = "PBColor",
display_dpi = 300,
color_saturation = 1.5,
hasColorScreen = yes,
canHWDither = yes, -- Adjust color saturation with inkview
canUseCBB = no, -- 24bpp
@ -672,7 +671,6 @@ local PocketBook740_2 = PocketBook:extend{
local PocketBook741 = PocketBook:extend{
model = "PBInkPadColor",
display_dpi = 300,
color_saturation = 1.5,
hasColorScreen = yes,
canHWDither = yes, -- Adjust color saturation with inkview
canUseCBB = no, -- 24bpp
@ -689,7 +687,6 @@ end
local PocketBook743C = PocketBook:extend{
model = "PBInkPadColor2",
display_dpi = 300,
color_saturation = 1.5,
hasColorScreen = yes,
canHWDither = yes, -- Adjust color saturation with inkview
canUseCBB = no, -- 24bpp
@ -708,7 +705,6 @@ local PocketBook743K3 = PocketBook:extend{
model = "PBInkPadColor3",
display_dpi = 300,
viewport = Geom:new{x=3, y=2, w=1395, h=1864},
color_saturation = 1.5,
hasColorScreen = yes,
canHWDither = yes, -- Adjust color saturation with inkview
canUseCBB = no, -- 24bpp
@ -735,7 +731,6 @@ local PocketBook743G = PocketBook:extend{
local PocketBookColorLux = PocketBook:extend{
model = "PBColorLux",
display_dpi = 125,
color_saturation = 1.5,
hasColorScreen = yes,
canHWDither = yes, -- Adjust color saturation with inkview
canUseCBB = no, -- 24bpp

@ -35,6 +35,7 @@ local order = {
"----------------------------",
"toc_items_per_page",
"toc_items_font_size",
"toc_items_show_chapter_length",
"toc_items_with_dots",
"----------------------------",
"toc_alt_toc",

@ -6,6 +6,7 @@ local Language = {
language_names = {
C = "English",
en = "English",
en_GB = "English (United Kingdom)",
ca = "Catalá",
cs = "Čeština",
da = "Dansk",
@ -118,6 +119,7 @@ function Language:getLangMenuTable()
-- NOTE: language with no translation are commented out for now
sub_item_table = {
self:genLanguageSubItem("C"),
self:genLanguageSubItem("en_GB"),
self:genLanguageSubItem("ca"),
self:genLanguageSubItem("cs"),
self:genLanguageSubItem("de"),
@ -138,7 +140,7 @@ function Language:getLangMenuTable()
--self:genLanguageSubItem("pl_PL"),
self:genLanguageSubItem("pt_PT"),
self:genLanguageSubItem("pt_BR"),
--self:genLanguageSubItem("ro"),
self:genLanguageSubItem("ro"),
self:genLanguageSubItem("ro_MD"),
self:genLanguageSubItem("sk"),
self:genLanguageSubItem("sv"),

@ -172,7 +172,9 @@ local FileChooser = Menu:extend{
local doc_settings = DocSettings:open(item.path)
percent_finished = doc_settings:readSetting("percent_finished")
end
item.percent_finished = percent_finished or 0
-- smooth 2 decimal points (0.00) instead of 16 decimal points
item.percent_finished = util.round_decimal(percent_finished or 0, 2)
end,
mandatory_func = function(item)
return item.opened and string.format("%d %%", 100 * item.percent_finished) or ""
@ -200,14 +202,16 @@ local FileChooser = Menu:extend{
local doc_settings = DocSettings:open(item.path)
percent_finished = doc_settings:readSetting("percent_finished")
end
item.percent_finished = percent_finished or 0
-- smooth 2 decimal points (0.00) instead of 16 decimal points
item.percent_finished = util.round_decimal(percent_finished or 0, 2)
end,
mandatory_func = function(item)
return item.opened and string.format("%d %%", 100 * item.percent_finished) or ""
end,
},
percent_natural = {
-- sort 90% > 50% > 0% > unopened > 100% or finished
-- sort 90% > 50% > 0% or on hold > unopened > 100% or finished
text = _("percent - unopened - finished last"),
menu_order = 90,
can_collate_mixed = false,
@ -215,14 +219,14 @@ local FileChooser = Menu:extend{
local natsort
natsort, cache = sort.natsort_cmp(cache)
local sortfunc = function(a, b)
if a.percent_finished == b.percent_finished then
if a.sort_percent == b.sort_percent then
return natsort(a.text, b.text)
elseif a.percent_finished == 1 then
elseif a.sort_percent == 1 then
return false
elseif b.percent_finished == 1 then
elseif b.sort_percent == 1 then
return true
else
return a.percent_finished > b.percent_finished
return a.sort_percent > b.sort_percent
end
end
@ -230,21 +234,24 @@ local FileChooser = Menu:extend{
end,
item_func = function(item)
local percent_finished
local sort_percent
item.opened = DocSettings:hasSidecarFile(item.path)
if item.opened then
local doc_settings = DocSettings:open(item.path)
local summary = doc_settings:readSetting("summary")
-- books marked as "finished" should be considered the same as 100%
-- books marked as "finished" or "on hold" should be considered the same as 100% and 0% respectively
if summary and summary.status == "complete" then
item.percent_finished = 1.0
return
sort_percent = 1.0
elseif summary and summary.status == "abandoned" then
sort_percent = 0
end
percent_finished = doc_settings:readSetting("percent_finished")
end
-- smooth 2 decimal points (0.00) instead of 16 decimal numbers
item.percent_finished = math.floor((percent_finished or -1) * 100) / 100
-- smooth 2 decimal points (0.00) instead of 16 decimal points
item.sort_percent = sort_percent or util.round_decimal(percent_finished or -1, 2)
item.percent_finished = percent_finished or 0
end,
mandatory_func = function(item)
return item.opened and string.format("%d %%", 100 * item.percent_finished) or ""

@ -184,6 +184,12 @@ function MenuItem:init()
self.face = Font:getFace(self.font, self.font_size)
-- Font for "mandatory" on the right
self.info_face = Font:getFace(self.infont, self.infont_size)
-- Font for post_text if any: for now, this is only used with TOC, showing
-- the chapter length: if feels best to use the face of the main text, but
-- with the size of the mandatory font (which shows some number too).
if self.post_text then
self.post_text_face = Font:getFace(self.font, self.infont_size)
end
-- "mandatory" is the text on the right: file size, page number...
-- Padding before mandatory
@ -219,10 +225,23 @@ function MenuItem:init()
text = self.bidi_wrap_func(text)
end
-- Note: support for post_text is currently implemented only when single_line=true
local post_text_widget
local post_text_left_padding = Size.padding.large
local post_text_right_padding = self.with_dots and 0 or Size.padding.large
local dots_widget
local dots_left_padding = Size.padding.small
local dots_right_padding = Size.padding.small
if self.single_line then -- items only in single line
if self.post_text then
post_text_widget = TextWidget:new{
text = self.post_text,
face = self.post_text_face,
bold = self.bold,
fgcolor = self.dim and Blitbuffer.COLOR_DARK_GRAY or nil,
}
available_width = available_width - post_text_widget:getWidth() - post_text_left_padding - post_text_right_padding
end
-- No font size change: text will be truncated if it overflows
item_name = TextWidget:new{
text = text,
@ -271,6 +290,9 @@ function MenuItem:init()
if dots_widget then
dots_widget.forced_height = self.dimen.h
end
if post_text_widget then
post_text_widget.forced_height = self.dimen.h
end
-- And adjust their baselines for proper centering and alignment
-- (We made sure the font sizes wouldn't exceed self.dimen.h, so we
-- get only non-negative pad_top here, and we're moving them down.)
@ -289,6 +311,9 @@ function MenuItem:init()
if dots_widget then
dots_widget.forced_baseline = mdtr_baseline
end
if post_text_widget then
post_text_widget.forced_baseline = mdtr_baseline
end
end
elseif self.multilines_show_more_text then
@ -374,6 +399,8 @@ function MenuItem:init()
width = state_width,
},
item_name,
post_text_widget and HorizontalSpan:new{ width = post_text_left_padding },
post_text_widget,
}
}
@ -1083,6 +1110,7 @@ function Menu:updateItems(select_number)
state_w = self.state_w or 0,
text = Menu.getMenuText(self.item_table[i]),
bidi_wrap_func = self.item_table[i].bidi_wrap_func,
post_text = self.item_table[i].post_text,
mandatory = self.item_table[i].mandatory,
mandatory_func = self.item_table[i].mandatory_func,
mandatory_dim = self.item_table[i].mandatory_dim or self.item_table[i].dim,

@ -1537,4 +1537,12 @@ function util.wrapMethod(target_table, target_field_name, new_func, before_callb
return wrapped
end
-- Round a given "num" to the decimal points of "points"
-- (i.e. `round_decimal(0.000000001, 2)` will yield `0.00`)
function util.round_decimal(num, points)
local op = 10 ^ points
return math.floor(num * op) / op
end
return util

@ -232,7 +232,9 @@ function CoverMenu:updateItems(select_number)
-- we replace it by ours.
-- (FileManager may replace file_chooser.showFileDialog after we've been called once, so we need
-- to replace it again if it is not ours)
if self.showFileDialog and self.showFileDialog ~= self.showFileDialog_ours then
if self.path -- FileManager only
and (not self.showFileDialog_ours -- never replaced
or self.showFileDialog ~= self.showFileDialog_ours) then -- it is no more ours
-- We need to do it at nextTick, once FileManager has instantiated
-- its FileChooser completely
UIManager:nextTick(function()

Loading…
Cancel
Save