From c6c8c5a0374e89f6a363f2ba9e78834929db3a04 Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 1 Aug 2019 19:08:09 +0200 Subject: [PATCH] Add vertical edge gesture (#5156) * Add vertical edge gesture * Add left/right edge swipe gesture * Move kobolight plugin to ReaderFrontlight * Remove kobolight plugin --- .../apps/reader/modules/readerfrontlight.lua | 136 ++++++++- .../apps/reader/modules/readergesture.lua | 123 +++++++- frontend/pluginloader.lua | 3 +- .../ui/elements/filemanager_menu_order.lua | 1 - frontend/ui/elements/reader_menu_order.lua | 1 - plugins/kobolight.koplugin/_meta.lua | 6 - plugins/kobolight.koplugin/demo.png | Bin 32899 -> 0 bytes plugins/kobolight.koplugin/demo_ka1.png | Bin 34136 -> 0 bytes plugins/kobolight.koplugin/main.lua | 271 ------------------ 9 files changed, 258 insertions(+), 283 deletions(-) delete mode 100644 plugins/kobolight.koplugin/_meta.lua delete mode 100644 plugins/kobolight.koplugin/demo.png delete mode 100644 plugins/kobolight.koplugin/demo_ka1.png delete mode 100644 plugins/kobolight.koplugin/main.lua diff --git a/frontend/apps/reader/modules/readerfrontlight.lua b/frontend/apps/reader/modules/readerfrontlight.lua index 18ba3d6f8..5f83fcb64 100644 --- a/frontend/apps/reader/modules/readerfrontlight.lua +++ b/frontend/apps/reader/modules/readerfrontlight.lua @@ -10,6 +10,7 @@ local _ = require("gettext") local ReaderFrontLight = InputContainer:new{ steps = {0,1,1,1,1,2,2,2,3,4,5,6,7,8,9,10}, + steps_fl = { 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, }, gestureScale = Screen:getWidth() * FRONTLIGHT_SENSITIVITY_DECREASE, } @@ -64,22 +65,153 @@ function ReaderFrontLight:onAdjust(arg, ges) return true end +-- direction +1 - increase frontlight +-- direction -1 - decrease frontlight +function ReaderFrontLight:onChangeFlIntensity(ges, direction) + local powerd = Device:getPowerDevice() + local gestureScale + if ges.direction == "south" or ges.direction == "north" then + gestureScale = Screen:getHeight() * 7/8 * 0.8 + elseif ges.direction == "west" or ges.direction == "east" then + gestureScale = Screen:getWidth() * 7/8 * 0.8 + else + local width = Screen:getWidth() + local height = Screen:getHeight() + -- diagonal + gestureScale = math.sqrt(width * width + height * height) * 7/8 * 0.8 + end + if powerd.fl_intensity == nil then return false end + + local steps_tbl = {} + local scale = (powerd.fl_max - powerd.fl_min) / 2 / 10.6 + for i = 1, #self.steps_fl, 1 + do + steps_tbl[i] = math.ceil(self.steps_fl[i] * scale) + end + + if ges.distance == nil then + ges.distance = 1 + end + local step = math.ceil(#steps_tbl * ges.distance / gestureScale) + local delta_int = steps_tbl[step] or steps_tbl[#steps_tbl] + if direction ~= -1 and direction ~= 1 then + -- set default value (increase frontlight) + direction = 1 + end + local new_intensity = powerd.fl_intensity + direction * delta_int + + if new_intensity == nil then return true end + -- when new_intensity <=0, toggle light off + if new_intensity <= 0 then + powerd:turnOffFrontlight() + else + powerd:setIntensity(new_intensity) + end + self:onShowIntensity() + if self.view and self.view.footer_visible and self.view.footer.settings.frontlight then + self.view.footer:updateFooter() + end + return true +end + +-- direction +1 - increase frontlight warmth +-- direction -1 - decrease frontlight warmth +function ReaderFrontLight:onChangeFlWarmth(ges, direction) + 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 gestureScale + if ges.direction == "south" or ges.direction == "north" then + gestureScale = Screen:getHeight() * 7/8 * 0.8 + elseif ges.direction == "west" or ges.direction == "east" then + gestureScale = Screen:getWidth() * 7/8 * 0.8 + else + local width = Screen:getWidth() + local height = Screen:getHeight() + -- diagonal + gestureScale = math.sqrt(width * width + height * height) * 7/8 * 0.8 + end + + local steps_tbl = {} + local scale = (powerd.fl_max - powerd.fl_min) / 2 / 10.6 + for i = 1, #self.steps_fl, 1 + do + steps_tbl[i] = math.ceil(self.steps_fl[i] * scale) + end + + if ges.distance == nil then + ges.distance = 1 + end + + local step = math.ceil(#steps_tbl * ges.distance / gestureScale) + local delta_int = steps_tbl[step] or steps_tbl[#steps_tbl] + local warmth + if direction ~= -1 and direction ~= 1 then + -- set default value (increase frontlight) + direction = 1 + end + warmth = powerd.fl_warmth + direction * delta_int + if warmth > 100 then + warmth = 100 + elseif warmth < 0 then + warmth = 0 + end + powerd:setWarmth(warmth) + self:onShowWarmth() + return true +end + + +function ReaderFrontLight:onShowOnOff() + local powerd = Device:getPowerDevice() + local new_text + if powerd.is_fl_on then + new_text = _("Frontlight enabled.") + else + new_text = _("Frontlight disabled.") + end + UIManager:show(Notification:new{ + text = new_text, + timeout = 1.0, + }) + return true +end + function ReaderFrontLight:onShowIntensity() if not Device:hasFrontlight() then return true end local powerd = Device:getPowerDevice() local new_text if powerd:isFrontlightOff() then - new_text = _("Frontlight is off.") + new_text = _("Frontlight disabled.") else new_text = T(_("Frontlight intensity is set to %1."), powerd:frontlightIntensity()) end UIManager:show(Notification:new{ text = new_text, - timeout = 2, + timeout = 1, }) return true end +function ReaderFrontLight:onShowWarmth(value) + local powerd = Device:getPowerDevice() + if powerd.fl_warmth ~= nil then + UIManager:show(Notification:new{ + text = T(_("Warmth set to %1."), powerd.fl_warmth), + timeout = 1.0, + }) + end + return true +end + function ReaderFrontLight:onSwipe(arg, ges) if ges.direction == "north" or ges.direction == "south" then logger.dbg("onSwipe activated") diff --git a/frontend/apps/reader/modules/readergesture.lua b/frontend/apps/reader/modules/readergesture.lua index d12e2e767..2a0913b11 100644 --- a/frontend/apps/reader/modules/readergesture.lua +++ b/frontend/apps/reader/modules/readergesture.lua @@ -61,6 +61,10 @@ local action_strings = { show_config_menu = _("Show bottom menu"), show_frontlight_dialog = _("Show frontlight dialog"), toggle_frontlight = _("Toggle frontlight"), + increase_frontlight = _("Increase frontlight brightness"), + decrease_frontlight = _("Decrease frontlight brightness"), + increase_frontlight_warmth = _("Increase frontlight warmth"), + decrease_frontlight_warmth = _("Decrease frontlight warmth"), toggle_gsensor = _("Toggle accelerometer"), toggle_rotation = _("Toggle rotation"), @@ -157,6 +161,10 @@ function ReaderGesture:init() hold_top_right_corner = "ignore", hold_bottom_left_corner = "ignore", hold_bottom_right_corner = "ignore", + one_finger_swipe_left_edge_down = Device:hasFrontlight() and "decrease_frontlight" or "ignore", + one_finger_swipe_left_edge_up = Device:hasFrontlight() and "increase_frontlight" or "ignore", + one_finger_swipe_right_edge_down = Device:hasNaturalLight() and "decrease_frontlight_warmth" or "ignore", + one_finger_swipe_right_edge_up = Device:hasNaturalLight() and "increase_frontlight_warmth" or "ignore", two_finger_tap_top_left_corner = "ignore", two_finger_tap_top_right_corner = "ignore", two_finger_tap_bottom_left_corner = "ignore", @@ -357,6 +365,28 @@ function ReaderGesture:addToMainMenu(menu_items) text = _("Short diagonal swipe"), sub_item_table = self:buildMenu("short_diagonal_swipe", self.default_gesture["short_diagonal_swipe"]), }, + { + text = _("One-finger swipe"), + sub_item_table = { + { + text_func = function() return actionTextFunc("one_finger_swipe_left_edge_down", _("Left edge down")) end, + sub_item_table = self:buildMenu("one_finger_swipe_left_edge_down", self.default_gesture["one_finger_swipe_left_edge_down"]), + }, + { + text_func = function() return actionTextFunc("one_finger_swipe_left_edge_up", _("Left edge up")) end, + sub_item_table = self:buildMenu("one_finger_swipe_left_edge_up", self.default_gesture["one_finger_swipe_left_edge_up"]), + }, + { + text_func = function() return actionTextFunc("one_finger_swipe_right_edge_down", _("Right edge down")) end, + sub_item_table = self:buildMenu("one_finger_swipe_right_edge_down", self.default_gesture["one_finger_swipe_right_edge_down"]), + }, + { + text_func = function() return actionTextFunc("one_finger_swipe_right_edge_up", _("Right edge up")) end, + sub_item_table = self:buildMenu("one_finger_swipe_right_edge_up", self.default_gesture["one_finger_swipe_right_edge_up"]), + }, + }, + }, + }, } menu_items.gesture_intervals = { @@ -610,7 +640,12 @@ function ReaderGesture:buildMenu(ges, default) {"show_menu", true}, {"show_config_menu", not self.is_docless, true}, {"show_frontlight_dialog", Device:hasFrontlight()}, - {"toggle_frontlight", Device:hasFrontlight(), true}, + {"toggle_frontlight", Device:hasFrontlight()}, + {"increase_frontlight", Device:hasFrontlight()}, + {"decrease_frontlight", Device:hasFrontlight(), true}, + {"increase_frontlight_warmth", Device:hasNaturalLight()}, + {"decrease_frontlight_warmth", Device:hasNaturalLight(), true}, + {"toggle_gsensor", Device:canToggleGSensor()}, {"toggle_rotation", not self.is_docless, true}, @@ -792,6 +827,15 @@ function ReaderGesture:setupGesture(ges, action) ratio_w = 1, ratio_h = 1, } + local zone_left_edge = { + ratio_x = 0, ratio_y = 1/8, + ratio_w = 1/8, ratio_h = 7/8, + } + local zone_right_edge = { + ratio_x = 7/8, ratio_y = 1/8, + ratio_w = 1/8, ratio_h = 7/8, + } + -- legacy global variable DTAP_ZONE_FLIPPING may still be defined in default.persistent.lua local dtap_zone_top_left = DTAP_ZONE_FLIPPING and DTAP_ZONE_FLIPPING or DTAP_ZONE_TOP_LEFT local zone_top_left_corner = { @@ -823,6 +867,9 @@ function ReaderGesture:setupGesture(ges, action) local overrides_tap_corner local overrides_hold_corner + local overrides_vertical_edge + local overrides_pan, overrides_pan_release + local overrides_swipe_pan, overrides_swipe_pan_release if self.is_docless then overrides_tap_corner = { "filemanager_tap", @@ -838,6 +885,17 @@ function ReaderGesture:setupGesture(ges, action) overrides_hold_corner = { "readerfooter_hold", } + overrides_vertical_edge = { + "paging_swipe", + "rolling_swipe", + } + overrides_pan = { + "paging_swipe", + "rolling_swipe", + } + overrides_pan_release = { + "paging_pan_release", + } end if ges == "multiswipe" then @@ -881,6 +939,34 @@ function ReaderGesture:setupGesture(ges, action) ges_type = "hold" zone = zone_bottom_left_corner overrides = overrides_hold_corner + elseif ges == "one_finger_swipe_left_edge_down" then + ges_type = "swipe" + zone = zone_left_edge + direction = {south = true} + overrides = overrides_vertical_edge + overrides_swipe_pan = overrides_pan + overrides_swipe_pan_release = overrides_pan_release + elseif ges == "one_finger_swipe_left_edge_up" then + ges_type = "swipe" + zone = zone_left_edge + direction = {north = true} + overrides = overrides_vertical_edge + overrides_swipe_pan = overrides_pan + overrides_swipe_pan_release = overrides_pan_release + elseif ges == "one_finger_swipe_right_edge_down" then + ges_type = "swipe" + zone = zone_right_edge + direction = {south = true} + overrides = overrides_vertical_edge + overrides_swipe_pan = overrides_pan + overrides_swipe_pan_release = overrides_pan_release + elseif ges == "one_finger_swipe_right_edge_up" then + ges_type = "swipe" + zone = zone_right_edge + direction = {north = true} + overrides = overrides_vertical_edge + overrides_swipe_pan = overrides_pan + overrides_swipe_pan_release = overrides_pan_release elseif ges == "two_finger_tap_top_left_corner" then ges_type = "two_finger_tap" zone = zone_top_left_corner @@ -939,6 +1025,13 @@ function ReaderGesture:setupGesture(ges, action) else return end self:registerGesture(ges, action, ges_type, zone, overrides, direction, distance) + -- make dummy zone to disable panning and panning_release when gesture is swipe + if ges_type == "swipe" and ges ~= "short_diagonal_swipe" then + local pan_gesture = ges.."_pan" + local pan_release_gesture = ges.."_pan_release" + self:registerGesture(pan_gesture, "", "pan", zone, overrides_swipe_pan, direction, distance) + self:registerGesture(pan_release_gesture, "", "pan_release", zone, overrides_swipe_pan_release, direction, distance) + end end function ReaderGesture:registerGesture(ges, action, ges_type, zone, overrides, direction, distance) @@ -1081,6 +1174,34 @@ function ReaderGesture:gestureAction(action, ges) else self.ui:handleEvent(Event:new("ShowFlDialog")) end + elseif action == "increase_frontlight" then + if self.ges_mode == "gesture_fm" then + local ReaderFrontLight = require("apps/reader/modules/readerfrontlight") + ReaderFrontLight:onChangeFlIntensity(ges, 1) + else + self.ui:handleEvent(Event:new("ChangeFlIntensity", ges, 1)) + end + elseif action == "decrease_frontlight" then + if self.ges_mode == "gesture_fm" then + local ReaderFrontLight = require("apps/reader/modules/readerfrontlight") + ReaderFrontLight:onChangeFlIntensity(ges, -1) + else + self.ui:handleEvent(Event:new("ChangeFlIntensity", ges, -1)) + end + elseif action == "increase_frontlight_warmth" then + if self.ges_mode == "gesture_fm" then + local ReaderFrontLight = require("apps/reader/modules/readerfrontlight") + ReaderFrontLight:onChangeFlWarmth(ges, 1) + else + self.ui:handleEvent(Event:new("ChangeFlWarmth", ges, 1)) + end + elseif action == "decrease_frontlight_warmth" then + if self.ges_mode == "gesture_fm" then + local ReaderFrontLight = require("apps/reader/modules/readerfrontlight") + ReaderFrontLight:onChangeFlWarmth(ges, -1) + else + self.ui:handleEvent(Event:new("ChangeFlWarmth", ges, -1)) + end elseif action == "toggle_bookmark" then self.ui:handleEvent(Event:new("ToggleBookmark")) elseif action == "toggle_frontlight" then diff --git a/frontend/pluginloader.lua b/frontend/pluginloader.lua index 5917b022f..a3610a36f 100644 --- a/frontend/pluginloader.lua +++ b/frontend/pluginloader.lua @@ -3,7 +3,8 @@ local logger = require("logger") local DEFAULT_PLUGIN_PATH = "plugins" local OBSOLETE_PLUGINS = { - storagestat = true + storagestat = true, + kobolight = true, } local function sandboxPluginEventHandlers(plugin) diff --git a/frontend/ui/elements/filemanager_menu_order.lua b/frontend/ui/elements/filemanager_menu_order.lua index 288278cfb..9847439d6 100644 --- a/frontend/ui/elements/filemanager_menu_order.lua +++ b/frontend/ui/elements/filemanager_menu_order.lua @@ -77,7 +77,6 @@ local order = { }, taps_and_gestures = { "gesture_manager", - "frontlight_gesture_controller", "gesture_intervals", "----------------------------", "menu_activate", diff --git a/frontend/ui/elements/reader_menu_order.lua b/frontend/ui/elements/reader_menu_order.lua index afd1622e8..bd0208fd2 100644 --- a/frontend/ui/elements/reader_menu_order.lua +++ b/frontend/ui/elements/reader_menu_order.lua @@ -96,7 +96,6 @@ local order = { }, taps_and_gestures = { "gesture_manager", - "frontlight_gesture_controller", "gesture_intervals", "----------------------------", "follow_links", diff --git a/plugins/kobolight.koplugin/_meta.lua b/plugins/kobolight.koplugin/_meta.lua deleted file mode 100644 index a2f2e9ddc..000000000 --- a/plugins/kobolight.koplugin/_meta.lua +++ /dev/null @@ -1,6 +0,0 @@ -local _ = require("gettext") -return { - name = 'kobolight', - fullname = _("Frontlight gesture controller"), - description = _([[Controls the frontlight with gestures on the left border of screen.]]), -} diff --git a/plugins/kobolight.koplugin/demo.png b/plugins/kobolight.koplugin/demo.png deleted file mode 100644 index 0fee3e861883cdce9d40b2e2fd358f64ee456cf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32899 zcmV*eKvBPmP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00007 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 diff --git a/plugins/kobolight.koplugin/demo_ka1.png b/plugins/kobolight.koplugin/demo_ka1.png deleted file mode 100644 index 142d6854fd8f3551a078d629fcc520a18f2057f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34136 zcmV*XKv=(tP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00009 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 diff --git a/plugins/kobolight.koplugin/main.lua b/plugins/kobolight.koplugin/main.lua deleted file mode 100644 index a8b665619..000000000 --- a/plugins/kobolight.koplugin/main.lua +++ /dev/null @@ -1,271 +0,0 @@ -local Device = require("device") - -local with_frontlight = (Device:isCervantes() or Device:isKindle() or Device:isKobo()) and Device:hasFrontlight() -local with_natural_light = 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 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_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: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, "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, "full") - end, - }) - UIManager:setDirty("all", "full") - end, - } -end - -return KoboLight