mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
396 lines
9.2 KiB
Lua
396 lines
9.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 PANEL = {}
|
||
|
|
|
||
|
|
AccessorFunc( PANEL, "m_ConVarR", "ConVarR" )
|
||
|
|
AccessorFunc( PANEL, "m_ConVarG", "ConVarG" )
|
||
|
|
AccessorFunc( PANEL, "m_ConVarB", "ConVarB" )
|
||
|
|
AccessorFunc( PANEL, "m_ConVarA", "ConVarA" )
|
||
|
|
|
||
|
|
AccessorFunc( PANEL, "m_bPalette", "Palette", FORCE_BOOL )
|
||
|
|
AccessorFunc( PANEL, "m_bAlpha", "AlphaBar", FORCE_BOOL )
|
||
|
|
AccessorFunc( PANEL, "m_bWangsPanel", "Wangs", FORCE_BOOL )
|
||
|
|
|
||
|
|
AccessorFunc( PANEL, "m_Color", "Color" )
|
||
|
|
|
||
|
|
local BarWide = 26
|
||
|
|
|
||
|
|
local function CreateWangFunction( self, colindex )
|
||
|
|
local function OnValueChanged( ptxt, strvar )
|
||
|
|
if ( ptxt.notuserchange ) then return end
|
||
|
|
|
||
|
|
local targetValue = tonumber( strvar ) or 0
|
||
|
|
self:GetColor()[ colindex ] = targetValue
|
||
|
|
if ( colindex == "a" ) then
|
||
|
|
self.Alpha:SetBarColor( ColorAlpha( self:GetColor(), 255 ) )
|
||
|
|
self.Alpha:SetValue( targetValue / 255 )
|
||
|
|
else
|
||
|
|
self.HSV:SetColor( self:GetColor() )
|
||
|
|
|
||
|
|
local h, s, v = ColorToHSV( self.HSV:GetBaseRGB() )
|
||
|
|
self.RGB.LastY = ( 1 - h / 360 ) * self.RGB:GetTall()
|
||
|
|
end
|
||
|
|
|
||
|
|
self:UpdateColor( self:GetColor() )
|
||
|
|
end
|
||
|
|
|
||
|
|
return OnValueChanged
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:Init()
|
||
|
|
|
||
|
|
self.Palette = vgui.Create( "DColorPalette", self )
|
||
|
|
self.Palette:Dock( BOTTOM )
|
||
|
|
self.Palette:SetTall( 75 )
|
||
|
|
self.Palette:SetButtonSize( 16 )
|
||
|
|
self.Palette:DockMargin( 0, 8, 0, 0 )
|
||
|
|
self.Palette:Reset()
|
||
|
|
self.Palette.DoClick = function( ctrl, color, btn )
|
||
|
|
self:SetColor( Color( color.r, color.g, color.b, self:GetAlphaBar() and color.a or 255 ) )
|
||
|
|
end
|
||
|
|
self.Palette.OnRightClickButton = function( ctrl, btn )
|
||
|
|
local m = DermaMenu()
|
||
|
|
m:AddOption( "Save Color", function() ctrl:SaveColor( btn, self:GetColor() ) end )
|
||
|
|
m:AddOption( "Reset Palette", function() ctrl:ResetSavedColors() end )
|
||
|
|
m:Open()
|
||
|
|
end
|
||
|
|
self:SetPalette( true )
|
||
|
|
|
||
|
|
-- The label
|
||
|
|
self.label = vgui.Create( "DLabel", self )
|
||
|
|
self.label:SetText( "" )
|
||
|
|
self.label:Dock( TOP )
|
||
|
|
self.label:SetDark( true )
|
||
|
|
self.label:SetVisible( false )
|
||
|
|
|
||
|
|
--The number stuff
|
||
|
|
self.WangsPanel = vgui.Create( "Panel", self )
|
||
|
|
self.WangsPanel:SetWide( 50 )
|
||
|
|
self.WangsPanel:Dock( RIGHT )
|
||
|
|
self.WangsPanel:DockMargin( 4, 0, 0, 0 )
|
||
|
|
self:SetWangs( true )
|
||
|
|
|
||
|
|
self.txtR = self.WangsPanel:Add( "DNumberWang" )
|
||
|
|
self.txtR:SetDecimals( 0 )
|
||
|
|
self.txtR:SetMinMax( 0, 255 )
|
||
|
|
self.txtR:SetTall( 20 )
|
||
|
|
self.txtR:Dock( TOP )
|
||
|
|
self.txtR:DockMargin( 0, 0, 0, 0 )
|
||
|
|
self.txtR:SetTextColor( Color( 150, 0, 0, 255 ) )
|
||
|
|
|
||
|
|
self.txtG = self.WangsPanel:Add( "DNumberWang" )
|
||
|
|
self.txtG:SetDecimals( 0 )
|
||
|
|
self.txtG:SetMinMax( 0, 255 )
|
||
|
|
self.txtG:SetTall( 20 )
|
||
|
|
self.txtG:Dock( TOP )
|
||
|
|
self.txtG:DockMargin( 0, 4, 0, 0 )
|
||
|
|
self.txtG:SetTextColor( Color( 0, 150, 0, 255 ) )
|
||
|
|
|
||
|
|
self.txtB = self.WangsPanel:Add( "DNumberWang" )
|
||
|
|
self.txtB:SetDecimals( 0 )
|
||
|
|
self.txtB:SetMinMax( 0, 255 )
|
||
|
|
self.txtB:SetTall( 20 )
|
||
|
|
self.txtB:Dock( TOP )
|
||
|
|
self.txtB:DockMargin( 0, 4, 0, 0 )
|
||
|
|
self.txtB:SetTextColor( Color( 0, 0, 150, 255 ) )
|
||
|
|
|
||
|
|
self.txtA = self.WangsPanel:Add( "DNumberWang" )
|
||
|
|
self.txtA:SetDecimals( 0 )
|
||
|
|
self.txtA:SetMinMax( 0, 255 )
|
||
|
|
self.txtA:SetTall( 20 )
|
||
|
|
self.txtA:Dock( TOP )
|
||
|
|
self.txtA:DockMargin( 0, 4, 0, 0 )
|
||
|
|
self.txtA:SetTextColor( Color( 80, 80, 80, 255 ) )
|
||
|
|
|
||
|
|
self.txtR.OnValueChanged = CreateWangFunction( self, "r" )
|
||
|
|
self.txtG.OnValueChanged = CreateWangFunction( self, "g" )
|
||
|
|
self.txtB.OnValueChanged = CreateWangFunction( self, "b" )
|
||
|
|
self.txtA.OnValueChanged = CreateWangFunction( self, "a" )
|
||
|
|
|
||
|
|
-- The colouring stuff
|
||
|
|
self.HSV = vgui.Create( "DColorCube", self )
|
||
|
|
self.HSV:Dock( FILL )
|
||
|
|
self.HSV.OnUserChanged = function( ctrl, color )
|
||
|
|
color.a = self:GetColor().a
|
||
|
|
self:UpdateColor( color )
|
||
|
|
end
|
||
|
|
|
||
|
|
self.RGB = vgui.Create( "DRGBPicker", self )
|
||
|
|
self.RGB:Dock( RIGHT )
|
||
|
|
self.RGB:SetWidth( BarWide )
|
||
|
|
self.RGB:DockMargin( 4, 0, 0, 0 )
|
||
|
|
self.RGB.OnChange = function( ctrl, color )
|
||
|
|
self:SetBaseColor( color )
|
||
|
|
end
|
||
|
|
|
||
|
|
self.Alpha = vgui.Create( "DAlphaBar", self )
|
||
|
|
self.Alpha:DockMargin( 4, 0, 0, 0 )
|
||
|
|
self.Alpha:Dock( RIGHT )
|
||
|
|
self.Alpha:SetWidth( BarWide )
|
||
|
|
self.Alpha.OnChange = function( ctrl, fAlpha )
|
||
|
|
self:GetColor().a = math.floor( fAlpha * 255 )
|
||
|
|
self:UpdateColor( self:GetColor() )
|
||
|
|
end
|
||
|
|
self:SetAlphaBar( true )
|
||
|
|
|
||
|
|
-- Layout
|
||
|
|
self:SetColor( Color( 255, 0, 0, 255 ) )
|
||
|
|
self:SetSize( 256, 230 )
|
||
|
|
self:InvalidateLayout()
|
||
|
|
|
||
|
|
self.NextConVarCheck = 0
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:SetLabel( text )
|
||
|
|
|
||
|
|
if ( !text or text == "" ) then
|
||
|
|
self.label:SetVisible( false )
|
||
|
|
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
self.label:SetText( text )
|
||
|
|
self.label:SetVisible( true )
|
||
|
|
|
||
|
|
self:InvalidateLayout()
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:SetPalette( bEnabled )
|
||
|
|
self.m_bPalette = bEnabled
|
||
|
|
|
||
|
|
self.Palette:SetVisible( bEnabled )
|
||
|
|
|
||
|
|
self:InvalidateLayout()
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:SetAlphaBar( bEnabled )
|
||
|
|
self.m_bAlpha = bEnabled
|
||
|
|
|
||
|
|
self.Alpha:SetVisible( bEnabled )
|
||
|
|
self.txtA:SetVisible( bEnabled )
|
||
|
|
|
||
|
|
self:InvalidateLayout()
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:SetWangs( bEnabled )
|
||
|
|
self.m_bWangsPanel = bEnabled
|
||
|
|
|
||
|
|
self.WangsPanel:SetVisible( bEnabled )
|
||
|
|
|
||
|
|
self:InvalidateLayout()
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:SetConVarR( cvar )
|
||
|
|
self.m_ConVarR = cvar
|
||
|
|
self:UpdateDefaultColor()
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:SetConVarG( cvar )
|
||
|
|
self.m_ConVarG = cvar
|
||
|
|
self:UpdateDefaultColor()
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:SetConVarB( cvar )
|
||
|
|
self.m_ConVarB = cvar
|
||
|
|
self:UpdateDefaultColor()
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:SetConVarA( cvar )
|
||
|
|
self.m_ConVarA = cvar
|
||
|
|
self:SetAlphaBar( cvar != nil )
|
||
|
|
self:UpdateDefaultColor()
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:UpdateDefaultColor()
|
||
|
|
|
||
|
|
local function GetConVarDefault( str )
|
||
|
|
if ( str and GetConVar( str ) ) then return tonumber( GetConVar( str ):GetDefault() ) end
|
||
|
|
return 255
|
||
|
|
end
|
||
|
|
|
||
|
|
local defRGB = Color(
|
||
|
|
GetConVarDefault( self.m_ConVarR ),
|
||
|
|
GetConVarDefault( self.m_ConVarG ),
|
||
|
|
GetConVarDefault( self.m_ConVarB ),
|
||
|
|
GetConVarDefault( self.m_ConVarA )
|
||
|
|
)
|
||
|
|
|
||
|
|
self.HSV:SetDefaultColor( defRGB )
|
||
|
|
|
||
|
|
-- Allow immediate read of convar values
|
||
|
|
self.NextConVarCheck = 0
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:PerformLayout( w, h )
|
||
|
|
|
||
|
|
local hue, s, v = ColorToHSV( self.HSV:GetBaseRGB() )
|
||
|
|
self.RGB.LastY = ( 1 - hue / 360 ) * self.RGB:GetTall()
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:Paint()
|
||
|
|
-- Invisible background!
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:SetColor( color )
|
||
|
|
|
||
|
|
local hue, s, v = ColorToHSV( color )
|
||
|
|
self.RGB.LastY = ( 1 - hue / 360 ) * self.RGB:GetTall()
|
||
|
|
|
||
|
|
self.HSV:SetColor( color )
|
||
|
|
|
||
|
|
self:UpdateColor( color )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:SetVector( vec )
|
||
|
|
|
||
|
|
self:SetColor( Color( vec.x * 255, vec.y * 255, vec.z * 255, 255 ) )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:SetBaseColor( color )
|
||
|
|
self.HSV:SetBaseRGB( color )
|
||
|
|
self.HSV:TranslateValues()
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:UpdateConVar( strName, strKey, color )
|
||
|
|
if ( !strName ) then return end
|
||
|
|
local col = color[ strKey ]
|
||
|
|
|
||
|
|
RunConsoleCommand( strName, tostring( col ) )
|
||
|
|
|
||
|
|
self[ "ConVarOld" .. strName ] = col
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:UpdateConVars( color )
|
||
|
|
|
||
|
|
self.NextConVarCheck = SysTime() + 0.2
|
||
|
|
|
||
|
|
self:UpdateConVar( self.m_ConVarR, 'r', color )
|
||
|
|
self:UpdateConVar( self.m_ConVarG, 'g', color )
|
||
|
|
self:UpdateConVar( self.m_ConVarB, 'b', color )
|
||
|
|
self:UpdateConVar( self.m_ConVarA, 'a', color )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:UpdateColor( color )
|
||
|
|
|
||
|
|
self.Alpha:SetBarColor( ColorAlpha( color, 255 ) )
|
||
|
|
self.Alpha:SetValue( color.a / 255 )
|
||
|
|
|
||
|
|
if ( color.r != self.txtR:GetValue() ) then
|
||
|
|
self.txtR.notuserchange = true
|
||
|
|
self.txtR:SetValue( color.r )
|
||
|
|
self.txtR.notuserchange = nil
|
||
|
|
end
|
||
|
|
|
||
|
|
if ( color.g != self.txtG:GetValue() ) then
|
||
|
|
self.txtG.notuserchange = true
|
||
|
|
self.txtG:SetValue( color.g )
|
||
|
|
self.txtG.notuserchange = nil
|
||
|
|
end
|
||
|
|
|
||
|
|
if ( color.b != self.txtB:GetValue() ) then
|
||
|
|
self.txtB.notuserchange = true
|
||
|
|
self.txtB:SetValue( color.b )
|
||
|
|
self.txtB.notuserchange = nil
|
||
|
|
end
|
||
|
|
|
||
|
|
if ( color.a != self.txtA:GetValue() ) then
|
||
|
|
self.txtA.notuserchange = true
|
||
|
|
self.txtA:SetValue( color.a )
|
||
|
|
self.txtA.notuserchange = nil
|
||
|
|
end
|
||
|
|
|
||
|
|
self:UpdateConVars( color )
|
||
|
|
self:ValueChanged( color )
|
||
|
|
|
||
|
|
self.m_Color = color
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:ValueChanged( color )
|
||
|
|
-- Override
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:GetColor()
|
||
|
|
|
||
|
|
self.m_Color.a = 255
|
||
|
|
if ( self.Alpha:IsVisible() ) then
|
||
|
|
self.m_Color.a = math.floor( self.Alpha:GetValue() * 255 )
|
||
|
|
end
|
||
|
|
|
||
|
|
return self.m_Color
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:GetVector()
|
||
|
|
|
||
|
|
local col = self:GetColor()
|
||
|
|
return Vector( col.r / 255, col.g / 255, col.b / 255 )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:Think()
|
||
|
|
|
||
|
|
self:ConVarThink()
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:ConVarThink()
|
||
|
|
|
||
|
|
-- Don't update the convars while we're changing them!
|
||
|
|
if ( input.IsMouseDown( MOUSE_LEFT ) ) then return end
|
||
|
|
if ( self.NextConVarCheck > SysTime() ) then return end
|
||
|
|
|
||
|
|
local r, changed_r = self:DoConVarThink( self.m_ConVarR )
|
||
|
|
local g, changed_g = self:DoConVarThink( self.m_ConVarG )
|
||
|
|
local b, changed_b = self:DoConVarThink( self.m_ConVarB )
|
||
|
|
local a, changed_a = 255, false
|
||
|
|
|
||
|
|
if ( self.m_ConVarA ) then
|
||
|
|
a, changed_a = self:DoConVarThink( self.m_ConVarA )
|
||
|
|
end
|
||
|
|
|
||
|
|
if ( changed_r or changed_g or changed_b or changed_a ) then
|
||
|
|
self:SetColor( Color( r, g, b, a ) )
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:DoConVarThink( convar )
|
||
|
|
|
||
|
|
if ( !convar ) then return 255, false end
|
||
|
|
|
||
|
|
local fValue = GetConVarNumber( convar )
|
||
|
|
local fOldValue = self[ "ConVarOld" .. convar ]
|
||
|
|
if ( fOldValue and fValue == fOldValue ) then return fOldValue, false end
|
||
|
|
|
||
|
|
self[ "ConVarOld" .. convar ] = fValue
|
||
|
|
|
||
|
|
return fValue, true
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:GenerateExample( ClassName, PropertySheet, Width, Height )
|
||
|
|
|
||
|
|
local ctrl = vgui.Create( ClassName )
|
||
|
|
ctrl:SetSize( 256, 256 )
|
||
|
|
|
||
|
|
PropertySheet:AddSheet( ClassName, ctrl, nil, true, true )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
derma.DefineControl( "DColorMixer", "", PANEL, "DPanel" )
|