Files
wnsrc/gamemodes/terrortown/gamemode/vgui/simpleicon.lua
lifestorm df294d03aa Upload
2024-08-04 23:54:45 +03:00

241 lines
5.7 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/
--]]
-- Altered version of gmod's SpawnIcon
-- This panel does not deal with models and such
local matHover = Material( "vgui/spawnmenu/hover" )
local PANEL = {}
AccessorFunc( PANEL, "m_iIconSize", "IconSize" )
function PANEL:Init()
self.Icon = vgui.Create( "DImage", self )
self.Icon:SetMouseInputEnabled( false )
self.Icon:SetKeyboardInputEnabled( false )
self.animPress = Derma_Anim( "Press", self, self.PressedAnim )
self:SetIconSize(64)
end
function PANEL:OnMousePressed( mcode )
if mcode == MOUSE_LEFT then
self:DoClick()
self.animPress:Start(0.1)
end
end
function PANEL:OnMouseReleased()
end
function PANEL:DoClick()
end
function PANEL:OpenMenu()
end
function PANEL:ApplySchemeSettings()
end
function PANEL:OnCursorEntered()
self.PaintOverOld = self.PaintOver
self.PaintOver = self.PaintOverHovered
end
function PANEL:OnCursorExited()
if self.PaintOver == self.PaintOverHovered then
self.PaintOver = self.PaintOverOld
end
end
function PANEL:PaintOverHovered()
if self.animPress:Active() then return end
surface.SetDrawColor( 255, 255, 255, 80 )
surface.SetMaterial( matHover )
self:DrawTexturedRect()
end
function PANEL:PerformLayout()
if self.animPress:Active() then return end
self:SetSize( self.m_iIconSize, self.m_iIconSize )
self.Icon:StretchToParent( 0, 0, 0, 0 )
end
function PANEL:SetIcon( icon )
self.Icon:SetImage(icon)
end
function PANEL:GetIcon()
return self.Icon:GetImage()
end
function PANEL:SetIconColor(clr)
self.Icon:SetImageColor(clr)
end
function PANEL:Think()
self.animPress:Run()
end
function PANEL:PressedAnim( anim, delta, data )
if anim.Started then
return
end
if anim.Finished then
self.Icon:StretchToParent( 0, 0, 0, 0 )
return
end
local border = math.sin( delta * math.pi ) * (self.m_iIconSize * 0.05 )
self.Icon:StretchToParent( border, border, border, border )
end
vgui.Register( "SimpleIcon", PANEL, "Panel" )
---
local PANEL = {}
function PANEL:Init()
self.Layers = {}
end
-- Add a panel to this icon. Most recent addition will be the top layer.
function PANEL:AddLayer(pnl)
if not IsValid(pnl) then return end
pnl:SetParent(self)
pnl:SetMouseInputEnabled(false)
pnl:SetKeyboardInputEnabled(false)
table.insert(self.Layers, pnl)
end
function PANEL:PerformLayout()
if self.animPress:Active() then return end
self:SetSize( self.m_iIconSize, self.m_iIconSize )
self.Icon:StretchToParent( 0, 0, 0, 0 )
for _, p in ipairs(self.Layers) do
p:SetPos(0, 0)
p:InvalidateLayout()
end
end
function PANEL:EnableMousePassthrough(pnl)
for _, p in pairs(self.Layers) do
if p == pnl then
p.OnMousePressed = function(s, mc) s:GetParent():OnMousePressed(mc) end
p.OnCursorEntered = function(s) s:GetParent():OnCursorEntered() end
p.OnCursorExited = function(s) s:GetParent():OnCursorExited() end
p:SetMouseInputEnabled(true)
end
end
end
vgui.Register("LayeredIcon", PANEL, "SimpleIcon")
-- Avatar icon
local PANEL = {}
function PANEL:Init()
self.imgAvatar = vgui.Create( "AvatarImage", self )
self.imgAvatar:SetMouseInputEnabled( false )
self.imgAvatar:SetKeyboardInputEnabled( false )
self.imgAvatar.PerformLayout = function(s) s:Center() end
self:SetAvatarSize(32)
self:AddLayer(self.imgAvatar)
--return self.BaseClass.Init(self)
end
function PANEL:SetAvatarSize(s)
self.imgAvatar:SetSize(s, s)
end
function PANEL:SetPlayer(ply)
self.imgAvatar:SetPlayer(ply)
end
vgui.Register( "SimpleIconAvatar", PANEL, "LayeredIcon" )
--- Labelled icon
local PANEL = {}
AccessorFunc(PANEL, "IconText", "IconText")
AccessorFunc(PANEL, "IconTextColor", "IconTextColor")
AccessorFunc(PANEL, "IconFont", "IconFont")
AccessorFunc(PANEL, "IconTextShadow", "IconTextShadow")
AccessorFunc(PANEL, "IconTextPos", "IconTextPos")
function PANEL:Init()
self:SetIconText("")
self:SetIconTextColor(Color(255, 200, 0))
self:SetIconFont("TargetID")
self:SetIconTextShadow({opacity=255, offset=2})
self:SetIconTextPos({32, 32})
-- DPanelSelect loves to overwrite its children's PaintOver hooks and such,
-- so have to use a dummy panel to do some custom painting.
self.FakeLabel = vgui.Create("Panel", self)
self.FakeLabel.PerformLayout = function(s) s:StretchToParent(0,0,0,0) end
self:AddLayer(self.FakeLabel)
return self.BaseClass.Init(self)
end
function PANEL:PerformLayout()
self:SetLabelText(self:GetIconText(), self:GetIconTextColor(), self:GetIconFont(), self:GetIconTextPos())
return self.BaseClass.PerformLayout(self)
end
function PANEL:SetIconProperties(color, font, shadow, pos)
self:SetIconTextColor( color or self:GetIconTextColor())
self:SetIconFont( font or self:GetIconFont())
self:SetIconTextShadow(shadow or self:GetIconShadow())
self:SetIconTextPos( pos or self:GetIconTextPos())
end
function PANEL:SetLabelText(text, color, font, pos)
if self.FakeLabel then
local spec = {pos=pos, color=color, text=text, font=font, xalign=TEXT_ALIGN_CENTER, yalign=TEXT_ALIGN_CENTER}
local shadow = self:GetIconTextShadow()
local opacity = shadow and shadow.opacity or 0
local offset = shadow and shadow.offset or 0
local drawfn = shadow and draw.TextShadow or draw.Text
self.FakeLabel.Paint = function()
drawfn(spec, offset, opacity)
end
end
end
vgui.Register("SimpleIconLabelled", PANEL, "LayeredIcon")