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

219 lines
6.9 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 PANEL = {}
local colorpickerMat, checkmarkMat = Material("slib/icons/color-picker16.png", "noclamp smooth" ), Material("slib/icons/checkmark.png", "noclamp smooth" )
local textcolor, textcolor_50, maincolor, maincolor_7, maincolor_10, accentcolor, cleanaccentcolor = slib.getTheme("textcolor"), slib.getTheme("textcolor", -50), slib.getTheme("maincolor"), slib.getTheme("maincolor", 7), slib.getTheme("maincolor", 10), slib.getTheme("accentcolor"), slib.getTheme("accentcolor")
local margin = slib.getTheme("margin")
function PANEL:Init()
self:Dock(TOP)
self:SetTall(slib.getScaledSize(25, "y"))
self:DockMargin(margin, 0, margin, margin)
self.font = slib.createFont("Roboto", 14)
self.bg = maincolor_7
self.elemBg = maincolor
slib.wrapFunction(self, "SetZPos", nil, function() return self end, true)
slib.wrapFunction(self, "DockMargin", nil, function() return self end, true)
end
function PANEL:Paint(w,h)
surface.SetDrawColor(self.bg)
surface.DrawRect(0, 0, w, h)
draw.SimpleText(self.name, self.font, self.center and w * .5 - self.xoffset - margin or margin, h * .5, textcolor, self.center and TEXT_ALIGN_CENTER or TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
end
function PANEL:OnSizeChanged(w, h)
if self.center then
self:setCenter()
end
end
function PANEL:setCenter()
self.center = true
self.xoffset = self.element:GetWide() * .5
surface.SetFont(self.font)
local w, h = surface.GetTextSize(self.name)
local l,t,r,b = self.element:GetDockMargin()
self.element:DockMargin(l,t,self:GetWide() * .5 - self.xoffset - (w * .5) - margin,b)
end
function PANEL:addStatement(name, value)
self.name = name
local statement = slib.getStatement(value)
local element
if statement == "color" then
element = vgui.Create("SButton", self)
element:SetWide(slib.getScaledSize(25, "y") - slib.getScaledSize(2, "x") - slib.getScaledSize(2, "x"))
element.color = value
element.old_color = value
element.Paint = function(s,w,h)
draw.RoundedBox(h * .3, 0, 0, w, h, element.color)
surface.SetDrawColor(textcolor_50)
surface.SetMaterial(colorpickerMat)
local sizew, sizeh = 16, 16
surface.DrawTexturedRect( (w * .5) - (sizew * .5), (h * .5) - (sizeh * .5), sizew, sizeh )
end
element.OnRemove = function()
if IsValid(element.ColorPicker) then element.ColorPicker:Remove() end
end
element.DoClick = function()
if element.ColorPicker and IsValid(element.ColorPicker) then return end
local posx, posy = self:LocalToScreen( element:GetPos() )
element.ClosePicker = vgui.Create("SButton")
element.ClosePicker:Dock(FILL)
element.ClosePicker:MakePopup()
element.ClosePicker.DoClick = function()
if IsValid(element.ColorPicker) then element.ColorPicker:Remove() end
if IsValid(element.ClosePicker) then element.ClosePicker:Remove() end
end
element.ClosePicker.Paint = function() end
element.ColorPicker = vgui.Create("DColorMixer")
element.ColorPicker:SetSize( slib.getScaledSize(200, "x"), slib.getScaledSize(160, "y") )
element.ColorPicker:SetPos( posx - element.ColorPicker:GetWide(), posy )
element.ColorPicker:SetPalette(false)
element.ColorPicker:SetAlphaBar(false)
element.ColorPicker:SetAlphaBar( true )
element.ColorPicker:SetWangs(false)
element.ColorPicker:SetColor(element.color and element.color or Color(255,0,0))
element.ColorPicker:MakePopup()
element.ColorPicker.Think = function()
element.color = element.ColorPicker:GetColor()
end
element.ColorPicker.OnRemove = function()
element.old_color = element.color
if isfunction(element.onValueChange) then
local result = element.onValueChange(element.color)
if result == false then element.color = element.old_color end
end
end
end
elseif statement == "bool" then
element = vgui.Create("SButton", self)
element:SetWide(slib.getScaledSize(25, "y") - slib.getScaledSize(2, "x") - slib.getScaledSize(2, "x"))
element.basealpha = cleanaccentcolor.a
element.Paint = function(s,w,h)
draw.RoundedBox(h * .3, 0, 0, w, h, self.elemBg)
local wantedcolor = accentcolor
wantedcolor.a = s.enabled and element.basealpha or 0
local ico_size = h * .55
surface.SetDrawColor(slib.lerpColor(s, wantedcolor, 3))
surface.SetMaterial(checkmarkMat)
surface.DrawTexturedRect(w * .5 - ico_size * .5,h * .5 - ico_size * .5, ico_size, ico_size)
end
element.enabled = value
element.DoClick = function()
element.enabled = !element.enabled
if isfunction(element.onValueChange) then
local result = element.onValueChange(element.enabled)
if result == false then element.enabled = !element.enabled end
end
end
elseif statement == "int" then
element = vgui.Create("DNumberWang", self)
element:SetWide(slib.getScaledSize(50, "x"))
element:SetDrawLanguageID(false)
element:SetFont(self.font)
element:SetMin(0)
element:SetMax(2000000)
element.oldValue = value
element.Paint = function(s,w,h)
draw.RoundedBox(h * .3, 0, 0, w, h, self.elemBg)
s:DrawTextEntryText(textcolor, cleanaccentcolor, cleanaccentcolor)
end
element.OnValueChanged = function(ignore)
local oldValue = element.oldValue
local newValue = element:GetValue()
timer.Create(tostring(element), .3, 1, function()
if isfunction(element.onValueChange) then
local result = element.onValueChange(newValue)
if result == false then
element.oldValue = oldValue
element:SetText(oldValue)
return end
element.oldValue = newValue
end
end)
end
element:SetText(value)
elseif statement == "function" or statement == "table" then
element = vgui.Create("SButton", self)
element:Dock(RIGHT)
element:DockMargin(0,slib.getTheme("margin"),slib.getTheme("margin"),slib.getTheme("margin"))
element:setTitle(statement == "function" and "Execute" or "View Table")
element.DoClick = function()
if statement == "function" then
value()
return end
local display_data = vgui.Create("STableViewer")
display_data:setTable(value)
display_data:SetBG(false, true, nil, true)
if isfunction(element.onElementOpen) then
element.onElementOpen(display_data)
end
end
elseif statement == "string" then
element = vgui.Create("DTextEntry", self)
element:SetWide(slib.getScaledSize(80, "x"))
element:SetDrawLanguageID(false)
element:SetFont(self.font)
element.Paint = function(s,w,h)
draw.RoundedBox(h * .3, 0, 0, w, h, self.elemBg)
s:DrawTextEntryText(textcolor, cleanaccentcolor, cleanaccentcolor)
end
end
element:Dock(RIGHT)
element:DockMargin(0,slib.getScaledSize(2, "x"),slib.getScaledSize(2, "x"),slib.getScaledSize(2, "x"))
self.element = element
return self, element
end
vgui.Register("SStatement", PANEL, "EditablePanel")