diff --git a/frontend/apps/filemanager/filemanagermenu.lua b/frontend/apps/filemanager/filemanagermenu.lua index 1e0f5d1c4..527844116 100644 --- a/frontend/apps/filemanager/filemanagermenu.lua +++ b/frontend/apps/filemanager/filemanagermenu.lua @@ -147,8 +147,8 @@ function FileManagerMenu:setUpdateItemTable() value = curr_items, value_min = 6, value_max = 24, - ok_text = _("Set items"), title_text = _("Items per page"), + keep_shown_on_apply = true, callback = function(spin) G_reader_settings:saveSetting("items_per_page", spin.value) self.ui:onRefresh() @@ -171,7 +171,7 @@ function FileManagerMenu:setUpdateItemTable() value_min = 10, value_max = 72, default_value = default_font_size, - ok_text = _("Set size"), + keep_shown_on_apply = true, title_text = _("Maximum font size for item"), callback = function(spin) G_reader_settings:saveSetting("items_font_size", spin.value) diff --git a/frontend/apps/reader/modules/readerfooter.lua b/frontend/apps/reader/modules/readerfooter.lua index 7969c3998..1d010e4f9 100644 --- a/frontend/apps/reader/modules/readerfooter.lua +++ b/frontend/apps/reader/modules/readerfooter.lua @@ -872,6 +872,7 @@ function ReaderFooter:addToMainMenu(menu_items) default_value = 14, ok_text = _("Set size"), title_text = _("Footer font size"), + keep_shown_on_apply = true, callback = function(spin) self.settings.text_font_size = spin.value self.footer_text:free() @@ -927,7 +928,8 @@ function ReaderFooter:addToMainMenu(menu_items) value_hold_step = 20, value_max = 100, title_text = _("Maximum width"), - text = _("Maximum book title width in percentage of screen width"), + info_text = _("Maximum book title width in percentage of screen width"), + keep_shown_on_apply = true, callback = function(spin) self.settings.book_title_max_width_pct = spin.value self:refreshFooter(true, true) @@ -952,7 +954,8 @@ function ReaderFooter:addToMainMenu(menu_items) value_hold_step = 20, value_max = 100, title_text = _("Maximum width"), - text = _("Maximum chapter width in percentage of screen width"), + info_text = _("Maximum chapter width in percentage of screen width"), + keep_shown_on_apply = true, callback = function(spin) self.settings.book_chapter_max_width_pct = spin.value self:refreshFooter(true, true) @@ -1339,6 +1342,7 @@ function ReaderFooter:addToMainMenu(menu_items) value_max = value_max, default_value = default_value, title_text = _("Progress bar size"), + keep_shown_on_apply = true, callback = function(spin) if self.settings.progress_style_thin then self.settings.progress_style_thin_height = spin.value @@ -1499,6 +1503,7 @@ function ReaderFooter:addToMainMenu(menu_items) value_max = 50, title_text = _("Minimal width"), text = _("Minimal progress bar width in percentage of screen width"), + keep_shown_on_apply = true, callback = function(spin) self.settings.progress_bar_min_width_pct = spin.value self:refreshFooter(true, true) diff --git a/frontend/apps/reader/modules/readerlink.lua b/frontend/apps/reader/modules/readerlink.lua index 19940fea8..9e6d6535c 100644 --- a/frontend/apps/reader/modules/readerlink.lua +++ b/frontend/apps/reader/modules/readerlink.lua @@ -257,7 +257,7 @@ From the footnote popup, you can jump to the footnote location in the book by sw precision = "%+d", ok_text = _("Set font size"), title_text = _("Set footnote popup font size"), - text = _([[ + info_text = _([[ The footnote popup font adjusts to the font size you've set for the document. You can specify here how much smaller or larger it should be relative to the document font size. A negative value will make it smaller, while a positive one will make it larger. diff --git a/frontend/apps/reader/modules/readerpagemap.lua b/frontend/apps/reader/modules/readerpagemap.lua index 96577a13e..6e523940a 100644 --- a/frontend/apps/reader/modules/readerpagemap.lua +++ b/frontend/apps/reader/modules/readerpagemap.lua @@ -388,6 +388,7 @@ function ReaderPageMap:addToMainMenu(menu_items) text_func = function() return T(_("Page labels font size (%1)"), self.label_font_size) end, + enabled_func = function() return self.show_page_labels end, callback = function(touchmenu_instance) local SpinWidget = require("ui/widget/spinwidget") local spin_w = SpinWidget:new{ @@ -396,8 +397,8 @@ function ReaderPageMap:addToMainMenu(menu_items) value_min = 8, value_max = 20, default_value = self.label_default_font_size, - ok_text = _("Set size"), title_text = _("Page labels font size"), + keep_shown_on_apply = true, callback = function(spin) self.label_font_size = spin.value G_reader_settings:saveSetting("pagemap_label_font_size", self.label_font_size) diff --git a/frontend/apps/reader/modules/readerrolling.lua b/frontend/apps/reader/modules/readerrolling.lua index 51f179211..5e1d24dff 100644 --- a/frontend/apps/reader/modules/readerrolling.lua +++ b/frontend/apps/reader/modules/readerrolling.lua @@ -455,7 +455,7 @@ You can set how many lines are shown.]]) precision = "%d", ok_text = _("Set"), title_text = _("Set overlapped lines"), - text = overlap_lines_help_text, + info_text = overlap_lines_help_text, callback = function(spin) G_reader_settings:saveSetting("copt_overlap_lines", spin.value) touchmenu_instance:updateItems() diff --git a/frontend/apps/reader/modules/readertypography.lua b/frontend/apps/reader/modules/readertypography.lua index d141e86d2..e3da0a4fb 100644 --- a/frontend/apps/reader/modules/readertypography.lua +++ b/frontend/apps/reader/modules/readertypography.lua @@ -420,6 +420,7 @@ When the book's language tag is not among our presets, no specific features will Set minimum length before hyphenation occurs. These settings will apply to all books with any hyphenation dictionary. 'Use language defaults' resets them.]]), + keep_shown_on_apply = true, callback = function(left_hyphen_min, right_hyphen_min) G_reader_settings:saveSetting("hyph_left_hyphen_min", left_hyphen_min) G_reader_settings:saveSetting("hyph_right_hyphen_min", right_hyphen_min) diff --git a/frontend/ui/widget/doublespinwidget.lua b/frontend/ui/widget/doublespinwidget.lua index ac02ac3ee..31a6f19f4 100644 --- a/frontend/ui/widget/doublespinwidget.lua +++ b/frontend/ui/widget/doublespinwidget.lua @@ -26,7 +26,7 @@ local Screen = Device.screen local DoubleSpinWidget = InputContainer:new{ title_text = "", title_face = Font:getFace("x_smalltfont"), - info_text = "", + info_text = nil, width = nil, height = nil, left_min = 1, @@ -39,9 +39,15 @@ local DoubleSpinWidget = InputContainer:new{ right_value = 1, right_default = nil, right_text = _("Right"), - -- set this to see extra default button + cancel_text = _("Close"), + ok_text = _("Apply"), + keep_shown_on_apply = false, + -- Set this to add default button that restores numbers to their default values default_values = nil, default_text = _("Use defaults"), + -- Optional extra button on bottom + extra_text = nil, + extra_callback = nil, } function DoubleSpinWidget:init() @@ -74,7 +80,7 @@ end function DoubleSpinWidget:update() -- This picker_update_callback will be redefined later. It is needed -- so we can have our MovableContainer repainted on NumberPickerWidgets - -- update It is needed if we have enabled transparency on MovableContainer, + -- update. It is needed if we have enabled transparency on MovableContainer, -- otherwise the NumberPicker area gets opaque on update. local picker_update_callback = function() end local left_widget = NumberPickerWidget:new{ @@ -166,7 +172,7 @@ function DoubleSpinWidget:update() margin = Size.margin.small, bordersize = 0, TextBoxWidget:new{ - text = self.info_text, + text = self.info_text or "", face = Font:getFace("x_smallinfofont"), width = self.width * 0.9, } @@ -174,17 +180,20 @@ function DoubleSpinWidget:update() local buttons = { { { - text = _("Close"), + text = self.cancel_text, callback = function() self:onClose() end, }, { - text = _("Apply"), + text = self.ok_text, callback = function() if self.callback then self.callback(left_widget:getValue(), right_widget:getValue()) end + if not self.keep_shown_on_apply then + self:onClose() + end end, }, }, @@ -203,6 +212,21 @@ function DoubleSpinWidget:update() } }) end + if self.extra_text then + table.insert(buttons,{ + { + text = self.extra_text, + callback = function() + if self.extra_callback then + self.extra_callback(left_widget:getValue(), right_widget:getValue()) + end + if not self.keep_shown_on_apply then -- assume extra wants it same as ok + self:onClose() + end + end, + }, + }) + end local button_table = ButtonTable:new{ width = self.width - 2*Size.padding.default, @@ -263,6 +287,11 @@ function DoubleSpinWidget:update() end end +function DoubleSpinWidget:hasMoved() + local offset = self.movable:getMovedOffset() + return offset.x ~= 0 or offset.y ~= 0 +end + function DoubleSpinWidget:onCloseWidget() UIManager:setDirty(nil, function() return "partial", self.widget_frame.dimen diff --git a/frontend/ui/widget/spinwidget.lua b/frontend/ui/widget/spinwidget.lua index 8f46f5d37..c36712b6b 100644 --- a/frontend/ui/widget/spinwidget.lua +++ b/frontend/ui/widget/spinwidget.lua @@ -10,6 +10,7 @@ local Font = require("ui/font") local HorizontalGroup = require("ui/widget/horizontalgroup") local InputContainer = require("ui/widget/container/inputcontainer") local LineWidget = require("ui/widget/linewidget") +local MovableContainer = require("ui/widget/container/movablecontainer") local NumberPickerWidget = require("ui/widget/numberpickerwidget") local OverlapGroup = require("ui/widget/overlapgroup") local Size = require("ui/size") @@ -22,8 +23,9 @@ local _ = require("gettext") local Screen = Device.screen local SpinWidget = InputContainer:new{ + title_text = "", title_face = Font:getFace("x_smalltfont"), - text = nil, + info_text = nil, width = Screen:getWidth() * 0.95, height = Screen:getHeight(), value_table = nil, @@ -33,14 +35,15 @@ local SpinWidget = InputContainer:new{ value_min = 0, value_step = 1, value_hold_step = 4, - ok_text = _("OK"), - cancel_text = _("Cancel"), - -- extra button on bottom - extra_text = nil, - extra_callback = nil, - -- set this to see extra default button + cancel_text = _("Close"), + ok_text = _("Apply"), + keep_shown_on_apply = false, + -- Set this to add default button that restores number to its default value default_value = nil, default_text = _("Use default"), + -- Optional extra button on bottom + extra_text = nil, + extra_callback = nil, } function SpinWidget:init() @@ -70,6 +73,11 @@ function SpinWidget:init() end function SpinWidget:update() + -- This picker_update_callback will be redefined later. It is needed + -- so we can have our MovableContainer repainted on NumberPickerWidgets + -- update. It is needed if we have enabled transparency on MovableContainer, + -- otherwise the NumberPicker area gets opaque on update. + local picker_update_callback = function() end local value_widget = NumberPickerWidget:new{ show_parent = self, width = self.screen_width * 0.2, @@ -81,6 +89,7 @@ function SpinWidget:update() value_step = self.value_step, value_hold_step = self.value_hold_step, precision = self.precision, + update_callback = function() picker_update_callback() end, } local value_group = HorizontalGroup:new{ align = "center", @@ -134,7 +143,9 @@ function SpinWidget:update() self.value, self.value_index = value_widget:getValue() self:callback(self) end - self:onClose() + if not self.keep_shown_on_apply then + self:onClose() + end end, }, } @@ -151,19 +162,21 @@ function SpinWidget:update() }, }) end - if self.extra_text then - table.insert(buttons,{ - { - text = self.extra_text, - callback = function() - if self.extra_callback then - self.value, self.value_index = value_widget:getValue() - self.extra_callback(self) - end + if self.extra_text then + table.insert(buttons,{ + { + text = self.extra_text, + callback = function() + if self.extra_callback then + self.value, self.value_index = value_widget:getValue() + self.extra_callback(self) + end + if not self.keep_shown_on_apply then -- assume extra wants it same as ok self:onClose() - end, - }, - }) + end + end, + }, + }) end local ok_cancel_buttons = ButtonTable:new{ @@ -178,13 +191,13 @@ function SpinWidget:update() value_bar, value_line, } - if self.text then + if self.info_text then table.insert(vgroup, FrameContainer:new{ padding = Size.padding.default, margin = Size.margin.small, bordersize = 0, TextBoxWidget:new{ - text = self.text, + text = self.info_text, face = Font:getFace("x_smallinfofont"), width = self.width * 0.9, } @@ -211,6 +224,9 @@ function SpinWidget:update() background = Blitbuffer.COLOR_WHITE, vgroup, } + self.movable = MovableContainer:new{ + self.spin_frame, + } self[1] = WidgetContainer:new{ align = "center", dimen =Geom:new{ @@ -218,14 +234,21 @@ function SpinWidget:update() w = self.screen_width, h = self.screen_height, }, - FrameContainer:new{ - bordersize = 0, - self.spin_frame, - } + self.movable, } UIManager:setDirty(self, function() return "ui", self.spin_frame.dimen end) + picker_update_callback = function() + UIManager:setDirty("all", function() + return "ui", self.movable.dimen + end) + end +end + +function SpinWidget:hasMoved() + local offset = self.movable:getMovedOffset() + return offset.x ~= 0 or offset.y ~= 0 end function SpinWidget:onCloseWidget() diff --git a/plugins/coverbrowser.koplugin/main.lua b/plugins/coverbrowser.koplugin/main.lua index c74cc5b53..f97bb6f64 100644 --- a/plugins/coverbrowser.koplugin/main.lua +++ b/plugins/coverbrowser.koplugin/main.lua @@ -414,7 +414,7 @@ function CoverBrowser:addToMainMenu(menu_items) { text = _("(Detailed list) Files per page"), help_text = _([[This sets the number of files and directories per page in non-'classic' display modes.]]), - keep_menu_open = true, + -- Best to not "keep_menu_open = true", to see how this apply on the full view callback = function() local SpinWidget = require("ui/widget/spinwidget") -- "files_per_page" should have been saved with an adequate value @@ -426,7 +426,7 @@ function CoverBrowser:addToMainMenu(menu_items) value = curr_items, value_min = 4, value_max = 20, - ok_text = _("Set files"), + keep_shown_on_apply = true, title_text = _("Files per page"), callback = function(spin) BookInfoManager:saveSetting("files_per_page", spin.value) diff --git a/plugins/statistics.koplugin/main.lua b/plugins/statistics.koplugin/main.lua index b669a2af5..f7622f544 100644 --- a/plugins/statistics.koplugin/main.lua +++ b/plugins/statistics.koplugin/main.lua @@ -791,7 +791,7 @@ The max value ensures a page you stay on for a long time (because you fell aslee value_max = 5, ok_text = _("Set"), title_text = _("Books per calendar day"), - text = _("Set the max number of book spans to show for a day"), + info_text = _("Set the max number of book spans to show for a day"), callback = function(spin) self.calendar_nb_book_spans = spin.value touchmenu_instance:updateItems()