Untitled diff

Created Diff never expires
10 removals
181 lines
7 additions
178 lines
---- Unlike sandbox, we have teams to deal with, so here's an extra panel in the
---- Unlike sandbox, we have teams to deal with, so here's an extra panel in the
---- hierarchy that handles a set of player rows belonging to its team.
---- hierarchy that handles a set of player rows belonging to its team.


include("sb_row.lua")
include("sb_row.lua")


local function CompareScore(pa, pb)
local function CompareScore(pa, pb)
if not IsValid(pa) then return false end
if not ValidPanel(pa) then return false end
if not IsValid(pb) then return true end
if not ValidPanel(pb) then return true end


local a = pa:GetPlayer()
local a = pa:GetPlayer()
local b = pb:GetPlayer()
local b = pb:GetPlayer()


if not IsValid(a) then return false end
if not IsValid(a) then return false end
if not IsValid(b) then return true end
if not IsValid(b) then return true end


if a:Frags() == b:Frags() then return a:Deaths() < b:Deaths() end
if a:Frags() == b:Frags() then return a:Deaths() < b:Deaths() end


return a:Frags() > b:Frags()
return a:Frags() > b:Frags()
end
end


local PANEL = {}
local PANEL = {}


function PANEL:Init()
function PANEL:Init()
self.name = "Unnamed"
self.name = "Unnamed"


self.color = COLOR_WHITE
self.color = COLOR_WHITE


self.rows = {}
self.rows = {}
self.rowcount = 0
self.rowcount = 0


self.rows_sorted = {}
self.rows_sorted = {}


self.group = "spec"
self.group = "spec"
end
end


function PANEL:SetGroupInfo(name, color, group)
function PANEL:SetGroupInfo(name, color, group)
self.name = name
self.name = name
self.color = color
self.color = color
self.group = group
self.group = group
end
end


local bgcolor = Color(20,20,20, 150)
local bgcolor = Color(20,20,20, 150)
function PANEL:Paint()
function PANEL:Paint()
-- Darkened background
-- Darkened background
draw.RoundedBox(8, 0, 0, self:GetWide(), self:GetTall(), bgcolor)
draw.RoundedBox(8, 0, 0, self:GetWide(), self:GetTall(), bgcolor)


surface.SetFont("treb_small")
surface.SetFont("treb_small")


-- Header bg
-- Header bg
local txt = self.name .. " (" .. self.rowcount .. ")"
local txt = self.name .. " (" .. self.rowcount .. ")"
local w, h = surface.GetTextSize(txt)
local w, h = surface.GetTextSize(txt)
draw.RoundedBox(8, 0, 0, w + 24, 20, self.color)
draw.RoundedBox(8, 0, 0, w + 24, 20, self.color)


-- Shadow
-- Shadow
surface.SetTextPos(11, 11 - h/2)
surface.SetTextPos(11, 11 - h/2)
surface.SetTextColor(0,0,0, 200)
surface.SetTextColor(0,0,0, 200)
surface.DrawText(txt)
surface.DrawText(txt)


-- Text
-- Text
surface.SetTextPos(10, 10 - h/2)
surface.SetTextPos(10, 10 - h/2)
surface.SetTextColor(255,255,255,255)
surface.SetTextColor(255,255,255,255)
surface.DrawText(txt)
surface.DrawText(txt)


-- Alternating row background
-- Alternating row background
local y = 24
local y = 24
for i, row in ipairs(self.rows_sorted) do
for i, row in ipairs(self.rows_sorted) do
if (i % 2) != 0 then
if (i % 2) != 0 then
surface.SetDrawColor(75,75,75, 100)
surface.SetDrawColor(75,75,75, 100)
surface.DrawRect(0, y, self:GetWide(), row:GetTall())
surface.DrawRect(0, y, self:GetWide(), row:GetTall())
end
end


y = y + row:GetTall() + 1
y = y + row:GetTall() + 1
end
end


-- Column darkening
-- Column darkening
local scr = sboard_panel.ply_frame.scroll.Enabled and 16 or 0
local scr = sboard_panel.ply_frame.scroll.Enabled and 16 or 0
surface.SetDrawColor(0,0,0, 80)
surface.SetDrawColor(0,0,0, 80)
if sboard_panel.cols then
if sboard_panel.cols then
local cx = self:GetWide() - scr
-- Draw for odd numbered columns
for k,v in ipairs(sboard_panel.cols) do
for i=1, #sboard_panel.cols, 2 do
cx = cx - v.Width
surface.DrawRect(self:GetWide() - (50*i) - 25 - scr, 0, 50, self:GetTall())
if k % 2 == 1 then -- Draw for odd numbered columns
surface.DrawRect(cx-v.Width/2, 0, v.Width, self:GetTall())
end
end
end
else
else
-- If columns are not setup yet, fall back to darkening the areas for the
-- If columns are not setup yet, fall back to darkening the areas for the
-- default columns
-- default columns
surface.DrawRect(self:GetWide() - 175 - 25 - scr, 0, 50, self:GetTall())
surface.DrawRect(self:GetWide() - 175 - 25 - scr, 0, 50, self:GetTall())
surface.DrawRect(self:GetWide() - 75 - 25 - scr, 0, 50, self:GetTall())
surface.DrawRect(self:GetWide() - 75 - 25 - scr, 0, 50, self:GetTall())
end
end
end
end


function PANEL:AddPlayerRow(ply)
function PANEL:AddPlayerRow(ply)
if ScoreGroup(ply) == self.group and not self.rows[ply] then
if ScoreGroup(ply) == self.group and not self.rows[ply] then
local row = vgui.Create("TTTScorePlayerRow", self)
local row = vgui.Create("TTTScorePlayerRow", self)
row:SetPlayer(ply)
row:SetPlayer(ply)
self.rows[ply] = row
self.rows[ply] = row
self.rowcount = table.Count(self.rows)
self.rowcount = table.Count(self.rows)


-- row:InvalidateLayout()
-- row:InvalidateLayout()


-- must force layout immediately or it takes its sweet time to do so
-- must force layout immediately or it takes its sweet time to do so
self:PerformLayout()
self:PerformLayout()
--self:InvalidateLayout()
--self:InvalidateLayout()
end
end
end
end


function PANEL:HasPlayerRow(ply)
function PANEL:HasPlayerRow(ply)
return self.rows[ply] != nil
return self.rows[ply] != nil
end
end


function PANEL:HasRows()
function PANEL:HasRows()
return self.rowcount > 0
return self.rowcount > 0
end
end


function PANEL:UpdateSortCache()
function PANEL:UpdateSortCache()
self.rows_sorted = {}
self.rows_sorted = {}
for k,v in pairs(self.rows) do
for k,v in pairs(self.rows) do
table.insert(self.rows_sorted, v)
table.insert(self.rows_sorted, v)
end
end


table.sort(self.rows_sorted, CompareScore)
table.sort(self.rows_sorted, CompareScore)
end
end


function PANEL:UpdatePlayerData()
function PANEL:UpdatePlayerData()
local to_remove = {}
local to_remove = {}
for k,v in pairs(self.rows) do
for k,v in pairs(self.rows) do
-- Player still belongs in this group?
-- Player still belongs in this group?
if IsValid(v) and IsValid(v:GetPlayer()) and ScoreGroup(v:GetPlayer()) == self.group then
if ValidPanel(v) and IsValid(v:GetPlayer()) and ScoreGroup(v:GetPlayer()) == self.group then
v:UpdatePlayerData()
v:UpdatePlayerData()
else
else
-- can't remove now, will break pairs
-- can't remove now, will break pairs
table.insert(to_remove, k)
table.insert(to_remove, k)
end
end
end
end


if #to_remove == 0 then return end
if #to_remove == 0 then return end


for k,ply in pairs(to_remove) do
for k,ply in pairs(to_remove) do
local pnl = self.rows[ply]
local pnl = self.rows[ply]
if IsValid(pnl) then
if ValidPanel(pnl) then
pnl:Remove()
pnl:Remove()
end
end


-- print(CurTime(), "Removed player", ply)
-- print(CurTime(), "Removed player", ply)


self.rows[ply] = nil
self.rows[ply] = nil
end
end
self.rowcount = table.Count(self.rows)
self.rowcount = table.Count(self.rows)


self:UpdateSortCache()
self:UpdateSortCache()


self:InvalidateLayout()
self:InvalidateLayout()
end
end




function PANEL:PerformLayout()
function PANEL:PerformLayout()
if self.rowcount < 1 then
if self.rowcount < 1 then
self:SetVisible(false)
self:SetVisible(false)
return
return
end
end


self:SetSize(self:GetWide(), 30 + self.rowcount + self.rowcount * SB_ROW_HEIGHT)
self:SetSize(self:GetWide(), 30 + self.rowcount + self.rowcount * SB_ROW_HEIGHT)


-- Sort and layout player rows
-- Sort and layout player rows
self:UpdateSortCache()
self:UpdateSortCache()


local y = 24
local y = 24
for k, v in ipairs(self.rows_sorted) do
for k, v in ipairs(self.rows_sorted) do
v:SetPos(0, y)
v:SetPos(0, y)
v:SetSize(self:GetWide(), v:GetTall())
v:SetSize(self:GetWide(), v:GetTall())


y = y + v:GetTall() + 1
y = y + v:GetTall() + 1
end
end


self:SetSize(self:GetWide(), 30 + (y - 24))
self:SetSize(self:GetWide(), 30 + (y - 24))
end
end


vgui.Register("TTTScoreGroup", PANEL, "Panel")
vgui.Register("TTTScoreGroup", PANEL, "Panel")