From f4b74cea959c3827cda60fc054631de6dabedc43 Mon Sep 17 00:00:00 2001 From: chrox Date: Thu, 28 Mar 2013 22:08:48 +0800 Subject: [PATCH] use rotate gesture to set screen mode --- frontend/ui/reader/readerrotation.lua | 56 ++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/frontend/ui/reader/readerrotation.lua b/frontend/ui/reader/readerrotation.lua index 07660e0eb..fc7e848d3 100644 --- a/frontend/ui/reader/readerrotation.lua +++ b/frontend/ui/reader/readerrotation.lua @@ -1,12 +1,42 @@ ReaderRotation = InputContainer:new{ - key_events = { - -- these will all generate the same event, just with different arguments - RotateLeft = { {"J"}, doc = "rotate left by 90 degrees", event = "Rotate", args = -90 }, - RotateRight = { {"K"}, doc = "rotate right by 90 degrees", event = "Rotate", args = 90 }, - }, + ROTATE_ANGLE_THRESHOLD = 15, current_rotation = 0 } +function ReaderRotation:init() + if Device:hasKeyboard() then + self.key_events = { + -- these will all generate the same event, just with different arguments + RotateLeft = { {"J"}, doc = "rotate left by 90 degrees", event = "Rotate", args = -90 }, + RotateRight = { {"K"}, doc = "rotate right by 90 degrees", event = "Rotate", args = 90 }, + } + end + if Device:isTouchDevice() then + self.ges_events = { + RotateGes = { + GestureRange:new{ + ges = "rotate", + range = Geom:new{ + x = 0, y = 0, + w = Screen:getWidth(), + h = Screen:getHeight(), + } + } + }, + TwoFingerPanRelease = { + GestureRange:new{ + ges = "two_finger_pan_release", + range = Geom:new{ + x = 0, y = 0, + w = Screen:getWidth(), + h = Screen:getHeight(), + } + } + } + } + end +end + -- TODO: reset rotation on new document, maybe on new page? function ReaderRotation:onRotate(rotate_by) @@ -14,3 +44,19 @@ function ReaderRotation:onRotate(rotate_by) self.ui:handleEvent(Event:new("RotationUpdate", self.current_rotation)) return true end + +function ReaderRotation:onRotateGes(arg, ges) + self.ratate_angle = ges.angle + return true +end + +function ReaderRotation:onTwoFingerPanRelease(arg, ges) + if self.ratate_angle and self.ratate_angle > self.ROTATE_ANGLE_THRESHOLD then + if Screen:getScreenMode() == "portrait" then + self.ui:handleEvent(Event:new("SetScreenMode", "landscape")) + else + self.ui:handleEvent(Event:new("SetScreenMode", "portrait")) + end + self.ratate_angle = nil + end +end