2
0
mirror of https://github.com/koreader/koreader synced 2024-11-04 12:00:25 +00:00
koreader/plugins/profiles.koplugin/main.lua
Philip Chan 107156c0a8
[feat] Non-touch improvements (#8859)
FocusManager: fix round x use y layout
FocusManager: add tab and shift tab focus navigation support
FocusManager: handle Press key by default
FocusManager: make sure selected in instance level
FocusManager: add hold event support
FocusManager: Half move instead of edge move
FocusManager: add keymap override support
FocusManager: refocusWidget will delegate to parent FocusManager
Focusmanager: refocusWidget can execute on next tick
inputtext: can move out of focus on back
inputtext: fix cannot exit for non-touch device
inputtext: fix cannot input text with kindle dx physical keyboard
fontlightwidget: add non-touch support
datetimewidget: add non-touch support
datetimewidget: fix set date failed in kindle DX, fix datetimewidget month range to 1~23 by default
datetimewidget: make hour max value to 23
multiinputdialog: add non-touch support
checkbox: focusable and focus style
virtualkeyboard: no need to press two back to unfocus inputtext
virtualkeyboard: collect FocusManager event key names to let VirtualKeyboard disable them
openwithdialog: add non-touch support
inputdialog: can close via back button
enable all InputDialog and MultiInputDialog can be close by back
keyboardlayoutdialog: non-touch support
readertoc: non touch device can expand/collapse in toc
bookstatuswidget: non touch support
keyvaluepage: non-touch support
calendarview: non-touch support
2022-03-04 21:20:00 +01:00

193 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"),
id = "close",
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