diff --git a/frontend/apps/reader/modules/readerkobolight.lua b/frontend/apps/reader/modules/readerkobolight.lua deleted file mode 100644 index 19a77fc54..000000000 --- a/frontend/apps/reader/modules/readerkobolight.lua +++ /dev/null @@ -1,132 +0,0 @@ -local InputContainer = require("ui/widget/container/inputcontainer") -local LeftContainer = require("ui/widget/container/leftcontainer") -local GestureRange = require("ui/gesturerange") -local Device = require("device") -local Geom = require("ui/geometry") -local Screen = Device.screen -local DEBUG = require("dbg") -local UIManager = require("ui/uimanager") -local Notification = require("ui/widget/notification") -local T = require("ffi/util").template -local _ = require("gettext") - -local DTAP_ZONE_KOBOLIGHTTOGGLE = {x = 0, y = 0.9375, w = 0.1, h = 0.0625 } -local DTAP_ZONE_KOBOLIGHTSWIPE = {x = 0, y = 0.125, w = 0.1, h = 0.875 } - -local ReaderKoboLight = InputContainer:new{ - steps = {0,1,1,1,1,2,2,2,3,4,5,6,7,8,9,10}, - gestureScale = Screen:getHeight() * DTAP_ZONE_KOBOLIGHTSWIPE.h * 0.8, -} - -function ReaderKoboLight:init() - self[1] = LeftContainer:new{ - dimen = Geom:new{w = nil, h = nil}, - } - self:resetLayout() -end - -function ReaderKoboLight:resetLayout() - local new_screen_width = Screen:getWidth() - if new_screen_width == self[1].dimen.w then return end - local new_screen_height = Screen:getHeight() - self[1].dimen.w = new_screen_width - self[1].dimen.h = new_screen_height - self.gestureScale = new_screen_height * DTAP_ZONE_KOBOLIGHTSWIPE.h * 0.8 - - if Device:isTouchDevice() then - self.ges_events = { - Tap = { - GestureRange:new{ - ges = "tap", - range = Geom:new{ - x = new_screen_width*DTAP_ZONE_KOBOLIGHTTOGGLE.x, - y = new_screen_height*DTAP_ZONE_KOBOLIGHTTOGGLE.y, - w = new_screen_width*DTAP_ZONE_KOBOLIGHTTOGGLE.w, - h = new_screen_height*DTAP_ZONE_KOBOLIGHTTOGGLE.h - } - } - }, - Swipe = { - GestureRange:new{ - ges = "swipe", - range = Geom:new{ - x = new_screen_width*DTAP_ZONE_KOBOLIGHTSWIPE.x, - y = new_screen_height*DTAP_ZONE_KOBOLIGHTSWIPE.y, - w = new_screen_width*DTAP_ZONE_KOBOLIGHTSWIPE.w, - h = new_screen_height*DTAP_ZONE_KOBOLIGHTSWIPE.h - } - } - } - } - end -end - -function ReaderKoboLight: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 ReaderKoboLight: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 ReaderKoboLight:onTap() - Device:getPowerDevice():toggleFrontlight() - self:onShowOnOff() - if self.view.footer_visible and self.view.footer.settings.frontlight then - self.view.footer:updateFooter() - end - return true -end - -function ReaderKoboLight:onSwipe(arg, ges) - local powerd = Device:getPowerDevice() - if powerd.fl_intensity == nil then return true end - - DEBUG("frontlight intensity", powerd.fl_intensity) - local step = math.ceil(#self.steps * ges.distance / self.gestureScale) - DEBUG("step = ", step) - local delta_int = self.steps[step] or self.steps[#self.steps] - DEBUG("delta_int = ", delta_int) - 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 - end - if new_intensity ~= nil then - -- 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 - if self.view.footer_visible and self.view.footer.settings.frontlight then - self.view.footer:updateFooter() - end - end - return true -end - -return ReaderKoboLight diff --git a/frontend/apps/reader/pluginloader.lua b/frontend/apps/reader/pluginloader.lua index 17f76e305..7716812fb 100644 --- a/frontend/apps/reader/pluginloader.lua +++ b/frontend/apps/reader/pluginloader.lua @@ -23,9 +23,9 @@ function PluginLoader:loadPlugins() if not ok then DEBUG("Error when loading", mainfile, plugin_module) end - package.path = package_path - package.cpath = package_cpath - if ok then + if not plugin_module.disabled and ok then + package.path = package_path + package.cpath = package_cpath plugin_module.path = path plugin_module.name = plugin_module.name or path:match("/(.-)%.koplugin") table.insert(self.plugins, plugin_module) diff --git a/frontend/apps/reader/readerui.lua b/frontend/apps/reader/readerui.lua index a21140b3a..fa533b55e 100644 --- a/frontend/apps/reader/readerui.lua +++ b/frontend/apps/reader/readerui.lua @@ -100,6 +100,7 @@ function ReaderUI:init() self.doc_settings = DocSettings:open(self.document.file) -- a view container (so it must be child #1!) + -- all paintable widgets need to be a child of reader view self:registerModule("view", ReaderView:new{ dialog = self.dialog, dimen = self.dimen, @@ -317,15 +318,6 @@ function ReaderUI:init() }) end - local ReaderKoboLight = require("apps/reader/modules/readerkobolight") - if (Device:isKobo() and Device:hasFrontlight()) then - self:registerModule('kobolight', ReaderKoboLight:new{ - dialog = self.dialog, - view = self.view, - ui = self, - }) - end - -- we only read settings after all the widgets are initialized self:handleEvent(Event:new("ReadSettings", self.doc_settings)) diff --git a/plugins/evernote.koplugin/main.lua b/plugins/evernote.koplugin/main.lua index afa81932e..b38a15dda 100644 --- a/plugins/evernote.koplugin/main.lua +++ b/plugins/evernote.koplugin/main.lua @@ -419,4 +419,3 @@ function EvernoteExporter:exportBooknotesToHTML(title, booknotes) end return EvernoteExporter - diff --git a/plugins/kobolight.koplugin/main.lua b/plugins/kobolight.koplugin/main.lua new file mode 100644 index 000000000..298f96e94 --- /dev/null +++ b/plugins/kobolight.koplugin/main.lua @@ -0,0 +1,142 @@ +local Device = require("device") + +if not (Device:isKobo() and Device:hasFrontlight()) then + return { disabled = true, } +end + +local WidgetContainer = require("ui/widget/container/widgetcontainer") +local Screen = Device.screen +local UIManager = require("ui/uimanager") +local Notification = require("ui/widget/notification") +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 KoboLight = WidgetContainer:new{ + name = 'kobolight', + steps = { 0, 1, 1, 1, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, }, + gestureScale = nil, -- initialized in self:resetLayout() +} + +function KoboLight:onReaderReady() + self:setupTouchZones() + self:resetLayout() +end + +function KoboLight:setupTouchZones() + if not Device:isTouchDevice() 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, + } + 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 = { 'footer_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', }, + }, + }) +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: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() + if self.view.footer_visible and self.view.footer.settings.frontlight then + self.view.footer:updateFooter() + end + return true +end + +function KoboLight:onSwipe(_, ges) + local powerd = Device:getPowerDevice() + if powerd.fl_intensity == nil then 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 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 + end + if new_intensity ~= nil then + -- 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 + if self.view.footer_visible and self.view.footer.settings.frontlight then + self.view.footer:updateFooter() + end + end + return true +end + +return KoboLight diff --git a/spec/unit/networksetting_spec.lua b/spec/unit/networksetting_spec.lua index f9ac127cc..6f1f86c1f 100644 --- a/spec/unit/networksetting_spec.lua +++ b/spec/unit/networksetting_spec.lua @@ -1,7 +1,8 @@ describe("NetworkSetting module", function() - local NetworkSetting, NetworkMgr + local NetworkSetting, NetworkMgr, UIManager setup(function() require("commonrequire") + UIManager = require("ui/uimanager") NetworkSetting = require("ui/widget/networksetting") NetworkMgr = require("ui/network/manager") end) @@ -15,6 +16,7 @@ describe("NetworkSetting module", function() stub(NetworkMgr, "disconnectNetwork") stub(NetworkMgr, "releaseIP") + UIManager:quit() local called = false local network_list = { { @@ -41,6 +43,7 @@ describe("NetworkSetting module", function() stub(NetworkMgr, "disconnectNetwork") stub(NetworkMgr, "releaseIP") + UIManager:quit() local network_list = { { ssid = "foo",