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