demo for dimming on page overlap

pull/2/merge
Qingping Hou 12 years ago
parent 683c7eee2c
commit e98a89f8d5

@ -3,6 +3,8 @@ ReaderPaging = InputContainer:new{
number_of_pages = 0,
visible_area = nil,
page_area = nil,
show_overlap_enable = true,
overlap = 20,
}
function ReaderPaging:init()
@ -67,6 +69,10 @@ end
function ReaderPaging:onReadSettings(config)
self:gotoPage(config:readSetting("last_page") or 1)
local soe = config:readSetting("show_overlap_enable")
if not soe then
self.show_overlap_enable = soe
end
end
function ReaderPaging:onCloseDocument()
@ -112,7 +118,7 @@ end
function ReaderPaging:onViewRecalculate(visible_area, page_area)
-- we need to remember areas to handle page turn event
self.visible_area = visible_area
self.visible_area = visible_area:copy()
self.page_area = page_area
end
@ -144,28 +150,76 @@ function ReaderPaging:onGotoPageRel(diff)
x_pan_off = self.visible_area.w * diff
end
end
-- adjust offset to help with page turn decision
-- we dont take overlap into account here yet, otherwise new_va will
-- always intersect with page_area
x_pan_off = math.roundAwayFromZero(x_pan_off)
y_pan_off = math.roundAwayFromZero(y_pan_off)
new_va.x = math.roundAwayFromZero(self.visible_area.x+x_pan_off)
new_va.y = math.roundAwayFromZero(self.visible_area.y+y_pan_off)
if (new_va:notIntersectWith(self.page_area)) then
if new_va:notIntersectWith(self.page_area) then
-- view area out of page area, do a page turn
self:gotoPage(self.current_page + diff)
-- if we are going back to previous page, reset
-- view to bottom of previous page
-- view area to bottom of previous page
if x_pan_off < 0 then
self.view:PanningUpdate(self.page_area.w, 0)
elseif y_pan_off < 0 then
self.view:PanningUpdate(0, self.page_area.h)
end
-- reset dim_area
--self.view.dim_area.h = 0
--self.view.dim_area.w = 0
--
else
-- not end of page yet, goto next view
-- adjust panning step according to overlap
if self.show_overlap_enable then
if x_pan_off > self.overlap then
-- moving to next view, move view
x_pan_off = x_pan_off - self.overlap
elseif x_pan_off < -self.overlap then
x_pan_off = x_pan_off + self.overlap
end
if y_pan_off > self.overlap then
y_pan_off = y_pan_off - self.overlap
elseif y_pan_off < -self.overlap then
y_pan_off = y_pan_off + self.overlap
end
-- we have to calculate again to count into overlap
new_va.x = math.roundAwayFromZero(self.visible_area.x+x_pan_off)
new_va.y = math.roundAwayFromZero(self.visible_area.y+y_pan_off)
end
-- fit new view area into page area
new_va:offsetWithin(self.page_area, 0, 0)
self.view:PanningUpdate(
new_va.x - self.visible_area.x,
new_va.y - self.visible_area.y)
-- calculate panning offsets
local panned_x = new_va.x - self.visible_area.x
local panned_y = new_va.y - self.visible_area.y
-- adjust for crazy float point overflow...
if math.abs(panned_x) < 1 then
panned_x = 0
end
if math.abs(panned_y) < 1 then
panned_y = 0
end
-- singal panning update
self.view:PanningUpdate(panned_x, panned_y)
-- update dime area in ReaderView
if self.show_overlap_enable then
self.view.dim_area.h = new_va.h - math.abs(panned_y)
self.view.dim_area.w = new_va.w - math.abs(panned_x)
if panned_y < 0 then
self.view.dim_area.y = new_va.y - panned_y
else
self.view.dim_area.y = 0
end
if panned_x < 0 then
self.view.dim_area.x = new_va.x - panned_x
else
self.view.dim_area.x = 0
end
end
-- update self.visible_area
self.visible_area = new_va
end

@ -1,29 +1,12 @@
require "ui/reader/readerpanning"
ReaderRolling = InputContainer:new{
key_events = {
GotoNextView = { {Input.group.PgFwd}, doc = "go to next view", event = "GotoViewRel", args = 1 },
GotoPrevView = { {Input.group.PgBack}, doc = "go to previous view", event = "GotoViewRel", args = -1 },
MoveUp = { {"Up"}, doc = "move view up", event = "Panning", args = {0, -1} },
MoveDown = { {"Down"}, doc = "move view down", event = "Panning", args = {0, 1} },
GotoFirst = { {"1"}, doc = "go to start", event = "GotoPercent", args = 0},
Goto11 = { {"2"}, doc = "go to 11%", event = "GotoPercent", args = 11},
Goto22 = { {"3"}, doc = "go to 22%", event = "GotoPercent", args = 22},
Goto33 = { {"4"}, doc = "go to 33%", event = "GotoPercent", args = 33},
Goto44 = { {"5"}, doc = "go to 44%", event = "GotoPercent", args = 44},
Goto55 = { {"6"}, doc = "go to 55%", event = "GotoPercent", args = 55},
Goto66 = { {"7"}, doc = "go to 66%", event = "GotoPercent", args = 66},
Goto77 = { {"8"}, doc = "go to 77%", event = "GotoPercent", args = 77},
Goto88 = { {"9"}, doc = "go to 88%", event = "GotoPercent", args = 88},
GotoLast = { {"0"}, doc = "go to end", event = "GotoPercent", args = 100},
},
old_doc_height = nil,
current_pos = 0,
doc_height = nil,
panning_steps = ReaderPanning.panning_steps,
show_overlap_enable = true,
overlap = 20,
}
function ReaderRolling:init()
@ -103,6 +86,10 @@ end
function ReaderRolling:onReadSettings(config)
self:gotoPercent(config:readSetting("last_percent") or 0)
local soe = config:readSetting("show_overlap_enable")
if not soe then
self.show_overlap_enable = soe
end
end
function ReaderRolling:onCloseDocument()
@ -132,7 +119,15 @@ end
function ReaderRolling:onGotoViewRel(diff)
DEBUG("goto relative screen:", diff)
self:gotoPos(self.current_pos + diff * self.ui.dimen.h)
local pan_diff = diff * self.ui.dimen.h
if self.show_overlap_enable then
if pan_diff > self.overlap then
pan_diff = pan_diff - self.overlap
elseif pan_diff < -self.overlap then
pan_diff = pan_diff + self.overlap
end
end
self:gotoPos(self.current_pos + pan_diff)
return true
end
@ -167,6 +162,18 @@ function ReaderRolling:gotoPos(new_pos)
if new_pos == self.current_pos then return end
if new_pos < 0 then new_pos = 0 end
if new_pos > self.doc_height then new_pos = self.doc_height end
-- adjust dim_area according to new_pos
if self.show_overlap_enable then
local panned_step = new_pos - self.current_pos
self.view.dim_area.x = 0
self.view.dim_area.h = self.ui.dimen.h - math.abs(panned_step)
self.view.dim_area.w = self.ui.dimen.w
if panned_step < 0 then
self.view.dim_area.y = self.ui.dimen.h - self.view.dim_area.h
elseif panned_step > 0 then
self.view.dim_area.y = 0
end
end
self.ui:handleEvent(Event:new("PosUpdate", new_pos))
end

@ -17,6 +17,8 @@ ReaderView = WidgetContainer:new{
visible_area = Geom:new{x = 0, y = 0},
-- dimen for current viewing page
page_area = Geom:new{},
-- dimen for area to dim
dim_area = Geom:new{w = 0, h = 0},
}
function ReaderView:paintTo(bb, x, y)
@ -54,8 +56,18 @@ function ReaderView:paintTo(bb, x, y)
self.visible_area,
self.state.pos)
end
-- dim last read area
if self.dim_area.w ~= 0 and self.dim_area.h ~= 0 then
bb:dimRect(
self.dim_area.x, self.dim_area.y,
self.dim_area.w, self.dim_area.h
)
end
end
--[[
This method is supposed to be only used by ReaderPaging
--]]
function ReaderView:recalculate()
local page_size = nil
if self.ui.document.info.has_pages then
@ -77,11 +89,14 @@ function ReaderView:recalculate()
self.visible_area:setSizeTo(self.dimen)
-- and recalculate it according to page size
self.visible_area:offsetWithin(self.page_area, 0, 0)
-- clear dim area
self.dim_area.w = 0
self.dim_area.h = 0
self.ui:handleEvent(
Event:new("ViewRecalculate", self.visible_area, self.page_area))
else
self.visible_area:setSizeTo(self.dimen)
end
self.ui:handleEvent(
Event:new("ViewRecalculate", self.visible_area, self.page_area))
-- flag a repaint so self:paintTo will be called
UIManager:setDirty(self.dialog)
end

Loading…
Cancel
Save