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

146 lines
3.2 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 BSHADOWS = sui.BSHADOWS
local SUI, NAME = CURRENT_SUI, CURRENT_SUI.name
local GetColor = SUI.GetColor
local RoundedBox = sui.TDLib.LibClasses.RoundedBox
local TextColor = sui.TDLib.LibClasses.TextColor
local OPTION_FONT = SUI.CreateFont("MenuOption", "Roboto Medium", 15, 500)
local PANEL = {}
AccessorFunc(PANEL, "m_bIsMenuComponent", "IsMenu")
AccessorFunc(PANEL, "m_bDeleteSelf", "DeleteSelf")
AccessorFunc(PANEL, "m_iMinimumWidth", "MinimumWidth")
AccessorFunc(PANEL, "m_SetInternal", "Internal")
PANEL:SetIsMenu(true)
PANEL:SetDeleteSelf(true)
local pad = 4
local max_height = 300
local PerformLayout = function(s)
local w, h = s:ChildrenSize()
if h > SUI.Scale(max_height) then
h = SUI.Scale(max_height)
end
s:SetSize(math.max(s:GetMinimumWidth(), w), h)
end
function PANEL:Init()
self:GetCanvas():DockPadding(0, pad, 0, pad)
self:SetMinimumWidth(SUI.Scale(100))
self:SetKeyboardInputEnabled(false)
self:SetTall(pad * 2)
self:SetAlpha(0)
self.tall = pad * 2
RegisterDermaMenuForClose(self)
self:On("PerformLayoutInternal", PerformLayout)
end
function PANEL:Paint(w, h)
local x, y = self:LocalToScreen()
BSHADOWS.BeginShadow()
self:RoundedBox("Background", pad, x, y, w, h, GetColor("menu"))
BSHADOWS.EndShadow(1, 3, 3)
self:MoveToFront()
end
function PANEL:Open(x, y)
self:SizeToChildren(true, false)
local w, h = self:GetSize()
if h > SUI.Scale(max_height) then
h = SUI.Scale(max_height)
end
local internal = self:GetInternal()
internal:On("OnRemove", function()
self:Remove()
end)
if not x then
x, y = internal:LocalToScreen(0, 0)
y = y + (internal:GetTall() + 2)
end
if y + h > ScrH() then
y = y - h
end
if x + w > ScrW() then
x = x - w
end
if y < 1 then
y = 1
end
if x < 1 then
x = 1
end
self:SetPos(x, y)
self:MakePopup()
self:AlphaTo(255, 0.23)
self:SetDrawOnTop(true)
self:MoveToFront()
end
local option_OnMouseReleased = function(s, mousecode)
if s.Depressed and mousecode == MOUSE_LEFT then
CloseDermaMenus()
end
DButton.OnMouseReleased(s, mousecode)
end
function PANEL:AddOption(str, callback)
local option = self:Add("DButton")
option:Dock(TOP)
option:SetFont(OPTION_FONT)
option:SetText(str)
option:SizeToContentsX(20)
option:SizeToContentsY(10)
option:InvalidateLayout(true)
option.OnMouseReleased = option_OnMouseReleased
function option:Paint(w, h)
RoundedBox(self, "Background", 0, 0, 0, w, h, self.Hovered and GetColor("menu_option_hover") or GetColor("menu_option"))
TextColor(self, self.Hovered and GetColor("menu_option_hover_text") or GetColor("menu_option_text"))
end
option.DoClick = callback
self.tall = self.tall + option:GetTall()
self:SetTall(self.tall)
return option
end
function PANEL:AddSpacer()
local spacer = self:Add("Panel")
spacer:Dock(TOP)
spacer:DockMargin(0, 1, 0, 1)
spacer:SetTall(2)
function spacer:Paint(w, h)
RoundedBox(self, "Background", 0, 0, 0, w, h, GetColor("menu_spacer"))
end
spacer:InvalidateLayout(true)
end
sui.register("Menu", PANEL, NAME .. ".ScrollPanel")