Kindle4NT improvements (#3745)

* [device][kindle4] add fake event to kindle4

* modify focusmanager to allow for more complex layout

The focusmanager now naviguate the layout by avoiding nil value
instead of relying on table lenght. It should be completely backward
compatible

* add Dpad naviguation to the touchmenu

* fix crash because virtualkeyboard on non touch device

the kindle4NT has no keyboard nor touch, the fix open the virtual
keyboard so koreader dont crash but it's not useable

* Enable device with keys to use the touchmenu

* Don't get stuck in reader progress statistics plugin

* [underlinecontainer] Fix and remove unused function

References #1898.
This commit is contained in:
onde2rock
2018-03-14 22:16:38 +01:00
committed by Frans de Jonge
parent 9849d89f0e
commit e8aab49ee9
12 changed files with 148 additions and 69 deletions

View File

@@ -6,6 +6,8 @@ local Button = require("ui/widget/button")
local CenterContainer = require("ui/widget/container/centercontainer")
local CheckMark = require("ui/widget/checkmark")
local Device = require("device")
local Event = require("ui/event")
local FocusManager = require("ui/widget/focusmanager")
local Font = require("ui/font")
local FrameContainer = require("ui/widget/container/framecontainer")
local Geom = require("ui/geometry")
@@ -20,12 +22,14 @@ local RightContainer = require("ui/widget/container/rightcontainer")
local Size = require("ui/size")
local TextWidget = require("ui/widget/textwidget")
local UIManager = require("ui/uimanager")
local UnderlineContainer = require("ui/widget/container/underlinecontainer")
local VerticalGroup = require("ui/widget/verticalgroup")
local VerticalSpan = require("ui/widget/verticalspan")
local util = require("ffi/util")
local _ = require("gettext")
local Screen = Device.screen
local getMenuText = require("util").getMenuText
local Input = Device.input
local Screen = Device.screen
--[[
TouchMenuItem widget
@@ -97,7 +101,27 @@ function TouchMenuItem:init()
},
},
}
self[1] = self.item_frame
self._underline_container = UnderlineContainer:new{
vertical_align = "center",
dimen =self.dimen,
self.item_frame
}
self[1] = self._underline_container
function self:isEnabled()
return item_enabled ~= false and true
end
end
function TouchMenuItem:onFocus()
self._underline_container.color = Blitbuffer.COLOR_BLACK
return true
end
function TouchMenuItem:onUnfocus()
self._underline_container.color = Blitbuffer.COLOR_WHITE
return true
end
function TouchMenuItem:onTapSelect(arg, ges)
@@ -202,9 +226,11 @@ function TouchMenuBar:init()
callback = nil,
padding_left = icon_padding,
padding_right = icon_padding,
menu = self.menu,
}
table.insert(self.icon_widgets, ib)
table.insert(self.menu.layout, ib) -- for the focusmanager
-- we have to use local variable here for closure callback
local _start_seg = end_seg + icon_sep_width
@@ -319,7 +345,7 @@ end
--[[
TouchMenu widget for hierarchical menus
--]]
local TouchMenu = InputContainer:new{
local TouchMenu = FocusManager:new{
tab_item_table = {},
-- for returnning in multi-level menus
item_table_stack = nil,
@@ -351,6 +377,8 @@ function TouchMenu:init()
end
end
self.layout = {}
self.ges_events.TapCloseAllMenus = {
GestureRange:new{
ges = "tap",
@@ -368,7 +396,10 @@ function TouchMenu:init()
}
}
self.key_events.Close = { {"Back"}, doc = "close touch menu" }
self.key_events.Back = { {"Back"}, doc = "back to upper menu or close touchmenu" }
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" }
local icons = {}
for _,v in ipairs(self.tab_item_table) do
@@ -509,7 +540,9 @@ function TouchMenu:updateItems()
local old_dimen = self.dimen and self.dimen:copy()
self:_recalculatePageLayout()
self.item_group:clear()
self.layout = {}
table.insert(self.item_group, self.bar)
table.insert(self.layout, self.bar.icon_widgets) --for the focusmanager
for c = 1, self.perpage do
-- calculate index in item_table
@@ -526,6 +559,9 @@ function TouchMenu:updateItems()
show_parent = self.show_parent,
}
table.insert(self.item_group, item_tmp)
if item_tmp:isEnabled() then
table.insert(self.layout, {[self.cur_tab] = item_tmp}) --for the focusmanager
end
if item.separator and c ~= self.perpage then
-- insert split line
table.insert(self.item_group, self.split_line)
@@ -553,6 +589,7 @@ function TouchMenu:updateItems()
-- recalculate dimen based on new layout
self.dimen.w = self.width
self.dimen.h = self.item_group:getSize().h + self.bordersize*2 + self.padding*2
self.selected = { x = self.cur_tab, y = 1 } --reset the position of the focusmanager
UIManager:setDirty("all", function()
local refresh_dimen =
@@ -707,4 +744,12 @@ function TouchMenu:onClose()
self:closeMenu()
end
function TouchMenu:onBack()
self:backToUpperMenu()
end
function TouchMenu:onPress()
self:getFocusItem():handleEvent(Event:new("TapSelect"))
end
return TouchMenu