Files
wnsrc/lua/slib/vgui/cl_slistpanel.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

180 lines
5.5 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local font = slib.createFont("Roboto", 14)
local textcolor, neutralcolor, successcolor, failcolor, maincolor_7, maincolor_10, maincolor_15, maincolor_25 = slib.getTheme("textcolor"), slib.getTheme("neutralcolor"), slib.getTheme("successcolor"), slib.getTheme("failcolor"), slib.getTheme("maincolor", 7), slib.getTheme("maincolor", 10), slib.getTheme("maincolor", 15), slib.getTheme("maincolor", 25)
local PANEL = {}
function PANEL:Init()
self:Dock(TOP)
self:SetTall(slib.getScaledSize(250, "y"))
self:DockMargin(slib.getTheme("margin"),0,slib.getTheme("margin"),slib.getTheme("margin"))
self.frame = vgui.Create("SScrollPanel", self)
self.frame:Dock(FILL)
self.frame.Paint = function(s,w,h)
surface.SetDrawColor(maincolor_10)
surface.DrawRect(0, 0, w, h)
end
self.selected = false
slib.wrapFunction(self, "SetZPos", nil, function() return self end, true)
slib.wrapFunction(self, "SetTall", nil, function() return self end, true)
slib.wrapFunction(self, "DockMargin", nil, function() return self end, true)
slib.wrapFunction(self, "Dock", nil, function() return self end, true)
end
function PANEL:addEntry(var, toggleable, tab)
title = var
if !isstring(var) and IsValid(var) and var:IsPlayer() then title = var:Nick() end
local selectable = vgui.Create("DButton", self.frame)
selectable:SetTall(slib.getScaledSize(25, "y"))
selectable:Dock(TOP)
selectable:DockMargin(slib.getTheme("margin"),slib.getTheme("margin"),slib.getTheme("margin"),0)
selectable:SetText("")
selectable.name = title
selectable.tab = tab
selectable.toggleable = toggleable
selectable.Paint = function(s,w,h)
if !isstring(var) and !IsValid(var) then s:Remove() return end
local wantedcolor
if s.toggleable then
if isfunction(s.toggleCheck) then
wantedcolor = s.toggleCheck() and successcolor or failcolor
end
else
wantedcolor = neutralcolor
end
wantedcolor.a = 40
if !s.toggleable and self.selected ~= var then
wantedcolor.a = 0
end
surface.SetDrawColor(slib.lerpColor(s, wantedcolor))
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(maincolor_25)
surface.DrawOutlinedRect(0, 0, w, h)
draw.SimpleText(selectable.name, font, 5, h * .5, textcolor, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
end
selectable.DoClick = function()
self.selected = (self.selected ~= var) and var or nil
end
return self, selectable
end
function PANEL:setTitle(title)
self.title = title
if !self.topbar then
self.topbar = vgui.Create("EditablePanel", self)
self.topbar:SetTall(slib.getScaledSize(25, "y"))
self.topbar:Dock(TOP)
self.topbar.Paint = function(s,w,h)
surface.SetDrawColor(maincolor_7)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(maincolor_25)
surface.DrawRect(0,h-1,w,1)
draw.SimpleText(self.title, font, slib.getTheme("margin"), h * .5, textcolor, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
end
end
return self
end
function PANEL:addSearchbar()
self.search = vgui.Create("SSearchBar", self.topbar)
self.search:Dock(RIGHT)
:DockMargin(slib.getTheme("margin"),slib.getTheme("margin"),slib.getTheme("margin"),slib.getTheme("margin"))
self.search.entry.bg = maincolor_15
self.search.entry.onValueChange = function(newval)
for k,v in pairs(self.frame:GetCanvas():GetChildren()) do
v:SetVisible(string.find(string.lower(v.name), string.lower(newval)))
self.frame:GetCanvas():InvalidateLayout(true)
end
end
self.topbar.OnSizeChanged = function()
self.search:SetWide(self.topbar:GetWide() * .35)
end
return self
end
function PANEL:addDropdown()
self.dropdown = vgui.Create("SDropDown", self.topbar)
self.dropdown:Dock(RIGHT)
:DockMargin(slib.getTheme("margin"),slib.getTheme("margin"),slib.getTheme("margin"),slib.getTheme("margin"))
self.dropdown.bg = maincolor_15
self.dropdown.onValueChange = function(newtab)
for k,v in pairs(self.frame:GetCanvas():GetChildren()) do
v:SetVisible(v.tab == newtab)
self.frame:GetCanvas():InvalidateLayout(true)
end
end
self.topbar.OnSizeChanged = function()
self.dropdown:SetWide(self.topbar:GetWide() * .35)
end
return self.dropdown
end
function PANEL:addButton(title, func, thnk)
if !self.bottombar then
self.bottombar = vgui.Create("EditablePanel", self)
self.bottombar:Dock(BOTTOM)
self.bottombar:SetTall(slib.getScaledSize(25,"x"))
self.bottombar.Paint = function(s,w,h)
surface.SetDrawColor(maincolor_25)
surface.DrawRect(0, 0, w, 1)
end
end
local bttn = vgui.Create("SButton", self.bottombar)
bttn:Dock(LEFT)
:setTitle(title)
:DockMargin(slib.getTheme("margin"),slib.getTheme("margin"),0,slib.getTheme("margin"))
bttn.DoClick = function() func(self, bttn) end
if thnk then
bttn.Think = function() thnk(self, bttn) end
end
return self, bttn
end
function PANEL:Paint(w,h)
surface.SetDrawColor(maincolor_10)
surface.DrawRect(0, 0, w, h)
end
vgui.Register("SListPanel", PANEL, "EditablePanel")