mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
Profiles: various fixes related to registration and gestures (#10033)
- Keep profile registration in a duplicate. - Fix profile menu update on register/unregister. - Update gestures and profiles after renaming a profile. - Update gestures and profiles after deleting a profile. - Update gestures and profiles after unregistering a profile. - Fix Profiles touchmenu stack update.
This commit is contained in:
@@ -15,6 +15,7 @@ local autostart_done = false
|
||||
|
||||
local Profiles = WidgetContainer:extend{
|
||||
name = "profiles",
|
||||
prefix = "profile_exec_",
|
||||
profiles_file = DataStorage:getSettingsDir() .. "/profiles.lua",
|
||||
profiles = nil,
|
||||
data = nil,
|
||||
@@ -55,12 +56,12 @@ function Profiles:onFlushSettings()
|
||||
end
|
||||
|
||||
local function dispatcherRegisterProfile(name)
|
||||
Dispatcher:registerAction("profile_exec_"..name,
|
||||
Dispatcher:registerAction(Profiles.prefix..name,
|
||||
{category="none", event="ProfileExecute", arg=name, title=T(_("Profile %1"), name), general=true})
|
||||
end
|
||||
|
||||
local function dispatcherUnregisterProfile(name)
|
||||
Dispatcher:removeAction("profile_exec_"..name)
|
||||
Dispatcher:removeAction(Profiles.prefix..name)
|
||||
end
|
||||
|
||||
function Profiles:onDispatcherRegisterActions()
|
||||
@@ -144,6 +145,8 @@ function Profiles:getSubMenuItems()
|
||||
callback = function(touchmenu_instance)
|
||||
if v.settings.registered then
|
||||
dispatcherUnregisterProfile(k)
|
||||
self:updateGestures(self.prefix..k)
|
||||
self:updateProfiles(self.prefix..k)
|
||||
self.data[k].settings.registered = nil
|
||||
else
|
||||
dispatcherRegisterProfile(k)
|
||||
@@ -152,7 +155,8 @@ function Profiles:getSubMenuItems()
|
||||
self.updated = true
|
||||
local actions_sub_menu = {}
|
||||
Dispatcher:addSubMenu(self, actions_sub_menu, self.data, k)
|
||||
touchmenu_instance.item_table[4].sub_item_table = actions_sub_menu -- item index in submenu
|
||||
touchmenu_instance.item_table[5].sub_item_table = actions_sub_menu -- "Edit actions" submenu (item #5)
|
||||
touchmenu_instance.item_table_stack[#touchmenu_instance.item_table_stack] = self:getSubMenuItems()
|
||||
end,
|
||||
},
|
||||
{
|
||||
@@ -165,17 +169,20 @@ function Profiles:getSubMenuItems()
|
||||
keep_menu_open = true,
|
||||
callback = function(touchmenu_instance)
|
||||
local function editCallback(new_name)
|
||||
self.data[new_name] = util.tableDeepCopy(v)
|
||||
self.data[new_name].settings.name = new_name
|
||||
self:updateAutostart(k, new_name)
|
||||
if v.settings.registered then
|
||||
dispatcherUnregisterProfile(k)
|
||||
dispatcherRegisterProfile(new_name)
|
||||
self:updateGestures(self.prefix..k, self.prefix..new_name)
|
||||
self:updateProfiles(self.prefix..k, self.prefix..new_name)
|
||||
end
|
||||
self:renameAutostart(k, new_name)
|
||||
self.data[new_name] = util.tableDeepCopy(v)
|
||||
self.data[new_name].settings.name = new_name
|
||||
self.data[k] = nil
|
||||
self.updated = true
|
||||
touchmenu_instance.item_table = self:getSubMenuItems()
|
||||
touchmenu_instance:updateItems()
|
||||
table.remove(touchmenu_instance.item_table_stack)
|
||||
end
|
||||
self:editProfileName(editCallback, k)
|
||||
end,
|
||||
@@ -187,10 +194,13 @@ function Profiles:getSubMenuItems()
|
||||
local function editCallback(new_name)
|
||||
self.data[new_name] = util.tableDeepCopy(v)
|
||||
self.data[new_name].settings.name = new_name
|
||||
self.data[new_name].settings.registered = nil
|
||||
if v.settings.registered then
|
||||
dispatcherRegisterProfile(new_name)
|
||||
end
|
||||
self.updated = true
|
||||
touchmenu_instance.item_table = self:getSubMenuItems()
|
||||
touchmenu_instance:updateItems()
|
||||
table.remove(touchmenu_instance.item_table_stack)
|
||||
end
|
||||
self:editProfileName(editCallback, k)
|
||||
end,
|
||||
@@ -204,14 +214,17 @@ function Profiles:getSubMenuItems()
|
||||
text = _("Do you want to delete this profile?"),
|
||||
ok_text = _("Delete"),
|
||||
ok_callback = function()
|
||||
self:updateAutostart(k)
|
||||
if v.settings.registered then
|
||||
dispatcherUnregisterProfile(k)
|
||||
self:updateGestures(self.prefix..k)
|
||||
self:updateProfiles(self.prefix..k)
|
||||
end
|
||||
self:renameAutostart(k)
|
||||
self.data[k] = nil
|
||||
self.updated = true
|
||||
touchmenu_instance.item_table = self:getSubMenuItems()
|
||||
touchmenu_instance:updateItems()
|
||||
table.remove(touchmenu_instance.item_table_stack)
|
||||
end,
|
||||
})
|
||||
end,
|
||||
@@ -268,7 +281,82 @@ function Profiles:editProfileName(editCallback, old_name)
|
||||
name_input:onShowKeyboard()
|
||||
end
|
||||
|
||||
function Profiles:renameAutostart(old_name, new_name)
|
||||
function Profiles:updateGestures(action_old_name, action_new_name)
|
||||
local gestures_path = FFIUtil.joinPath(DataStorage:getSettingsDir(), "gestures.lua")
|
||||
local all_gestures = LuaSettings:open(gestures_path) -- in file
|
||||
if not all_gestures then return end
|
||||
local updated = false
|
||||
for section, gestures in pairs(all_gestures.data) do -- custom_multiswipes, fm, reader sections
|
||||
for gesture_name, gesture in pairs(gestures) do
|
||||
if gesture[action_old_name] then
|
||||
local gesture_loaded = self.ui.gestures.gestures[gesture_name] -- in memory
|
||||
if gesture.settings and gesture.settings.order then
|
||||
for i, action in ipairs(gesture.settings.order) do
|
||||
if action == action_old_name then
|
||||
if action_new_name then
|
||||
gesture.settings.order[i] = action_new_name
|
||||
gesture_loaded.settings.order[i] = action_new_name
|
||||
else
|
||||
table.remove(gesture.settings.order, i)
|
||||
table.remove(gesture_loaded.settings.order, i)
|
||||
if #gesture.settings.order == 0 then
|
||||
gesture.settings.order = nil
|
||||
if #gesture.settings == 0 then
|
||||
gesture.settings = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
gesture[action_old_name] = nil
|
||||
gesture_loaded[action_old_name] = nil
|
||||
if action_new_name then
|
||||
gesture[action_new_name] = true
|
||||
gesture_loaded[action_new_name] = true
|
||||
else
|
||||
if #gesture == 0 then
|
||||
all_gestures.data[section][gesture_name] = nil
|
||||
end
|
||||
end
|
||||
updated = true
|
||||
end
|
||||
end
|
||||
end
|
||||
if updated then
|
||||
all_gestures:flush()
|
||||
end
|
||||
end
|
||||
|
||||
function Profiles:updateProfiles(action_old_name, action_new_name)
|
||||
for _, profile in pairs(self.data) do
|
||||
if profile[action_old_name] then
|
||||
if profile.settings and profile.settings.order then
|
||||
for i, action in ipairs(profile.settings.order) do
|
||||
if action == action_old_name then
|
||||
if action_new_name then
|
||||
profile.settings.order[i] = action_new_name
|
||||
else
|
||||
table.remove(profile.settings.order, i)
|
||||
if #profile.settings.order == 0 then
|
||||
profile.settings.order = nil
|
||||
end
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
profile[action_old_name] = nil
|
||||
if action_new_name then
|
||||
profile[action_new_name] = true
|
||||
end
|
||||
self.updated = true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Profiles:updateAutostart(old_name, new_name)
|
||||
if G_reader_settings:getSettingForExt("autostart_profiles", old_name) then
|
||||
G_reader_settings:saveSettingForExt("autostart_profiles", nil, old_name)
|
||||
if new_name then
|
||||
@@ -287,7 +375,7 @@ function Profiles:executeAutostart()
|
||||
Dispatcher:execute(self.data[autostart_profile_name])
|
||||
end)
|
||||
else
|
||||
self:renameAutostart(autostart_profile_name) -- remove deleted profile from autostart_profile
|
||||
self:updateAutostart(autostart_profile_name) -- remove deleted profile from autostart_profile
|
||||
end
|
||||
end
|
||||
autostart_done = true
|
||||
|
||||
Reference in New Issue
Block a user