mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
a bit of cleanup, switched width/height combo over to use Geom() objects, moved framebuffer handling to Screen object, callback syntax sanitizing, lots of small changes
110 lines
2.7 KiB
Lua
110 lines
2.7 KiB
Lua
ReaderView = WidgetContainer:new{
|
|
document = nil,
|
|
|
|
state = {
|
|
page = 0,
|
|
pos = 0,
|
|
zoom = 1.0,
|
|
rotation = 0,
|
|
offset = {},
|
|
bbox = nil,
|
|
},
|
|
|
|
outer_page_color = 7,
|
|
|
|
visible_area = Geom:new{x = 0, y = 0},
|
|
page_area = Geom:new{},
|
|
}
|
|
|
|
function ReaderView:paintTo(bb, x, y)
|
|
DEBUG("painting", self.visible_area, "to", x, y)
|
|
local inner_offset = Geom:new{x = 0, y = 0}
|
|
|
|
-- draw surrounding space, if any
|
|
if self.ui.dimen.h > self.visible_area.h then
|
|
inner_offset.y = (self.ui.dimen.h - self.visible_area.h) / 2
|
|
bb:paintRect(x, y, self.ui.dimen.w, inner_offset.y, self.outer_page_color)
|
|
bb:paintRect(x, y + self.ui.dimen.h - inner_offset.y - 1, self.ui.dimen.w, inner_offset.y + 1, self.outer_page_color)
|
|
end
|
|
if self.ui.dimen.w > self.visible_area.w then
|
|
inner_offset.x = (self.ui.dimen.w - self.visible_area.w) / 2
|
|
bb:paintRect(x, y, inner_offset.x, self.ui.dimen.h, self.outer_page_color)
|
|
bb:paintRect(x + self.ui.dimen.w - inner_offset.x - 1, y, inner_offset.x + 1, self.ui.dimen.h, self.outer_page_color)
|
|
end
|
|
|
|
-- draw content
|
|
if self.ui.document.info.has_pages then
|
|
self.ui.document:drawPage(
|
|
bb,
|
|
x + inner_offset.x,
|
|
y + inner_offset.y,
|
|
self.visible_area,
|
|
self.state.page,
|
|
self.state.zoom,
|
|
self.state.rotation)
|
|
else
|
|
self.ui.document:drawCurrentView(
|
|
bb,
|
|
x + inner_offset.x,
|
|
y + inner_offset.y,
|
|
self.visible_area,
|
|
self.state.pos)
|
|
end
|
|
end
|
|
|
|
function ReaderView:recalculate()
|
|
if self.ui.document.info.has_pages then
|
|
local page_size = self.ui.document:getPageDimensions(self.state.page, self.state.zoom, self.state.rotation)
|
|
-- TODO: bbox
|
|
self.page_area = page_size
|
|
|
|
-- reset our size
|
|
self.visible_area:setSizeTo(self.ui.dimen)
|
|
-- and recalculate it according to page size
|
|
self.visible_area:offsetWithin(self.page_area, 0, 0)
|
|
else
|
|
self.visible_area:setSizeTo(self.ui.dimen)
|
|
end
|
|
-- flag a repaint
|
|
UIManager:setDirty(self.dialog)
|
|
end
|
|
|
|
function ReaderView:onSetDimensions(dimensions)
|
|
-- recalculate view
|
|
self:recalculate()
|
|
end
|
|
|
|
function ReaderView:PanningUpdate(dx, dy)
|
|
DEBUG("pan by", dx, dy)
|
|
local old = self.visible_area:copy()
|
|
self.visible_area:offsetWithin(self.page_area, dx, dy)
|
|
if self.visible_area ~= old then
|
|
-- flag a repaint
|
|
UIManager:setDirty(self.dialog)
|
|
DEBUG(self.page_area)
|
|
DEBUG(self.visible_area)
|
|
end
|
|
return true
|
|
end
|
|
|
|
function ReaderView:onPageUpdate(new_page_no)
|
|
self.state.page = new_page_no
|
|
self:recalculate()
|
|
end
|
|
|
|
function ReaderView:onPosUpdate(new_pos)
|
|
self.state.pos = new_pos
|
|
self:recalculate()
|
|
end
|
|
|
|
function ReaderView:ZoomUpdate(zoom)
|
|
self.state.zoom = zoom
|
|
self:recalculate()
|
|
end
|
|
|
|
function ReaderView:onRotationUpdate(rotation)
|
|
self.state.rotation = rotation
|
|
self:recalculate()
|
|
end
|
|
|