Files
koreader/frontend/ui/readerui.lua
chrox 7f53ddacbe add activity indicator when configuring in reflow mode
For now pillow activityIndicator is used to draw animated waiting icon
at the upper left corner of the screen. So pillow service should be
enabled to use this feature, but eventually we should implement an
activity indicator that is independent of native system.
2013-04-21 16:54:59 +08:00

250 lines
5.8 KiB
Lua

require "ui/reader/readerview"
require "ui/reader/readerzooming"
require "ui/reader/readerpanning"
require "ui/reader/readerrotation"
require "ui/reader/readerpaging"
require "ui/reader/readerrolling"
require "ui/reader/readertoc"
require "ui/reader/readerbookmark"
require "ui/reader/readerfont"
require "ui/reader/readertypeset"
require "ui/reader/readermenu"
require "ui/reader/readerconfig"
require "ui/reader/readercropping"
require "ui/reader/readerkopt"
require "ui/reader/readercopt"
require "ui/reader/readerhinting"
require "ui/reader/readerscreenshot"
require "ui/reader/readerfrontlight"
require "ui/reader/readerhyphenation"
require "ui/reader/readeractivityindicator"
--[[
This is an abstraction for a reader interface
it works using data gathered from a document interface
]]--
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:hasKeyboard() 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,
}
-- rotation controller
self[2] = ReaderRotation:new{
dialog = self.dialog,
view = self[1],
ui = self
}
-- reader menu controller
self[3] = ReaderMenu:new{
view = self[1],
ui = self
}
self.menu = self[3] -- hold reference to menu widget
-- Table of content controller
self[4] = ReaderToc:new{
dialog = self.dialog,
view = self[1],
ui = self
}
self.toc = self[4] -- hold reference to bm widget
-- bookmark controller
local reader_bm = ReaderBookmark:new{
dialog = self.dialog,
view = self[1],
ui = self
}
table.insert(self, reader_bm)
-- screenshot controller
local reader_ss = ReaderScreenshot:new{
dialog = self.dialog,
view = self[1],
ui = self
}
-- frontlight controller
local reader_fl = ReaderFrontLight:new{
dialog = self.dialog,
view = self[1],
ui = self
}
table.insert(self.active_widgets, reader_ss)
table.insert(self.active_widgets, reader_fl)
if self.document.info.has_pages then
-- for page specific controller
-- if needed, insert a paging container
local pager = ReaderPaging:new{
dialog = self.dialog,
view = self[1],
ui = self
}
table.insert(self, pager)
-- zooming controller
local zoomer = ReaderZooming:new{
dialog = self.dialog,
view = self[1],
ui = self
}
table.insert(self, zoomer)
-- panning controller
local panner = ReaderPanning:new{
dialog = self.dialog,
view = self[1],
ui = self
}
table.insert(self, panner)
-- cropping controller
local cropper = ReaderCropping:new{
dialog = self.dialog,
view = self[1],
ui = self,
document = self.document,
}
table.insert(self, cropper)
-- hinting controller
local hinter = ReaderHinting:new{
dialog = self.dialog,
view = self[1],
ui = self,
document = self.document,
}
table.insert(self, hinter)
else
-- make sure we load document first before calling any callback
table.insert(self.postInitCallback, function()
self.document:loadDocument()
end)
-- rolling controller
local roller = ReaderRolling:new{
dialog = self.dialog,
view = self[1],
ui = self
}
table.insert(self, roller)
-- font menu
local font_menu = ReaderFont:new{
dialog = self.dialog,
view = self[1],
ui = self
}
table.insert(self, font_menu)
-- typeset controller
local typeset = ReaderTypeset:new{
dialog = self.dialog,
view = self[1],
ui = self
}
table.insert(self, typeset)
table.insert(self, ReaderHyphenation:new{
dialog = self.dialog,
view = self[1],
ui = self
})
end
if self.document.info.configurable then
-- configurable controller
local config_dialog = ReaderConfig:new{
configurable = self.document.configurable,
options = self.document.options,
dialog = self.dialog,
view = self[1],
ui = self
}
table.insert(self, config_dialog)
-- kopt option controller
local koptlistener = ReaderKoptListener:new{
dialog = self.dialog,
view = self[1],
ui = self,
document = self.document,
}
table.insert(self, koptlistener)
-- cre option controller
local coptlistener = ReaderCoptListener:new{
dialog = self.dialog,
view = self[1],
ui = self,
document = self.document,
}
table.insert(self, coptlistener)
-- activity indicator
local activity_listener = ReaderActivityIndicator:new{
dialog = self.dialog,
view = self[1],
ui = self,
document = self.document,
}
table.insert(self, activity_listener)
end
--DEBUG(self.doc_settings)
-- we only read settings after all the widgets are initialized
self:handleEvent(Event:new("ReadSettings", self.doc_settings))
-- notify childs of dimensions
self:handleEvent(Event:new("SetDimensions", self.dimen))
for _,v in ipairs(self.postInitCallback) do
v()
end
end
function ReaderUI:onSetDimensions(dimen)
self.dimen = dimen
end
function ReaderUI:onClose()
DEBUG("closing reader")
self:handleEvent(Event:new("CloseDocument"))
self.doc_settings:flush()
if self.document ~= nil then
self.document:close()
self.document = nil
self.start_pos = nil
end
UIManager:close(self.dialog)
return true
end