mirror of
https://github.com/koreader/koreader.git
synced 2025-12-24 12:14:05 +01:00
ImageViewer: allow saving current view as an image
And to make it the screensaver image. Done on two-finger large diagonal tap on multitouch devices (like regular ScreenShoter) as long-diagonal swipe is reserved for panning. Fallback to tap in the bottom left corner on non-multitouch devices.
This commit is contained in:
@@ -7,6 +7,8 @@ local Blitbuffer = require("ffi/blitbuffer")
|
||||
local ButtonTable = require("ui/widget/buttontable")
|
||||
local CenterContainer = require("ui/widget/container/centercontainer")
|
||||
local CloseButton = require("ui/widget/closebutton")
|
||||
local ConfirmBox = require("ui/widget/confirmbox")
|
||||
local DataStorage = require("datastorage")
|
||||
local Device = require("device")
|
||||
local Geom = require("ui/geometry")
|
||||
local GestureRange = require("ui/gesturerange")
|
||||
@@ -24,6 +26,7 @@ local VerticalGroup = require("ui/widget/verticalgroup")
|
||||
local WidgetContainer = require("ui/widget/container/widgetcontainer")
|
||||
local UIManager = require("ui/uimanager")
|
||||
local logger = require("logger")
|
||||
local T = require("ffi/util").template
|
||||
local _ = require("gettext")
|
||||
local Screen = Device.screen
|
||||
|
||||
@@ -101,6 +104,7 @@ function ImageViewer:init()
|
||||
w = Screen:getWidth(),
|
||||
h = Screen:getHeight(),
|
||||
}
|
||||
local diagonal = math.sqrt( math.pow(Screen:getWidth(), 2) + math.pow(Screen:getHeight(), 2) )
|
||||
self.ges_events = {
|
||||
Tap = { GestureRange:new{ ges = "tap", range = range } },
|
||||
-- Zoom in/out (Pinch & Spread are not triggered if user is too
|
||||
@@ -116,6 +120,13 @@ function ImageViewer:init()
|
||||
Pan = { GestureRange:new{ ges = "pan", range = range } },
|
||||
PanRelease = { GestureRange:new{ ges = "pan_release", range = range } },
|
||||
Swipe = { GestureRange:new{ ges = "swipe", range = range } },
|
||||
-- Allow saving the image as Screenshoter does (with two fingers tap,
|
||||
-- swipe being reserved for panning - on non multitouch Devices, this
|
||||
-- is also available with a tap in the bottom left corner)
|
||||
TapDiagonal = { GestureRange:new{ ges = "two_finger_tap",
|
||||
scale = {diagonal - Screen:scaleBySize(200), diagonal}, rate = 1.0,
|
||||
}
|
||||
},
|
||||
}
|
||||
end
|
||||
if self.fullscreen then
|
||||
@@ -453,6 +464,12 @@ function ImageViewer:onTap(_, ges)
|
||||
self:onClose()
|
||||
return true
|
||||
end
|
||||
if not Device:hasMultitouch() then
|
||||
-- Allow saving screenshot with tap in bottom left corner
|
||||
if not self.buttons_visible and ges.pos.x < Screen:getWidth()/10 and ges.pos.y > Screen:getHeight()*9/10 then
|
||||
return self:onSaveImageView()
|
||||
end
|
||||
end
|
||||
if self.caption_tap_area and ges.pos:intersectWith(self.caption_tap_area.dimen) then
|
||||
self.caption_visible = not self.caption_visible
|
||||
self:update()
|
||||
@@ -629,6 +646,59 @@ function ImageViewer:onPinch(_, ges)
|
||||
return true
|
||||
end
|
||||
|
||||
function ImageViewer:onTapDiagonal()
|
||||
return self:onSaveImageView()
|
||||
end
|
||||
|
||||
function ImageViewer:onSaveImageView()
|
||||
-- Similar behaviour as in Screenshoter:onScreenshot()
|
||||
-- We save the currently displayed blitbuffer (panned or zoomed)
|
||||
-- after getting fullscreen and removing UI elements if needed.
|
||||
local screenshots_dir = G_reader_settings:readSetting("screenshot_dir")
|
||||
if not screenshots_dir then
|
||||
screenshots_dir = DataStorage:getDataDir() .. "/screenshots/"
|
||||
end
|
||||
self.screenshot_fn_fmt = screenshots_dir .. "ImageViewer_%Y-%m-%d_%H%M%S.png"
|
||||
local screenshot_name = os.date(self.screenshot_fn_fmt)
|
||||
local restore_settings_func
|
||||
if self.with_title_bar or self.buttons_visible or not self.fullscreen then
|
||||
local with_title_bar = self.with_title_bar
|
||||
local buttons_visible = self.buttons_visible
|
||||
local fullscreen = self.fullscreen
|
||||
restore_settings_func = function()
|
||||
self.with_title_bar = with_title_bar
|
||||
self.buttons_visible = buttons_visible
|
||||
self.fullscreen = fullscreen
|
||||
self:update()
|
||||
end
|
||||
self.with_title_bar = false
|
||||
self.buttons_visible = false
|
||||
self.fullscreen = true
|
||||
self:update()
|
||||
UIManager:forceRePaint()
|
||||
end
|
||||
Screen:shot(screenshot_name)
|
||||
local widget = ConfirmBox:new{
|
||||
text = T( _("Saved screenshot to %1.\nWould you like to set it as screensaver?"), BD.filepath(screenshot_name)),
|
||||
ok_text = _("Yes"),
|
||||
ok_callback = function()
|
||||
G_reader_settings:saveSetting("screensaver_type", "image_file")
|
||||
G_reader_settings:saveSetting("screensaver_image", screenshot_name)
|
||||
if restore_settings_func then
|
||||
restore_settings_func()
|
||||
end
|
||||
end,
|
||||
cancel_text = _("No"),
|
||||
cancel_callback = function()
|
||||
if restore_settings_func then
|
||||
restore_settings_func()
|
||||
end
|
||||
end
|
||||
}
|
||||
UIManager:show(widget)
|
||||
return true
|
||||
end
|
||||
|
||||
function ImageViewer:onClose()
|
||||
UIManager:close(self)
|
||||
return true
|
||||
|
||||
Reference in New Issue
Block a user