131 lines
4.4 KiB
Lua
131 lines
4.4 KiB
Lua
local utils = require("utils")
|
|
local tHex = require("tHex")
|
|
|
|
return function(name, basalt)
|
|
local base = basalt.getObject("List")(name, basalt)
|
|
local objectType = "Menubar"
|
|
local object = {}
|
|
|
|
base:setSize(30, 1)
|
|
base:setZIndex(5)
|
|
|
|
local itemOffset = 0
|
|
local space, outerSpace = 1, 1
|
|
local scrollable = true
|
|
|
|
local function maxScroll()
|
|
local mScroll = 0
|
|
local w = base:getWidth()
|
|
local list = base:getAll()
|
|
for n = 1, #list do
|
|
mScroll = mScroll + list[n].text:len() + space * 2
|
|
end
|
|
return math.max(mScroll - w, 0)
|
|
end
|
|
|
|
object = {
|
|
init = function(self)
|
|
local parent = self:getParent()
|
|
self:listenEvent("mouse_click")
|
|
self:listenEvent("mouse_drag")
|
|
self:listenEvent("mouse_scroll")
|
|
return base.init(self)
|
|
end,
|
|
|
|
getType = function(self)
|
|
return objectType
|
|
end,
|
|
|
|
getBase = function(self)
|
|
return base
|
|
end,
|
|
|
|
setSpace = function(self, _space)
|
|
space = _space or space
|
|
self:updateDraw()
|
|
return self
|
|
end,
|
|
|
|
getSpace = function(self)
|
|
return space
|
|
end,
|
|
|
|
setScrollable = function(self, scroll)
|
|
scrollable = scroll
|
|
if(scroll==nil)then scrollable = true end
|
|
return self
|
|
end,
|
|
|
|
getScrollable = function(self)
|
|
return scrollable
|
|
end,
|
|
|
|
mouseHandler = function(self, button, x, y)
|
|
if(base:getBase().mouseHandler(self, button, x, y))then
|
|
local objX, objY = self:getAbsolutePosition()
|
|
local w,h = self:getSize()
|
|
local xPos = 0
|
|
local list = self:getAll()
|
|
for n = 1, #list do
|
|
if (list[n] ~= nil) then
|
|
if (objX + xPos <= x + itemOffset) and (objX + xPos + list[n].text:len() + (space*2) > x + itemOffset) and (objY == y) then
|
|
self:setValue(list[n])
|
|
self:sendEvent(event, self, event, 0, x, y, list[n])
|
|
end
|
|
xPos = xPos + list[n].text:len() + space * 2
|
|
end
|
|
end
|
|
self:updateDraw()
|
|
return true
|
|
end
|
|
end,
|
|
|
|
scrollHandler = function(self, dir, x, y)
|
|
if(base:getBase().scrollHandler(self, dir, x, y))then
|
|
if(scrollable)then
|
|
itemOffset = itemOffset + dir
|
|
if (itemOffset < 0) then
|
|
itemOffset = 0
|
|
end
|
|
|
|
local mScroll = maxScroll()
|
|
|
|
if (itemOffset > mScroll) then
|
|
itemOffset = mScroll
|
|
end
|
|
self:updateDraw()
|
|
end
|
|
return true
|
|
end
|
|
return false
|
|
end,
|
|
|
|
draw = function(self)
|
|
base.draw(self)
|
|
self:addDraw("list", function()
|
|
local parent = self:getParent()
|
|
local w,h = self:getSize()
|
|
local text = ""
|
|
local textBGCol = ""
|
|
local textFGCol = ""
|
|
local itemSelectedBG, itemSelectedFG = self:getSelectionColor()
|
|
for _, v in pairs(self:getAll()) do
|
|
local newItem = (" "):rep(space) .. v.text .. (" "):rep(space)
|
|
text = text .. newItem
|
|
if(v == self:getValue())then
|
|
textBGCol = textBGCol .. tHex[itemSelectedBG or v.bgCol or self:getBackground()]:rep(newItem:len())
|
|
textFGCol = textFGCol .. tHex[itemSelectedFG or v.FgCol or self:getForeground()]:rep(newItem:len())
|
|
else
|
|
textBGCol = textBGCol .. tHex[v.bgCol or self:getBackground()]:rep(newItem:len())
|
|
textFGCol = textFGCol .. tHex[v.FgCol or self:getForeground()]:rep(newItem:len())
|
|
end
|
|
end
|
|
|
|
self:addBlit(1, 1, text:sub(itemOffset+1, w+itemOffset), textFGCol:sub(itemOffset+1, w+itemOffset), textBGCol:sub(itemOffset+1, w+itemOffset))
|
|
end)
|
|
end,
|
|
}
|
|
|
|
object.__index = object
|
|
return setmetatable(object, base)
|
|
end |