GM.NotifyFadeTime = 8



local DefaultFont = "ZSHUDFontSmallest"

local DefaultFontEntity = "ZSHUDFontSmallest"



local PANEL  = {}



function PANEL:Init()

	self:DockPadding(8, 2, 8, 2)

end



local matGrad = Material("VGUI/gradient-r")

function PANEL:Paint()

	surface.SetMaterial(matGrad)

	surface.SetDrawColor(0, 0, 0, 180)



	local align = self:GetParent():GetAlign()

	if align == RIGHT then

		surface.DrawTexturedRect(self:GetWide() * 0.25, 0, self:GetWide(), self:GetTall())

	elseif align == CENTER then

		surface.DrawTexturedRect(self:GetWide() * 0.25, 0, self:GetWide() * 0.25, self:GetTall())

		surface.DrawTexturedRectRotated(self:GetWide() * 0.625, self:GetTall() / 2, self:GetWide() * 0.25, self:GetTall(), 180)

	else

		surface.DrawTexturedRectRotated(self:GetWide() * 0.25, self:GetTall() / 2, self:GetWide() / 2, self:GetTall(), 180)

	end

end



function PANEL:AddLabel(text, col, font, extramargin)

	local label = vgui.Create("DLabel", self)

	label:SetText(text)

	label:SetFont(font or DefaultFont)

	label:SetTextColor(col or color_white)

	label:SizeToContents()

	if extramargin then

		label:SetContentAlignment(7)

		label:DockMargin(0, label:GetTall() * 0.2, 0, 0)

	else

		label:SetContentAlignment(4)

	end

	label:Dock(LEFT)

end



function PANEL:AddImage(mat, col)

	local img = vgui.Create("DImage", self)

	img:SetImage(mat)

	if col then

		img:SetImageColor(col)

	end

	img:SizeToContents()

	local height = img:GetTall()

	if height > self:GetTall() then

		img:SetSize(self:GetTall() / height * img:GetWide(), self:GetTall())

	end

	img:DockMargin(0, (self:GetTall() - img:GetTall()) / 2, 0, 0)

	img:Dock(LEFT)

end



function PANEL:AddKillIcon(class)

	local icondata = killicon.GetIcon(class)



	if icondata then

		self:AddImage(icondata[1], icondata[2])

	else

		local fontdata = killicon.GetFont(class) or killicon.GetFont("default")

		if fontdata then

			self:AddLabel(fontdata[2], fontdata[3], fontdata[1], true)

		end

	end

end



function PANEL:SetNotification(...)

	local args = {...}



	local defaultcol = color_white

	local defaultfont

	for k, v in ipairs(args) do

		local vtype = type(v)



		if vtype == "table" then

			if v.r and v.g and v.b then

				defaultcol = v

			elseif v.font then

				if v.font == "" then

					defaultfont = nil

				else

					local th = draw.GetFontHeight(v.font)

					if tw then

						defaultfont = v.font

					end

				end

			elseif v.killicon then

				self:AddKillIcon(v.killicon)

				if v.headshot then

					self:AddKillIcon("headshot")

				end

			elseif v.image then

				self:AddImage(v.image, v.color)

			end

		elseif vtype == "Player" then

			local avatar = vgui.Create("AvatarImage", self)

			local size = self:GetTall() >= 32 and 32 or 16

			avatar:SetSize(size, size)

			if v:IsValid() then

				avatar:SetPlayer(v, size)

			end

			avatar:SetAlpha(220)

			avatar:Dock(LEFT)

			avatar:DockMargin(0, (self:GetTall() - avatar:GetTall()) / 2, 0, 0)



			if v:IsValid() then

				self:AddLabel(" "..v:Name(), team.GetColor(v:Team()), DefaultFontEntity)

			else

				self:AddLabel(" ?", team.GetColor(TEAM_UNASSIGNED), DefaultFontEntity)

			end

		elseif vtype == "Entity" then

			self:AddLabel("["..(v:IsValid() and v:GetClass() or "?").."]", COLOR_RED, DefaultFontEntity)

		else

			local text = tostring(v)



			self:AddLabel(text, defaultcol, defaultfont)

		end

	end

end



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



local PANEL  = {}



AccessorFunc(PANEL, "m_Align", "Align", FORCE_NUMBER)

AccessorFunc(PANEL, "m_MessageHeight", "MessageHeight", FORCE_NUMBER)



function PANEL:Init()

	self:SetAlign(LEFT)

	self:SetMessageHeight(32)

	self:ParentToHUD()

	self:InvalidateLayout()

end



function PANEL:PerformLayout()

end



function PANEL:Paint()

end



function PANEL:AddNotification(...)

	local notif = vgui.Create("DEXNotification", self)

	notif:SetTall(BetterScreenScale() * self:GetMessageHeight())

	notif:SetNotification(...)

	local w = 0

	for _, p in pairs(notif:GetChildren()) do

		w = w + p:GetWide()

	end

	if self:GetAlign() == RIGHT then

		notif:DockPadding(self:GetWide() - w - 32, 0, 8, 0)

	elseif self:GetAlign() == CENTER then

		notif:DockPadding((self:GetWide() - w) / 2, 0, 0, 0)

	else

		notif:DockPadding(8, 0, 8, 0)

	end

	

	notif:Dock(TOP)



	notif:SetAlpha(1)

	notif:AlphaTo(255, 0.5)

	notif:AlphaTo(1, 1, GAMEMODE.NotifyFadeTime - 1)



	notif.DieTime = CurTime() + GAMEMODE.NotifyFadeTime



	return notif

end



function PANEL:Think()

	local time = CurTime()



	for i, pan in pairs(self:GetChildren()) do

		if pan.DieTime and time >= pan.DieTime then

			pan:Remove()

			local dummy = vgui.Create("Panel", self)

			dummy:SetTall(0)

			dummy:Dock(TOP)

			dummy:Remove()

		end

	end

end



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

