Radio button done.
Videos:
Video before I had overwritten Paint:

Video after I had overwritten Paint:

Code:
Code:
local PANEL = {}
function PANEL:Init()
self:SetSize( 16, 16 )
self:SetType("none")
self.Partners = {}
end
function PANEL:Toggle()
if (!self:GetChecked()) then
for k,v in pairs( self.Partners ) do
if (v == true) then
k:SetValue(false)
k:SetType("none")
end
end
self:SetValue(true)
self:SetType("none")
end
end
function PANEL:Paint()
draw.RoundedBox( 8, 0, 0, 16, 16, Color( 0,0,0,255 ) )
draw.RoundedBox( 6, 2, 2, 12, 12, Color( 255,255,255,255 ) )
if (self:GetChecked()) then
draw.RoundedBox( 4, 4, 4, 8, 8, Color( 0,0,0,255 ) )
end
end
function PANEL:DrawBorder() end
function PANEL:PaintOver() end
function PANEL:ApplySchemeSettings() end
function PANEL:Scheme() end
function PANEL:AddPartner( Partner )
if (Partner.Button) then
self.Partners[Partner.Button] = true
if (Partner.Button.Partners[self] == nil) then Partner.Button:AddPartner( self ) end
else
self.Partners[Partner] = true
if (Partner.Partners[self] == nil) then Partner:AddPartner( self ) end
end
end
function PANEL:RemovePartner( Partner )
if (Partner.Button) then
self.Partners[Partner.Button] = nil
if (Partner.Button.Partners[self] == true) then Partner.Button:AddPartner( self ) end
else
self.Partners[Partner] = nil
if (Partner.Partners[self] == true) then Partner.Button:AddPartner( self ) end
end
end
function PANEL:SetPartners( ... )
local args = {...}
table.insert( args, self )
for k,v in ipairs( args ) do
if (v.Button) then v.Partners = {} else v.Partners = {} end
for k2, v2 in ipairs( args ) do
v:AddPartner( v2 )
end
end
end
derma.DefineControl( "DRadioButton", "Radio Button", PANEL, "DCheckBox" )
PANEL = {}
function PANEL:Init()
self:SetTall( 18 )
self.Button = vgui.Create("DRadioButton",self)
function self:DoClick() self.Button:Toggle() end
end
function PANEL:AddPartner( Partner )
self.Button:AddPartner( Partner )
end
function PANEL:RemovePartner( Partner )
self.Button:AddPartner( Partner )
end
function PANEL:SetPartners( ... )
self.Button:SetPartners( ... )
end
function PANEL:PerformLayout()
local x = self.m_iIndent or 0
self.Button:SetSize( 16, 16 )
self.Button:SetPos( x, 0 )
if (self.Label) then
self.Label:SizeToContents()
self.Label:SetPos( x + 16 + 10, 0 )
end
end
function PANEL:SetText( Text )
if (!self.Label) then
self.Label = vgui.Create("DLabel",self)
self.Label:SetMouseInputEnabled(true)
self.Label.OnMouseReleased = function() self.Button:Toggle() end
end
self.Label:SetText( Text )
self:InvalidateLayout()
end
function PANEL:SetValue( val ) self.Button:SetValue( val ) end
function PANEL:SetChecked( val ) self.Button:SetChecked( val ) end
function PANEL:GetChecked( val ) return self.Button:GetChecked() end
function PANEL:Toggle() self.Button:Toggle() end
function PANEL:Paint() end
derma.DefineControl( "DRadioButtonLabel", "Radio Button label", PANEL, "DPanel" ) Example code (used in the 2nd video)
Code:
local pnl = vgui.Create("DFrame")
pnl:ShowCloseButton(true)
pnl:SetDeleteOnClose(true)
pnl:SetSize(300,300)
pnl:Center()
pnl:MakePopup()
local box1 = vgui.Create("DRadioButton",pnl)
box1:SetPos( 80, 50 )
local box2 = vgui.Create("DRadioButtonLabel",pnl)
box2:SetPos( 80, 70 )
box2:SetText("hello")
local box3 = vgui.Create("DRadioButton",pnl)
box3:SetPos( 80, 90 )
box1:SetPartners( box2, box3 )
box1 = vgui.Create("DRadioButton",pnl)
box1:SetPos( 10, 50 )
box2 = vgui.Create("DRadioButtonLabel",pnl)
box2:SetPos( 10, 70 )
box2:SetText("hello")
box3 = vgui.Create("DRadioButton",pnl)
box3:SetPos( 10, 90 )
box1:SetPartners( box2, box3 ) Usage:
Code:
-- First create 2 radio buttons on some parent
local box1 = vgui.Create("DRadioButton",someparent)
local box2 = vgui.Create("DRadioButton",someparent)
-- And don't forget to set their position etc
-- Then use AddPartner, RemovePartner and SetPartners to make them trigger eachother.
-- For example:
box1:AddPartner(box2)
box2:AddPartner(box1)
-- This will make box1 and box2 uncheck eachother. If you click box1, box2 will be unchecked, and if you click box2, box1 will be unchecked.
-- If you have several checkboxes, writing AddPartner for every combination might be a bit time consuming and annoying. For this reason, I made SetPartners(...). Simply enter every single box in the "..." argument and it runs AddPartner on every single one.
box1:SetPartners( box2, box3, box4, box5, box6, box7, box8, etc etc )
-- Remember that SetPartners first resets each control's Partner table, so if you do this:
box1:AddPartner( box10 )
box1:SetPartners( box2, box3, box4, box5 )
-- Box1 and 10 will no longer be linked. Suggestions?
Bookmarks