diff --git a/frontend/ui/bbox.lua b/frontend/ui/bbox.lua index ee1889c85..e955ffbeb 100644 --- a/frontend/ui/bbox.lua +++ b/frontend/ui/bbox.lua @@ -17,41 +17,25 @@ function BBoxWidget:init() TapAdjust = { GestureRange:new{ ges = "tap", - range = Geom:new{ - x = 0, y = 0, - w = Screen:getWidth(), - h = Screen:getHeight() - } + range = self.view.dimen, } }, PanAdjust = { GestureRange:new{ ges = "pan", - range = Geom:new{ - x = 0, y = 0, - w = Screen:getWidth(), - h = Screen:getHeight() - } + range = self.view.dimen, } }, - ConfirmCrop = { + Confirm = { GestureRange:new{ ges = "double_tap", - range = Geom:new{ - x = 0, y = 0, - w = Screen:getWidth(), - h = Screen:getHeight() - } + range = self.view.dimen, } }, - CancelCrop = { + Cancel = { GestureRange:new{ ges = "hold", - range = Geom:new{ - x = 0, y = 0, - w = Screen:getWidth(), - h = Screen:getHeight() - } + range = self.view.dimen, } }, } @@ -67,7 +51,8 @@ function BBoxWidget:getSize() end function BBoxWidget:paintTo(bb, x, y) - self.screen_bbox = self.screen_bbox or self:page_to_screen() + -- As getScreenBBox uses view states, screen_bbox initialization is postponed. + self.screen_bbox = self.screen_bbox or self:getScreenBBox(self.page_bbox) local bbox = self.screen_bbox -- upper_left bb:invertRect(bbox.x0 + self.linesize, bbox.y0, bbox.x1 - bbox.x0, self.linesize) @@ -78,33 +63,41 @@ function BBoxWidget:paintTo(bb, x, y) end -- transform page bbox to screen bbox -function BBoxWidget:page_to_screen() +function BBoxWidget:getScreenBBox(page_bbox) local bbox = {} local scale = self.view.state.zoom local screen_offset = self.view.state.offset --DEBUG("screen offset in page_to_screen", screen_offset) - bbox.x0 = self.page_bbox.x0 * scale + screen_offset.x - bbox.y0 = self.page_bbox.y0 * scale + screen_offset.y - bbox.x1 = self.page_bbox.x1 * scale + screen_offset.x - bbox.y1 = self.page_bbox.y1 * scale + screen_offset.y + bbox.x0 = page_bbox.x0 * scale + screen_offset.x + bbox.y0 = page_bbox.y0 * scale + screen_offset.y + bbox.x1 = page_bbox.x1 * scale + screen_offset.x + bbox.y1 = page_bbox.y1 * scale + screen_offset.y return bbox end -- transform screen bbox to page bbox -function BBoxWidget:screen_to_page() +function BBoxWidget:getPageBBox(screen_bbox) local bbox = {} local scale = self.view.state.zoom local screen_offset = self.view.state.offset --DEBUG("screen offset in screen_to_page", screen_offset) - bbox.x0 = (self.screen_bbox.x0 - screen_offset.x) / scale - bbox.y0 = (self.screen_bbox.y0 - screen_offset.y) / scale - bbox.x1 = (self.screen_bbox.x1 - screen_offset.x) / scale - bbox.y1 = (self.screen_bbox.y1 - screen_offset.y) / scale + bbox.x0 = (screen_bbox.x0 - screen_offset.x) / scale + bbox.y0 = (screen_bbox.y0 - screen_offset.y) / scale + bbox.x1 = (screen_bbox.x1 - screen_offset.x) / scale + bbox.y1 = (screen_bbox.y1 - screen_offset.y) / scale return bbox end -function BBoxWidget:onAdjustScreenBBox(ges, rate) +function BBoxWidget:inPageArea(ges) + local offset = self.view.state.offset + local page_area = self.view.page_area + local page_dimen = Geom:new{ x = offset.x, y = offset.y, h = page_area.h, w = page_area.w} + return not ges.pos:notIntersectWith(page_dimen) +end + +function BBoxWidget:adjustScreenBBox(ges, rate) --DEBUG("adjusting crop bbox with pos", ges.pos) + if not self:inPageArea(ges) then return end local bbox = self.screen_bbox local upper_left = Geom:new{ x = bbox.x0, y = bbox.y0} local upper_right = Geom:new{ x = bbox.x1, y = bbox.y0} @@ -163,24 +156,28 @@ function BBoxWidget:onAdjustScreenBBox(ges, rate) end end +function BBoxWidget:getModifiedPageBBox() + return self:getPageBBox(self.screen_bbox) +end + function BBoxWidget:onTapAdjust(arg, ges) - self:onAdjustScreenBBox(ges) + self:adjustScreenBBox(ges) return true end function BBoxWidget:onPanAdjust(arg, ges) -- up to 3 updates per second - self:onAdjustScreenBBox(ges, 3.0) + self:adjustScreenBBox(ges, 3.0) return true end -function BBoxWidget:onConfirmCrop() - local new_bbox = self:screen_to_page() +function BBoxWidget:onConfirm() + local new_bbox = self:getModifiedPageBBox() self.ui:handleEvent(Event:new("ConfirmPageCrop", new_bbox)) return true end -function BBoxWidget:onCancelCrop() +function BBoxWidget:onCancel() UIManager:close(self.crop_bbox) self.ui:handleEvent(Event:new("CancelPageCrop")) return true