@ -84,6 +84,16 @@ function ReaderZooming:init()
}
}
} ,
ToggleFreeZoom = {
GestureRange : new {
ges = " double_tap " ,
range = Geom : new {
x = 0 , y = 0 ,
w = Screen : getWidth ( ) ,
h = Screen : getHeight ( ) ,
}
}
} ,
}
end
self.ui . menu : registerToMainMenu ( self )
@ -126,6 +136,24 @@ function ReaderZooming:onPinch(arg, ges)
return true
end
function ReaderZooming : onToggleFreeZoom ( arg , ges )
if self.zoom_mode ~= " free " then
self.orig_zoom = self.zoom
self.orig_zoom_mode = self.zoom_mode
local xpos , ypos
self.zoom , xpos , ypos = self : getRegionalZoomCenter ( self.current_page , ges.pos )
DEBUG ( " zoom center " , self.zoom , xpos , ypos )
self.ui : handleEvent ( Event : new ( " SetZoomMode " , " free " ) )
if xpos == nil or ypos == nil then
xpos = ges.pos . x * self.zoom / self.orig_zoom
ypos = ges.pos . y * self.zoom / self.orig_zoom
end
self.view : SetZoomCenter ( xpos , ypos )
else
self.ui : handleEvent ( Event : new ( " SetZoomMode " , self.orig_zoom_mode or " page " ) )
end
end
function ReaderZooming : onSetDimensions ( dimensions )
-- we were resized
self.dimen = dimensions
@ -160,9 +188,9 @@ function ReaderZooming:onSetZoomMode(new_mode)
self.view . zoom_mode = new_mode
if self.zoom_mode ~= new_mode then
DEBUG ( " setting zoom mode to " , new_mode )
self.ui : handleEvent ( Event : new ( " ZoomModeUpdate " , new_mode ) )
self.zoom_mode = new_mode
self : setZoom ( )
self.ui : handleEvent ( Event : new ( " ZoomModeUpdate " , new_mode ) )
end
end
@ -212,15 +240,34 @@ function ReaderZooming:getZoom(pageno)
zoom = zoom_w
elseif self.zoom_mode == " contentheight " or self.zoom_mode == " pageheight " then
zoom = zoom_h
elseif self.zoom_mode == " free " then
zoom = self.zoom
end
return zoom
end
function ReaderZooming : setZoom ( )
-- nothing to do in free zoom mode
if self.zoom_mode == " free " then
return
function ReaderZooming : getRegionalZoomCenter ( pageno , pos )
local p_pos = self.view : getSinglePagePosition ( pos )
local page_size = self.ui . document : getNativePageDimensions ( pageno )
local pos_x = p_pos.x / page_size.w / p_pos.zoom
local pos_y = p_pos.y / page_size.h / p_pos.zoom
local regions = self.ui . document : getPageRegions ( pageno )
DEBUG ( " get page regions " , regions )
local margin = self.ui . document.configurable . page_margin * Screen : getDPI ( )
for i = 1 , # regions do
if regions [ i ] . x0 <= pos_x and pos_x <= regions [ i ] . x1
and regions [ i ] . y0 <= pos_y and pos_y <= regions [ i ] . y1 then
local zoom = 1 / ( regions [ i ] . x1 - regions [ i ] . x0 )
zoom = zoom / ( 1 + 3 * margin / zoom / page_size.w )
local xpos = ( regions [ i ] . x0 + regions [ i ] . x1 ) / 2 * zoom * page_size.w
local ypos = p_pos.y / p_pos.zoom * zoom
return zoom , xpos , ypos
end
end
return 2
end
function ReaderZooming : setZoom ( )
if not self.dimen then
self.dimen = self.ui . dimen
end