mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
241 lines
5.7 KiB
Lua
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")
|