From c8a6c144fa4872e212db7c62f3516e6b9452317d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Derungs?= Date: Thu, 26 Sep 2019 23:13:35 +0200 Subject: [PATCH] [fix] Make set defaults self contained (#5419) Fixes #5418. --- frontend/apps/filemanager/filemanagermenu.lua | 34 ++------ .../filemanager/filemanagersetdefaults.lua | 78 +++++++++++++------ 2 files changed, 61 insertions(+), 51 deletions(-) diff --git a/frontend/apps/filemanager/filemanagermenu.lua b/frontend/apps/filemanager/filemanagermenu.lua index 647e2964b..33ef53caf 100644 --- a/frontend/apps/filemanager/filemanagermenu.lua +++ b/frontend/apps/filemanager/filemanagermenu.lua @@ -10,6 +10,7 @@ local SetDefaults = require("apps/filemanager/filemanagersetdefaults") local UIManager = require("ui/uimanager") local Screen = Device.screen local dbg = require("dbg") +local lfs = require("libs/libkoreader-lfs") local logger = require("logger") local util = require("util") local _ = require("gettext") @@ -324,7 +325,6 @@ function FileManagerMenu:setUpdateItemTable() table.insert(self.menu_items.developer_options.sub_item_table, { text = _("Disable C blitter"), enabled_func = function() - local lfs = require("libs/libkoreader-lfs") return lfs.attributes("libs/libblitbuffer.so", "mode") == "file" end, checked_func = function() @@ -451,7 +451,9 @@ function FileManagerMenu:setUpdateItemTable() self.menu_items.restart_koreader = { text = _("Restart KOReader"), callback = function() - self:exitOrRestart(function() UIManager:restartKOReader() end) + self:exitOrRestart(function() + UIManager:restartKOReader() + end) end, } if not Device:canRestart() then @@ -487,30 +489,10 @@ dbg:guard(FileManagerMenu, 'setUpdateItemTable', end) function FileManagerMenu:exitOrRestart(callback) - if SetDefaults.settings_changed then - UIManager:show(ConfirmBox:new{ - text = _("You have unsaved default settings. Save them now?\nTap \"Cancel\" to return to KOReader."), - ok_text = _("Save"), - ok_callback = function() - SetDefaults.settings_changed = false - SetDefaults:saveSettings() - self:exitOrRestart(callback) - end, - cancel_text = _("Don't save"), - cancel_callback = function() - SetDefaults.settings_changed = false - self:exitOrRestart(callback) - end, - other_buttons = {{ - text = _("Cancel"), - }} - }) - else - UIManager:close(self.menu_container) - self.ui:onClose() - if callback then - callback() - end + UIManager:close(self.menu_container) + self.ui:onClose() + if callback then + callback() end end diff --git a/frontend/apps/filemanager/filemanagersetdefaults.lua b/frontend/apps/filemanager/filemanagersetdefaults.lua index bc4f21108..83362aa3e 100644 --- a/frontend/apps/filemanager/filemanagersetdefaults.lua +++ b/frontend/apps/filemanager/filemanagersetdefaults.lua @@ -1,6 +1,7 @@ local CenterContainer = require("ui/widget/container/centercontainer") local ConfirmBox = require("ui/widget/confirmbox") local DataStorage = require("datastorage") +local Device = require("device") local Font = require("ui/font") local InfoMessage = require("ui/widget/infomessage") local InputContainer = require("ui/widget/container/inputcontainer") @@ -10,6 +11,7 @@ local MultiInputDialog = require("ui/widget/multiinputdialog") local UIManager = require("ui/uimanager") local dump = require("dump") local isAndroid, android = pcall(require, "android") +local logger = require("logger") local util = require("ffi/util") local _ = require("gettext") local Screen = require("device").screen @@ -34,7 +36,6 @@ local SetDefaults = InputContainer:new{ defaults_value = {}, results = {}, defaults_menu = {}, - initialized = false, changed = {}, settings_changed = false, } @@ -56,28 +57,24 @@ end function SetDefaults:init() self.results = {} - if not self.initialized then - local defaults = {} - local load_defaults = loadfile(defaults_path) + local defaults = {} + local load_defaults = loadfile(defaults_path) + setfenv(load_defaults, defaults) + load_defaults() + + local file = io.open(persistent_defaults_path, "r") + if file ~= nil then + file:close() + load_defaults = loadfile(persistent_defaults_path) setfenv(load_defaults, defaults) load_defaults() + end - local file = io.open(persistent_defaults_path, "r") - if file ~= nil then - file:close() - load_defaults = loadfile(persistent_defaults_path) - setfenv(load_defaults, defaults) - load_defaults() - end - - local i = 1 - for n, v in util.orderedPairs(defaults) do - self.defaults_name[i] = n - self.defaults_value[i] = v - i = i + 1 - end - - self.initialized = true + local idx = 1 + for n, v in util.orderedPairs(defaults) do + self.defaults_name[idx] = n + self.defaults_value[idx] = v + idx = idx + 1 end local menu_container = CenterContainer:new{ @@ -99,8 +96,15 @@ function SetDefaults:init() show_parent = menu_container, _manager = self, } + -- Prevent menu from closing when editing a value + function self.defaults_menu:onMenuSelect(item) + item.callback() + end + table.insert(menu_container, self.defaults_menu) self.defaults_menu.close_callback = function() + logger.dbg("Closing defaults menu") + self:saveBeforeExit() UIManager:close(menu_container) end @@ -109,7 +113,6 @@ function SetDefaults:init() enabled = true, callback = function() self:close() - UIManager:show(menu_container) end, } @@ -136,7 +139,6 @@ function SetDefaults:init() self.results[i].text = self:build_setting(i) self:close() self.defaults_menu:switchItemTable("Defaults", self.results, i) - UIManager:show(menu_container) end }, { @@ -150,7 +152,6 @@ function SetDefaults:init() self.results[i].text = self:build_setting(i) self.defaults_menu:switchItemTable("Defaults", self.results, i) self:close() - UIManager:show(menu_container) end }, }, @@ -203,7 +204,6 @@ function SetDefaults:init() self:close() self.defaults_menu:switchItemTable("Defaults", self.results, i) - UIManager:show(menu_container) end, }, }, @@ -242,7 +242,6 @@ function SetDefaults:init() end self:close() self.defaults_menu:switchItemTable("Defaults", self.results, i) - UIManager:show(menu_container) end, }, }, @@ -356,4 +355,33 @@ function SetDefaults:saveSettings() self.settings_changed = false end +function SetDefaults:saveBeforeExit(callback) + local save_text = _("Save and quit") + if Device:canRestart() then + save_text = _("Save and restart") + end + if self.settings_changed then + UIManager:show(ConfirmBox:new{ + text = _("KOReader needs to be restarted to apply the new default settings."), + ok_text = save_text, + ok_callback = function() + self.settings_changed = false + self:saveSettings() + if Device:canRestart() then + UIManager:restartKOReader() + else + UIManager:quit() + end + end, + cancel_text = _("Discard changes"), + cancel_callback = function() + logger.info("discard defaults") + pcall(dofile, defaults_path) + pcall(dofile, persistent_defaults_path) + self.settings_changed = false + end, + }) + end +end + return SetDefaults