Files
koreader-mirror/plugins/goodreads.koplugin/main.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

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