mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
Since wikipedia server is language specific we should first detect language of the text by querying Google Translate. Make sure you have access to both Google Translate and Wikipedia service to use this function.
326 lines
9.8 KiB
Lua
326 lines
9.8 KiB
Lua
local InputContainer = require("ui/widget/container/inputcontainer")
|
|
local Cache = require("cache")
|
|
local Geom = require("ui/geometry")
|
|
local Device = require("ui/device")
|
|
local DocSettings = require("docsettings")
|
|
local Event = require("ui/event")
|
|
local UIManager = require("ui/uimanager")
|
|
local DEBUG = require("dbg")
|
|
local _ = require("gettext")
|
|
|
|
local ReaderView = require("apps/reader/modules/readerview")
|
|
local ReaderZooming = require("apps/reader/modules/readerzooming")
|
|
local ReaderPanning = require("apps/reader/modules/readerpanning")
|
|
local ReaderRotation = require("apps/reader/modules/readerrotation")
|
|
local ReaderPaging = require("apps/reader/modules/readerpaging")
|
|
local ReaderRolling = require("apps/reader/modules/readerrolling")
|
|
local ReaderToc = require("apps/reader/modules/readertoc")
|
|
local ReaderBookmark = require("apps/reader/modules/readerbookmark")
|
|
local ReaderFont = require("apps/reader/modules/readerfont")
|
|
local ReaderTypeset = require("apps/reader/modules/readertypeset")
|
|
local ReaderMenu = require("apps/reader/modules/readermenu")
|
|
local ReaderGoto = require("apps/reader/modules/readergoto")
|
|
local ReaderConfig = require("apps/reader/modules/readerconfig")
|
|
local ReaderCropping = require("apps/reader/modules/readercropping")
|
|
local ReaderKoptListener = require("apps/reader/modules/readerkoptlistener")
|
|
local ReaderCoptListener = require("apps/reader/modules/readercoptlistener")
|
|
local ReaderHinting = require("apps/reader/modules/readerhinting")
|
|
local ReaderHighlight = require("apps/reader/modules/readerhighlight")
|
|
local ReaderScreenshot = require("apps/reader/modules/readerscreenshot")
|
|
local ReaderFrontLight = require("apps/reader/modules/readerfrontlight")
|
|
local ReaderDictionary = require("apps/reader/modules/readerdictionary")
|
|
local ReaderWikipedia = require("apps/reader/modules/readerwikipedia")
|
|
local ReaderHyphenation = require("apps/reader/modules/readerhyphenation")
|
|
local ReaderActivityIndicator = require("apps/reader/modules/readeractivityindicator")
|
|
local ReaderLink = require("apps/reader/modules/readerlink")
|
|
local PluginLoader = require("apps/reader/pluginloader")
|
|
|
|
--[[
|
|
This is an abstraction for a reader interface
|
|
|
|
it works using data gathered from a document interface
|
|
]]--
|
|
|
|
local ReaderUI = InputContainer:new{
|
|
key_events = {
|
|
Close = { { "Home" },
|
|
doc = "close document", event = "Close" },
|
|
},
|
|
active_widgets = {},
|
|
|
|
-- our own size
|
|
dimen = Geom:new{ w = 400, h = 600 },
|
|
-- if we have a parent container, it must be referenced for now
|
|
dialog = nil,
|
|
|
|
-- the document interface
|
|
document = nil,
|
|
|
|
-- initial page or percent inside document on opening
|
|
start_pos = nil,
|
|
-- password for document unlock
|
|
password = nil,
|
|
|
|
postInitCallback = nil,
|
|
}
|
|
|
|
function ReaderUI:init()
|
|
self.postInitCallback = {}
|
|
-- if we are not the top level dialog ourselves, it must be given in the table
|
|
if not self.dialog then
|
|
self.dialog = self
|
|
end
|
|
|
|
if Device:hasKeys() then
|
|
self.key_events.Back = {
|
|
{ "Back" }, doc = "close document",
|
|
event = "Close" }
|
|
end
|
|
|
|
self.doc_settings = DocSettings:open(self.document.file)
|
|
|
|
-- a view container (so it must be child #1!)
|
|
self[1] = ReaderView:new{
|
|
dialog = self.dialog,
|
|
dimen = self.dimen,
|
|
ui = self,
|
|
document = self.document,
|
|
}
|
|
-- reader menu controller
|
|
-- hold reference to menu widget
|
|
self.menu = ReaderMenu:new{
|
|
view = self[1],
|
|
ui = self
|
|
}
|
|
-- link
|
|
table.insert(self, ReaderLink:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self,
|
|
document = self.document,
|
|
})
|
|
-- text highlight
|
|
table.insert(self, ReaderHighlight:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self,
|
|
document = self.document,
|
|
})
|
|
-- menu widget should be registered after link widget and highlight widget
|
|
-- so that taps on link and highlight areas won't popup reader menu
|
|
table.insert(self, self.menu)
|
|
-- rotation controller
|
|
table.insert(self, ReaderRotation:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self
|
|
})
|
|
-- Table of content controller
|
|
-- hold reference to bm widget
|
|
self.toc = ReaderToc:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self
|
|
}
|
|
table.insert(self, self.toc)
|
|
-- bookmark controller
|
|
table.insert(self, ReaderBookmark:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self
|
|
})
|
|
-- reader goto controller
|
|
table.insert(self, ReaderGoto:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self,
|
|
document = self.document,
|
|
})
|
|
-- dictionary
|
|
table.insert(self, ReaderDictionary:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self,
|
|
document = self.document,
|
|
})
|
|
-- wikipedia
|
|
table.insert(self, ReaderWikipedia:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self,
|
|
document = self.document,
|
|
})
|
|
-- screenshot controller
|
|
table.insert(self.active_widgets, ReaderScreenshot:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self
|
|
})
|
|
-- frontlight controller
|
|
if Device:hasFrontlight() then
|
|
table.insert(self, ReaderFrontLight:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self
|
|
})
|
|
end
|
|
-- configuable controller
|
|
if self.document.info.configurable then
|
|
-- config panel controller
|
|
table.insert(self, ReaderConfig:new{
|
|
configurable = self.document.configurable,
|
|
options = self.document.options,
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self
|
|
})
|
|
if not self.document.info.has_pages then
|
|
-- cre option controller
|
|
table.insert(self, ReaderCoptListener:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self,
|
|
document = self.document,
|
|
})
|
|
end
|
|
end
|
|
-- for page specific controller
|
|
if self.document.info.has_pages then
|
|
-- cropping controller
|
|
table.insert(self, ReaderCropping:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self,
|
|
document = self.document,
|
|
})
|
|
-- paging controller
|
|
table.insert(self, ReaderPaging:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self
|
|
})
|
|
-- zooming controller
|
|
local zoom = ReaderZooming:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self
|
|
}
|
|
table.insert(self, zoom)
|
|
-- panning controller
|
|
table.insert(self, ReaderPanning:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self
|
|
})
|
|
-- hinting controller
|
|
table.insert(self, ReaderHinting:new{
|
|
dialog = self.dialog,
|
|
zoom = zoom,
|
|
view = self[1],
|
|
ui = self,
|
|
document = self.document,
|
|
})
|
|
else
|
|
-- make sure we load document first before calling any callback
|
|
table.insert(self.postInitCallback, function()
|
|
self.document:loadDocument()
|
|
end)
|
|
-- typeset controller
|
|
table.insert(self, ReaderTypeset:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self
|
|
})
|
|
-- font menu
|
|
self.font = ReaderFont:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self
|
|
}
|
|
table.insert(self, self.font) -- hold reference to font menu
|
|
-- hyphenation menu
|
|
self.hyphenation = ReaderHyphenation:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self
|
|
}
|
|
table.insert(self, self.hyphenation) -- hold reference to hyphenation menu
|
|
-- rolling controller
|
|
table.insert(self, ReaderRolling:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self
|
|
})
|
|
end
|
|
-- configuable controller
|
|
if self.document.info.configurable then
|
|
if self.document.info.has_pages then
|
|
-- kopt option controller
|
|
table.insert(self, ReaderKoptListener:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self,
|
|
document = self.document,
|
|
})
|
|
end
|
|
-- activity indicator
|
|
table.insert(self, ReaderActivityIndicator:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self,
|
|
document = self.document,
|
|
})
|
|
end
|
|
|
|
-- koreader plugins
|
|
for _,module in ipairs(PluginLoader:loadPlugins()) do
|
|
DEBUG("Loaded plugin", module.path)
|
|
table.insert(self, module:new{
|
|
dialog = self.dialog,
|
|
view = self[1],
|
|
ui = self,
|
|
document = self.document,
|
|
})
|
|
end
|
|
|
|
--DEBUG(self.doc_settings)
|
|
-- we only read settings after all the widgets are initialized
|
|
self:handleEvent(Event:new("ReadSettings", self.doc_settings))
|
|
|
|
for _,v in ipairs(self.postInitCallback) do
|
|
v()
|
|
end
|
|
end
|
|
|
|
function ReaderUI:onSetDimensions(dimen)
|
|
self.dimen = dimen
|
|
end
|
|
|
|
function ReaderUI:saveSettings()
|
|
self:handleEvent(Event:new("SaveSettings"))
|
|
self.doc_settings:flush()
|
|
G_reader_settings:flush()
|
|
end
|
|
|
|
function ReaderUI:onFlushSettings()
|
|
self:saveSettings()
|
|
return true
|
|
end
|
|
|
|
function ReaderUI:onClose()
|
|
DEBUG("closing reader")
|
|
self:saveSettings()
|
|
self:handleEvent(Event:new("CloseReader"))
|
|
if self.document ~= nil then
|
|
self.document:close()
|
|
self.document = nil
|
|
self.start_pos = nil
|
|
end
|
|
UIManager:close(self.dialog)
|
|
-- serialize last used items for later launch
|
|
Cache:serialize()
|
|
return true
|
|
end
|
|
|
|
return ReaderUI
|