mirror of
https://github.com/koreader/koreader
synced 2024-11-13 19:11:25 +00:00
5bbcb9ea79
Add the possibility to autostart profiles when KOReader is started with filemanager or lastfile. Discussed in #8020 If more profiles are selected, they are started in alphabetically order.
192 lines
6.5 KiB
Lua
192 lines
6.5 KiB
Lua
local ConfirmBox = require("ui/widget/confirmbox")
|
|
local DataStorage = require("datastorage")
|
|
local Dispatcher = require("dispatcher")
|
|
local FFIUtil = require("ffi/util")
|
|
local InfoMessage = require("ui/widget/infomessage")
|
|
local InputDialog = require("ui/widget/inputdialog")
|
|
local LuaSettings = require("luasettings")
|
|
local UIManager = require("ui/uimanager")
|
|
local WidgetContainer = require("ui/widget/container/widgetcontainer")
|
|
local _ = require("gettext")
|
|
local T = FFIUtil.template
|
|
|
|
local autostart_done = false
|
|
|
|
local Profiles = WidgetContainer:new{
|
|
name = "profiles",
|
|
profiles_file = DataStorage:getSettingsDir() .. "/profiles.lua",
|
|
profiles = nil,
|
|
data = nil,
|
|
updated = false,
|
|
}
|
|
|
|
function Profiles:init()
|
|
Dispatcher:init()
|
|
self.ui.menu:registerToMainMenu(self)
|
|
self:executeAutostart()
|
|
end
|
|
|
|
function Profiles:loadProfiles()
|
|
if self.profiles then
|
|
return
|
|
end
|
|
self.profiles = LuaSettings:open(self.profiles_file)
|
|
self.data = self.profiles.data
|
|
end
|
|
|
|
function Profiles:onFlushSettings()
|
|
if self.profiles and self.updated then
|
|
self.profiles:flush()
|
|
self.updated = false
|
|
end
|
|
end
|
|
|
|
function Profiles:addToMainMenu(menu_items)
|
|
menu_items.profiles = {
|
|
text = _("Profiles"),
|
|
sub_item_table_func = function()
|
|
return self:getSubMenuItems()
|
|
end,
|
|
}
|
|
end
|
|
|
|
function Profiles:getSubMenuItems()
|
|
self:loadProfiles()
|
|
local sub_item_table = {
|
|
{
|
|
text = _("New"),
|
|
keep_menu_open = true,
|
|
callback = function(touchmenu_instance)
|
|
local name_input
|
|
name_input = InputDialog:new{
|
|
title = _("Enter profile name"),
|
|
input = "",
|
|
buttons = {{
|
|
{
|
|
text = _("Cancel"),
|
|
callback = function()
|
|
UIManager:close(name_input)
|
|
end,
|
|
},
|
|
{
|
|
text = _("Save"),
|
|
callback = function()
|
|
local name = name_input:getInputText()
|
|
if not self:newProfile(name) then
|
|
UIManager:show(InfoMessage:new{
|
|
text = T(_("There is already a profile called: %1"), name),
|
|
})
|
|
return
|
|
end
|
|
UIManager:close(name_input)
|
|
touchmenu_instance.item_table = self:getSubMenuItems()
|
|
touchmenu_instance.page = 1
|
|
touchmenu_instance:updateItems()
|
|
end,
|
|
},
|
|
}},
|
|
}
|
|
UIManager:show(name_input)
|
|
name_input:onShowKeyboard()
|
|
end,
|
|
separator = true,
|
|
}
|
|
}
|
|
for k,v in FFIUtil.orderedPairs(self.data) do
|
|
local sub_items = {
|
|
{
|
|
text = _("Delete profile"),
|
|
keep_menu_open = false,
|
|
separator = true,
|
|
callback = function()
|
|
UIManager:show(ConfirmBox:new{
|
|
text = _("Do you want to delete this profile?"),
|
|
ok_text = _("Yes"),
|
|
cancel_text = _("No"),
|
|
ok_callback = function()
|
|
self:deleteProfile(k)
|
|
end,
|
|
})
|
|
end,
|
|
},
|
|
{
|
|
text = _("Autostart"),
|
|
help_text = _("Execute this profile when KOReader is started with 'file browser' or 'last file'."),
|
|
checked_func = function()
|
|
return self:isAutostartProfile(k)
|
|
end,
|
|
separator = true,
|
|
callback = function()
|
|
if self:isAutostartProfile(k) then
|
|
self:deleteAutostartProfile(k)
|
|
else
|
|
self:setAutostartProfile(k)
|
|
end
|
|
end,
|
|
},
|
|
}
|
|
Dispatcher:addSubMenu(self, sub_items, self.data, k)
|
|
table.insert(sub_item_table, {
|
|
text = k,
|
|
hold_keep_menu_open = false,
|
|
sub_item_table = sub_items,
|
|
hold_callback = function()
|
|
Dispatcher:execute(self.data[k])
|
|
end,
|
|
})
|
|
end
|
|
return sub_item_table
|
|
end
|
|
|
|
function Profiles:newProfile(name)
|
|
if self.data[name] == nil then
|
|
self.data[name] = {}
|
|
self.updated = true
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
function Profiles:deleteProfile(name)
|
|
self.data[name] = nil
|
|
self.updated = true
|
|
self:deleteAutostartProfile(name)
|
|
end
|
|
|
|
function Profiles:isAutostartProfile(name)
|
|
return G_reader_settings:has("autostart_profiles") and G_reader_settings:readSetting("autostart_profiles")[name] == true
|
|
end
|
|
|
|
function Profiles:setAutostartProfile(name)
|
|
local autostart_table = G_reader_settings:has("autostart_profiles") and G_reader_settings:readSetting("autostart_profiles") or {}
|
|
autostart_table[name] = true
|
|
G_reader_settings:saveSetting("autostart_profiles", autostart_table)
|
|
end
|
|
|
|
function Profiles:deleteAutostartProfile(name)
|
|
local autostart_table = G_reader_settings:has("autostart_profiles") and G_reader_settings:readSetting("autostart_profiles") or {}
|
|
autostart_table[name] = nil
|
|
G_reader_settings:saveSetting("autostart_profiles", autostart_table)
|
|
end
|
|
|
|
function Profiles:executeAutostart()
|
|
if not autostart_done then
|
|
self:loadProfiles()
|
|
local autostart_table = G_reader_settings:has("autostart_profiles") and G_reader_settings:readSetting("autostart_profiles") or {}
|
|
for autostart_profile_name, profile_enabled in pairs(autostart_table) do
|
|
if self.data[autostart_profile_name] and profile_enabled then
|
|
UIManager:nextTick(function()
|
|
Dispatcher:execute(self.data[autostart_profile_name])
|
|
end)
|
|
else
|
|
autostart_table[autostart_profile_name] = nil -- remove deleted profile form autostart_profile
|
|
G_reader_settings:saveSetting("autostart_profiles", autostart_table)
|
|
end
|
|
end
|
|
autostart_done = true
|
|
end
|
|
end
|
|
|
|
return Profiles
|