From 47bcfc531ee5da59b043bd0ac59462832354620f Mon Sep 17 00:00:00 2001 From: poire-z Date: Fri, 21 Sep 2018 15:48:40 +0200 Subject: [PATCH] Allow closing full screen dialogs with swipe down (#4237) Mostly all that have a close button at top right, that may be hard to reach or hit for some people: TOC, Bookmarks, History, KeyValuePage (Book information, Statistics...), Book status... Added full refresh on diagonal swipe where it was missing. CoverMenu: removed onSwipe override, as it had become the same as Menu a few months ago. --- frontend/ui/widget/bookstatuswidget.lua | 25 +++++++++++++++++++ frontend/ui/widget/keyvaluepage.lua | 8 +++++- frontend/ui/widget/menu.lua | 13 +++++++++- plugins/coverbrowser.koplugin/covermenu.lua | 14 ----------- plugins/coverbrowser.koplugin/main.lua | 4 --- .../goodreads.koplugin/doublekeyvaluepage.lua | 12 +++++++++ .../statistics.koplugin/readerprogress.lua | 25 +++++++++++++++++++ 7 files changed, 81 insertions(+), 20 deletions(-) diff --git a/frontend/ui/widget/bookstatuswidget.lua b/frontend/ui/widget/bookstatuswidget.lua index 6a1685e7d..162fe9b67 100644 --- a/frontend/ui/widget/bookstatuswidget.lua +++ b/frontend/ui/widget/bookstatuswidget.lua @@ -6,6 +6,7 @@ local Device = require("device") local Font = require("ui/font") local FrameContainer = require("ui/widget/container/framecontainer") local Geom = require("ui/geometry") +local GestureRange = require("ui/gesturerange") local HorizontalGroup = require("ui/widget/horizontalgroup") local HorizontalSpan = require("ui/widget/horizontalspan") local ImageWidget = require("ui/widget/imagewidget") @@ -91,6 +92,14 @@ function BookStatusWidget:init() seqtext = "any key", doc = "close dialog" } } end + if Device:isTouchDevice() then + self.ges_events.Swipe = { + GestureRange:new{ + ges = "swipe", + range = function() return self.dimen end, + } + } + end local screen_size = Screen:getSize() self.covers_fullscreen = true -- hint for UIManager:_repaint() @@ -540,6 +549,22 @@ function BookStatusWidget:onAnyKeyPressed() return self:onClose() end +function BookStatusWidget:onSwipe(arg, ges_ev) + if ges_ev.direction == "south" then + -- Allow easier closing with swipe down + self:onClose() + elseif ges_ev.direction == "east" or ges_ev.direction == "west" or ges_ev.direction == "north" then + -- no use for now + do end -- luacheck: ignore 541 + else -- diagonal swipe + -- trigger full refresh + UIManager:setDirty(nil, "full") + -- a long diagonal swipe may also be used for taking a screenshot, + -- so let it propagate + return false + end +end + function BookStatusWidget:onClose() self:saveSummary() -- NOTE: Flash on close to avoid ghosting, since we show an image. diff --git a/frontend/ui/widget/keyvaluepage.lua b/frontend/ui/widget/keyvaluepage.lua index 080327a7e..ccf3841c5 100644 --- a/frontend/ui/widget/keyvaluepage.lua +++ b/frontend/ui/widget/keyvaluepage.lua @@ -529,7 +529,13 @@ function KeyValuePage:onSwipe(arg, ges_ev) elseif ges_ev.direction == "east" then self:prevPage() return true - else + elseif ges_ev.direction == "south" then + -- Allow easier closing with swipe down + self:onClose() + elseif ges_ev.direction == "north" then + -- no use for now + do end -- luacheck: ignore 541 + else -- diagonal swipe -- trigger full refresh UIManager:setDirty(nil, "full") -- a long diagonal swipe may also be used for taking a screenshot, diff --git a/frontend/ui/widget/menu.lua b/frontend/ui/widget/menu.lua index c365cc769..fafb8d92c 100644 --- a/frontend/ui/widget/menu.lua +++ b/frontend/ui/widget/menu.lua @@ -1176,7 +1176,18 @@ function Menu:onSwipe(arg, ges_ev) self:onNextPage() elseif ges_ev.direction == "east" then self:onPrevPage() - else + elseif ges_ev.direction == "south" then + if self.has_close_button and not self.no_title then + -- If there is a close button displayed (so, this Menu can be + -- closed), allow easier closing with swipe up/down + self:onClose() + end + -- If there is no close button, it's a top level Menu and swipe + -- up/down may hide/show top menu + elseif ges_ev.direction == "north" then + -- no use for now + do end -- luacheck: ignore 541 + else -- diagonal swipe -- trigger full refresh UIManager:setDirty(nil, "full") end diff --git a/plugins/coverbrowser.koplugin/covermenu.lua b/plugins/coverbrowser.koplugin/covermenu.lua index 159a4235f..2022fb4e0 100644 --- a/plugins/coverbrowser.koplugin/covermenu.lua +++ b/plugins/coverbrowser.koplugin/covermenu.lua @@ -16,7 +16,6 @@ local BookInfoManager = require("bookinfomanager") -- Here are defined the common overriden methods of Menu: -- :updateItems(select_number) -- :onCloseWidget() --- :onSwipe(arg, ges_ev) -- -- MosaicMenu or ListMenu should implement specific UI methods: -- :_recalculateDimen() @@ -452,19 +451,6 @@ function CoverMenu:onCloseWidget() Menu.onCloseWidget(self) end --- Overriden just to allow full refresh (useful with images) -function CoverMenu:onSwipe(arg, ges_ev) - if ges_ev.direction == "west" then - self:onNextPage() - elseif ges_ev.direction == "east" then - self:onPrevPage() - elseif ges_ev.direction ~= "north" and ges_ev.direction ~= "south" then - -- but not if north/south, and we're triggering menu - -- trigger full refresh - UIManager:setDirty(nil, "full") - end -end - function CoverMenu:tapPlus() -- Call original function: it will create a ButtonDialogTitle -- and store it as self.file_dialog, and UIManager:show() it. diff --git a/plugins/coverbrowser.koplugin/main.lua b/plugins/coverbrowser.koplugin/main.lua index 0d1fe9182..44cda8639 100644 --- a/plugins/coverbrowser.koplugin/main.lua +++ b/plugins/coverbrowser.koplugin/main.lua @@ -18,7 +18,6 @@ local FileChooser = require("ui/widget/filechooser") local _FileChooser__recalculateDimen_orig = FileChooser._recalculateDimen local _FileChooser_updateItems_orig = FileChooser.updateItems local _FileChooser_onCloseWidget_orig = FileChooser.onCloseWidget -local _FileChooser_onSwipe_orig = FileChooser.onSwipe local FileManagerHistory = require("apps/filemanager/filemanagerhistory") local _FileManagerHistory_updateItemTable_orig = FileManagerHistory.updateItemTable @@ -454,7 +453,6 @@ function CoverBrowser:setupFileManagerDisplayMode(display_mode) -- Put back original methods FileChooser.updateItems = _FileChooser_updateItems_orig FileChooser.onCloseWidget = _FileChooser_onCloseWidget_orig - FileChooser.onSwipe = _FileChooser_onSwipe_orig FileChooser._recalculateDimen = _FileChooser__recalculateDimen_orig FileManager.tapPlus = _FileManager_tapPlus_orig -- Also clean-up what we added, even if it does not bother original code @@ -471,7 +469,6 @@ function CoverBrowser:setupFileManagerDisplayMode(display_mode) local CoverMenu = require("covermenu") FileChooser.updateItems = CoverMenu.updateItems FileChooser.onCloseWidget = CoverMenu.onCloseWidget - FileChooser.onSwipe = CoverMenu.onSwipe if display_mode == "mosaic_image" or display_mode == "mosaic_text" then -- mosaic mode -- Replace some other original methods with those from our MosaicMenu @@ -534,7 +531,6 @@ local function _FileManagerHistory_updateItemTable(self) local CoverMenu = require("covermenu") hist_menu.updateItems = CoverMenu.updateItems hist_menu.onCloseWidget = CoverMenu.onCloseWidget - hist_menu.onSwipe = CoverMenu.onSwipe -- Also replace original onMenuHold (it will use original method, so remember it) hist_menu.onMenuHold_orig = hist_menu.onMenuHold hist_menu.onMenuHold = CoverMenu.onHistoryMenuHold diff --git a/plugins/goodreads.koplugin/doublekeyvaluepage.lua b/plugins/goodreads.koplugin/doublekeyvaluepage.lua index 83b0c7905..f36bfed7c 100644 --- a/plugins/goodreads.koplugin/doublekeyvaluepage.lua +++ b/plugins/goodreads.koplugin/doublekeyvaluepage.lua @@ -435,6 +435,18 @@ function DoubleKeyValuePage:onSwipe(arg, ges_ev) elseif ges_ev.direction == "east" then self:prevPage() return true + elseif ges_ev.direction == "south" then + -- Allow easier closing with swipe down + self:onClose() + elseif ges_ev.direction == "north" then + -- no use for now + do end -- luacheck: ignore 541 + else -- diagonal swipe + -- trigger full refresh + UIManager:setDirty(nil, "full") + -- a long diagonal swipe may also be used for taking a screenshot, + -- so let it propagate + return false end end diff --git a/plugins/statistics.koplugin/readerprogress.lua b/plugins/statistics.koplugin/readerprogress.lua index e184aeac9..95f02aad4 100644 --- a/plugins/statistics.koplugin/readerprogress.lua +++ b/plugins/statistics.koplugin/readerprogress.lua @@ -5,6 +5,7 @@ local Device = require("device") local Font = require("ui/font") local FrameContainer = require("ui/widget/container/framecontainer") local Geom = require("ui/geometry") +local GestureRange = require("ui/gesturerange") local HorizontalGroup = require("ui/widget/horizontalgroup") local HorizontalSpan = require("ui/widget/horizontalspan") local InputContainer = require("ui/widget/container/inputcontainer") @@ -61,6 +62,14 @@ function ReaderProgress:init() seqtext = "any key", doc = "close dialog" } } end + if Device:isTouchDevice() then + self.ges_events.Swipe = { + GestureRange:new{ + ges = "swipe", + range = function() return self.dimen end, + } + } + end self[1] = FrameContainer:new{ width = self.width, height = self.height, @@ -488,6 +497,22 @@ function ReaderProgress:onAnyKeyPressed() return self:onClose() end +function ReaderProgress:onSwipe(arg, ges_ev) + if ges_ev.direction == "south" then + -- Allow easier closing with swipe up/down + self:onClose() + elseif ges_ev.direction == "east" or ges_ev.direction == "west" or ges_ev.direction == "north" then + -- no use for now + do end -- luacheck: ignore 541 + else -- diagonal swipe + -- trigger full refresh + UIManager:setDirty(nil, "full") + -- a long diagonal swipe may also be used for taking a screenshot, + -- so let it propagate + return false + end +end + function ReaderProgress:onClose() UIManager:close(self) return true