local PANEL = {} Derma_Hook( PANEL, "Paint", "Paint", "TeamScoreboardHeader" ) Derma_Hook( PANEL, "ApplySchemeSettings", "Scheme", "TeamScoreboardHeader" ) Derma_Hook( PANEL, "PerformLayout", "Layout", "TeamScoreboardHeader" ) function PANEL:Init() self.Columns = {} self.iTeamID = 0 self.PlayerCount = 0 self.TeamName = vgui.Create( "DLabel", self ) self.TeamScore = vgui.Create( "DLabel", self ) end function PANEL:Setup( iTeam, pMainScoreboard ) self.TeamName:SetText( team.GetName( iTeam ) ) self.iTeamID = iTeam end function PANEL:Think() local Count = #team.GetPlayers( self.iTeamID ) if ( self.PlayerCount != Count ) then self.PlayerCount = Count self.TeamName:SetText( team.GetName( self.iTeamID ) .. " (" .. self.PlayerCount .. " Players)" ) end self.TeamScore:SetText( team.GetScore( self.iTeamID ) ) end derma.DefineControl( "TeamScoreboardHeader", "", PANEL, "Panel" ) local PANEL = {} function PANEL:Init() self.Columns = {} self.List = vgui.Create( "DListView", self ) self.List:SetSortable( false ) self.List:DisableScrollbar() self.Header = vgui.Create( "TeamScoreboardHeader", self ) end function PANEL:Setup( iTeam, pMainScoreboard ) self.iTeam = iTeam self.pMain = pMainScoreboard self.Header:Setup( iTeam, pMainScoreboard ) end function PANEL:SizeToContents() self.List:SizeToContents() local tall = self.List:GetTall() self:SetTall( tall + self.Header:GetTall() ) end function PANEL:PerformLayout() if ( self.pMain:GetShowScoreboardHeaders() ) then self.Header:SetPos( 0, 0 ) self.Header:CopyWidth( self ) else self.Header:SetTall( 0 ) self.Header:SetVisible( false ) end self:SizeToContents() self.List:StretchToParent( 0, self.Header:GetTall(), 0, 0 ) self.List:SetDataHeight( self.pMain:GetRowHeight() ) self.List:SetHeaderHeight( 16 ) end function PANEL:AddColumn( col ) table.insert( self.Columns, col ) local pnlCol = self.List:AddColumn( col.Name ) if (col.iFixedSize) then pnlCol:SetMinWidth( col.iFixedSize ) pnlCol:SetMaxWidth( col.iFixedSize ) end if (col.HeaderAlign) then pnlCol.Header:SetContentAlignment( col.HeaderAlign ) end Derma_Hook( pnlCol, "Paint", "Paint", "ScorePanelHeader" ) pnlCol.cTeamColor = team.GetColor( self.iTeam ) Derma_Hook( pnlCol.Header, "Paint", "Paint", "ScorePanelHeaderLabel" ) Derma_Hook( pnlCol.Header, "ApplySchemeSettings", "Scheme", "ScorePanelHeaderLabel" ) Derma_Hook( pnlCol.Header, "PerformLayout", "Layout", "ScorePanelHeaderLabel" ) pnlCol.Header:ApplySchemeSettings() end function PANEL:SetSortColumns( ... ) self.SortArgs = ... end function PANEL:FindPlayerLine( ply ) for _, line in pairs( self.List.Lines ) do if ( line.pPlayer == ply ) then return line end end local line = self.List:AddLine() line.pPlayer = ply line.UpdateTime = {} Derma_Hook( line, "Paint", "Paint", "ScorePanelLine" ) Derma_Hook( line, "ApplySchemeSettings", "Scheme", "ScorePanelLine" ) Derma_Hook( line, "PerformLayout", "Layout", "ScorePanelLine" ) self.pMain:InvalidateLayout() return line end function PANEL:UpdateColumn( i, col, pLine ) if ( !col.fncValue ) then return end pLine.UpdateTime[i] = pLine.UpdateTime[i] or 0 if ( col.UpdateRate == 0 && pLine.UpdateTime[i] != 0 ) then return end // 0 = only update once if ( pLine.UpdateTime[i] > RealTime() ) then return end pLine.UpdateTime[i] = RealTime() + col.UpdateRate local Value = col.fncValue( pLine.pPlayer ) if ( Value == nil ) then return end local lbl = pLine:SetColumnText( i, Value ) if ( IsValid( lbl ) && !lbl.bScorePanelHooks ) then lbl.bScorePanelHooks = true if ( col.ValueAlign ) then lbl:SetContentAlignment( col.ValueAlign ) end if ( col.Font ) then lbl:SetFont( col.Font ) end lbl.pPlayer = pLine.pPlayer Derma_Hook( lbl, "Paint", "Paint", "ScorePanelLabel" ) Derma_Hook( lbl, "ApplySchemeSettings", "Scheme", "ScorePanelLabel" ) Derma_Hook( lbl, "PerformLayout", "Layout", "ScorePanelLabel" ) end end function PANEL:UpdateLine( pLine ) for i, col in pairs( self.Columns ) do self:UpdateColumn( i, col, pLine ) end end function PANEL:CleanLines( pLine ) for k, line in pairs( self.List.Lines ) do if ( !IsValid( line.pPlayer ) || line.pPlayer:Team() != self.iTeam ) then self.List:RemoveLine( k ) end end end function PANEL:Think() self:CleanLines() local players = team.GetPlayers( self.iTeam ) for _, player in pairs( players ) do local line = self:FindPlayerLine( player ) self:UpdateLine( line ) end if ( self.SortArgs ) then self.List:SortByColumns( unpack(self.SortArgs) ) end end derma.DefineControl( "TeamScoreboard", "", PANEL, "Panel" )