2
0
mirror of https://github.com/koreader/koreader synced 2024-11-18 03:25:46 +00:00
koreader/plugins/terminal.koplugin/aliases.lua
NiLuJe eef938996f MultiDialog: Fix an extremely nasty API misuse
Stuff was poking at the class object, not the instance's :s.

Fix #9599
2022-10-06 19:28:26 +02:00

170 lines
6.1 KiB
Lua

local KeyValuePage = require("ui/widget/keyvaluepage")
local InfoMessage = require("ui/widget/infomessage")
local MultiInputDialog = require("ui/widget/multiinputdialog")
local UIManager = require("ui/uimanager")
local _ = require("gettext")
local util = require("util")
local T = require("ffi/util").template
local Aliases = {
filename = "",
close_callback = nil,
parent = nil,
alias_kv = nil,
kv_pairs = {},
}
function Aliases:show(filename, close_callback, parent)
self.filename = filename
self.close_callback = close_callback
self.parent = parent
self:load()
self.alias_kv = KeyValuePage:new{
title = "Aliases (Shortcuts)",
kv_pairs = self.kv_pairs,
close_callback = self.close_callback,
}
UIManager:show(self.alias_kv)
end
function Aliases:updateKeyValues()
self.alias_kv.kv_pairs = self.kv_pairs
UIManager:close(self.alias_kv)
self.alias_kv = KeyValuePage:new{
title = "Aliases (Shortcuts)",
kv_pairs = self.kv_pairs,
close_callback = self.close_callback,
}
UIManager:show(self.alias_kv)
end
function Aliases:load()
local file = io.open(self.filename, "r")
self.kv_pairs = {}
if file then
for line in file:lines() do
line = line:gsub("^ *alias *", "") -- drop alias
local dummy, separator = line:find("^[%a%d][%a%d-_]*%=") -- find separator
if line ~= "" and line:sub(1, 1) ~= "#" and separator then
local alias_name = line:sub(1, separator - 1)
local alias_command = line:sub(separator + 1):gsub("\"", "")
table.insert(self.kv_pairs, {alias_name, alias_command,
callback = function() self.editAlias(self, alias_name, alias_command) end
})
end
end
file:close()
table.sort(self.kv_pairs, function(a, b) return a[1] < b[1] end)
end
table.insert(self.kv_pairs, 1,
{ _("Create a new alias"), "", callback = function() self.editAlias(self, "", "") end})
table.insert(self.kv_pairs, 2, "---")
end
function Aliases:save()
local file = io.open(self.filename .. ".new", "w")
if not file then
UIManager:show(InfoMessage:new{
text = T(_("Terminal emulator: error saving: %1"), self.filename)
})
end
file:write("# Aliases generated by terminal emulator\n\n")
for i = 3, #self.kv_pairs do
file:write("alias " .. self.kv_pairs[i][1] .. "=\"" .. self.kv_pairs[i][2] .. "\"\n")
end
file:close()
os.remove(self.filename)
os.rename(self.filename .. ".new", self.filename)
end
function Aliases:editAlias(alias_name, alias_command)
local alias_input
alias_input = MultiInputDialog:new{
title = _("Edit alias"),
fields = {
{
description = _("Alias name:"),
text = alias_name,
},
{
description = _("Alias command:"),
text = alias_command,
},
},
buttons = {
{
{
text = _("Cancel"),
callback = function()
UIManager:close(alias_input)
end
},
{
text = _("Delete"),
callback = function()
UIManager:close(alias_input)
for i, v in pairs(self.kv_pairs) do
if v[1] == alias_name then
table.remove(self.kv_pairs, i)
self.parent:transmit("unalias " .. alias_name .."\n")
end
end
self:save()
self:updateKeyValues()
end
},
{
text = _("Save"),
callback = function()
local fields = alias_input:getFields()
local name = fields[1] and util.trim(fields[1])
local value = fields[2] and util.trim(fields[2])
if name ~= "" and value ~= "" then
UIManager:close(alias_input)
for i, v in pairs(self.kv_pairs) do
if v[1] == alias_name then
table.remove(self.kv_pairs, i)
self.parent:transmit("unalias " .. alias_name .."\n")
end
end
self.parent:transmit("alias " .. name .. "='" .. value .. "'\n")
table.insert(self.kv_pairs, {name, value,
callback = function()
self.editAlias(self, name, value)
end
})
table.remove(self.kv_pairs, 2)
table.remove(self.kv_pairs, 1)
table.sort(self.kv_pairs, function(a, b) return a[1] < b[1] end)
table.insert(self.kv_pairs, 1, { _("Create a new alias"), "",
callback = function() self:editAlias(self, "", "") end })
table.insert(self.kv_pairs, 2, "---")
self:save()
self:updateKeyValues()
end
end
},
{
text = _("Execute"),
callback = function()
local fields = alias_input:getFields()
local value = fields[2] and util.trim(fields[2])
if value ~= "" then
UIManager:close(alias_input)
self.alias_kv:onClose()
self.parent:transmit(value .. "\n")
end
end
},
},
},
}
UIManager:show(alias_input)
alias_input:onShowKeyboard()
end
return Aliases