From 4a65cc666bbb462d4444cbc43f654beca8ec851e Mon Sep 17 00:00:00 2001 From: Frans de Jonge Date: Thu, 4 Jun 2020 13:26:18 +0200 Subject: [PATCH] [UX] Implement hasFewKeys prototype (#6195) This is a quick exploration into how the new Device:hasFewKeys() method could work to make things more usable on very limited devices. In the reader, the right is repurposed to open the menu. Left in turn closes it. The same principle is applied to ButtonDialog. This means you can select anything in principle, but once you go right you can't go back. References . --- frontend/apps/reader/modules/readermenu.lua | 6 ++++++ frontend/apps/reader/modules/readerpaging.lua | 4 ++++ frontend/ui/widget/buttondialog.lua | 3 ++- frontend/ui/widget/buttondialogtitle.lua | 3 ++- frontend/ui/widget/focusmanager.lua | 3 +++ frontend/ui/widget/menu.lua | 3 +++ frontend/ui/widget/touchmenu.lua | 3 +++ 7 files changed, 23 insertions(+), 2 deletions(-) diff --git a/frontend/apps/reader/modules/readermenu.lua b/frontend/apps/reader/modules/readermenu.lua index 69f606e51..c64acbbbe 100644 --- a/frontend/apps/reader/modules/readermenu.lua +++ b/frontend/apps/reader/modules/readermenu.lua @@ -59,10 +59,16 @@ function ReaderMenu:init() if Device:hasKeys() then if Device:isTouchDevice() then self.key_events.TapShowMenu = { { "Menu" }, doc = "show menu", } + if Device:hasFewKeys() then + self.key_events.TapShowMenu = { { { "Menu", "Right" } }, doc = "show menu", } + end else -- map menu key to only top menu because bottom menu is only -- designed for touch devices self.key_events.ShowReaderMenu = { { "Menu" }, doc = "show menu", } + if Device:hasFewKeys() then + self.key_events.ShowReaderMenu = { { { "Menu", "Right" } }, doc = "show menu", } + end end end self.activation_menu = G_reader_settings:readSetting("activate_menu") diff --git a/frontend/apps/reader/modules/readerpaging.lua b/frontend/apps/reader/modules/readerpaging.lua index 2f20312dc..427927673 100644 --- a/frontend/apps/reader/modules/readerpaging.lua +++ b/frontend/apps/reader/modules/readerpaging.lua @@ -52,6 +52,10 @@ function ReaderPaging:init() { { "RPgBack", "LPgBack", "Left" } }, doc = "go to previous page", event = "GotoViewRel", args = -1, } + if Device:hasFewKeys() then + table.remove(self.key_events.GotoNextPage[1][1], 3) -- right + table.remove(self.key_events.GotoPrevPage[1][1], 3) -- left + end self.key_events.GotoNextPos = { { {"Down" } }, doc = "go to next position", event = "GotoPosRel", args = 1, diff --git a/frontend/ui/widget/buttondialog.lua b/frontend/ui/widget/buttondialog.lua index c0913b6b2..09c219a43 100644 --- a/frontend/ui/widget/buttondialog.lua +++ b/frontend/ui/widget/buttondialog.lua @@ -20,8 +20,9 @@ local ButtonDialog = InputContainer:new{ function ButtonDialog:init() if Device:hasKeys() then + local close_keys = Device:hasFewKeys() and { "Back", "Left" } or "Back" self.key_events = { - Close = { {"Back"}, doc = "close button dialog" } + Close = { { close_keys }, doc = "close button dialog" } } end if Device:isTouchDevice() then diff --git a/frontend/ui/widget/buttondialogtitle.lua b/frontend/ui/widget/buttondialogtitle.lua index 8d7581bf6..63ac84279 100644 --- a/frontend/ui/widget/buttondialogtitle.lua +++ b/frontend/ui/widget/buttondialogtitle.lua @@ -34,8 +34,9 @@ local ButtonDialogTitle = InputContainer:new{ function ButtonDialogTitle:init() if self.dismissable then if Device:hasKeys() then + local close_keys = Device:hasFewKeys() and { "Back", "Left" } or "Back" self.key_events = { - Close = { { "Back" }, doc = "close button dialog" } + Close = { { close_keys }, doc = "close button dialog" } } end if Device:isTouchDevice() then diff --git a/frontend/ui/widget/focusmanager.lua b/frontend/ui/widget/focusmanager.lua index a5e3c202f..6ba25244b 100644 --- a/frontend/ui/widget/focusmanager.lua +++ b/frontend/ui/widget/focusmanager.lua @@ -43,6 +43,9 @@ function FocusManager:init() FocusLeft = { {"Left"}, doc = "move focus left", event = "FocusMove", args = {-1, 0} }, FocusRight = { {"Right"}, doc = "move focus right", event = "FocusMove", args = {1, 0} }, } + if Device:hasFewKeys() then + self.key_events.FocusLeft = nil + end end end diff --git a/frontend/ui/widget/menu.lua b/frontend/ui/widget/menu.lua index 09ec4c607..9ffb8379d 100644 --- a/frontend/ui/widget/menu.lua +++ b/frontend/ui/widget/menu.lua @@ -892,6 +892,9 @@ function Menu:init() if Device:hasKeys() then -- set up keyboard events self.key_events.Close = { {"Back"}, doc = "close menu" } + if Device:hasFewKeys() then + self.key_events.Close = { {"Left"}, doc = "close menu" } + end self.key_events.NextPage = { {Input.group.PgFwd}, doc = "goto next page of the menu" } diff --git a/frontend/ui/widget/touchmenu.lua b/frontend/ui/widget/touchmenu.lua index 9c53e799a..42fc1b676 100644 --- a/frontend/ui/widget/touchmenu.lua +++ b/frontend/ui/widget/touchmenu.lua @@ -420,6 +420,9 @@ function TouchMenu:init() } self.key_events.Back = { {"Back"}, doc = "back to upper menu or close touchmenu" } + if Device:hasFewKeys() then + self.key_events.Back = { {"Left"}, doc = "back to upper menu or close touchmenu" } + end self.key_events.NextPage = { {Input.group.PgFwd}, doc = "next page" } self.key_events.PrevPage = { {Input.group.PgBack}, doc = "previous page" } self.key_events.Press = { {"Press"}, doc = "chose selected item" }