diff --git a/frontend/apps/filemanager/filemanager.lua b/frontend/apps/filemanager/filemanager.lua index 5bd55238f..41f6e9dc6 100644 --- a/frontend/apps/filemanager/filemanager.lua +++ b/frontend/apps/filemanager/filemanager.lua @@ -185,7 +185,6 @@ function FileManager:setupLayout() is_popout = false, is_borderless = true, has_close_button = true, - perpage = G_reader_settings:readSetting("items_per_page"), show_unsupported = show_unsupported, file_filter = function(filename) if DocumentRegistry:hasProvider(filename) then diff --git a/frontend/apps/filemanager/filemanagerfilesearcher.lua b/frontend/apps/filemanager/filemanagerfilesearcher.lua index af4628dd4..f00a1d01a 100644 --- a/frontend/apps/filemanager/filemanagerfilesearcher.lua +++ b/frontend/apps/filemanager/filemanagerfilesearcher.lua @@ -170,7 +170,6 @@ function FileSearcher:showSearchResults() show_parent = menu_container, onMenuHold = self.onMenuHold, cface = Font:getFace("smallinfofont"), - perpage = G_reader_settings:readSetting("items_per_page") or 14, _manager = self, } table.insert(menu_container, self.search_menu) diff --git a/frontend/apps/filemanager/filemanagermenu.lua b/frontend/apps/filemanager/filemanagermenu.lua index 2f45d5774..e256c410e 100644 --- a/frontend/apps/filemanager/filemanagermenu.lua +++ b/frontend/apps/filemanager/filemanagermenu.lua @@ -158,19 +158,22 @@ function FileManagerMenu:setUpdateItemTable() { text = _("Items per page"), help_text = _([[This sets the number of items per page in: -- File browser and history in 'classic' display mode +- File browser, history and favorites in 'classic' display mode +- Search results and folder shortcuts - File and directory selection -- Table of contents -- Bookmarks list]]), +- 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 curr_items = G_reader_settings:readSetting("items_per_page") or 14 + 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{ width = math.floor(Screen:getWidth() * 0.6), - value = curr_items, + value = curr_perpage, value_min = 6, value_max = 24, + default_value = default_perpage, title_text = _("Items per page"), keep_shown_on_apply = true, callback = function(spin) @@ -185,9 +188,10 @@ function FileManagerMenu:setUpdateItemTable() text = _("Font size"), keep_menu_open = true, callback = function() + local Menu = require("ui/widget/menu") local SpinWidget = require("ui/widget/spinwidget") - local curr_items = G_reader_settings:readSetting("items_per_page") or 14 - local default_font_size = math.floor(24 - ((curr_items - 6)/ 18) * 10 ) + 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 local items_font = SpinWidget:new{ width = math.floor(Screen:getWidth() * 0.6), @@ -198,7 +202,14 @@ function FileManagerMenu:setUpdateItemTable() keep_shown_on_apply = true, title_text = _("Maximum font size for item"), callback = function(spin) - G_reader_settings:saveSetting("items_font_size", spin.value) + 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 + G_reader_settings:delSetting("items_font_size") + else + G_reader_settings:saveSetting("items_font_size", spin.value) + end self.ui:onRefresh() end } @@ -213,6 +224,7 @@ function FileManagerMenu:setUpdateItemTable() end, callback = function() G_reader_settings:flipNilOrFalse("items_multilines_show_more_text") + self.ui:onRefresh() end } } diff --git a/frontend/apps/filemanager/filemanagersetdefaults.lua b/frontend/apps/filemanager/filemanagersetdefaults.lua index 6a451e33d..9573374fe 100644 --- a/frontend/apps/filemanager/filemanagersetdefaults.lua +++ b/frontend/apps/filemanager/filemanagersetdefaults.lua @@ -92,7 +92,6 @@ function SetDefaults:init() width = Screen:getWidth()-15, height = Screen:getHeight()-15, cface = Font:getFace("smallinfofont"), - perpage = G_reader_settings:readSetting("items_per_page") or 14, show_parent = menu_container, _manager = self, } diff --git a/frontend/apps/reader/modules/readerbookmark.lua b/frontend/apps/reader/modules/readerbookmark.lua index 26e6700cd..82b666e04 100644 --- a/frontend/apps/reader/modules/readerbookmark.lua +++ b/frontend/apps/reader/modules/readerbookmark.lua @@ -19,6 +19,7 @@ local T = require("ffi/util").template local ReaderBookmark = InputContainer:new{ bm_menu_title = _("Bookmarks"), bbm_menu_title = _("Bookmark browsing mode"), + bookmarks_items_per_page_default = 14, bookmarks = nil, } @@ -30,6 +31,21 @@ function ReaderBookmark:init() doc = "show bookmarks" }, } end + + if not G_reader_settings:readSetting("bookmarks_items_per_page") then + -- The Bookmarks items per page and items' font size can now be + -- configured. Previously, the ones set for the file browser + -- were used. Initialize them from these ones. + local items_per_page = G_reader_settings:readSetting("items_per_page") + or self.bookmarks_items_per_page_default + G_reader_settings:saveSetting("bookmarks_items_per_page", items_per_page) + local items_font_size = G_reader_settings:readSetting("items_font_size") + if items_font_size and items_font_size ~= Menu.getItemFontSize(items_per_page) then + -- Keep the user items font size if it's not the default for items_per_page + G_reader_settings:saveSetting("bookmarks_items_font_size", items_font_size) + end + end + self.ui.menu:registerToMainMenu(self) end @@ -59,6 +75,58 @@ function ReaderBookmark:addToMainMenu(menu_items) end, } end + menu_items.bookmarks_items_per_page = { + text = _("Bookmarks per page"), + keep_menu_open = true, + callback = function() + local SpinWidget = require("ui/widget/spinwidget") + local curr_perpage = G_reader_settings:readSetting("bookmarks_items_per_page") or self.bookmarks_items_per_page_default + local items = SpinWidget:new{ + width = math.floor(Screen:getWidth() * 0.6), + value = curr_perpage, + value_min = 6, + value_max = 24, + default_value = self.bookmarks_items_per_page_default, + title_text = _("Bookmarks per page"), + callback = function(spin) + G_reader_settings:saveSetting("bookmarks_items_per_page", spin.value) + end + } + UIManager:show(items) + end + } + menu_items.bookmarks_items_font_size = { + text = _("Bookmark font size"), + keep_menu_open = true, + callback = function() + local SpinWidget = require("ui/widget/spinwidget") + local curr_perpage = G_reader_settings:readSetting("bookmarks_items_per_page") or self.bookmarks_items_per_page_default + local default_font_size = Menu.getItemFontSize(curr_perpage) + local curr_font_size = G_reader_settings:readSetting("bookmarks_items_font_size") or default_font_size + local items_font = SpinWidget:new{ + width = math.floor(Screen:getWidth() * 0.6), + value = curr_font_size, + value_min = 10, + value_max = 72, + default_value = default_font_size, + title_text = _("Bookmark font size"), + callback = function(spin) + G_reader_settings:saveSetting("bookmarks_items_font_size", spin.value) + end + } + UIManager:show(items_font) + end, + } + menu_items.bookmarks_items_show_more_text = { + text = _("Shrink bookmark font size to fit more text"), + keep_menu_open = true, + checked_func = function() + return G_reader_settings:isTrue("bookmarks_items_multilines_show_more_text") + end, + callback = function() + G_reader_settings:flipNilOrFalse("bookmarks_items_multilines_show_more_text") + end + } end function ReaderBookmark:enableBookmarkBrowsingMode() @@ -271,6 +339,10 @@ function ReaderBookmark:onShowBookmark() end end + local items_per_page = G_reader_settings:readSetting("bookmarks_items_per_page") or self.bookmarks_items_per_page_default + local items_font_size = G_reader_settings:readSetting("bookmarks_items_font_size") or Menu.getItemFontSize(items_per_page) + local multilines_show_more_text = G_reader_settings:isTrue("bookmarks_items_multilines_show_more_text") + local bm_menu = Menu:new{ title = _("Bookmarks"), item_table = self.bookmarks, @@ -279,7 +351,9 @@ function ReaderBookmark:onShowBookmark() width = Screen:getWidth(), height = Screen:getHeight(), cface = Font:getFace("x_smallinfofont"), - perpage = G_reader_settings:readSetting("items_per_page") or 14, + items_per_page = items_per_page, + items_font_size = items_font_size, + multilines_show_more_text = multilines_show_more_text, line_color = require("ffi/blitbuffer").COLOR_WHITE, on_close_ges = { GestureRange:new{ diff --git a/frontend/apps/reader/modules/readerfont.lua b/frontend/apps/reader/modules/readerfont.lua index 8ff5f6c38..4a859f150 100644 --- a/frontend/apps/reader/modules/readerfont.lua +++ b/frontend/apps/reader/modules/readerfont.lua @@ -169,12 +169,13 @@ function ReaderFont:onShowFontMenu() width = Screen:getWidth() - 100, height = math.floor(Screen:getHeight() * 0.5), single_line = true, - perpage_custom = 8, + items_per_page = 8, + items_font_size = Menu.getItemFontSize(8), } -- build container local menu_container = CenterContainer:new{ - main_menu, dimen = Screen:getSize(), + main_menu, } main_menu.close_callback = function () UIManager:close(menu_container) diff --git a/frontend/apps/reader/modules/readerpagemap.lua b/frontend/apps/reader/modules/readerpagemap.lua index 9257dca9d..dd68056d5 100644 --- a/frontend/apps/reader/modules/readerpagemap.lua +++ b/frontend/apps/reader/modules/readerpagemap.lua @@ -207,6 +207,10 @@ function ReaderPageMap:onShowPageList() page_list.current = cur_page_idx end + -- We use the per-page and font-size settings set for the ToC + local items_per_page = G_reader_settings:readSetting("toc_items_per_page") or 14 + local items_font_size = G_reader_settings:readSetting("toc_items_font_size") or Menu.getItemFontSize(items_per_page) + local pl_menu = Menu:new{ title = _("Reference page numbers list"), item_table = page_list, @@ -215,7 +219,8 @@ function ReaderPageMap:onShowPageList() width = Screen:getWidth(), height = Screen:getHeight(), cface = Font:getFace("x_smallinfofont"), - perpage = G_reader_settings:readSetting("items_per_page") or 14, + items_per_page = items_per_page, + items_font_size = items_font_size, line_color = require("ffi/blitbuffer").COLOR_WHITE, single_line = true, on_close_ges = { diff --git a/frontend/apps/reader/modules/readerrolling.lua b/frontend/apps/reader/modules/readerrolling.lua index b5ba67a3f..41ae6ae33 100644 --- a/frontend/apps/reader/modules/readerrolling.lua +++ b/frontend/apps/reader/modules/readerrolling.lua @@ -859,7 +859,7 @@ function ReaderRolling:updatePos() self:_gotoXPointer(self.xpointer) self.ui:handleEvent(Event:new("UpdateToc")) end - self:updateTopStatusBarMarkers() + self:onUpdateTopStatusBarMarkers() UIManager:setDirty(self.view.dialog, "partial") -- Allow for the new rendering to be shown before possibly showing -- the "Styles have changed..." ConfirmBox so the user can decide @@ -1042,7 +1042,7 @@ function ReaderRolling:onSetStatusLine(status_line) self.ui:handleEvent(Event:new("UpdatePos")) end -function ReaderRolling:updateTopStatusBarMarkers() +function ReaderRolling:onUpdateTopStatusBarMarkers() if not self.cre_top_bar_enabled then return end diff --git a/frontend/apps/reader/modules/readertoc.lua b/frontend/apps/reader/modules/readertoc.lua index eea8888c7..b403d71f8 100644 --- a/frontend/apps/reader/modules/readertoc.lua +++ b/frontend/apps/reader/modules/readertoc.lua @@ -28,6 +28,7 @@ local ReaderToc = InputContainer:new{ expanded_nodes = {}, toc_menu_title = _("Table of contents"), alt_toc_menu_title = _("Table of contents *"), + toc_items_per_page_default = 14, } function ReaderToc:init() @@ -38,10 +39,33 @@ function ReaderToc:init() doc = "show Table of Content menu" }, } end + + if not G_reader_settings:readSetting("toc_items_per_page") then + -- The TOC items per page and items' font size can now be + -- configured. Previously, the ones set for the file browser + -- were used. Initialize them from these ones. + local items_per_page = G_reader_settings:readSetting("items_per_page") + or self.toc_items_per_page_default + G_reader_settings:saveSetting("toc_items_per_page", items_per_page) + local items_font_size = G_reader_settings:readSetting("items_font_size") + if items_font_size and items_font_size ~= Menu.getItemFontSize(items_per_page) then + -- Keep the user items font size if it's not the default for items_per_page + G_reader_settings:saveSetting("toc_items_font_size", items_font_size) + end + end + self:resetToc() self.ui.menu:registerToMainMenu(self) end +function ReaderToc:onReadSettings(config) + self.toc_ticks_ignored_levels = config:readSetting("toc_ticks_ignored_levels") or {} +end + +function ReaderToc:onSaveSettings() + self.ui.doc_settings:saveSetting("toc_ticks_ignored_levels", self.toc_ticks_ignored_levels) +end + function ReaderToc:cleanUpTocTitle(title, replace_empty) title = title:gsub("\13", "") if replace_empty and title:match("^%s*$") then @@ -380,11 +404,13 @@ function ReaderToc:getTocTicksFlattened() -- Keep track of what we add to avoid duplicates (c.f., https://stackoverflow.com/a/20067270) local hash = {} - for _, v in ipairs(ticks) do - for depth, page in ipairs(v) do - if not hash[page] then - table.insert(ticks_flattened, page) - hash[page] = true + for depth, v in ipairs(ticks) do + if not self.toc_ticks_ignored_levels[depth] then + for _, page in ipairs(v) do + if not hash[page] then + table.insert(ticks_flattened, page) + hash[page] = true + end end end end @@ -571,8 +597,9 @@ function ReaderToc:onShowToc() end end + 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) -- Estimate expand/collapse icon size - local items_per_page = G_reader_settings:readSetting("items_per_page") or 14 -- *2/5 to acount for Menu top title and bottom icons, and add some air between consecutive icons local icon_size = math.floor(Screen:getHeight() / items_per_page * 2/5) local button_width = icon_size * 2 @@ -627,7 +654,8 @@ function ReaderToc:onShowToc() cface = Font:getFace("x_smallinfofont"), single_line = true, align_baselines = true, - perpage = items_per_page, + items_per_page = items_per_page, + items_font_size = items_font_size, line_color = require("ffi/blitbuffer").COLOR_WHITE, on_close_ges = { GestureRange:new{ @@ -785,38 +813,157 @@ function ReaderToc:addToMainMenu(menu_items) self:onShowToc() end, } + -- ToC (and other navigation) settings + menu_items.navi_settings = { + text = _("Settings"), + } + -- Alternative ToC (only available with CRE documents) if self.ui.document:canHaveAlternativeToc() then - menu_items.table_of_contents.hold_callback = function(touchmenu_instance) - if self.ui.document:isTocAlternativeToc() then - UIManager:show(ConfirmBox:new{ - text = _("The table of content for this book is currently an alternative one built from the document headings.\nDo you want to get back the original table of content? (The book will be reloaded.)"), - ok_callback = function() - touchmenu_instance:closeMenu() - self.ui.doc_settings:delSetting("alternative_toc") - self.ui.document:invalidateCacheFile() - -- Allow for ConfirmBox to be closed before showing - -- "Opening file" InfoMessage - UIManager:scheduleIn(0.5, function () - self.ui:reloadDocument() - end) - end, - }) - else - UIManager:show(ConfirmBox:new{ - text = _("Do you want to use an alternative table of content built from the document headings?"), - ok_callback = function() - touchmenu_instance:closeMenu() - self:resetToc() - self.ui.document:buildAlternativeToc() - self.ui.doc_settings:saveSetting("alternative_toc", true) - self:onShowToc() - self.view.footer:setTocMarkers(true) - self.view.footer:onUpdateFooter() - end, - }) + menu_items.toc_alt_toc = { + text = _("Alternative table of contents"), + help_text = _([[ +An alternative table of contents can be built from document headings