mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
185 lines
5.0 KiB
Lua
185 lines
5.0 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 font = slib.createFont("Roboto", 13)
|
|
local textcolor = slib.getTheme("textcolor")
|
|
local hovercolor, margin, maincolor_5, maincolor_10 = slib.getTheme("hovercolor"), slib.getTheme("margin"), slib.getTheme("maincolor", 5), slib.getTheme("maincolor", 10)
|
|
local icon = Material("slib/down-arrow.png", "smooth")
|
|
|
|
function PANEL:Init()
|
|
self:SetTall(slib.getScaledSize(25, "y"))
|
|
self:setTitle("Select Option", TEXT_ALIGN_LEFT)
|
|
self.iteration = 0
|
|
self.options = {}
|
|
self.maxHeightChilds = 0
|
|
|
|
self.close = vgui.Create("DButton")
|
|
self.close:Dock(FILL)
|
|
self.close:SetText("")
|
|
self.close:SetVisible(false)
|
|
|
|
self.close.Paint = function() end
|
|
|
|
self.close.DoClick = function()
|
|
self.close:SetVisible(false)
|
|
if IsValid(self.droppedMenu) then
|
|
self.droppedMenu:SetVisible(false)
|
|
end
|
|
|
|
if isfunction(self.onClose) then self.onClose(self) end
|
|
end
|
|
|
|
self.droppedMenu = vgui.Create("SScrollPanel")
|
|
self.droppedMenu:SetWide(self:GetWide())
|
|
self.droppedMenu:SetVisible(false)
|
|
self.droppedMenu.scrollbg = Color(42, 42, 42)
|
|
end
|
|
|
|
function PANEL:SetPlaceholder(str)
|
|
self:setTitle(str, TEXT_ALIGN_LEFT)
|
|
end
|
|
|
|
function PANEL:OnRemove()
|
|
if IsValid(self.droppedMenu) then self.droppedMenu:Remove() end
|
|
end
|
|
|
|
function PANEL:popupAlone()
|
|
self:DoClick()
|
|
|
|
local x, y = input.GetCursorPos()
|
|
if !IsValid(self.droppedMenu) then return end
|
|
self.droppedMenu:SetWide(self:GetWide())
|
|
self.droppedMenu:SetPos(x, y)
|
|
self.droppedMenu:MakePopup()
|
|
self:SetVisible(false)
|
|
self.poppedOut = true
|
|
|
|
self.onClose = function() self:Remove() end
|
|
|
|
return self
|
|
end
|
|
|
|
function PANEL:SizeToChilds()
|
|
local canvas = self.droppedMenu:GetCanvas()
|
|
local childsHeight = 0
|
|
|
|
for k,v in ipairs(canvas:GetChildren()) do
|
|
if self.maxHeightChilds > 0 and k > self.maxHeightChilds then
|
|
break
|
|
end
|
|
|
|
childsHeight = childsHeight + v:GetTall()
|
|
end
|
|
|
|
canvas:InvalidateLayout(true)
|
|
canvas:SetTall(childsHeight)
|
|
|
|
self.droppedMenu:SetHeight(canvas:GetTall())
|
|
end
|
|
|
|
function PANEL:addOption(val)
|
|
local iteration = self.iteration
|
|
self.options[iteration] = vgui.Create("SButton", self.droppedMenu)
|
|
:Dock(TOP)
|
|
:SetLinePos(0)
|
|
:SetTall(slib.getScaledSize(25, "y"))
|
|
|
|
if self.buttonfont then
|
|
self.options[iteration].font = self.buttonfont
|
|
end
|
|
|
|
local is_func = isfunction(val)
|
|
|
|
self.options[iteration]:setTitle(is_func and val() or val, TEXT_ALIGN_LEFT)
|
|
|
|
local wide = self.options[iteration]:GetWide()
|
|
|
|
self.options[iteration].accentheight = 1
|
|
|
|
self:SizeToChilds()
|
|
|
|
self.options[iteration].DoClick = function(called)
|
|
self.close.DoClick()
|
|
self:setTitle(is_func and val() or val, TEXT_ALIGN_LEFT, true)
|
|
self.sel_int = iteration + 1
|
|
|
|
if isfunction(self.onValueChange) then
|
|
self.onValueChange(is_func and val() or val)
|
|
end
|
|
end
|
|
local isFirst = !self.firstchild
|
|
self.options[iteration].Paint = function(s,w,h)
|
|
if is_func then self.options[iteration]:setTitle(val(), TEXT_ALIGN_LEFT) end
|
|
|
|
surface.SetDrawColor(s:IsHovered() and maincolor_5 or maincolor_10)
|
|
surface.DrawRect(0, 0, w, h)
|
|
|
|
draw.SimpleText(is_func and val() or val, self.buttonfont or self.options[iteration].font, margin, h * .5, color_white, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
|
|
end
|
|
|
|
if iteration == 0 then
|
|
self.options[iteration].DoClick()
|
|
end
|
|
|
|
if wide > self:GetWide() then
|
|
self:SetWide(wide)
|
|
end
|
|
|
|
self.iteration = self.iteration + 1
|
|
|
|
self.firstchild = self.firstchild or self.options[iteration]
|
|
self.lastchild = self.options[iteration]
|
|
|
|
return self
|
|
end
|
|
|
|
function PANEL:SelectOption(int)
|
|
self.options[int].DoClick(true)
|
|
|
|
return self
|
|
end
|
|
|
|
function PANEL:Reposition()
|
|
local x, y = self:LocalToScreen(0,self:GetTall())
|
|
if !IsValid(self.droppedMenu) then return end
|
|
self.droppedMenu:SetWide(self:GetWide())
|
|
self.droppedMenu:SetPos(x, y)
|
|
self.droppedMenu:MakePopup()
|
|
end
|
|
|
|
function PANEL:DoClick()
|
|
self.close:SetVisible(!self.droppedMenu:IsVisible())
|
|
self.close:MakePopup()
|
|
|
|
self.droppedMenu:SetVisible(!self.droppedMenu:IsVisible())
|
|
|
|
self:Reposition()
|
|
end
|
|
|
|
function PANEL:OnSizeChanged()
|
|
self:Reposition()
|
|
end
|
|
|
|
function PANEL:PaintOver(w,h)
|
|
local size = math.min(h * .7, slib.getScaledSize(12, "y"))
|
|
local thickness = slib.getScaledSize(2, "x")
|
|
|
|
draw.NoTexture()
|
|
|
|
local wantedCol = self:IsHovered() and color_white or hovercolor
|
|
|
|
surface.SetDrawColor(wantedCol)
|
|
surface.SetMaterial(icon)
|
|
surface.DrawTexturedRect(w - size - margin * 2, h * .5 - size * .5, size, size)
|
|
end
|
|
|
|
vgui.Register("SDropDown", PANEL, "SButton") |