Files
koreader/frontend/apps/cloudstorage/ftp.lua
onde2rock e502bf04d3 [feat, UX] Support the virtualKeyboard on non touch-device (#3796)
* [VirtualKeyboard] Add support for keynaviguation

Also rename the variable "layout" to "keyboard_layout" because conflict
with the layout from the focusmanager

* Make the goto dialog compatible with key naviguation

My solution is to change the order of the widget. The last one will the
virtualkeybard so it catch all the keybinding, and below it, make the
dialog "is_always_active = true" so it can receive touch event.

* Correctly show the virtual keyboard on dpad devices

* change the order to call the virtualKeyboard so it end up on top

* Handle the multi input dialog

* Support reopening the virtualKeyboard by the Press key

* add check focusmanager

* Fix https://github.com/koreader/koreader/issues/3797

* MultiInputDialog : Now work on non touch-device

* Set the virtualkeyboard to be a modal widget

* Fix the layout in multiinputwidget

* Fix for the various combination of
hasKeys,hasDpad,isTouchDevice

* [Focusmanager] Better handling of malformed layout
2018-03-30 12:46:36 +02:00

153 lines
5.0 KiB
Lua

local ConfirmBox = require("ui/widget/confirmbox")
local FtpApi = require("apps/cloudstorage/ftpapi")
local InfoMessage = require("ui/widget/infomessage")
local MultiInputDialog = require("ui/widget/multiinputdialog")
local ReaderUI = require("apps/reader/readerui")
local Screen = require("device").screen
local UIManager = require("ui/uimanager")
local logger = require("logger")
local util = require("util")
local _ = require("gettext")
local T = require("ffi/util").template
local Ftp = {}
function Ftp:run(address, user, pass, path)
local url = FtpApi:generateUrl(address, user, pass) .. path
return FtpApi:listFolder(url, path)
end
function Ftp:downloadFile(item, address, user, pass, path, close)
local url = FtpApi:generateUrl(address, user, pass) .. item.url
logger.dbg("downloadFile url", url)
local response = FtpApi:downloadFile(url)
if response ~= nil then
path = util.fixUtf8(path, "_")
local file = io.open(path, "w")
file:write(response)
file:close()
UIManager:show(ConfirmBox:new{
text = T(_("File saved to:\n %1\nWould you like to read the downloaded book now?"),
path),
ok_callback = function()
close()
ReaderUI:showReader(path)
end
})
else
UIManager:show(InfoMessage:new{
text = T(_("Could not save file to:\n%1"), path),
timeout = 3,
})
end
end
function Ftp:config(item, callback)
local text_info = "FTP address must be in the format ftp://example.domian.com\n"..
"Also supported is format with IP e.g: ftp://10.10.10.1\n"..
"Username and password are optional."
local hint_name = _("Your FTP name")
local text_name = ""
local hint_address = _("FTP address eg ftp://example.com")
local text_address = ""
local hint_username = _("FTP username")
local text_username = ""
local hint_password = _("FTP password")
local text_password = ""
local hint_folder = _("FTP folder")
local text_folder = "/"
local title
local text_button_right = _("Add")
if item then
title = _("Edit FTP account")
text_button_right = _("Apply")
text_name = item.text
text_address = item.address
text_username = item.username
text_password = item.password
text_folder = item.folder
else
title = _("Add FTP account")
end
self.settings_dialog = MultiInputDialog:new {
title = title,
fields = {
{
text = text_name,
input_type = "string",
hint = hint_name ,
},
{
text = text_address,
input_type = "string",
hint = hint_address ,
},
{
text = text_username,
input_type = "string",
hint = hint_username,
},
{
text = text_password,
input_type = "string",
hint = hint_password,
},
{
text = text_folder,
input_type = "string",
hint = hint_folder,
},
},
buttons = {
{
{
text = _("Cancel"),
callback = function()
self.settings_dialog:onClose()
UIManager:close(self.settings_dialog)
end
},
{
text = _("Info"),
callback = function()
UIManager:show(InfoMessage:new{ text = text_info })
end
},
{
text = text_button_right,
callback = function()
local fields = MultiInputDialog:getFields()
if fields[1] ~= "" and fields[2] ~= "" then
if item then
-- edit
callback(item, fields)
else
-- add new
callback(fields)
end
self.settings_dialog:onClose()
UIManager:close(self.settings_dialog)
else
UIManager:show(InfoMessage:new{
text = _("Please fill in all fields.")
})
end
end
},
},
},
width = Screen:getWidth() * 0.95,
height = Screen:getHeight() * 0.2,
input_type = "text",
}
UIManager:show(self.settings_dialog)
self.settings_dialog:onShowKeyboard()
end
function Ftp:info(item)
local info_text = T(_"Type: %1\nName: %2\nAddress: %3", "FTP", item.text, item.address)
UIManager:show(InfoMessage:new{text = info_text})
end
return Ftp