mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
This should finish the work to make all globals to local variables. That allows LuaJIT to properly compile things by interning the references to the relevant parts (rather than looking up globals all the time which stops a trace).
84 lines
2.5 KiB
Lua
84 lines
2.5 KiB
Lua
local InputContainer = require("ui/widget/container/inputcontainer")
|
|
local TextBoxWidget = require("ui/widget/textboxwidget")
|
|
local VerticalScrollBar = require("ui/widget/verticalscrollbar")
|
|
local Geom = require("ui/geometry")
|
|
local GestureRange = require("ui/gesturerange")
|
|
local UIManager = require("ui/uimanager")
|
|
local Screen = require("ui/screen")
|
|
local HorizontalGroup = require("ui/widget/horizontalgroup")
|
|
local HorizontalSpan = require("ui/widget/horizontalspan")
|
|
local Device = require("ui/device")
|
|
|
|
--[[
|
|
Text widget with vertical scroll bar
|
|
--]]
|
|
local ScrollTextWidget = InputContainer:new{
|
|
text = nil,
|
|
face = nil,
|
|
bgcolor = 0.0, -- [0.0, 1.0]
|
|
fgcolor = 1.0, -- [0.0, 1.0]
|
|
width = 400,
|
|
height = 20,
|
|
scroll_bar_width = Screen:scaleByDPI(6),
|
|
text_scroll_span = Screen:scaleByDPI(6),
|
|
dialog = nil,
|
|
}
|
|
|
|
function ScrollTextWidget:init()
|
|
self.text_widget = TextBoxWidget:new{
|
|
text = self.text,
|
|
face = self.face,
|
|
bgcolor = self.bgcolor,
|
|
fgcolor = self.fgcolor,
|
|
width = self.width - self.scroll_bar_width - self.text_scroll_span,
|
|
height = self.height
|
|
}
|
|
local visible_line_count = self.text_widget:getVisLineCount()
|
|
local total_line_count = self.text_widget:getAllLineCount()
|
|
self.v_scroll_bar = VerticalScrollBar:new{
|
|
enable = visible_line_count < total_line_count,
|
|
low = 0,
|
|
high = visible_line_count/total_line_count,
|
|
width = Screen:scaleByDPI(6),
|
|
height = self.height,
|
|
}
|
|
local horizontal_group = HorizontalGroup:new{}
|
|
table.insert(horizontal_group, self.text_widget)
|
|
table.insert(horizontal_group, HorizontalSpan:new{width = Screen:scaleByDPI(6)})
|
|
table.insert(horizontal_group, self.v_scroll_bar)
|
|
self[1] = horizontal_group
|
|
self.dimen = Geom:new(self[1]:getSize())
|
|
if Device:isTouchDevice() then
|
|
self.ges_events = {
|
|
Swipe = {
|
|
GestureRange:new{
|
|
ges = "swipe",
|
|
range = self.dimen,
|
|
},
|
|
},
|
|
}
|
|
end
|
|
end
|
|
|
|
function ScrollTextWidget:updateScrollBar(text)
|
|
local virtual_line_num = text:getVirtualLineNum()
|
|
local visible_line_count = text:getVisLineCount()
|
|
local all_line_count = text:getAllLineCount()
|
|
self.v_scroll_bar:set(
|
|
(virtual_line_num - 1) / all_line_count,
|
|
(virtual_line_num - 1 + visible_line_count) / all_line_count
|
|
)
|
|
end
|
|
|
|
function ScrollTextWidget:onSwipe(arg, ges)
|
|
if ges.direction == "north" then
|
|
self.text_widget:scrollDown()
|
|
self:updateScrollBar(self.text_widget)
|
|
elseif ges.direction == "south" then
|
|
self.text_widget:scrollUp()
|
|
self:updateScrollBar(self.text_widget)
|
|
end
|
|
UIManager:setDirty(self.dialog, "partial")
|
|
return true
|
|
end
|