mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
And not also settings that are different from the ones loaded. This prevents Koreader from overwriting your complete persistent.defaults.settings when you started Koreader with a malformated persistent.defaults.settings file and choose "save settings". In such a malformated case you just can edit the damaged setting and save it back (although you can't see which one is damaged since the defaults settings are taken)
357 lines
13 KiB
Lua
357 lines
13 KiB
Lua
local InfoMessage = require("ui/widget/infomessage")
|
|
local UIManager = require("ui/uimanager")
|
|
local _ = require("gettext")
|
|
local InputContainer = require("ui/widget/container/inputcontainer")
|
|
local InputDialog = require("ui/widget/inputdialog")
|
|
local ConfirmBox = require("ui/widget/confirmbox")
|
|
local CenterContainer = require("ui/widget/container/centercontainer")
|
|
local Screen = require("ui/screen")
|
|
local Menu = require("ui/widget/menu")
|
|
local Font = require("ui/font")
|
|
|
|
local SetDefaults = InputContainer:new{
|
|
defaults_name = {},
|
|
defaults_value = {},
|
|
results = {},
|
|
defaults_menu = {},
|
|
already_read = false,
|
|
changed = {}
|
|
}
|
|
|
|
local function settype(b,t)
|
|
if t == "boolean" then
|
|
if b == "false" then return false else return true end
|
|
else
|
|
return b
|
|
end
|
|
end
|
|
|
|
local function __genOrderedIndex( t )
|
|
-- this function is taken from http://lua-users.org/wiki/SortedIteration
|
|
local orderedIndex = {}
|
|
for key in pairs(t) do
|
|
table.insert( orderedIndex, key )
|
|
end
|
|
table.sort( orderedIndex )
|
|
return orderedIndex
|
|
end
|
|
|
|
local function orderedNext(t, state)
|
|
-- this function is taken from http://lua-users.org/wiki/SortedIteration
|
|
|
|
-- Equivalent of the next function, but returns the keys in the alphabetic
|
|
-- order. We use a temporary ordered key table that is stored in the
|
|
-- table being iterated.
|
|
|
|
if state == nil then
|
|
-- the first time, generate the index
|
|
t.__orderedIndex = __genOrderedIndex( t )
|
|
key = t.__orderedIndex[1]
|
|
return key, t[key]
|
|
end
|
|
-- fetch the next value
|
|
key = nil
|
|
for i = 1,table.getn(t.__orderedIndex) do
|
|
if t.__orderedIndex[i] == state then
|
|
key = t.__orderedIndex[i+1]
|
|
end
|
|
end
|
|
|
|
if key then
|
|
return key, t[key]
|
|
end
|
|
|
|
-- no more value to return, cleanup
|
|
t.__orderedIndex = nil
|
|
return
|
|
end
|
|
|
|
local function orderedPairs(t)
|
|
-- this function is taken from http://lua-users.org/wiki/SortedIteration
|
|
-- Equivalent of the pairs() function on tables. Allows to iterate
|
|
-- in order
|
|
return orderedNext, t, nil
|
|
end
|
|
|
|
function SetDefaults:ConfirmEdit()
|
|
if not SetDefaults.EditConfirmed then
|
|
UIManager:show(ConfirmBox:new{
|
|
text = _("Some changes will just work on the next restart. Wrong settings might crash Koreader! Continue?"),
|
|
ok_callback = function()
|
|
self.EditConfirmed = true
|
|
self:init()
|
|
end,
|
|
})
|
|
else
|
|
self:init()
|
|
end
|
|
end
|
|
|
|
function SetDefaults:init()
|
|
|
|
self.defaults_name = {}
|
|
self.defaults_value = {}
|
|
self.results = {}
|
|
|
|
self.filldefaults()
|
|
|
|
local menu_container = CenterContainer:new{
|
|
dimen = Screen:getSize(),
|
|
}
|
|
|
|
self.defaults_menu = Menu:new{
|
|
width = Screen:getWidth()-15,
|
|
height = Screen:getHeight()-15,
|
|
cface = Font:getFace("cfont", 22),
|
|
show_parent = menu_container,
|
|
_manager = self,
|
|
}
|
|
table.insert(menu_container, self.defaults_menu)
|
|
self.defaults_menu.close_callback = function()
|
|
UIManager:close(menu_container)
|
|
end
|
|
|
|
for i=1,#self.defaults_name do
|
|
self.changed[i] = false
|
|
local settings_type = type(_G[self.defaults_name[i]])
|
|
if settings_type == "boolean" then
|
|
table.insert(self.results, {
|
|
text = self:build_setting(i),
|
|
callback = function()
|
|
GLOBAL_INPUT_VALUE = tostring(self.defaults_value[i])
|
|
self.set_dialog = InputDialog:new{
|
|
title = self.defaults_name[i] .. ":",
|
|
buttons = {
|
|
{
|
|
{
|
|
text = _("Cancel"),
|
|
enabled = true,
|
|
callback = function()
|
|
self:close()
|
|
UIManager:show(menu_container)
|
|
end
|
|
},
|
|
{
|
|
text = "true",
|
|
enabled = true,
|
|
callback = function()
|
|
self.defaults_value[i] = true
|
|
_G[self.defaults_name[i]] = true
|
|
settings_changed = true
|
|
self.changed[i] = true
|
|
self.results[i].text = self:build_setting(i)
|
|
self:close()
|
|
self.defaults_menu:swithItemTable("Defaults", self.results, i)
|
|
UIManager:show(menu_container)
|
|
end
|
|
},
|
|
{
|
|
text = "false",
|
|
enabled = true,
|
|
callback = function()
|
|
self.defaults_value[i] = false
|
|
_G[self.defaults_name[i]] = false
|
|
settings_changed = true
|
|
self.changed[i] = true
|
|
self.results[i].text = self:build_setting(i)
|
|
self.defaults_menu:swithItemTable("Defaults", self.results, i)
|
|
self:close()
|
|
UIManager:show(menu_container)
|
|
end
|
|
},
|
|
},
|
|
},
|
|
input_type = settings_type,
|
|
width = Screen:getWidth() * 0.95,
|
|
height = Screen:getHeight() * 0.2,
|
|
}
|
|
GLOBAL_INPUT_VALUE = nil
|
|
self.set_dialog:onShowKeyboard()
|
|
UIManager:show(self.set_dialog)
|
|
end
|
|
})
|
|
else
|
|
table.insert(self.results, {
|
|
text = self:build_setting(i),
|
|
callback = function()
|
|
GLOBAL_INPUT_VALUE = tostring(self.defaults_value[i])
|
|
self.set_dialog = InputDialog:new{
|
|
title = self.defaults_name[i] .. ":",
|
|
buttons = {
|
|
{
|
|
{
|
|
text = _("Cancel"),
|
|
enabled = true,
|
|
callback = function()
|
|
self:close()
|
|
UIManager:show(menu_container)
|
|
end,
|
|
},
|
|
{
|
|
text = _("OK"),
|
|
enabled = true,
|
|
callback = function()
|
|
if type(_G[self.defaults_name[i]]) == "table" then
|
|
self.defaults_value[i] = self.set_dialog:getInputText()
|
|
elseif _G[self.defaults_name[i]] ~= settype(self.set_dialog:getInputText(),settings_type) then
|
|
_G[self.defaults_name[i]] = settype(self.set_dialog:getInputText(),settings_type)
|
|
self.defaults_value[i] = _G[self.defaults_name[i]]
|
|
end
|
|
settings_changed = true
|
|
self.changed[i] = true
|
|
self.results[i].text = self:build_setting(i)
|
|
self:close()
|
|
self.defaults_menu:swithItemTable("Defaults", self.results, i)
|
|
UIManager:show(menu_container)
|
|
end,
|
|
},
|
|
},
|
|
},
|
|
input_type = settings_type,
|
|
width = Screen:getWidth() * 0.95,
|
|
height = Screen:getHeight() * 0.2,
|
|
}
|
|
GLOBAL_INPUT_VALUE = nil
|
|
self.set_dialog:onShowKeyboard()
|
|
UIManager:show(self.set_dialog)
|
|
end
|
|
})
|
|
end
|
|
end
|
|
self.defaults_menu:swithItemTable("Defaults", self.results)
|
|
UIManager:show(menu_container)
|
|
end
|
|
|
|
local function getTableValues(t,dtap)
|
|
local dummy = "{"
|
|
for n,v in pairs(t) do
|
|
if dtap:sub(1,4) == "DTAP" or dtap:sub(1,11) == "DDOUBLE_TAP" then
|
|
dummy = dummy .. tostring(n) .. " = " .. tostring(v) .. ", "
|
|
elseif tonumber(v) then
|
|
dummy = dummy .. tostring(v) .. ", "
|
|
else
|
|
dummy = dummy .. "\"" .. tostring(v) .. "\", "
|
|
end
|
|
end
|
|
dummy = dummy:sub(1,string.len(dummy) - 2) .. "}"
|
|
return dummy
|
|
end
|
|
|
|
function SetDefaults:filldefaults()
|
|
if not SetDefaults.already_read then
|
|
local i = 0
|
|
for n,v in orderedPairs(_G) do
|
|
if (not string.find(tostring(v), "<")) and (not string.find(tostring(v), ": ")) and string.sub(n,1,1) ~= "_" and string.upper(n) == n and n ~= "GLOBAL_INPUT_VALUE" and n ~= "LIBRARY_PATH" then
|
|
i = i + 1
|
|
SetDefaults.defaults_name[i] = n
|
|
SetDefaults.defaults_value[i] = v
|
|
end
|
|
if string.find(tostring(v), "table: ") and string.upper(n) == n and n ~= "ARGV" and n ~= "_G" then
|
|
i = i + 1
|
|
SetDefaults.defaults_name[i] = n
|
|
SetDefaults.defaults_value[i] = getTableValues(v,n)
|
|
end
|
|
end
|
|
SetDefaults.already_read = true
|
|
end
|
|
end
|
|
|
|
function SetDefaults:close()
|
|
self.set_dialog:onClose()
|
|
UIManager:close(self.set_dialog)
|
|
end
|
|
|
|
function SetDefaults:ConfirmSave()
|
|
UIManager:show(ConfirmBox:new{
|
|
text = _("Are you sure to save the settings to \"defaults.persistent.lua\"?"),
|
|
ok_callback = function()
|
|
self:SaveSettings()
|
|
end,
|
|
})
|
|
end
|
|
|
|
function SetDefaults:build_setting(j)
|
|
local ret = self.defaults_name[j] .. " = "
|
|
if type(_G[self.defaults_name[j]]) == "boolean" or type(_G[self.defaults_name[j]]) == "table" then
|
|
ret = ret .. tostring(self.defaults_value[j])
|
|
elseif tonumber(self.defaults_value[j]) then
|
|
ret = ret .. tostring(tonumber(self.defaults_value[j]))
|
|
else
|
|
ret = ret .. "\"" .. tostring(self.defaults_value[j]) .. "\""
|
|
end
|
|
return ret
|
|
end
|
|
|
|
function SetDefaults:SaveSettings()
|
|
|
|
local function fileread(filename,array)
|
|
local file = io.open(filename)
|
|
local line = file:read()
|
|
local counter = 0
|
|
while line do
|
|
counter = counter + 1
|
|
local i = string.find(line,"[-][-]") -- remove comments from file
|
|
if (i or 0)>1 then line = string.sub(line,1,i-1) end
|
|
array[counter] = line:gsub("^%s*(.-)%s*$", "%1") -- trim
|
|
line = file:read()
|
|
end
|
|
file:close()
|
|
end
|
|
|
|
local filename = "defaults.persistent.lua"
|
|
local file
|
|
if io.open(filename,"r") == nil then
|
|
file = io.open(filename, "w")
|
|
file:write("-- For configuration changes that persists between (nightly) releases\n")
|
|
file:close()
|
|
end
|
|
|
|
local dpl = {}
|
|
fileread("defaults.persistent.lua",dpl)
|
|
local dl = {}
|
|
fileread("defaults.lua",dl)
|
|
self.results = {}
|
|
self.filldefaults()
|
|
local done = {}
|
|
|
|
for j=1,#SetDefaults.defaults_name do
|
|
if not self.changed[j] then done[j] = true end
|
|
end
|
|
|
|
-- handle case "found in persistent", replace it
|
|
for i = 1,#dpl do
|
|
for j=1,#SetDefaults.defaults_name do
|
|
if not done[j] and string.find(dpl[i],SetDefaults.defaults_name[j] .. " ") == 1 then
|
|
dpl[i] = self:build_setting(j)
|
|
done[j] = true
|
|
end
|
|
end
|
|
end
|
|
|
|
-- handle case "exists identical in non-persistent", ignore it
|
|
for i = 1,#dl do
|
|
for j=1,#SetDefaults.defaults_name do
|
|
if not done[j] and dl[i]:gsub("1/4","0.25"):gsub("2/4","0.5"):gsub("3/4","0.75"):gsub("4/4","1"):gsub("1/8","0.125"):gsub("2/8","0.25"):gsub("3/8","0.375"):gsub("4/8","0.5"):gsub("5/8","0.625"):gsub("6/8","0.75"):gsub("7/8","0.875"):gsub("8/8","1"):gsub("1/16","0.0625"):gsub("15/16","0.9375"):gsub("1024[*]1024[*]10","10485760"):gsub("1024[*]1024[*]30","31457280"):gsub("[.]0$",""):gsub("([.][0-9]+)0","%1") == self:build_setting(j) then
|
|
done[j] = true
|
|
end
|
|
end
|
|
end
|
|
|
|
-- handle case "not in persistent and different in non-persistent", add to persistent
|
|
for j=1,#SetDefaults.defaults_name do
|
|
if not done[j] then
|
|
dpl[#dpl+1] = self:build_setting(j)
|
|
end
|
|
end
|
|
|
|
file = io.open("defaults.persistent.lua", "w")
|
|
for i = 1,#dpl do
|
|
file:write(dpl[i] .. "\n")
|
|
end
|
|
file:close()
|
|
UIManager:show(InfoMessage:new{text = _("Default settings successfully saved!")})
|
|
settings_changed = false
|
|
|
|
end
|
|
return SetDefaults
|