From 9f61c230a371ddefa87b9929fcc678289258cfad Mon Sep 17 00:00:00 2001 From: hius07 <62179190+hius07@users.noreply.github.com> Date: Sun, 9 Mar 2025 07:45:43 +0200 Subject: [PATCH] KeyValuePage: lanscape and portrait items per page (#13377) --- frontend/apps/filemanager/filemanagermenu.lua | 47 ++++++++++++------- frontend/ui/widget/keyvaluepage.lua | 31 +++++++++--- 2 files changed, 54 insertions(+), 24 deletions(-) diff --git a/frontend/apps/filemanager/filemanagermenu.lua b/frontend/apps/filemanager/filemanagermenu.lua index 21f9c404d..ffcbeb0bb 100644 --- a/frontend/apps/filemanager/filemanagermenu.lua +++ b/frontend/apps/filemanager/filemanagermenu.lua @@ -2,6 +2,7 @@ local BD = require("ui/bidi") local CenterContainer = require("ui/widget/container/centercontainer") local ConfirmBox = require("ui/widget/confirmbox") local Device = require("device") +local DoubleSpinWidget = require("ui/widget/doublespinwidget") local InputContainer = require("ui/widget/container/inputcontainer") local KeyValuePage = require("ui/widget/keyvaluepage") local PluginLoader = require("pluginloader") @@ -394,9 +395,8 @@ To: }, { text_func = function() - local default_value = KeyValuePage.getDefaultItemsPerPage() - local current_value = G_reader_settings:readSetting("keyvalues_per_page") or default_value - return T(_("Info lists items per page: %1"), current_value) + local nb_items_landscape, nb_items_portrait = KeyValuePage.getCurrentItemsPerPage() + return T(_("Info lists items per page: %1 / %2"), nb_items_portrait, nb_items_landscape) end, help_text = _([[This sets the number of items per page in: - Book information @@ -405,25 +405,38 @@ To: - A few other plugins]]), keep_menu_open = true, callback = function(touchmenu_instance) - local default_value = KeyValuePage.getDefaultItemsPerPage() - local current_value = G_reader_settings:readSetting("keyvalues_per_page") or default_value - local widget = SpinWidget:new{ - value = current_value, - value_min = 10, - value_max = 30, - default_value = default_value, + local nb_items_landscape_default, nb_items_portrait_default = KeyValuePage.getDefaultItemsPerPage() + local nb_items_landscape, nb_items_portrait = + KeyValuePage.getCurrentItemsPerPage(nb_items_landscape_default, nb_items_portrait_default) + local widget = DoubleSpinWidget:new{ title_text = _("Info lists items per page"), - callback = function(spin) - if spin.value == default_value 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 + width_factor = 0.6, + left_text = _("Portrait"), + left_value = nb_items_portrait, + left_min = 10, + left_max = 30, + left_default = nb_items_portrait_default, + right_text = _("Landscape"), + right_value = nb_items_landscape, + right_min = 10, + right_max = 30, + right_default = nb_items_landscape_default, + callback = function(left_value, right_value) + -- 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 + if left_value == nb_items_portrait_default then G_reader_settings:delSetting("keyvalues_per_page") else - G_reader_settings:saveSetting("keyvalues_per_page", spin.value) + G_reader_settings:saveSetting("keyvalues_per_page", left_value) + end + if right_value == nb_items_landscape_default then + G_reader_settings:delSetting("keyvalues_per_page_landscape") + else + G_reader_settings:saveSetting("keyvalues_per_page_landscape", right_value) end touchmenu_instance:updateItems() - end + end, } UIManager:show(widget) end, diff --git a/frontend/ui/widget/keyvaluepage.lua b/frontend/ui/widget/keyvaluepage.lua index 3d127b260..05350d761 100644 --- a/frontend/ui/widget/keyvaluepage.lua +++ b/frontend/ui/widget/keyvaluepage.lua @@ -297,15 +297,17 @@ local KeyValuePage = FocusManager:extend{ } function KeyValuePage:init() + local screen_w = Screen:getWidth() + local screen_h = Screen:getHeight() self.show_parent = self.show_parent or self self.kv_pairs = self.kv_pairs or {} self.dimen = Geom:new{ x = 0, y = 0, - w = self.width or Screen:getWidth(), - h = self.height or Screen:getHeight(), + w = self.width or screen_w, + h = self.height or screen_h, } - if self.dimen.w == Screen:getWidth() and self.dimen.h == Screen:getHeight() then + if self.dimen.w == screen_w and self.dimen.h == screen_h then self.covers_fullscreen = true -- hint for UIManager:_repaint() end @@ -466,7 +468,8 @@ function KeyValuePage:init() - 2*Size.line.thick -- account for possibly 2 separator lines added - self.items_per_page = G_reader_settings:readSetting("keyvalues_per_page") or self.getDefaultItemsPerPage() + local nb_items_landscape, nb_items_portrait = KeyValuePage.getCurrentItemsPerPage() + self.items_per_page = screen_h < screen_w and nb_items_landscape or nb_items_portrait if self.single_page and self.items_per_page < #self.kv_pairs then self.items_per_page = #self.kv_pairs end @@ -520,10 +523,24 @@ end function KeyValuePage.getDefaultItemsPerPage() -- Get a default according to Screen DPI (roughly following -- the former implementation building logic) + local screen_w = Screen:getWidth() + local screen_h = Screen:getHeight() + if screen_w > screen_h then + screen_w, screen_h = screen_h, screen_w + end 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 + local nb_items_landscape = math.floor(screen_w / default_item_height) - 3 -- account for title and footer heights + local nb_items_portrait = math.floor(screen_h / default_item_height) - 3 + return nb_items_landscape, nb_items_portrait +end + +function KeyValuePage.getCurrentItemsPerPage(nb_items_landscape_default, nb_items_portrait_default) + if nb_items_landscape_default == nil then + nb_items_landscape_default, nb_items_portrait_default = KeyValuePage.getDefaultItemsPerPage() + end + local nb_items_landscape = G_reader_settings:readSetting("keyvalues_per_page_landscape") or nb_items_landscape_default + local nb_items_portrait = G_reader_settings:readSetting("keyvalues_per_page") or nb_items_portrait_default + return nb_items_landscape, nb_items_portrait end function KeyValuePage:nextPage()