Files
koreader/plugins/kobolight.koplugin/main.lua
poire-z 850be52177 Keep some menus open when Tap or Hold (#4189)
TouchMenu: added options to menu items with the following defaults:
    keep_menu_open = false
    hold_keep_menu_open = true
So, default for Tap callback is to close menu, and for Hold callback
to keep menu open.
In both cases, provide the TouchMenu instance as the 1st argument to
the callback functions (instead of a refresh_menu_func I added in #3941)
so the callback can do more things, like closing, refreshing,
changing menu items text and re-ordering...

ReaderZooming: show symbol for default (like it was done for
ReaderFont, ReaderHyphenation...)
TextEditor plugin: update the previously opened files list in real
time, so the menu can be kept open and used as the TextEditor main
interface.
SSH plugin: keep menu open and update the Start/Stop state in real time
ReadTimer plugin: tried to do what feels right (but I don't use it)

Also remove forgotten cp in the move/paste file code
2018-09-04 23:55:58 +02:00

275 lines
9.4 KiB
Lua

local Device = require("device")
local with_frontlight = (Device:isKindle() or Device:isKobo()) and Device:hasFrontlight()
local with_natural_light = Device:isKobo() and Device:hasNaturalLight()
if not (with_frontlight or Device:isSDL()) then
return { disabled = true, }
end
local ConfirmBox = require("ui/widget/confirmbox")
local ImageWidget = require("ui/widget/imagewidget")
local InfoMessage = require("ui/widget/infomessage")
local Notification = require("ui/widget/notification")
local Screen = require("device").screen
local UIManager = require("ui/uimanager")
local WidgetContainer = require("ui/widget/container/widgetcontainer")
local T = require("ffi/util").template
local _ = require("gettext")
local tap_touch_zone_ratio = { x = 0, y = 15/16, w = 1/10, h = 1/16, }
local swipe_touch_zone_ratio = { x = 0, y = 1/8, w = 1/10, h = 7/8, }
local swipe_touch_zone_ratio_warmth = { x = 7/8, y = 1/8, w = 1/8, h = 7/8, }
local KoboLight = WidgetContainer:new{
name = 'kobolight',
gestureScale = nil, -- initialized in self:resetLayout()
}
function KoboLight:init()
local powerd = Device:getPowerDevice()
local scale = (powerd.fl_max - powerd.fl_min) / 2 / 10.6
self.steps = { 0.1, 0.1, 0.2, 0.4, 0.7, 1.1, 1.6, 2.2, 2.9, 3.7, 4.6, 5.6, 6.7, 7.9, 9.2, 10.6, }
for i = 1, #self.steps, 1
do
self.steps[i] = math.ceil(self.steps[i] * scale)
end
self.ui.menu:registerToMainMenu(self)
end
function KoboLight:onReaderReady()
self:setupTouchZones()
self:resetLayout()
end
function KoboLight:disabled()
return G_reader_settings:isTrue("disable_kobolight")
end
function KoboLight:setupTouchZones()
if not Device:isTouchDevice() then return end
if self:disabled() then return end
local swipe_zone = {
ratio_x = swipe_touch_zone_ratio.x, ratio_y = swipe_touch_zone_ratio.y,
ratio_w = swipe_touch_zone_ratio.w, ratio_h = swipe_touch_zone_ratio.h,
}
local swipe_zone_warmth = {
ratio_x = swipe_touch_zone_ratio_warmth.x,
ratio_y = swipe_touch_zone_ratio_warmth.y,
ratio_w = swipe_touch_zone_ratio_warmth.w,
ratio_h = swipe_touch_zone_ratio_warmth.h,
}
self.ui:registerTouchZones({
{
id = "plugin_kobolight_tap",
ges = "tap",
screen_zone = {
ratio_x = tap_touch_zone_ratio.x, ratio_y = tap_touch_zone_ratio.y,
ratio_w = tap_touch_zone_ratio.w, ratio_h = tap_touch_zone_ratio.h,
},
handler = function() return self:onTap() end,
overrides = { 'readerfooter_tap' },
},
{
id = "plugin_kobolight_swipe",
ges = "swipe",
screen_zone = swipe_zone,
handler = function(ges) return self:onSwipe(nil, ges) end,
overrides = { 'paging_swipe', 'rolling_swipe', },
},
{
-- dummy zone to disable reader panning
id = "plugin_kobolight_pan",
ges = "pan",
screen_zone = swipe_zone,
handler = function(ges) return true end,
overrides = { 'paging_pan', 'rolling_pan', },
},
{
-- dummy zone to disable reader panning
id = "plugin_kobolight_pan_release",
ges = "pan_release",
screen_zone = swipe_zone,
handler = function(ges) return true end,
overrides = { 'paging_pan_release', },
},
})
if with_natural_light then
self.ui:registerTouchZones({
{
id = "plugin_kobolight_swipe_warmth",
ges = "swipe",
screen_zone = swipe_zone_warmth,
handler = function(ges) return self:onSwipeWarmth(nil, ges) end,
overrides = { 'paging_swipe', 'rolling_swipe', },
},
{
-- dummy zone to disable reader panning
id = "plugin_kobolight_pan_warmth",
ges = "pan",
screen_zone = swipe_zone_warmth,
handler = function(ges) return true end,
overrides = { 'paging_pan', 'rolling_pan', },
},
{
-- dummy zone to disable reader panning
id = "plugin_kobolight_pan_release_warmth",
ges = "pan_release",
screen_zone = swipe_zone_warmth,
handler = function(ges) return true end,
overrides = { 'paging_pan_release', },
},
})
end
end
function KoboLight:resetLayout()
local new_screen_height = Screen:getHeight()
self.gestureScale = new_screen_height * swipe_touch_zone_ratio.h * 0.8
end
function KoboLight:onShowIntensity()
local powerd = Device:getPowerDevice()
if powerd.fl_intensity ~= nil then
UIManager:show(Notification:new{
text = T(_("Frontlight intensity is set to %1."), powerd.fl_intensity),
timeout = 1.0,
})
end
return true
end
function KoboLight:onShowWarmth(value)
local powerd = Device:getPowerDevice()
if powerd.fl_warmth ~= nil then
UIManager:show(Notification:new{
text = T(_("Warmth is set to %1."), powerd.fl_warmth),
timeout = 1.0,
})
end
return true
end
function KoboLight:onShowOnOff()
local powerd = Device:getPowerDevice()
local new_text
if powerd.is_fl_on then
new_text = _("Frontlight is on.")
else
new_text = _("Frontlight is off.")
end
UIManager:show(Notification:new{
text = new_text,
timeout = 1.0,
})
return true
end
function KoboLight:onTap()
Device:getPowerDevice():toggleFrontlight()
self:onShowOnOff()
return true
end
function KoboLight:onSwipe(_, ges)
local powerd = Device:getPowerDevice()
if powerd.fl_intensity == nil then return false end
local step = math.ceil(#self.steps * ges.distance / self.gestureScale)
local delta_int = self.steps[step] or self.steps[#self.steps]
local new_intensity
if ges.direction == "north" then
new_intensity = powerd.fl_intensity + delta_int
elseif ges.direction == "south" then
new_intensity = powerd.fl_intensity - delta_int
else
return false -- don't consume swipe event if it's not matched
end
-- when new_intensity <=0, toggle light off
if new_intensity <=0 then
if powerd.is_fl_on then
powerd:toggleFrontlight()
end
self:onShowOnOff()
else -- general case
powerd:setIntensity(new_intensity)
self:onShowIntensity()
end
return true
end
function KoboLight:onSwipeWarmth(ignored, ges)
local powerd = Device:getPowerDevice()
if powerd.fl_warmth == nil then return false end
if powerd.auto_warmth then
UIManager:show(Notification:new{
text = _("Warmth is handled automatically."),
timeout = 1.0,
})
return true
end
local step = math.ceil(#self.steps * ges.distance / self.gestureScale)
local delta_int = self.steps[step] or self.steps[#self.steps]
local warmth
if ges.direction == "north" then
warmth = math.min(powerd.fl_warmth + delta_int, 100)
elseif ges.direction == "south" then
warmth = math.max(powerd.fl_warmth - delta_int, 0)
else
return false -- don't consume swipe event if it's not matched
end
powerd:setWarmth(warmth)
self:onShowWarmth()
return true
end
function KoboLight:addToMainMenu(menu_items)
menu_items.frontlight_gesture_controller = {
text = _("Frontlight gesture controller"),
keep_menu_open = true,
callback = function()
local image_name
local nl_text = ""
if with_natural_light then
image_name = "/demo_ka1.png"
nl_text = _("\n- Change frontlight warmth by swiping up or down on the right of the screen.")
else
image_name = "/demo.png"
end
local image = ImageWidget:new{
file = self.path .. image_name,
height = Screen:getHeight(),
width = Screen:getWidth(),
scale_factor = 0,
}
UIManager:show(image)
UIManager:show(ConfirmBox:new{
text = _("Frontlight gesture controller can:\n- Turn on or off frontlight by tapping bottom left of the screen.\n- Change frontlight intensity by swiping up or down on the left of the screen.") .. nl_text .. "\n\n" ..
(self:disabled() and _("Do you want to enable the frontlight gesture controller?") or _("Do you want to disable the frontlight gesture controller?")),
ok_text = self:disabled() and _("Enable") or _("Disable"),
ok_callback = function()
UIManager:close(image)
UIManager:setDirty("all", "full")
UIManager:show(InfoMessage:new{
text = T(_("You have %1 the frontlight gesture controller. It will take effect on next restart."),
self:disabled() and _("enabled") or _("disabled"))
})
G_reader_settings:flipTrue("disable_kobolight")
end,
cancel_text = _("Close"),
cancel_callback = function()
UIManager:close(image)
UIManager:setDirty("all", "full")
end,
})
UIManager:setDirty("all", "full")
end,
}
end
return KoboLight