DoubleSpinWidget, SpinWidget: add units, make usage more consistent (#9046)

reviewable/pr9126/r1
zwim 2 years ago committed by GitHub
parent 13274d6212
commit d5d5867d4e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -7,6 +7,7 @@ local SpinWidget = require("ui/widget/spinwidget")
local UIManager = require("ui/uimanager") local UIManager = require("ui/uimanager")
local powerd = Device:getPowerDevice() local powerd = Device:getPowerDevice()
local _ = require("gettext") local _ = require("gettext")
local C_ = _.pgettext
local T = require("ffi/util").template local T = require("ffi/util").template
local ReaderDeviceStatus = InputContainer:new{ local ReaderDeviceStatus = InputContainer:new{
@ -36,8 +37,8 @@ function ReaderDeviceStatus:init()
UIManager:close(self.battery_confirm_box) UIManager:close(self.battery_confirm_box)
end end
self.battery_confirm_box = ConfirmBox:new { self.battery_confirm_box = ConfirmBox:new {
text = is_charging and T(_("High battery level: %1%\n\nDismiss battery level alert?"), battery_capacity) text = is_charging and T(_("High battery level: %1 %\n\nDismiss battery level alert?"), battery_capacity)
or T(_("Low battery level: %1%\n\nDismiss battery level alert?"), battery_capacity), or T(_("Low battery level: %1 %\n\nDismiss battery level alert?"), battery_capacity),
ok_text = _("Dismiss"), ok_text = _("Dismiss"),
dismissable = false, dismissable = false,
ok_callback = function() ok_callback = function()
@ -154,6 +155,7 @@ function ReaderDeviceStatus:addToMainMenu(menu_items)
value_min = 1, value_min = 1,
value_max = 60, value_max = 60,
default_value = 10, default_value = 10,
unit = C_("Time", "min"),
value_hold_step = 5, value_hold_step = 5,
title_text = _("Battery check interval"), title_text = _("Battery check interval"),
callback = function(spin) callback = function(spin)
@ -172,7 +174,7 @@ function ReaderDeviceStatus:addToMainMenu(menu_items)
table.insert(menu_items.device_status_alarm.sub_item_table, table.insert(menu_items.device_status_alarm.sub_item_table,
{ {
text_func = function() text_func = function()
return T(_("Thresholds: %1% %2%"), self.battery_threshold, self.battery_threshold_high) return T(_("Thresholds: %1 % / %2 %"), self.battery_threshold, self.battery_threshold_high)
end, end,
enabled_func = function() enabled_func = function()
return G_reader_settings:isTrue("device_status_battery_alarm") return G_reader_settings:isTrue("device_status_battery_alarm")
@ -199,16 +201,12 @@ High level threshold is checked when the device is charging.]]),
right_default = 100, right_default = 100,
right_hold_step = 5, right_hold_step = 5,
default_values = true, default_values = true,
unit = "%",
callback = function(left_value, right_value) callback = function(left_value, right_value)
if not left_value then -- "Default" button pressed
left_value = 20
right_value = 100
end
self.battery_threshold = left_value self.battery_threshold = left_value
self.battery_threshold_high = right_value self.battery_threshold_high = right_value
G_reader_settings:saveSetting("device_status_battery_threshold", self.battery_threshold) G_reader_settings:saveSetting("device_status_battery_threshold", self.battery_threshold)
G_reader_settings:saveSetting("device_status_battery_threshold_high", self.battery_threshold_high) G_reader_settings:saveSetting("device_status_battery_threshold_high", self.battery_threshold_high)
UIManager:close(thresholds_widget)
touchmenu_instance:updateItems() touchmenu_instance:updateItems()
powerd:setDismissBatteryStatus(false) powerd:setDismissBatteryStatus(false)
end, end,
@ -249,6 +247,7 @@ High level threshold is checked when the device is charging.]]),
value_min = 1, value_min = 1,
value_max = 60, value_max = 60,
default_value = 5, default_value = 5,
unit = C_("Time", "min"),
value_hold_step = 5, value_hold_step = 5,
title_text = _("Memory check interval"), title_text = _("Memory check interval"),
callback = function(spin) callback = function(spin)
@ -278,6 +277,7 @@ High level threshold is checked when the device is charging.]]),
value_min = 20, value_min = 20,
value_max = 500, value_max = 500,
default_value = 100, default_value = 100,
unit = C_("Data storage size", "MB"),
value_step = 5, value_step = 5,
value_hold_step = 10, value_hold_step = 10,
title_text = _("Memory alert threshold"), title_text = _("Memory alert threshold"),

@ -630,14 +630,14 @@ function ReaderFooter:set_custom_text(touchmenu_instance)
title = "Enter a custom text", title = "Enter a custom text",
fields = { fields = {
{ {
text = self.custom_text or "", text = self.custom_text or "",
description = _("Custom string:"), description = _("Custom string:"),
input_type = "string", input_type = "string",
}, },
{ {
text = self.custom_text_repetitions, text = self.custom_text_repetitions,
description =_("Number of repetitions:"), description =_("Number of repetitions:"),
input_type = "number", input_type = "number",
}, },
}, },
buttons = { buttons = {
@ -1198,7 +1198,7 @@ function ReaderFooter:addToMainMenu(menu_items)
value_max = 36, value_max = 36,
default_value = 14, default_value = 14,
ok_text = _("Set size"), ok_text = _("Set size"),
title_text = _("Footer font size"), title_text = _("Footer font size"),
keep_shown_on_apply = true, keep_shown_on_apply = true,
callback = function(spin) callback = function(spin)
self.settings.text_font_size = spin.value self.settings.text_font_size = spin.value
@ -1251,7 +1251,7 @@ function ReaderFooter:addToMainMenu(menu_items)
value_max = 98, value_max = 98,
default_value = DMINIBAR_CONTAINER_HEIGHT, default_value = DMINIBAR_CONTAINER_HEIGHT,
ok_text = _("Set height"), ok_text = _("Set height"),
title_text = _("Container height"), title_text = _("Container height"),
keep_shown_on_apply = true, keep_shown_on_apply = true,
callback = function(spin) callback = function(spin)
self.settings.container_height = spin.value self.settings.container_height = spin.value
@ -1277,7 +1277,7 @@ function ReaderFooter:addToMainMenu(menu_items)
value_max = 49, value_max = 49,
default_value = 1, default_value = 1,
ok_text = _("Set margin"), ok_text = _("Set margin"),
title_text = _("Container bottom margin"), title_text = _("Container bottom margin"),
keep_shown_on_apply = true, keep_shown_on_apply = true,
callback = function(spin) callback = function(spin)
self.settings.container_bottom_padding = spin.value self.settings.container_bottom_padding = spin.value
@ -1295,7 +1295,7 @@ function ReaderFooter:addToMainMenu(menu_items)
sub_item_table = { sub_item_table = {
{ {
text_func = function() text_func = function()
return T(_("Book title: %1%"), self.settings.book_title_max_width_pct) return T(_("Book title: %1 %"), self.settings.book_title_max_width_pct)
end, end,
callback = function(touchmenu_instance) callback = function(touchmenu_instance)
local SpinWidget = require("ui/widget/spinwidget") local SpinWidget = require("ui/widget/spinwidget")
@ -1305,7 +1305,8 @@ function ReaderFooter:addToMainMenu(menu_items)
value_step = 5, value_step = 5,
value_hold_step = 20, value_hold_step = 20,
value_max = 100, value_max = 100,
title_text = _("Maximum width"), unit = "%",
title_text = _("Maximum width"),
info_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, keep_shown_on_apply = true,
callback = function(spin) callback = function(spin)
@ -1320,7 +1321,7 @@ function ReaderFooter:addToMainMenu(menu_items)
}, },
{ {
text_func = function() text_func = function()
return T(_("Current chapter: %1%"), self.settings.book_chapter_max_width_pct) return T(_("Current chapter: %1 %"), self.settings.book_chapter_max_width_pct)
end, end,
callback = function(touchmenu_instance) callback = function(touchmenu_instance)
local SpinWidget = require("ui/widget/spinwidget") local SpinWidget = require("ui/widget/spinwidget")
@ -1330,7 +1331,8 @@ function ReaderFooter:addToMainMenu(menu_items)
value_step = 5, value_step = 5,
value_hold_step = 20, value_hold_step = 20,
value_max = 100, value_max = 100,
title_text = _("Maximum width"), unit = "%",
title_text = _("Maximum width"),
info_text = _("Maximum chapter width in percentage of screen width"), info_text = _("Maximum chapter width in percentage of screen width"),
keep_shown_on_apply = true, keep_shown_on_apply = true,
callback = function(spin) callback = function(spin)
@ -1572,7 +1574,7 @@ With this enabled, the current page is included, so the count goes from n to 1 i
table.insert(sub_items[settings_submenu_num].sub_item_table, 4, { table.insert(sub_items[settings_submenu_num].sub_item_table, 4, {
text_func = function() text_func = function()
if self.settings.battery_hide_threshold <= (Device:hasAuxBattery() and 200 or 100) then if self.settings.battery_hide_threshold <= (Device:hasAuxBattery() and 200 or 100) then
return T(_("Hide battery status if level higher than: %1%"), self.settings.battery_hide_threshold) return T(_("Hide battery status if level higher than: %1 %"), self.settings.battery_hide_threshold)
else else
return _("Hide battery status") return _("Hide battery status")
end end
@ -1591,8 +1593,9 @@ With this enabled, the current page is included, so the count goes from n to 1 i
value_min = 0, value_min = 0,
value_max = Device:hasAuxBattery() and 200 or 100, value_max = Device:hasAuxBattery() and 200 or 100,
default_value = Device:hasAuxBattery() and 200 or 100, default_value = Device:hasAuxBattery() and 200 or 100,
unit = "%",
value_hold_step = 10, value_hold_step = 10,
title_text = _("Hide battery threshold"), title_text = _("Hide battery threshold"),
callback = function(spin) callback = function(spin)
self.settings.battery_hide_threshold = spin.value self.settings.battery_hide_threshold = spin.value
self:refreshFooter(true, true) self:refreshFooter(true, true)
@ -1747,7 +1750,7 @@ With this enabled, the current page is included, so the count goes from n to 1 i
value_hold_step = 2, value_hold_step = 2,
value_max = value_max, value_max = value_max,
default_value = default_value, default_value = default_value,
title_text = _("Progress bar size"), title_text = _("Progress bar size"),
keep_shown_on_apply = true, keep_shown_on_apply = true,
callback = function(spin) callback = function(spin)
if self.settings.progress_style_thin then if self.settings.progress_style_thin then
@ -1907,7 +1910,7 @@ With this enabled, the current page is included, so the count goes from n to 1 i
}, },
{ {
text_func = function() text_func = function()
return T(_("Minimal width: %1%"), self.settings.progress_bar_min_width_pct) return T(_("Minimal width: %1 %"), self.settings.progress_bar_min_width_pct)
end, end,
enabled_func = function() enabled_func = function()
return self.settings.progress_bar_position == "alongside" and not self.settings.disable_progress_bar return self.settings.progress_bar_position == "alongside" and not self.settings.disable_progress_bar
@ -1921,7 +1924,8 @@ With this enabled, the current page is included, so the count goes from n to 1 i
value_step = 5, value_step = 5,
value_hold_step = 20, value_hold_step = 20,
value_max = 50, value_max = 50,
title_text = _("Minimal width"), unit = "%",
title_text = _("Minimal width"),
text = _("Minimal progress bar width in percentage of screen width"), text = _("Minimal progress bar width in percentage of screen width"),
keep_shown_on_apply = true, keep_shown_on_apply = true,
callback = function(spin) callback = function(spin)

@ -397,9 +397,12 @@ function ReaderHighlight:addToMainMenu(menu_items)
text = _("Long-press on text"), text = _("Long-press on text"),
sub_item_table = { sub_item_table = {
{ {
text = _("Highlight long-press interval"), text_func = function()
return T(_("Highlight long-press interval: %1 s"),
G_reader_settings:readSetting("highlight_long_hold_threshold_s", 3))
end,
keep_menu_open = true, keep_menu_open = true,
callback = function() callback = function(touchmenu_instance)
local SpinWidget = require("ui/widget/spinwidget") local SpinWidget = require("ui/widget/spinwidget")
local items = SpinWidget:new{ local items = SpinWidget:new{
title_text = _("Highlight long-press interval"), title_text = _("Highlight long-press interval"),
@ -408,15 +411,17 @@ If a touch is not released in this interval, it is considered a long-press. On d
The interval value is in seconds and can range from 3 to 20 seconds.]]), The interval value is in seconds and can range from 3 to 20 seconds.]]),
width = math.floor(Screen:getWidth() * 0.75), width = math.floor(Screen:getWidth() * 0.75),
value = G_reader_settings:readSetting("highlight_long_hold_threshold", 3), value = G_reader_settings:readSetting("highlight_long_hold_threshold_s", 3),
value_min = 3, value_min = 3,
value_max = 20, value_max = 20,
value_step = 1, value_step = 1,
value_hold_step = 5, value_hold_step = 5,
unit = C_("Time", "s"),
ok_text = _("Set interval"), ok_text = _("Set interval"),
default_value = 3, default_value = 3,
callback = function(spin) callback = function(spin)
G_reader_settings:saveSetting("highlight_long_hold_threshold", spin.value) G_reader_settings:saveSetting("highlight_long_hold_threshold_s", spin.value)
if touchmenu_instance then touchmenu_instance:updateItems() end
end end
} }
UIManager:show(items) UIManager:show(items)
@ -1425,7 +1430,7 @@ function ReaderHighlight:onHoldRelease()
local long_final_hold = false local long_final_hold = false
if self.hold_last_time then if self.hold_last_time then
local hold_duration = time.now() - self.hold_last_time local hold_duration = time.now() - self.hold_last_time
local long_hold_threshold_s = G_reader_settings:readSetting("highlight_long_hold_threshold", 3) -- seconds local long_hold_threshold_s = G_reader_settings:readSetting("highlight_long_hold_threshold_s", 3) -- seconds
if hold_duration > time.s(long_hold_threshold_s) then if hold_duration > time.s(long_hold_threshold_s) then
-- We stayed 3 seconds before release without updating selection -- We stayed 3 seconds before release without updating selection
long_final_hold = true long_final_hold = true

@ -5,6 +5,7 @@ local UIManager = require("ui/uimanager")
local logger = require("logger") local logger = require("logger")
local time = require("ui/time") local time = require("ui/time")
local _ = require("gettext") local _ = require("gettext")
local C_ = _.pgettext
local T = require("ffi/util").template local T = require("ffi/util").template
local Screen = Device.screen local Screen = Device.screen
@ -162,6 +163,7 @@ Default value: %1 ms]]), scroll_activation_delay_default_ms),
value_max = 2000, value_max = 2000,
value_step = 100, value_step = 100,
value_hold_step = 500, value_hold_step = 500,
unit = C_("Time", "ms"),
ok_text = _("Set delay"), ok_text = _("Set delay"),
default_value = scroll_activation_delay_default_ms, default_value = scroll_activation_delay_default_ms,
callback = function(spin) callback = function(spin)

@ -349,7 +349,7 @@ When the book's language tag is not among our presets, no specific features will
if G_reader_settings:has("hyph_left_hyphen_min") or if G_reader_settings:has("hyph_left_hyphen_min") or
G_reader_settings:has("hyph_right_hyphen_min") then G_reader_settings:has("hyph_right_hyphen_min") then
-- @translators to RTL language translators: %1/left is the min length of the start of a hyphenated word, %2/right is the min length of the end of a hyphenated word (note that there is yet no support for hyphenation with RTL languages, so this will mostly apply to LTR documents) -- @translators to RTL language translators: %1/left is the min length of the start of a hyphenated word, %2/right is the min length of the end of a hyphenated word (note that there is yet no support for hyphenation with RTL languages, so this will mostly apply to LTR documents)
return T(_("Left/right minimal sizes: %1 - %2"), return T(_("Left/right minimal sizes: %1 / %2"),
G_reader_settings:readSetting("hyph_left_hyphen_min"), G_reader_settings:readSetting("hyph_left_hyphen_min"),
G_reader_settings:readSetting("hyph_right_hyphen_min")) G_reader_settings:readSetting("hyph_right_hyphen_min"))
end end
@ -376,7 +376,7 @@ When the book's language tag is not among our presets, no specific features will
-- the hyphenation changes happening -- the hyphenation changes happening
width_factor = 0.6, width_factor = 0.6,
default_values = true, default_values = true,
default_text = _("Use language defaults"), default_text = T(_("Language defaults: %1 / %2"), alg_left_hyphen_min, alg_right_hyphen_min),
title_text = _("Hyphenation limits"), title_text = _("Hyphenation limits"),
info_text = _([[ info_text = _([[
Set minimum length before hyphenation occurs. Set minimum length before hyphenation occurs.
@ -384,6 +384,9 @@ These settings will apply to all books with any hyphenation dictionary.
'Use language defaults' resets them.]]), 'Use language defaults' resets them.]]),
keep_shown_on_apply = true, keep_shown_on_apply = true,
callback = function(left_hyphen_min, right_hyphen_min) callback = function(left_hyphen_min, right_hyphen_min)
if left_hyphen_min == alg_left_hyphen_min and right_hyphen_min == alg_right_hyphen_min then
left_hyphen_min, right_hyphen_min = nil, nil -- don't store default values
end
G_reader_settings:saveSetting("hyph_left_hyphen_min", left_hyphen_min) G_reader_settings:saveSetting("hyph_left_hyphen_min", left_hyphen_min)
G_reader_settings:saveSetting("hyph_right_hyphen_min", right_hyphen_min) G_reader_settings:saveSetting("hyph_right_hyphen_min", right_hyphen_min)
self.ui.document:setHyphLeftHyphenMin(G_reader_settings:readSetting("hyph_left_hyphen_min") or 0) self.ui.document:setHyphLeftHyphenMin(G_reader_settings:readSetting("hyph_left_hyphen_min") or 0)

@ -14,6 +14,7 @@ local logger = require("logger")
local util = require("util") local util = require("util")
local time = require("ui/time") local time = require("ui/time")
local _ = require("gettext") local _ = require("gettext")
local C_ = _.pgettext
local N_ = _.ngettext local N_ = _.ngettext
local T = require("ffi/util").template local T = require("ffi/util").template
@ -150,6 +151,7 @@ If set to 0, keitai input is disabled entirely and only flick input can be used.
value_min = 0, value_min = 0,
value_max = 10, value_max = 10,
value_step = 1, value_step = 1,
unit = C_("Time", "s"),
ok_text = _("Set interval"), ok_text = _("Set interval"),
default_value = DEFAULT_KEITAI_TAP_INTERVAL_S, default_value = DEFAULT_KEITAI_TAP_INTERVAL_S,
callback = function(spin) callback = function(spin)

@ -7,7 +7,7 @@ local lfs = require("libs/libkoreader-lfs")
local logger = require("logger") local logger = require("logger")
-- Date at which the last migration snippet was added -- Date at which the last migration snippet was added
local CURRENT_MIGRATION_DATE = 20220426 local CURRENT_MIGRATION_DATE = 20220523
-- Retrieve the date of the previous migration, if any -- Retrieve the date of the previous migration, if any
local last_migration_date = G_reader_settings:readSetting("last_migration_date", 0) local last_migration_date = G_reader_settings:readSetting("last_migration_date", 0)
@ -366,7 +366,7 @@ if last_migration_date < 20220205 then
end end
end end
-- Rename several time storing settings and shift their value to the new meaning -- Rename several time storing settings and shift their value to the new meaning see (#8999)
if last_migration_date < 20220426 then if last_migration_date < 20220426 then
local function migrateSettingsName(old, new, factor) local function migrateSettingsName(old, new, factor)
factor = factor or 1 factor = factor or 1
@ -387,6 +387,18 @@ if last_migration_date < 20220426 then
migrateSettingsName("device_status_memory_interval", "device_status_memory_interval_minutes") migrateSettingsName("device_status_memory_interval", "device_status_memory_interval_minutes")
end end
-- Rename several time storing settings and shift their value to the new meaning follow up to (#8999)
if last_migration_date < 20220523 then
local function migrateSettingsName(old, new, factor)
factor = factor or 1
if G_reader_settings:readSetting(old) then
local value = math.floor(G_reader_settings:readSetting(old) * factor)
G_reader_settings:saveSetting(new, value)
G_reader_settings:delSetting(old)
end
end
migrateSettingsName("highlight_long_hold_threshold", "highlight_long_hold_threshold_s")
end
-- We're done, store the current migration date -- We're done, store the current migration date
G_reader_settings:saveSetting("last_migration_date", CURRENT_MIGRATION_DATE) G_reader_settings:saveSetting("last_migration_date", CURRENT_MIGRATION_DATE)

@ -1,5 +1,6 @@
local Screensaver = require("ui/screensaver") local Screensaver = require("ui/screensaver")
local _ = require("gettext") local _ = require("gettext")
local T = require("ffi/util").template
local function hasLastFile() local function hasLastFile()
if G_reader_settings:hasNot("lastfile") then if G_reader_settings:hasNot("lastfile") then
@ -157,7 +158,8 @@ return {
if G_reader_settings:nilOrFalse("screensaver_stretch_images") then if G_reader_settings:nilOrFalse("screensaver_stretch_images") then
return _("Stretch to fit screen") return _("Stretch to fit screen")
elseif G_reader_settings:readSetting("screensaver_stretch_limit_percentage") then elseif G_reader_settings:readSetting("screensaver_stretch_limit_percentage") then
return _("Stretch to fit screen (with limit)") return T(_("Stretch to fit screen (with limit: %1 %)"),
G_reader_settings:readSetting("screensaver_stretch_limit_percentage"))
else else
return _("Stretch to fit screen") return _("Stretch to fit screen")
end end

@ -391,7 +391,8 @@ function Screensaver:setStretchLimit(touchmenu_instance)
value = G_reader_settings:readSetting("screensaver_stretch_limit_percentage", 8), value = G_reader_settings:readSetting("screensaver_stretch_limit_percentage", 8),
value_min = 0, value_min = 0,
value_max = 25, value_max = 25,
default_value = 8, -- percent default_value = 8,
unit = "%",
title_text = _("Set maximum stretch limit"), title_text = _("Set maximum stretch limit"),
ok_text = _("Set"), ok_text = _("Set"),
ok_always_enabled = true, ok_always_enabled = true,

@ -43,16 +43,19 @@ local DoubleSpinWidget = FocusManager:new{
right_wrap = false, right_wrap = false,
cancel_text = _("Close"), cancel_text = _("Close"),
ok_text = _("Apply"), ok_text = _("Apply"),
ok_always_enabled = false, -- set to true to enable OK button for unchanged values
cancel_callback = nil, cancel_callback = nil,
callback = nil, callback = nil,
close_callback = nil, close_callback = nil,
keep_shown_on_apply = false, keep_shown_on_apply = false,
-- Set this to add upper default button that applies default values with callback(nil, nil) -- Set this to add upper default button that applies default values with callback(left_default, right_default)
default_values = false, default_values = false,
default_text = nil, default_text = nil,
-- Optional extra button above ok/cancel buttons row -- Optional extra button above ok/cancel buttons row
extra_text = nil, extra_text = nil,
extra_callback = nil, extra_callback = nil,
is_range = false, -- show a range separator in default button and between the spinners
unit = nil,
} }
function DoubleSpinWidget:init() function DoubleSpinWidget:init()
@ -81,6 +84,11 @@ function DoubleSpinWidget:init()
} }
end end
if self.unit and self.unit ~= "" then
self.left_precision = self.left_precision and self.left_precision or "%1d"
self.right_precision = self.right_precision and self.right_precision or "%1d"
end
-- Actually the widget layout -- Actually the widget layout
self:update() self:update()
end end
@ -98,6 +106,7 @@ function DoubleSpinWidget:update(numberpicker_left_value, numberpicker_right_val
value_hold_step = self.left_hold_step, value_hold_step = self.left_hold_step,
precision = self.left_precision, precision = self.left_precision,
wrap = self.left_wrap, wrap = self.left_wrap,
unit = self.unit,
} }
self:mergeLayoutInHorizontal(left_widget) self:mergeLayoutInHorizontal(left_widget)
local right_widget = NumberPickerWidget:new{ local right_widget = NumberPickerWidget:new{
@ -109,6 +118,7 @@ function DoubleSpinWidget:update(numberpicker_left_value, numberpicker_right_val
value_hold_step = self.right_hold_step, value_hold_step = self.right_hold_step,
precision = self.right_precision, precision = self.right_precision,
wrap = self.right_wrap, wrap = self.right_wrap,
unit = self.unit,
} }
self:mergeLayoutInHorizontal(right_widget) self:mergeLayoutInHorizontal(right_widget)
left_widget.picker_updated_callback = function(value) left_widget.picker_updated_callback = function(value)
@ -117,26 +127,43 @@ function DoubleSpinWidget:update(numberpicker_left_value, numberpicker_right_val
right_widget.picker_updated_callback = function(value) right_widget.picker_updated_callback = function(value)
self:update(left_widget:getValue(), value) self:update(left_widget:getValue(), value)
end end
local separator_widget = TextWidget:new{
text = self.is_range and "" or "",
face = self.title_face,
bold = true,
}
local text_max_width = math.floor(0.95 * self.width / 2) local text_max_width = math.floor(0.95 * self.width / 2)
local left_vertical_group = VerticalGroup:new{ local left_vertical_group = VerticalGroup:new{
align = "center", align = "center",
TextWidget:new{
text = self.left_text,
face = self.title_face,
max_width = text_max_width,
},
left_widget, left_widget,
} }
local separator_vertical_group = VerticalGroup:new{
align = "center",
separator_widget,
}
local right_vertical_group = VerticalGroup:new{ local right_vertical_group = VerticalGroup:new{
align = "center", align = "center",
TextWidget:new{ right_widget,
}
if self.left_text ~= "" or self.right_text ~= "" then
table.insert(left_vertical_group, 1, TextWidget:new{
text = self.left_text,
face = self.title_face,
max_width = text_max_width,
})
table.insert(separator_vertical_group, 1, TextWidget:new{
text = "",
face = self.title_face,
})
table.insert(right_vertical_group, 1, TextWidget:new{
text = self.right_text, text = self.right_text,
face = self.title_face, face = self.title_face,
max_width = text_max_width, max_width = text_max_width,
}, })
right_widget, end
}
local widget_group = HorizontalGroup:new{ local widget_group = HorizontalGroup:new{
align = "center", align = "center",
CenterContainer:new{ CenterContainer:new{
@ -144,15 +171,19 @@ function DoubleSpinWidget:update(numberpicker_left_value, numberpicker_right_val
w = self.width / 2, w = self.width / 2,
h = left_vertical_group:getSize().h, h = left_vertical_group:getSize().h,
}, },
left_vertical_group left_vertical_group,
},
CenterContainer:new{
dimen = Geom:new{},
separator_vertical_group,
}, },
CenterContainer:new{ CenterContainer:new{
dimen = Geom:new{ dimen = Geom:new{
w = self.width / 2, w = self.width / 2,
h = right_vertical_group:getSize().h, h = right_vertical_group:getSize().h,
}, },
right_vertical_group right_vertical_group,
} },
} }
local title_bar = TitleBar:new{ local title_bar = TitleBar:new{
@ -167,17 +198,26 @@ function DoubleSpinWidget:update(numberpicker_left_value, numberpicker_right_val
local buttons = {} local buttons = {}
if self.default_values then if self.default_values then
local separator = self.is_range and "" or "/"
local unit = ""
if self.unit then
if self.unit == "°" then
unit = self.unit
elseif self.unit ~= "" then
unit = "\xE2\x80\xAF" .. self.unit -- use Narrow No-Break Space (NNBSP) here
end
end
table.insert(buttons, { table.insert(buttons, {
{ {
text = self.default_text or T(_("Apply default values: %1 / %2"), text = self.default_text or T(_("Default values: %1%3 %4 %2%3"),
self.left_precision and string.format(self.left_precision, self.left_default) or self.left_default, self.left_precision and string.format(self.left_precision, self.left_default) or self.left_default,
self.right_precision and string.format(self.right_precision, self.right_default) or self.right_default), self.right_precision and string.format(self.right_precision, self.right_default) or self.right_default,
unit, separator),
callback = function() callback = function()
left_widget.value = self.left_default left_widget.value = self.left_default
right_widget.value = self.right_default right_widget.value = self.right_default
left_widget:update() left_widget:update()
right_widget:update() right_widget:update()
self.callback(nil, nil)
end, end,
} }
}) })
@ -209,7 +249,8 @@ function DoubleSpinWidget:update(numberpicker_left_value, numberpicker_right_val
}, },
{ {
text = self.ok_text, text = self.ok_text,
enabled = self.left_value ~= left_widget:getValue() or self.right_value ~= right_widget:getValue(), enabled = self.ok_always_enabled or self.left_value ~= left_widget:getValue()
or self.right_value ~= right_widget:getValue(),
callback = function() callback = function()
self.left_value = left_widget:getValue() self.left_value = left_widget:getValue()
self.right_value = right_widget:getValue() self.right_value = right_widget:getValue()

@ -22,6 +22,7 @@ local VerticalSpan = require("ui/widget/verticalspan")
local WidgetContainer = require("ui/widget/container/widgetcontainer") local WidgetContainer = require("ui/widget/container/widgetcontainer")
local time = require("ui/time") local time = require("ui/time")
local _ = require("gettext") local _ = require("gettext")
local C_ = _.pgettext
local Screen = Device.screen local Screen = Device.screen
local FrontLightWidget = FocusManager:new{ local FrontLightWidget = FocusManager:new{
@ -181,7 +182,7 @@ function FrontLightWidget:layout()
self.fl_level, self.fl_level,
} }
local fl_min = Button:new{ local fl_min = Button:new{
text = _("Min"), text = C_("Extrema", "Min"),
margin = Size.margin.small, margin = Size.margin.small,
radius = 0, radius = 0,
enabled = true, enabled = true,
@ -192,7 +193,7 @@ function FrontLightWidget:layout()
end, -- min is 1 (We use 0 to mean "toggle") end, -- min is 1 (We use 0 to mean "toggle")
} }
local fl_max = Button:new{ local fl_max = Button:new{
text = _("Max"), text = C_("Extrema", "Max"),
margin = Size.margin.small, margin = Size.margin.small,
radius = 0, radius = 0,
enabled = true, enabled = true,
@ -310,7 +311,7 @@ function FrontLightWidget:layout()
self.nl_level, self.nl_level,
} }
local nl_min = Button:new{ local nl_min = Button:new{
text = _("Min"), text = C_("Extrema", "Min"),
margin = Size.margin.small, margin = Size.margin.small,
radius = 0, radius = 0,
enabled = true, enabled = true,
@ -321,7 +322,7 @@ function FrontLightWidget:layout()
end, end,
} }
local nl_max = Button:new{ local nl_max = Button:new{
text = _("Max"), text = C_("Extrema", "Max"),
margin = Size.margin.small, margin = Size.margin.small,
radius = 0, radius = 0,
enabled = true, enabled = true,

@ -50,6 +50,7 @@ local NumberPickerWidget = FocusManager:new{
date_year = nil, date_year = nil,
-- on update signal to the caller and pass updated value -- on update signal to the caller and pass updated value
picker_updated_callback = nil, picker_updated_callback = nil,
unit = "",
} }
function NumberPickerWidget:init() function NumberPickerWidget:init()
@ -176,8 +177,16 @@ function NumberPickerWidget:init()
end end
end end
local unit = ""
if self.unit then
if self.unit == "°" then
unit = self.unit
elseif self.unit ~= "" then
unit = "\xE2\x80\xAF" .. self.unit -- use Narrow No-Break Space (NNBSP) here
end
end
self.text_value = Button:new{ self.text_value = Button:new{
text = tostring(self.formatted_value), text = tostring(self.formatted_value) .. unit,
bordersize = 0, bordersize = 0,
padding = 0, padding = 0,
text_font_face = self.spinner_face.font, text_font_face = self.spinner_face.font,

@ -49,6 +49,7 @@ local SpinWidget = FocusManager:new{
-- Optional extra button above ok/cancel buttons row -- Optional extra button above ok/cancel buttons row
option_text = nil, option_text = nil,
option_callback = nil, option_callback = nil,
unit = nil,
} }
function SpinWidget:init() function SpinWidget:init()
@ -80,6 +81,9 @@ function SpinWidget:init()
} }
end end
if self.unit and self.unit ~= "" then
self.precision = self.precision and self.precision or "%1d"
end
-- Actually the widget layout -- Actually the widget layout
self:update() self:update()
end end
@ -102,6 +106,7 @@ function SpinWidget:update(numberpicker_value, numberpicker_value_index)
picker_updated_callback = function(value, value_index) picker_updated_callback = function(value, value_index)
self:update(value, value_index) self:update(value, value_index)
end, end,
unit = self.unit,
} }
self:mergeLayoutInVertical(value_widget) self:mergeLayoutInVertical(value_widget)
local value_group = HorizontalGroup:new{ local value_group = HorizontalGroup:new{
@ -121,10 +126,18 @@ function SpinWidget:update(numberpicker_value, numberpicker_value_index)
local buttons = {} local buttons = {}
if self.default_value then if self.default_value then
local unit = ""
if self.unit then
if self.unit == "°" then
unit = self.unit
elseif self.unit ~= "" then
unit = "\xE2\x80\xAF" .. self.unit -- use Narrow No-Break Space (NNBSP) here
end
end
table.insert(buttons, { table.insert(buttons, {
{ {
text = self.default_text or T(_("Default value: %1"), text = self.default_text or T(_("Default value: %1%2"),
self.precision and string.format(self.precision, self.default_value) or self.default_value), self.precision and string.format(self.precision, self.default_value) or self.default_value, unit),
callback = function() callback = function()
value_widget.value = self.default_value value_widget.value = self.default_value
value_widget:update() value_widget:update()

@ -4,6 +4,7 @@ This module contains miscellaneous helper functions for the KOReader frontend.
local BaseUtil = require("ffi/util") local BaseUtil = require("ffi/util")
local _ = require("gettext") local _ = require("gettext")
local C_ = _.pgettext
local T = BaseUtil.template local T = BaseUtil.template
local lshift = bit.lshift local lshift = bit.lshift
@ -203,18 +204,18 @@ function util.secondsToHClock(seconds, withoutSeconds, hmsFormat, withDays)
end end
if hmsFormat then if hmsFormat then
-- @translators This is the 'h' for hour, like in 1h30m30s. This is a duration. -- @translators This is the 'h' for hour, like in 1h30m30s. This is a duration.
time_string = time_string:gsub(":", _("h"), 1) time_string = time_string:gsub(":", C_("Time", "h"), 1)
-- @translators This is the 'm' for minute, like in 1h30m30s. This is a duration. -- @translators This is the 'm' for minute, like in 1h30m30s. This is a duration.
time_string = time_string:gsub(":", _("m"), 1) time_string = time_string:gsub(":", C_("Time", "m"), 1)
time_string = time_string:gsub("^00" .. _("h"), "") -- delete leading "00h" time_string = time_string:gsub("^00" .. C_("Time", "h"), "") -- delete leading "00h"
time_string = time_string:gsub("^0", "") -- delete leading "0" time_string = time_string:gsub("^0", "") -- delete leading "0"
-- @translators This is the 's' for second, like in 1h30m30s. This is a duration. -- @translators This is the 's' for second, like in 1h30m30s. This is a duration.
return withoutSeconds and time_string or (time_string .. _("s")) return withoutSeconds and time_string or (time_string .. C_("Time", "s"))
else else
-- @translators This is the 'h' for hour, like in 1h30m30s. This is a duration. -- @translators This is the 'h' for hour, like in 1h30m30s. This is a duration.
time_string = time_string:gsub(":", _("h"), 1) time_string = time_string:gsub(":", C_("Time", "h"), 1)
time_string = time_string:gsub(":", "'", 1) time_string = time_string:gsub(":", "'", 1)
time_string = time_string:gsub("^00" .. _("h"), "") -- delete leading "00h" time_string = time_string:gsub("^00" .. C_("Time", "h"), "") -- delete leading "00h"
time_string = time_string:gsub("^0", "") -- delete leading "0" time_string = time_string:gsub("^0", "") -- delete leading "0"
return withoutSeconds and time_string or (time_string .. SECONDS_SYMBOL) return withoutSeconds and time_string or (time_string .. SECONDS_SYMBOL)
end end

@ -22,6 +22,7 @@ local UIManager = require("ui/uimanager")
local WidgetContainer = require("ui/widget/container/widgetcontainer") local WidgetContainer = require("ui/widget/container/widgetcontainer")
local logger = require("logger") local logger = require("logger")
local _ = require("gettext") local _ = require("gettext")
local C_ = _.pgettext
local T = FFIUtil.template local T = FFIUtil.template
local Screen = require("device").screen local Screen = require("device").screen
local util = require("util") local util = require("util")
@ -483,7 +484,7 @@ function AutoWarmth:getLocationMenu()
}, },
{ {
text_func = function() text_func = function()
return T(_("Coordinates: (%1, %2)"), self.latitude, self.longitude) return T(_("Coordinates: (%1°, %2°)"), self.latitude, self.longitude)
end, end,
callback = function(touchmenu_instance) callback = function(touchmenu_instance)
local location_widget = DoubleSpinWidget:new{ local location_widget = DoubleSpinWidget:new{
@ -503,6 +504,7 @@ function AutoWarmth:getLocationMenu()
right_step = 0.1, right_step = 0.1,
right_hold_step = 5, right_hold_step = 5,
right_precision = "%0.2f", right_precision = "%0.2f",
unit = "°",
callback = function(lat, long) callback = function(lat, long)
self.latitude = lat self.latitude = lat
self.longitude = long self.longitude = long
@ -520,7 +522,7 @@ function AutoWarmth:getLocationMenu()
}, },
{ {
text_func = function() text_func = function()
return T(_("Altitude: %1m"), self.altitude) return T(_("Altitude: %1 m"), self.altitude)
end, end,
callback = function(touchmenu_instance) callback = function(touchmenu_instance)
UIManager:show(SpinWidget:new{ UIManager:show(SpinWidget:new{
@ -532,6 +534,7 @@ function AutoWarmth:getLocationMenu()
wrap = false, wrap = false,
value_step = 10, value_step = 10,
value_hold_step = 100, value_hold_step = 100,
unit = C_("Length", "m"),
ok_text = _("Set"), ok_text = _("Set"),
callback = function(spin) callback = function(spin)
self.altitude = spin.value self.altitude = spin.value
@ -676,9 +679,9 @@ function AutoWarmth:getWarmthMenu()
text_func = function() text_func = function()
if Device:hasNaturalLight() then if Device:hasNaturalLight() then
if self.warmth[num] <= 100 then if self.warmth[num] <= 100 then
return T(_("%1: %2%"), text, self.warmth[num]) return T(_("%1: %2 %"), text, self.warmth[num])
else else
return T(_("%1: 100% + ☾"), text) return T(_("%1: 100 % + ☾"), text)
end end
else else
if self.warmth[num] <= 100 then if self.warmth[num] <= 100 then
@ -699,6 +702,7 @@ function AutoWarmth:getWarmthMenu()
wrap = false, wrap = false,
value_step = math.floor(100 / device_max_warmth), value_step = math.floor(100 / device_max_warmth),
value_hold_step = 10, value_hold_step = 10,
unit = "%",
ok_text = _("Set"), ok_text = _("Set"),
callback = function(spin) callback = function(spin)
self.warmth[num] = spin.value self.warmth[num] = spin.value

@ -19,6 +19,7 @@ local util = require("util")
local T = FFIUtil.template local T = FFIUtil.template
local time = require("ui/time") local time = require("ui/time")
local _ = require("gettext") local _ = require("gettext")
local C_ = _.pgettext
local logger = require("logger") local logger = require("logger")
if not Device:isTouchDevice() then if not Device:isTouchDevice() then
@ -457,6 +458,7 @@ Higher values mean faster screen updates, but also use more CPU.]]),
value_max = 60.0, value_max = 60.0,
value_step = 1, value_step = 1,
value_hold_step = 15, value_hold_step = 15,
unit = C_("Frequency", "Hz"),
ok_text = _("Set rate"), ok_text = _("Set rate"),
default_value = default_value, default_value = default_value,
callback = function(spin) callback = function(spin)
@ -484,6 +486,7 @@ The interval value is in milliseconds and can range from 0 (0 seconds) to 2000 (
value_max = 2000, value_max = 2000,
value_step = 50, value_step = 50,
value_hold_step = 200, value_hold_step = 200,
unit = C_("Time", "ms"),
ok_text = _("Set interval"), ok_text = _("Set interval"),
default_value = GestureDetector.TAP_INTERVAL_MS, default_value = GestureDetector.TAP_INTERVAL_MS,
callback = function(spin) callback = function(spin)
@ -510,6 +513,7 @@ The interval value is in milliseconds and can range from 0 (0 seconds) to 2000 (
value_max = 2000, value_max = 2000,
value_step = 50, value_step = 50,
value_hold_step = 200, value_hold_step = 200,
unit = C_("Time", "ms"),
ok_text = _("Set interval"), ok_text = _("Set interval"),
default_value = 0, default_value = 0,
callback = function(spin) callback = function(spin)
@ -535,6 +539,7 @@ The interval value is in milliseconds and can range from 100 (0.1 seconds) to 20
value_max = 2000, value_max = 2000,
value_step = 100, value_step = 100,
value_hold_step = 500, value_hold_step = 500,
unit = C_("Time", "ms"),
ok_text = _("Set interval"), ok_text = _("Set interval"),
default_value = GestureDetector.DOUBLE_TAP_INTERVAL_MS, default_value = GestureDetector.DOUBLE_TAP_INTERVAL_MS,
callback = function(spin) callback = function(spin)
@ -561,6 +566,7 @@ The duration value is in milliseconds and can range from 100 (0.1 seconds) to 20
value_max = 2000, value_max = 2000,
value_step = 100, value_step = 100,
value_hold_step = 500, value_hold_step = 500,
unit = C_("Time", "ms"),
ok_text = _("Set duration"), ok_text = _("Set duration"),
default_value = GestureDetector.TWO_FINGER_TAP_DURATION_MS, default_value = GestureDetector.TWO_FINGER_TAP_DURATION_MS,
callback = function(spin) callback = function(spin)
@ -587,6 +593,7 @@ The interval value is in milliseconds and can range from 100 (0.1 seconds) to 20
value_max = 2000, value_max = 2000,
value_step = 100, value_step = 100,
value_hold_step = 500, value_hold_step = 500,
unit = C_("Time", "ms"),
ok_text = _("Set interval"), ok_text = _("Set interval"),
default_value = GestureDetector.HOLD_INTERVAL_MS, default_value = GestureDetector.HOLD_INTERVAL_MS,
callback = function(spin) callback = function(spin)
@ -612,6 +619,7 @@ The interval value is in milliseconds and can range from 100 (0.1 seconds) to 20
value_min = 100, value_min = 100,
value_max = 2000, value_max = 2000,
value_step = 100, value_step = 100,
unit = C_("Time", "ms"),
value_hold_step = 500, value_hold_step = 500,
ok_text = _("Set interval"), ok_text = _("Set interval"),
default_value = GestureDetector.SWIPE_INTERVAL_MS, default_value = GestureDetector.SWIPE_INTERVAL_MS,

@ -20,6 +20,7 @@ local lfs = require("libs/libkoreader-lfs")
local logger = require("logger") local logger = require("logger")
local util = require("util") local util = require("util")
local _ = require("gettext") local _ = require("gettext")
local C_ = _.pgettext
local N_ = _.ngettext local N_ = _.ngettext
local T = FFIUtil.template local T = FFIUtil.template
@ -935,21 +936,21 @@ function ReaderStatistics:addToMainMenu(menu_items)
sub_item_table = { sub_item_table = {
{ {
text_func = function() text_func = function()
return T(_("Read page duration limits: %1 s / %2 s"), return T(_("Read page duration limits: %1 s %2 s"),
self.settings.min_sec, self.settings.max_sec) self.settings.min_sec, self.settings.max_sec)
end, end,
callback = function(touchmenu_instance) callback = function(touchmenu_instance)
local DoubleSpinWidget = require("/ui/widget/doublespinwidget") local DoubleSpinWidget = require("/ui/widget/doublespinwidget")
local durations_widget local durations_widget
durations_widget = DoubleSpinWidget:new{ durations_widget = DoubleSpinWidget:new{
left_text = _("Min"), left_text = C_("Extrema", "Min"),
left_value = self.settings.min_sec, left_value = self.settings.min_sec,
left_default = DEFAULT_MIN_READ_SEC, left_default = DEFAULT_MIN_READ_SEC,
left_min = 0, left_min = 0,
left_max = 120, left_max = 120,
left_step = 1, left_step = 1,
left_hold_step = 10, left_hold_step = 10,
right_text = _("Max"), right_text = C_("Extrema", "Max"),
right_value = self.settings.max_sec, right_value = self.settings.max_sec,
right_default = DEFAULT_MAX_READ_SEC, right_default = DEFAULT_MAX_READ_SEC,
right_min = 10, right_min = 10,
@ -957,19 +958,17 @@ function ReaderStatistics:addToMainMenu(menu_items)
right_step = 10, right_step = 10,
right_hold_step = 60, right_hold_step = 60,
default_values = true, default_values = true,
is_range = true,
-- @translators This is the time unit for seconds.
unit = C_("Time", "s"),
title_text = _("Read page duration limits"), title_text = _("Read page duration limits"),
info_text = _([[ info_text = _([[
Set min and max time spent (in seconds) on a page for it to be counted as read in statistics. Set min and max time spent (in seconds) on a page for it to be counted as read in statistics.
The min value ensures pages you quickly browse and skip are not included. The min value ensures pages you quickly browse and skip are not included.
The max value ensures a page you stay on for a long time (because you fell asleep or went away) will be included, but with a duration capped to this specified max value.]]), The max value ensures a page you stay on for a long time (because you fell asleep or went away) will be included, but with a duration capped to this specified max value.]]),
callback = function(min, max) callback = function(min, max)
if not min then -- "Default" button pressed
min = DEFAULT_MIN_READ_SEC
max = DEFAULT_MAX_READ_SEC
end
self.settings.min_sec = min self.settings.min_sec = min
self.settings.max_sec = max self.settings.max_sec = max
UIManager:close(durations_widget)
touchmenu_instance:updateItems() touchmenu_instance:updateItems()
end, end,
} }

@ -77,6 +77,7 @@ local TextWidget = require("ui/widget/textwidget")
local bit = require("bit") local bit = require("bit")
local lfs = require("libs/libkoreader-lfs") local lfs = require("libs/libkoreader-lfs")
local _ = require("gettext") local _ = require("gettext")
local C_ = _.pgettext
local T = require("ffi/util").template local T = require("ffi/util").template
local CHUNK_SIZE = 80 * 40 -- max. nb of read bytes (reduce this, if taps are not detected) local CHUNK_SIZE = 80 * 40 -- max. nb of read bytes (reduce this, if taps are not detected)
@ -550,6 +551,7 @@ Aliases (shortcuts) to frequently used commands can be placed in:
value_max = 30, value_max = 30,
value_hold_step = 2, value_hold_step = 2,
default_value = 16, default_value = 16,
unit = C_("Data storage size", "kB"),
title_text = _("Terminal emulator buffer size (kB)"), title_text = _("Terminal emulator buffer size (kB)"),
callback = function(spin) callback = function(spin)
G_reader_settings:saveSetting("terminal_buffer_size", spin.value) G_reader_settings:saveSetting("terminal_buffer_size", spin.value)

Loading…
Cancel
Save