mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
193 lines
4.1 KiB
Lua
193 lines
4.1 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/
|
|
--]]
|
|
|
|
|
|
-- area entry
|
|
DEFINE_BASECLASS("Panel")
|
|
local PANEL = {}
|
|
|
|
AccessorFunc(PANEL, "text", "Text", FORCE_STRING)
|
|
AccessorFunc(PANEL, "backgroundColor", "BackgroundColor")
|
|
AccessorFunc(PANEL, "tickSound", "TickSound", FORCE_STRING)
|
|
AccessorFunc(PANEL, "tickSoundRange", "TickSoundRange")
|
|
AccessorFunc(PANEL, "backgroundAlpha", "BackgroundAlpha", FORCE_NUMBER)
|
|
AccessorFunc(PANEL, "expireTime", "ExpireTime", FORCE_NUMBER)
|
|
AccessorFunc(PANEL, "animationTime", "AnimationTime", FORCE_NUMBER)
|
|
|
|
function PANEL:Init()
|
|
self:DockPadding(4, 4, 4, 4)
|
|
self:SetSize(self:GetParent():GetWide(), 0)
|
|
|
|
self.label = self:Add("DLabel")
|
|
self.label:Dock(FILL)
|
|
self.label:SetFont("ixMediumLightFont")
|
|
self.label:SetTextColor(color_white)
|
|
self.label:SetExpensiveShadow(1, color_black)
|
|
self.label:SetText("Zone")
|
|
|
|
self.text = ""
|
|
self.tickSound = "ui/buttonrollover.wav"
|
|
self.tickSoundRange = {190, 200}
|
|
self.backgroundAlpha = 255
|
|
self.expireTime = 8
|
|
self.animationTime = 2
|
|
|
|
self.character = 1
|
|
self.createTime = RealTime()
|
|
self.currentAlpha = 255
|
|
self.currentHeight = 0
|
|
self.nextThink = RealTime()
|
|
end
|
|
|
|
function PANEL:Show()
|
|
self:CreateAnimation(0.5, {
|
|
index = -1,
|
|
target = {currentHeight = self.label:GetTall() + 8},
|
|
easing = "outQuint",
|
|
|
|
Think = function(animation, panel)
|
|
panel:SetTall(panel.currentHeight)
|
|
end
|
|
})
|
|
end
|
|
|
|
function PANEL:SetFont(font)
|
|
self.label:SetFont(font)
|
|
end
|
|
|
|
function PANEL:SetText(text)
|
|
if (text:sub(1, 1) == "@") then
|
|
text = L(text:sub(2))
|
|
end
|
|
|
|
self.label:SetText(text)
|
|
self.text = text
|
|
self.character = 1
|
|
end
|
|
|
|
function PANEL:Think()
|
|
local time = RealTime()
|
|
|
|
if (time >= self.nextThink) then
|
|
if (self.character < self.text:utf8len()) then
|
|
self.character = self.character + 1
|
|
self.label:SetText(string.utf8sub(self.text, 1, self.character))
|
|
|
|
LocalPlayer():EmitSound(self.tickSound, 100, math.random(self.tickSoundRange[1], self.tickSoundRange[2]))
|
|
end
|
|
|
|
if (time >= self.createTime + self.expireTime and !self.bRemoving) then
|
|
self:Remove()
|
|
end
|
|
|
|
self.nextThink = time + 0.05
|
|
end
|
|
end
|
|
|
|
function PANEL:SizeToContents()
|
|
self:SetWide(self:GetParent():GetWide())
|
|
|
|
self.label:SetWide(self:GetWide())
|
|
self.label:SizeToContentsY()
|
|
end
|
|
|
|
function PANEL:Paint(width, height)
|
|
self.backgroundAlpha = math.max(self.backgroundAlpha - 200 * FrameTime(), 0)
|
|
|
|
derma.SkinFunc("PaintAreaEntry", self, width, height)
|
|
end
|
|
|
|
function PANEL:Remove()
|
|
if (self.bRemoving) then
|
|
return
|
|
end
|
|
|
|
self:CreateAnimation(self.animationTime, {
|
|
target = {currentAlpha = 0},
|
|
|
|
Think = function(animation, panel)
|
|
panel:SetAlpha(panel.currentAlpha)
|
|
end,
|
|
|
|
OnComplete = function(animation, panel)
|
|
panel:CreateAnimation(0.5, {
|
|
index = -1,
|
|
target = {currentHeight = 0},
|
|
easing = "outQuint",
|
|
|
|
Think = function(_, sizePanel)
|
|
sizePanel:SetTall(sizePanel.currentHeight)
|
|
end,
|
|
|
|
OnComplete = function(_, sizePanel)
|
|
sizePanel:OnRemove()
|
|
BaseClass.Remove(sizePanel)
|
|
end
|
|
})
|
|
end
|
|
})
|
|
|
|
self.bRemoving = true
|
|
end
|
|
|
|
function PANEL:OnRemove()
|
|
end
|
|
|
|
vgui.Register("ixAreaEntry", PANEL, "Panel")
|
|
|
|
-- main panel
|
|
PANEL = {}
|
|
|
|
function PANEL:Init()
|
|
local chatWidth, _ = chat.GetChatBoxSize()
|
|
local _, chatY = chat.GetChatBoxPos()
|
|
|
|
self:SetSize(chatWidth, chatY)
|
|
self:SetPos(32, 0)
|
|
self:ParentToHUD()
|
|
|
|
self.entries = {}
|
|
ix.gui.area = self
|
|
end
|
|
|
|
function PANEL:AddEntry(entry, color)
|
|
color = color or ix.config.Get("color")
|
|
|
|
local id = #self.entries + 1
|
|
local panel = entry
|
|
|
|
if (isstring(entry)) then
|
|
panel = self:Add("ixAreaEntry")
|
|
panel:SetText(entry)
|
|
end
|
|
|
|
panel:SetBackgroundColor(color)
|
|
panel:SizeToContents()
|
|
panel:Dock(BOTTOM)
|
|
panel:Show()
|
|
panel.OnRemove = function()
|
|
for k, v in pairs(self.entries) do
|
|
if (v == panel) then
|
|
table.remove(self.entries, k)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
self.entries[id] = panel
|
|
return id
|
|
end
|
|
|
|
function PANEL:GetEntries()
|
|
return self.entries
|
|
end
|
|
|
|
vgui.Register("ixArea", PANEL, "Panel")
|