mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
219 lines
6.9 KiB
Lua
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") |