mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 13:23:46 +03:00
256 lines
5.5 KiB
Lua
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
|