Create SelectionLib.txt
This commit is contained in:
parent
1815ab2ffd
commit
345bd6df83
1 changed files with 127 additions and 0 deletions
127
libs/SelectionLib.txt
Normal file
127
libs/SelectionLib.txt
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
--@name SelectorLib
|
||||
--@shared
|
||||
|
||||
if SERVER then
|
||||
function openSelectionMenu(ply, vars, name, callback)
|
||||
local id = tostring({})
|
||||
|
||||
net.start("Selection")
|
||||
net.writeString(id)
|
||||
net.writeString(name)
|
||||
net.writeTable(vars)
|
||||
net.send(ply)
|
||||
|
||||
net.receive("Callback"..id, function()
|
||||
local var = net.readString()
|
||||
if not var then return end
|
||||
|
||||
callback(var)
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
if CLIENT then
|
||||
local selectionData = {
|
||||
current = 1,
|
||||
list = {},
|
||||
callback = nil,
|
||||
id = nil
|
||||
}
|
||||
|
||||
local screenX,screenY = render.getGameResolution()
|
||||
|
||||
function openSelectionMenu(vars, name, callback)
|
||||
if not render.isHUDActive() then enableHud(nil, true) end
|
||||
|
||||
selectionData.current = 1
|
||||
selectionData.name = name
|
||||
selectionData.list = vars
|
||||
selectionData.callback = callback
|
||||
selectionData.id = "Temp"
|
||||
end
|
||||
|
||||
function sendSelection(index)
|
||||
if not selectionData.id or not selectionData.list[index] then return end
|
||||
net.start("Callback"..selectionData.id)
|
||||
net.writeString(selectionData.list[index])
|
||||
net.send()
|
||||
|
||||
selectionData = {current = 1, list = {}, callback = nil, id = nil}
|
||||
end
|
||||
|
||||
net.receive("Selection", function()
|
||||
local id = net.readString()
|
||||
local name = net.readString()
|
||||
local vars = net.readTable()
|
||||
|
||||
openSelectionMenu(vars, name, function(choice)
|
||||
sendSelection(choice)
|
||||
end)
|
||||
selectionData.id = id
|
||||
end)
|
||||
|
||||
local spacing = 48
|
||||
local centerY = screenY / 2
|
||||
local visible = 1
|
||||
local font = render.createFont("Arial",24)
|
||||
local def_font = render.createFont("Arial",16,800)
|
||||
|
||||
hook.add("DrawHud", "SelectionDraw", function()
|
||||
if not selectionData.list[1] then return end
|
||||
local itemCount = 2 * visible + 1
|
||||
local boxHeight = spacing * itemCount
|
||||
local boxWidth = 250
|
||||
local boxX = screenX / 2 - boxWidth / 2
|
||||
local boxY = centerY - spacing * visible - spacing / 2
|
||||
|
||||
render.setColor(Color(80,60,255))
|
||||
render.drawRect(boxX+5, boxY-15, boxWidth + 20, boxHeight + 40)
|
||||
render.setColor(Color(50,30,200))
|
||||
render.drawRect(boxX+10, boxY+10, boxWidth + 10, boxHeight + 10)
|
||||
|
||||
if selectionData.name then
|
||||
render.setColor(Color(255,255,255))
|
||||
render.setFont(def_font)
|
||||
render.drawText(boxX+10, boxY-10,selectionData.name)
|
||||
end
|
||||
|
||||
for i = -visible, visible do
|
||||
local index = selectionData.current + i
|
||||
if selectionData.list[index] then
|
||||
local y = centerY + i * spacing
|
||||
local color = (i == 0) and Color(255, 255, 255) or Color(255, 255, 255)
|
||||
local bcolor = (i == 0) and Color(0, 255, 0) or Color(0, 255, 255)
|
||||
|
||||
local text = selectionData.list[index]
|
||||
render.setFont(font)
|
||||
|
||||
local maxTextWidth = boxWidth - 20
|
||||
while render.getTextSize(text) > maxTextWidth do
|
||||
text = string.sub(text, 1, #text - 1)
|
||||
end
|
||||
if render.getTextSize(selectionData.list[index]) > maxTextWidth then
|
||||
text = text:sub(1, #text - 3) .. "..."
|
||||
end
|
||||
|
||||
render.setColor(bcolor)
|
||||
render.drawRect(boxX + 15, y - 10, boxWidth, spacing)
|
||||
render.setColor(color)
|
||||
render.drawText(boxX + 20, y, text)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
hook.add("InputPressed", "SelectorScrollInput", function(key)
|
||||
if not selectionData.list[1] then return end
|
||||
|
||||
if key == KEY.UPARROW then
|
||||
selectionData.current = math.max(1, selectionData.current - 1)
|
||||
elseif key == KEY.DOWNARROW then
|
||||
selectionData.current = math.min(#selectionData.list, selectionData.current + 1)
|
||||
elseif key == KEY.ENTER then
|
||||
if selectionData.callback then
|
||||
selectionData.callback(selectionData.current)
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
Loading…
Add table
Reference in a new issue