mirror of
https://github.com/koreader/koreader.git
synced 2025-12-13 20:36:53 +01:00
* [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
235 lines
7.6 KiB
Lua
235 lines
7.6 KiB
Lua
local InputContainer = require("ui/widget/container/inputcontainer")
|
|
local InputDialog = require("ui/widget/inputdialog")
|
|
local DoubleKeyValuePage = require("doublekeyvaluepage")
|
|
local MultiInputDialog = require("ui/widget/multiinputdialog")
|
|
local InfoMessage = require("ui/widget/infomessage")
|
|
local UIManager = require("ui/uimanager")
|
|
local Screen = require("device").screen
|
|
local _ = require("gettext")
|
|
local NetworkMgr = require("ui/network/manager")
|
|
|
|
local Goodreads = InputContainer:new {
|
|
goodreads_key = "",
|
|
goodreads_secret = "",
|
|
}
|
|
|
|
function Goodreads:init()
|
|
local gr_sett = DoubleKeyValuePage:readGRSettings().data
|
|
if gr_sett.goodreads then
|
|
self.goodreads_key = gr_sett.goodreads.key
|
|
self.goodreads_secret = gr_sett.goodreads.secret
|
|
end
|
|
self.ui.menu:registerToMainMenu(self)
|
|
end
|
|
|
|
function Goodreads:addToMainMenu(menu_items)
|
|
menu_items.goodreads = {
|
|
text = _("Goodreads"),
|
|
sub_item_table = {
|
|
{
|
|
text = _("Settings"),
|
|
callback = function() self:updateSettings() end,
|
|
},
|
|
{
|
|
text = _("Search all books"),
|
|
callback = function()
|
|
if self.goodreads_key ~= "" then
|
|
self:search("all")
|
|
else
|
|
UIManager:show(InfoMessage:new{
|
|
text = _("Please set up your Goodreads key in the settings dialog"),
|
|
})
|
|
end
|
|
end,
|
|
},
|
|
{
|
|
text = _("Search for book by title"),
|
|
callback = function()
|
|
if self.goodreads_key ~= "" then
|
|
self:search("title")
|
|
else
|
|
UIManager:show(InfoMessage:new{
|
|
text = _("Please set up your Goodreads key in the settings dialog"),
|
|
})
|
|
end
|
|
end,
|
|
},
|
|
{
|
|
text = _("Search for book by author"),
|
|
callback = function()
|
|
if self.goodreads_key ~= "" then
|
|
self:search("author")
|
|
|
|
else
|
|
UIManager:show(InfoMessage:new{
|
|
text = _("Please set up your Goodreads key in the settings dialog"),
|
|
})
|
|
end
|
|
end,
|
|
},
|
|
},
|
|
}
|
|
end
|
|
|
|
function Goodreads:updateSettings()
|
|
local hint_top
|
|
local text_top
|
|
local hint_bottom
|
|
local text_bottom
|
|
local text_info = _([[
|
|
How to generate a key and a secret key:
|
|
|
|
1. Go to https://www.goodreads.com/user/sign_up and create an account
|
|
2. Register for a development key on the following page: https://www.goodreads.com/user/sign_in?rd=true
|
|
3. Your key and secret key will now be available on https://www.goodreads.com/api/key
|
|
4. Enter your generated key and your secret key in the settings dialog (Login to Goodreads window)
|
|
]])
|
|
|
|
if self.goodreads_key == "" then
|
|
hint_top = _("Goodreads key left empty")
|
|
text_top = ""
|
|
else
|
|
hint_top = ""
|
|
text_top = self.goodreads_key
|
|
end
|
|
|
|
if self.goodreads_secret == "" then
|
|
hint_bottom = _("Goodreads secret left empty (optional)")
|
|
text_bottom = ""
|
|
else
|
|
hint_bottom = ""
|
|
text_bottom = self.goodreads_key
|
|
end
|
|
self.settings_dialog = MultiInputDialog:new {
|
|
title = _("Login to Goodreads"),
|
|
fields = {
|
|
{
|
|
text = text_top,
|
|
input_type = "string",
|
|
hint = hint_top ,
|
|
},
|
|
{
|
|
text = text_bottom,
|
|
input_type = "string",
|
|
hint = hint_bottom,
|
|
},
|
|
},
|
|
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 = _("Apply"),
|
|
callback = function()
|
|
self:saveSettings(MultiInputDialog:getFields())
|
|
self.settings_dialog:onClose()
|
|
UIManager:close(self.settings_dialog)
|
|
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 Goodreads:saveSettings(fields)
|
|
if fields then
|
|
self.goodreads_key = fields[1]
|
|
self.goodreads_secret = fields[2]
|
|
end
|
|
local settings = {
|
|
key = self.goodreads_key,
|
|
secret = self.goodreads_secret,
|
|
}
|
|
DoubleKeyValuePage:saveGRSettings(settings)
|
|
end
|
|
|
|
-- search_type = all - search all
|
|
-- search_type = author - serch book by author
|
|
-- search_type = title - search book by title
|
|
function Goodreads:search(search_type)
|
|
local title_header
|
|
local hint
|
|
local search_input
|
|
local text_input
|
|
local info
|
|
local result
|
|
if not NetworkMgr:isOnline() then
|
|
NetworkMgr:promptWifiOn()
|
|
return
|
|
end
|
|
if search_type == "all" then
|
|
title_header = _("Search all books in Goodreads")
|
|
hint = _("Title, author or ISBN")
|
|
elseif search_type == "author" then
|
|
title_header = _("Search for book by author in Goodreads")
|
|
hint = _("Author")
|
|
elseif search_type == "title" then
|
|
title_header = _("Search for book by title in Goodreads")
|
|
hint = _("Title")
|
|
end
|
|
|
|
search_input = InputDialog:new{
|
|
title = title_header,
|
|
input = "",
|
|
input_hint = hint,
|
|
input_type = "string",
|
|
buttons = {
|
|
{
|
|
{
|
|
text = _("Cancel"),
|
|
callback = function()
|
|
UIManager:close(search_input)
|
|
end,
|
|
},
|
|
{
|
|
text = _("Find"),
|
|
is_enter_default = true,
|
|
callback = function()
|
|
text_input = search_input:getInputText()
|
|
if text_input ~= nil and text_input ~= "" then
|
|
info = InfoMessage:new{text = _("Please wait…")}
|
|
UIManager:close(search_input)
|
|
UIManager:show(info)
|
|
UIManager:forceRePaint()
|
|
result = DoubleKeyValuePage:new{
|
|
title = _("Select book"),
|
|
text_input = text_input,
|
|
search_type = search_type,
|
|
}
|
|
if #result.kv_pairs > 0 then
|
|
UIManager:show(result)
|
|
end
|
|
UIManager:close(info)
|
|
|
|
else
|
|
UIManager:show(InfoMessage:new{
|
|
text =_("Please enter text"),
|
|
})
|
|
end
|
|
end,
|
|
},
|
|
}
|
|
},
|
|
}
|
|
UIManager:show(search_input)
|
|
search_input:onShowKeyboard()
|
|
end
|
|
|
|
return Goodreads
|