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

256 lines
5.5 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 table = table
local vgui = vgui
local Msg = Msg
local setmetatable = setmetatable
local _G = _G
local gamemode = gamemode
local pairs = pairs
local isfunction = isfunction
module( "derma" )
Controls = {}
SkinList = {}
local DefaultSkin = {}
local SkinMetaTable = {}
local iSkinChangeIndex = 1
SkinMetaTable.__index = function ( self, key )
return DefaultSkin[ key ]
end
local function FindPanelsByClass( SeekingClass )
local outtbl = {}
--
-- Going through the registry is a hacky way to do this.
-- We're only doing it this way because it doesn't matter if it's a
-- bit slow - because this function is only used when reloading.
--
local tbl = vgui.GetAll()
for k, v in pairs( tbl ) do
if ( v.ClassName && v.ClassName == SeekingClass ) then
table.insert( outtbl, v )
end
end
return outtbl
end
--
-- Find all the panels that use this class and
-- if allowed replace the functions with the new ones.
--
local function ReloadClass( classname )
local ctrl = vgui.GetControlTable( classname )
if ( !ctrl ) then return end
local tbl = FindPanelsByClass( classname )
for k, v in pairs ( tbl ) do
if ( !v.AllowAutoRefresh ) then continue end
if ( v.PreAutoRefresh ) then
v:PreAutoRefresh()
end
for name, func in pairs( ctrl ) do
if ( !isfunction( func ) ) then continue end
v[ name ] = func
end
if ( v.PostAutoRefresh ) then
v:PostAutoRefresh()
end
end
end
--[[---------------------------------------------------------
GetControlList
-----------------------------------------------------------]]
function GetControlList()
return Controls
end
--[[---------------------------------------------------------
DefineControl
-----------------------------------------------------------]]
function DefineControl( strName, strDescription, strTable, strBase )
local bReloading = Controls[ strName ] != nil
-- Add Derma table to PANEL table.
strTable.Derma = {
ClassName = strName,
Description = strDescription,
BaseClass = strBase
}
-- Register control with VGUI
vgui.Register( strName, strTable, strBase )
-- Store control
Controls[ strName ] = strTable.Derma
-- Store as a global so controls can 'baseclass' easier
-- TODO: STOP THIS
_G[ strName ] = strTable
if ( bReloading ) then
Msg( "Reloaded Control: ", strName, "\n" )
ReloadClass( strName )
end
return strTable
end
--[[---------------------------------------------------------
DefineSkin
-----------------------------------------------------------]]
function DefineSkin( strName, strDescription, strTable )
strTable.Name = strName
strTable.Description = strDescription
strTable.Base = strTable.Base or "Default"
if ( strName != "Default" ) then
setmetatable( strTable, SkinMetaTable )
else
DefaultSkin = strTable
end
SkinList[ strName ] = strTable
-- Make all panels update their skin
RefreshSkins()
end
--[[---------------------------------------------------------
GetSkin - Returns current skin for panel
-----------------------------------------------------------]]
function GetSkinTable()
return table.Copy( SkinList )
end
--[[---------------------------------------------------------
Returns 'Default' Skin
-----------------------------------------------------------]]
function GetDefaultSkin()
local skin = nil
-- Check gamemode skin preference
if ( gamemode ) then
local skinname = gamemode.Call( "ForceDermaSkin" )
if ( skinname ) then skin = GetNamedSkin( skinname ) end
end
-- default
if ( !skin ) then skin = DefaultSkin end
return skin
end
--[[---------------------------------------------------------
Returns 'Named' Skin
-----------------------------------------------------------]]
function GetNamedSkin( name )
return SkinList[ name ]
end
--[[---------------------------------------------------------
SkinHook( strType, strName, panel )
-----------------------------------------------------------]]
function SkinHook( strType, strName, panel, w, h )
local Skin = panel:GetSkin()
if ( !Skin ) then return end
local func = Skin[ strType .. strName ]
if ( !func ) then return end
return func( Skin, panel, w, h )
end
--[[---------------------------------------------------------
SkinTexture( strName, panel, default )
-----------------------------------------------------------]]
function SkinTexture( strName, panel, default )
local Skin = panel:GetSkin()
if ( !Skin ) then return default end
local Textures = Skin.tex
if ( !Textures ) then return default end
return Textures[ strName ] or default
end
--[[---------------------------------------------------------
Color( strName, panel, default )
-----------------------------------------------------------]]
function Color( strName, panel, default )
local Skin = panel:GetSkin()
if ( !Skin ) then return default end
return Skin[ strName ] or default
end
--[[---------------------------------------------------------
SkinChangeIndex
-----------------------------------------------------------]]
function SkinChangeIndex()
return iSkinChangeIndex
end
--[[---------------------------------------------------------
RefreshSkins - clears all cache'd panels (so they will reassess which skin they should be using)
-----------------------------------------------------------]]
function RefreshSkins()
iSkinChangeIndex = iSkinChangeIndex + 1
end