mirror of https://github.com/kepler155c/opus
78 lines
1.9 KiB
Lua
78 lines
1.9 KiB
Lua
local class = require('opus.class')
|
|
local UI = require('opus.ui')
|
|
local Util = require('opus.util')
|
|
|
|
UI.ScrollingGrid = class(UI.Grid)
|
|
UI.ScrollingGrid.defaults = {
|
|
UIElement = 'ScrollingGrid',
|
|
scrollOffset = 0,
|
|
marginRight = 1,
|
|
}
|
|
function UI.ScrollingGrid:postInit()
|
|
self.scrollBar = UI.ScrollBar()
|
|
end
|
|
|
|
function UI.ScrollingGrid:drawRows()
|
|
UI.Grid.drawRows(self)
|
|
self.scrollBar:draw()
|
|
end
|
|
|
|
function UI.ScrollingGrid:getViewArea()
|
|
local y = 1
|
|
if not self.disableHeader then
|
|
y = y + self.headerHeight
|
|
end
|
|
|
|
return {
|
|
static = true, -- the container doesn't scroll
|
|
y = y, -- scrollbar Y
|
|
height = self.pageSize, -- viewable height
|
|
totalHeight = Util.size(self.values), -- total height
|
|
offsetY = self.scrollOffset, -- scroll offset
|
|
fill = not self.disableHeader and self.headerBackgroundColor,
|
|
}
|
|
end
|
|
|
|
function UI.ScrollingGrid:getStartRow()
|
|
local ts = Util.size(self.values)
|
|
if ts < self.pageSize then
|
|
self.scrollOffset = 0
|
|
end
|
|
return self.scrollOffset + 1
|
|
end
|
|
|
|
function UI.ScrollingGrid:setIndex(index)
|
|
if index < self.scrollOffset + 1 then
|
|
self.scrollOffset = index - 1
|
|
elseif index - self.scrollOffset > self.pageSize then
|
|
self.scrollOffset = index - self.pageSize
|
|
end
|
|
|
|
if self.scrollOffset < 0 then
|
|
self.scrollOffset = 0
|
|
else
|
|
local ts = Util.size(self.values)
|
|
if self.pageSize + self.scrollOffset + 1 > ts then
|
|
self.scrollOffset = math.max(0, ts - self.pageSize)
|
|
end
|
|
end
|
|
UI.Grid.setIndex(self, index)
|
|
end
|
|
|
|
function UI.ScrollingGrid.example()
|
|
local values = { }
|
|
for i = 1, 20 do
|
|
table.insert(values, { key = 'key' .. i, value = 'value' .. i })
|
|
end
|
|
return UI.ScrollingGrid {
|
|
values = values,
|
|
sortColumn = 'key',
|
|
columns = {
|
|
{ heading = 'key', key = 'key' },
|
|
{ heading = 'value', key = 'value' },
|
|
},
|
|
accelerators = {
|
|
grid_select = 'custom_select',
|
|
}
|
|
}
|
|
end |