diff --git a/frontend/apps/filemanager/filemanagesetdefaults.lua b/frontend/apps/filemanager/filemanagesetdefaults.lua new file mode 100644 index 000000000..89fff824f --- /dev/null +++ b/frontend/apps/filemanager/filemanagesetdefaults.lua @@ -0,0 +1,253 @@ +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 SetDefaults = InputContainer:new{ + bools_name = {}, + bools_value = {}, + results = {}, + defaults_menu = {}, +} + +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() + UIManager:show(ConfirmBox:new{ + text = _("Wrong settings might crash Koreader! Continue?"), + ok_callback = function() + self:init() + end, + }) +end + +function SetDefaults:init() + self.bools_name = {} + self.bools_value = {} + self.results = {} + + self.fillbools() + + local menu_container = CenterContainer:new{ + dimen = Screen:getSize(), + } + + self.defaults_menu = Menu:new{ + width = Screen:getWidth()-50, + height = Screen:getHeight()-50, + 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.bools_name do + local dummy = self.bools_name[i] .. " = " + if type(_G[self.bools_name[i]]) == "string" and not tonumber(self.bools_value[i]) then + dummy = dummy .. "\"" .. tostring(self.bools_value[i]) .. "\"" -- add quotation marks to strings + else + dummy = dummy .. tostring(self.bools_value[i]) + end + table.insert(self.results, { + text = dummy, + callback = function() + + GLOBAL_INPUT_VALUE = tostring(self.bools_value[i]) + self.set_dialog = InputDialog:new{ + title = self.bools_name[i] .. ":", + buttons = { + { + { + text = _("Ok"), + enabled = true, + callback = function() + _G[self.bools_name[i]] = settype(self.set_dialog:getInputText(),type(_G[self.bools_name[i]])) + self:close() + end, + }, + { + text = _("cancel"), + enabled = true, + callback = function() + self:close() + end, + }, + }, + }, + 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 + self.defaults_menu:swithItemTable("Defaults", self.results) + UIManager:show(menu_container) +end + +function SetDefaults:fillbools() + 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" then + i = i + 1 + SetDefaults.bools_name[i] = n + SetDefaults.bools_value[i] = v + end + 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: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 function build_setting(j) + local ret = SetDefaults.bools_name[j] .. " = " + if tonumber(SetDefaults.bools_value[j]) then + ret = ret .. tostring(tonumber(SetDefaults.bools_value[j])) + elseif type(_G[SetDefaults.bools_name[j]]) == "boolean" then + ret = ret .. tostring(SetDefaults.bools_value[j]) + else + ret = ret .. "\"" .. tostring(SetDefaults.bools_value[j]) .. "\"" + end + return ret + 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.bools = {} + self.results = {} + self.fillbools() + local done = {} + + -- handle case "found in persistent", replace it + for i = 1,#dpl do + for j=1,#SetDefaults.bools_name do + if string.find(dpl[i],SetDefaults.bools_name[j]) == 1 then + dpl[i] = 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.bools_name do + if dl[i]:gsub("1024[*]1024[*]10","10485760"):gsub("1024[*]1024[*]30","31457280"):gsub("[.]0$",""):gsub("([.][0-9]+)0","%1") == 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.bools_name do + if not done[j] then + dpl[#dpl+1] = 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 to \"defaults.persistent.lua\"!")}) +end +return SetDefaults