Files
wnsrc/lua/vgui/dcolorpalette.lua
lifestorm 9c918c46e5 Upload
2024-08-04 23:12:27 +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 PANEL = {}
local color_Error = Color( 255, 0, 255 )
AccessorFunc( PANEL, "m_ConVarR", "ConVarR" )
AccessorFunc( PANEL, "m_ConVarG", "ConVarG" )
AccessorFunc( PANEL, "m_ConVarB", "ConVarB" )
AccessorFunc( PANEL, "m_ConVarA", "ConVarA" )
AccessorFunc( PANEL, "m_buttonsize", "ButtonSize", FORCE_NUMBER )
AccessorFunc( PANEL, "m_NumRows", "NumRows", FORCE_NUMBER )
local function CreateColorTable( num_rows )
local rows = num_rows or 8
local index = 0
local ColorTable = {}
for i = 0, rows * 2 - 1 do -- HSV
local col = math.Round( math.min( i * ( 360 / ( rows * 2 ) ), 359 ) )
index = index + 1
ColorTable[ index ] = HSVToColor( 360 - col, 1, 1 )
end
for i = 0, rows - 1 do -- HSV dark
local col = math.Round( math.min( i * ( 360 / rows ), 359 ) )
index = index + 1
ColorTable[ index ] = HSVToColor( 360 - col, 1, 0.5 )
end
for i = 0, rows - 1 do -- HSV grey
local col = math.Round( math.min( i * ( 360 / rows ), 359 ) )
index = index + 1
ColorTable[ index ] = HSVToColor( 360 - col, 0.5, 0.5 )
end
for i = 0, rows - 1 do -- HSV bright
local col = math.min( i * ( 360 / rows ), 359 )
index = index + 1
ColorTable[ index ] = HSVToColor( 360 - col, 0.5, 1 )
end
for i = 0, rows - 1 do -- Greyscale
local white = 255 - math.Round( math.min( i * ( 256 / ( rows - 1 ) ), 255 ) )
index = index + 1
ColorTable[ index ] = Color( white, white, white )
end
return ColorTable
end
local function AddButton( panel, color, size, id )
local button = vgui.Create( "DColorButton", panel )
button:SetSize( size or 10, size or 10 )
button:SetID( id )
--
-- If the cookie value exists, then use it
--
local col_saved = panel:GetCookie( "col." .. id, nil )
if ( col_saved != nil ) then
color = col_saved:ToColor()
end
button:SetColor( color or color_Error )
button.DoClick = function( self )
local col = self:GetColor() or color_Error
panel:OnValueChanged( col )
panel:UpdateConVars( col )
panel:DoClick( col, button )
end
button.DoRightClick = function( self )
panel:OnRightClickButton( self )
end
return button
end
-- This stuff could be better
g_ColorPalettePanels = g_ColorPalettePanels or {}
function PANEL:Init()
self:SetSize( 80, 120 )
self:SetNumRows( 8 )
self:Reset()
self:SetCookieName( "palette" )
self:SetButtonSize( 10 )
table.insert( g_ColorPalettePanels, self )
end
-- This stuff could be better
function PANEL:NetworkColorChange()
for id, pnl in pairs( g_ColorPalettePanels ) do
if ( !IsValid( pnl ) ) then table.remove( g_ColorPalettePanels, id ) end
end
for id, pnl in pairs( g_ColorPalettePanels ) do
if ( !IsValid( pnl ) or pnl == self ) then continue end
if ( pnl:GetNumRows() != self:GetNumRows() or pnl:GetCookieName() != self:GetCookieName() ) then continue end
local tab = {}
for pid, p in ipairs( self:GetChildren() ) do
tab[ p:GetID() ] = p:GetColor()
end
pnl:SetColorButtons( tab )
end
end
function PANEL:DoClick( color, button )
-- Override
end
function PANEL:Reset()
self:SetColorButtons( CreateColorTable( self:GetNumRows() ) )
end
function PANEL:ResetSavedColors()
local tab = CreateColorTable( self:GetNumRows() )
for i, color in pairs( tab ) do
local id = tonumber( i )
if ( !id ) then break end
self:SetCookie( "col." .. id, nil )
end
self:SetColorButtons( tab )
self:NetworkColorChange()
end
function PANEL:PaintOver( w, h )
surface.SetDrawColor( 0, 0, 0, 200 )
local childW = 0
for id, child in ipairs( self:GetChildren() ) do
if ( childW + child:GetWide() > w ) then break end
childW = childW + child:GetWide()
end
surface.DrawOutlinedRect( 0, 0, childW, h )
end
function PANEL:SetColorButtons( tab )
self:Clear()
for i, color in pairs( tab or {} ) do
local id = tonumber( i )
if ( !id ) then break end
AddButton( self, color, self:GetButtonSize(), i )
end
self:InvalidateLayout()
end
function PANEL:SetButtonSize( val )
self.m_buttonsize = math.floor( val )
for k, v in ipairs( self:GetChildren() ) do
v:SetSize( self:GetButtonSize(), self:GetButtonSize() )
end
self:InvalidateLayout()
end
function PANEL:UpdateConVar( strName, strKey, color )
if ( !strName ) then return end
RunConsoleCommand( strName, tostring( color[ strKey ] ) )
end
function PANEL:UpdateConVars( color )
self:UpdateConVar( self:GetConVarR(), "r", color )
self:UpdateConVar( self:GetConVarG(), "g", color )
self:UpdateConVar( self:GetConVarB(), "b", color )
self:UpdateConVar( self:GetConVarA(), "a", color )
end
function PANEL:SaveColor( btn, color )
-- TODO: If something uses different palette size, consider that a separate palette?
-- ( i.e. for each m_NumRows value, save to a different cookie prefix/suffix? )
-- Avoid unintended color changing.
color = table.Copy( color or color_Error )
btn:SetColor( color )
self:SetCookie( "col." .. btn:GetID(), string.FromColor( color ) )
self:NetworkColorChange()
end
function PANEL:SetColor( newcol )
-- TODO: This should mark this colour as selected..
end
function PANEL:OnValueChanged( newcol )
-- For override
end
function PANEL:OnRightClickButton( btn )
-- For override
end
function PANEL:GenerateExample( ClassName, PropertySheet, Width, Height )
local ctrl = vgui.Create( ClassName )
ctrl:SetSize( 160, 256 )
PropertySheet:AddSheet( ClassName, ctrl, nil, true, true )
end
derma.DefineControl( "DColorPalette", "", PANEL, "DIconLayout" )