|
|
|
@ -10,41 +10,23 @@ local Screen = require("device").screen
|
|
|
|
|
local Menu = require("ui/widget/menu")
|
|
|
|
|
local Font = require("ui/font")
|
|
|
|
|
local util = require("ffi/util")
|
|
|
|
|
local DEBUG = require("dbg")
|
|
|
|
|
local _ = require("gettext")
|
|
|
|
|
local dump = require("dump")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local defaults_path = DataStorage:getDataDir() .. "/defaults.lua"
|
|
|
|
|
local persistent_filename = DataStorage:getDataDir() .. "/defaults.persistent.lua"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local SetDefaults = InputContainer:new{
|
|
|
|
|
defaults_name = {},
|
|
|
|
|
defaults_value = {},
|
|
|
|
|
results = {},
|
|
|
|
|
defaults_menu = {},
|
|
|
|
|
already_read = false,
|
|
|
|
|
initialized = 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 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:ConfirmEdit()
|
|
|
|
|
if not SetDefaults.EditConfirmed then
|
|
|
|
|
UIManager:show(ConfirmBox:new{
|
|
|
|
@ -62,21 +44,20 @@ end
|
|
|
|
|
function SetDefaults:init()
|
|
|
|
|
self.results = {}
|
|
|
|
|
|
|
|
|
|
if not self.already_read then
|
|
|
|
|
local i = 0
|
|
|
|
|
for n,v in util.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 ~= "LIBRARY_PATH" then
|
|
|
|
|
i = i + 1
|
|
|
|
|
if not self.initialized then
|
|
|
|
|
local defaults = {}
|
|
|
|
|
local load_defaults = loadfile(defaults_path)
|
|
|
|
|
setfenv(load_defaults, defaults)
|
|
|
|
|
load_defaults()
|
|
|
|
|
|
|
|
|
|
local i = 1
|
|
|
|
|
for n, v in util.orderedPairs(defaults) do
|
|
|
|
|
self.defaults_name[i] = n
|
|
|
|
|
self.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
|
|
|
|
|
self.defaults_name[i] = n
|
|
|
|
|
self.defaults_value[i] = getTableValues(v,n)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
self.already_read = true
|
|
|
|
|
|
|
|
|
|
self.initialized = true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local menu_container = CenterContainer:new{
|
|
|
|
@ -102,32 +83,33 @@ function SetDefaults:init()
|
|
|
|
|
UIManager:close(menu_container)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local cancel_button = {
|
|
|
|
|
text = _("Cancel"),
|
|
|
|
|
enabled = true,
|
|
|
|
|
callback = function()
|
|
|
|
|
self:close()
|
|
|
|
|
UIManager:show(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()
|
|
|
|
|
local setting_name = self.defaults_name[i]
|
|
|
|
|
local setting_type = type(_G[setting_name])
|
|
|
|
|
if setting_type == "boolean" then
|
|
|
|
|
local editBoolean = function()
|
|
|
|
|
self.set_dialog = InputDialog:new{
|
|
|
|
|
title = self.defaults_name[i] .. ":",
|
|
|
|
|
title = setting_name,
|
|
|
|
|
input = tostring(self.defaults_value[i]),
|
|
|
|
|
buttons = {
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
text = _("Cancel"),
|
|
|
|
|
enabled = true,
|
|
|
|
|
callback = function()
|
|
|
|
|
self:close()
|
|
|
|
|
UIManager:show(menu_container)
|
|
|
|
|
end
|
|
|
|
|
},
|
|
|
|
|
cancel_button,
|
|
|
|
|
{
|
|
|
|
|
text = "true",
|
|
|
|
|
enabled = true,
|
|
|
|
|
callback = function()
|
|
|
|
|
self.defaults_value[i] = true
|
|
|
|
|
_G[self.defaults_name[i]] = true
|
|
|
|
|
_G[setting_name] = true
|
|
|
|
|
settings_changed = true
|
|
|
|
|
self.changed[i] = true
|
|
|
|
|
self.results[i].text = self:build_setting(i)
|
|
|
|
@ -141,7 +123,7 @@ function SetDefaults:init()
|
|
|
|
|
enabled = true,
|
|
|
|
|
callback = function()
|
|
|
|
|
self.defaults_value[i] = false
|
|
|
|
|
_G[self.defaults_name[i]] = false
|
|
|
|
|
_G[setting_name] = false
|
|
|
|
|
settings_changed = true
|
|
|
|
|
self.changed[i] = true
|
|
|
|
|
self.results[i].text = self:build_setting(i)
|
|
|
|
@ -152,59 +134,44 @@ function SetDefaults:init()
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
input_type = settings_type,
|
|
|
|
|
input_type = setting_type,
|
|
|
|
|
width = Screen:getWidth() * 0.95,
|
|
|
|
|
height = Screen:getHeight() * 0.2,
|
|
|
|
|
}
|
|
|
|
|
self.set_dialog:onShowKeyboard()
|
|
|
|
|
UIManager:show(self.set_dialog)
|
|
|
|
|
end
|
|
|
|
|
})
|
|
|
|
|
else
|
|
|
|
|
if type(_G[self.defaults_name[i]]) == "table" then
|
|
|
|
|
|
|
|
|
|
table.insert(self.results, {
|
|
|
|
|
text = self:build_setting(i),
|
|
|
|
|
callback = function()
|
|
|
|
|
callback = editBoolean
|
|
|
|
|
})
|
|
|
|
|
elseif setting_type == "table" then
|
|
|
|
|
local editTable = function()
|
|
|
|
|
local fields = {}
|
|
|
|
|
for m, n in util.orderedPairs(_G[self.defaults_name[i]]) do
|
|
|
|
|
for k, v in util.orderedPairs(_G[setting_name]) do
|
|
|
|
|
table.insert(fields, {
|
|
|
|
|
text = tostring(m) .. " = " .. tostring(n),
|
|
|
|
|
text = tostring(k) .. " = " .. tostring(v),
|
|
|
|
|
hint = "",
|
|
|
|
|
})
|
|
|
|
|
end
|
|
|
|
|
self.set_dialog = MultiInputDialog:new{
|
|
|
|
|
title = self.defaults_name[i] .. ":",
|
|
|
|
|
title = setting_name,
|
|
|
|
|
fields = fields,
|
|
|
|
|
buttons = {
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
text = _("Cancel"),
|
|
|
|
|
enabled = true,
|
|
|
|
|
callback = function()
|
|
|
|
|
self:close()
|
|
|
|
|
UIManager:show(menu_container)
|
|
|
|
|
end,
|
|
|
|
|
},
|
|
|
|
|
cancel_button,
|
|
|
|
|
{
|
|
|
|
|
text = _("OK"),
|
|
|
|
|
enabled = true,
|
|
|
|
|
is_enter_default = true,
|
|
|
|
|
callback = function()
|
|
|
|
|
local fields = {}
|
|
|
|
|
local new_table = {}
|
|
|
|
|
for _, field in ipairs(MultiInputDialog:getFields()) do
|
|
|
|
|
fields[field:match("^[^= ]+")] = field:match("[^= ]+$")
|
|
|
|
|
end
|
|
|
|
|
_G[self.defaults_name[i]] = fields
|
|
|
|
|
self.defaults_value[i] = "{"
|
|
|
|
|
DEBUG(_G[self.defaults_name[i]])
|
|
|
|
|
for k,v in util.orderedPairs(_G[self.defaults_name[i]]) do
|
|
|
|
|
if tonumber(k) then
|
|
|
|
|
self.defaults_value[i] = self.defaults_value[i] .. v .. ", "
|
|
|
|
|
else
|
|
|
|
|
self.defaults_value[i] = self.defaults_value[i] .. k .. " = " .. v .. ", "
|
|
|
|
|
end
|
|
|
|
|
new_table[field:match("^[^= ]+")] = field:match("[^= ]+$")
|
|
|
|
|
end
|
|
|
|
|
self.defaults_value[i] = self.defaults_value[i]:sub(1,self.defaults_value[i]:len()-2) .. "}"
|
|
|
|
|
_G[setting_name] = new_table
|
|
|
|
|
|
|
|
|
|
self.defaults_value[i] = _G[setting_name]
|
|
|
|
|
settings_changed = true
|
|
|
|
|
self.changed[i] = true
|
|
|
|
|
|
|
|
|
@ -224,38 +191,39 @@ function SetDefaults:init()
|
|
|
|
|
self.set_dialog:onShowKeyboard()
|
|
|
|
|
UIManager:show(self.set_dialog)
|
|
|
|
|
end
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
table.insert(self.results, {
|
|
|
|
|
text = self:build_setting(i),
|
|
|
|
|
callback = function()
|
|
|
|
|
callback = editTable
|
|
|
|
|
})
|
|
|
|
|
else
|
|
|
|
|
local editNumStr = function()
|
|
|
|
|
self.set_dialog = InputDialog:new{
|
|
|
|
|
title = self.defaults_name[i] .. ":",
|
|
|
|
|
title = setting_name,
|
|
|
|
|
input = tostring(self.defaults_value[i]),
|
|
|
|
|
buttons = {
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
text = _("Cancel"),
|
|
|
|
|
enabled = true,
|
|
|
|
|
callback = function()
|
|
|
|
|
self:close()
|
|
|
|
|
UIManager:show(menu_container)
|
|
|
|
|
end,
|
|
|
|
|
},
|
|
|
|
|
cancel_button,
|
|
|
|
|
{
|
|
|
|
|
text = _("OK"),
|
|
|
|
|
is_enter_default = true,
|
|
|
|
|
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]]
|
|
|
|
|
local new_value = self.set_dialog:getInputText()
|
|
|
|
|
if setting_type == "boolean" then
|
|
|
|
|
if new_value == "true" then
|
|
|
|
|
new_value = true
|
|
|
|
|
else
|
|
|
|
|
new_value = false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if _G[setting_name] ~= new_value then
|
|
|
|
|
_G[setting_name] = new_value
|
|
|
|
|
self.defaults_value[i] = new_value
|
|
|
|
|
settings_changed = true
|
|
|
|
|
self.changed[i] = true
|
|
|
|
|
self.results[i].text = self:build_setting(i)
|
|
|
|
|
end
|
|
|
|
|
self:close()
|
|
|
|
|
self.defaults_menu:swithItemTable("Defaults", self.results, i)
|
|
|
|
|
UIManager:show(menu_container)
|
|
|
|
@ -263,29 +231,30 @@ function SetDefaults:init()
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
input_type = settings_type,
|
|
|
|
|
input_type = setting_type,
|
|
|
|
|
width = Screen:getWidth() * 0.95,
|
|
|
|
|
height = Screen:getHeight() * 0.2,
|
|
|
|
|
}
|
|
|
|
|
self.set_dialog:onShowKeyboard()
|
|
|
|
|
UIManager:show(self.set_dialog)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
table.insert(self.results, {
|
|
|
|
|
text = self:build_setting(i),
|
|
|
|
|
callback = editNumStr
|
|
|
|
|
})
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
self.defaults_menu:swithItemTable("Defaults", self.results)
|
|
|
|
|
UIManager:show(menu_container)
|
|
|
|
|
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 you want to save the settings to \"defaults.persistent.lua\"?"),
|
|
|
|
|
text = _('Are you sure you want to save the settings to "defaults.persistent.lua"?'),
|
|
|
|
|
ok_callback = function()
|
|
|
|
|
self:SaveSettings()
|
|
|
|
|
end,
|
|
|
|
@ -293,73 +262,75 @@ function SetDefaults:ConfirmSave()
|
|
|
|
|
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])
|
|
|
|
|
local setting_name = self.defaults_name[j]
|
|
|
|
|
local ret = setting_name .. " = "
|
|
|
|
|
if type(_G[setting_name]) == "boolean" then
|
|
|
|
|
return ret .. tostring(self.defaults_value[j])
|
|
|
|
|
elseif type(_G[setting_name]) == "table" then
|
|
|
|
|
return ret .. "{...}"
|
|
|
|
|
elseif tonumber(self.defaults_value[j]) then
|
|
|
|
|
ret = ret .. tostring(tonumber(self.defaults_value[j]))
|
|
|
|
|
return ret .. tostring(tonumber(self.defaults_value[j]))
|
|
|
|
|
else
|
|
|
|
|
ret = ret .. "\"" .. tostring(self.defaults_value[j]) .. "\""
|
|
|
|
|
return 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
|
|
|
|
|
self.results = {}
|
|
|
|
|
local persisted_defaults = {}
|
|
|
|
|
local file = io.open(persistent_filename, "r")
|
|
|
|
|
if file ~= nil then
|
|
|
|
|
file:close()
|
|
|
|
|
local load_defaults = loadfile(persistent_filename)
|
|
|
|
|
setfenv(load_defaults, persisted_defaults)
|
|
|
|
|
load_defaults()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local persistent_filename = DataStorage:getDataDir() .. "/defaults.persistent.lua"
|
|
|
|
|
local file
|
|
|
|
|
if io.open(persistent_filename,"r") == nil then
|
|
|
|
|
file = io.open(persistent_filename, "w")
|
|
|
|
|
file:write("-- For configuration changes that persists between (nightly) releases\n")
|
|
|
|
|
file:close()
|
|
|
|
|
local checked = {}
|
|
|
|
|
for j=1, #self.defaults_name do
|
|
|
|
|
if not self.changed[j] then checked[j] = true end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local dpl = {}
|
|
|
|
|
fileread(persistent_filename, dpl)
|
|
|
|
|
local dl = {}
|
|
|
|
|
fileread("defaults.lua",dl)
|
|
|
|
|
self.results = {}
|
|
|
|
|
local done = {}
|
|
|
|
|
|
|
|
|
|
for j=1,#SetDefaults.defaults_name do
|
|
|
|
|
if not self.changed[j] then done[j] = true end
|
|
|
|
|
-- load default value for defaults
|
|
|
|
|
local defaults = {}
|
|
|
|
|
local load_defaults = loadfile(defaults_path)
|
|
|
|
|
setfenv(load_defaults, defaults)
|
|
|
|
|
load_defaults()
|
|
|
|
|
-- handle case "found in persistent" and changed, replace/delete it
|
|
|
|
|
for k, v in pairs(persisted_defaults) do
|
|
|
|
|
for j=1, #self.defaults_name do
|
|
|
|
|
if not checked[j]
|
|
|
|
|
and k == self.defaults_name[j] then
|
|
|
|
|
-- remove from persist if value got reverted back to the
|
|
|
|
|
-- default one
|
|
|
|
|
if defaults[k] == self.defaults_value[j] then
|
|
|
|
|
persisted_defaults[k] = nil
|
|
|
|
|
else
|
|
|
|
|
persisted_defaults[k] = self.defaults_value[j]
|
|
|
|
|
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
|
|
|
|
|
checked[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)
|
|
|
|
|
-- handle case "not in persistent and different in non-persistent", add to
|
|
|
|
|
-- persistent
|
|
|
|
|
for j=1, #self.defaults_name do
|
|
|
|
|
if not checked[j] then
|
|
|
|
|
persisted_defaults[self.defaults_name[j]] = self.defaults_value[j]
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
file = io.open(persistent_filename, "w")
|
|
|
|
|
if file then
|
|
|
|
|
for i = 1,#dpl do
|
|
|
|
|
file:write(dpl[i] .. "\n")
|
|
|
|
|
file:write("-- For configuration changes that persists between updates\n")
|
|
|
|
|
for k, v in pairs(persisted_defaults) do
|
|
|
|
|
local line = {}
|
|
|
|
|
table.insert(line, k)
|
|
|
|
|
table.insert(line, " = ")
|
|
|
|
|
table.insert(line, dump(v))
|
|
|
|
|
table.insert(line, "\n")
|
|
|
|
|
file:write(table.concat(line))
|
|
|
|
|
end
|
|
|
|
|
file:close()
|
|
|
|
|
UIManager:show(InfoMessage:new{
|
|
|
|
@ -368,4 +339,5 @@ function SetDefaults:SaveSettings()
|
|
|
|
|
end
|
|
|
|
|
settings_changed = false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return SetDefaults
|
|
|
|
|