mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
88
gamemodes/terrortown/gamemode/vgui/scrolllabel.lua
Normal file
88
gamemodes/terrortown/gamemode/vgui/scrolllabel.lua
Normal file
@@ -0,0 +1,88 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
--- why can't the default label scroll? welcome to gmod
|
||||
|
||||
PANEL = {}
|
||||
|
||||
function PANEL:Init()
|
||||
self.Label = vgui.Create("DLabel", self)
|
||||
self.Label:SetPos(0, 0)
|
||||
|
||||
self.Scroll = vgui.Create("DVScrollBar", self)
|
||||
end
|
||||
|
||||
function PANEL:GetLabel() return self.Label end
|
||||
|
||||
function PANEL:OnMouseWheeled(dlta)
|
||||
if not self.Scroll then return end
|
||||
|
||||
self.Scroll:AddScroll(dlta * -2)
|
||||
|
||||
self:InvalidateLayout()
|
||||
end
|
||||
|
||||
function PANEL:SetScrollEnabled(st) self.Scroll:SetEnabled(st) end
|
||||
|
||||
-- enable/disable scrollbar depending on content size
|
||||
function PANEL:UpdateScrollState()
|
||||
if not self.Scroll then return end
|
||||
|
||||
self.Scroll:SetScroll(0)
|
||||
self:SetScrollEnabled(false)
|
||||
|
||||
self.Label:SetSize(self:GetWide(), self:GetTall())
|
||||
|
||||
self.Label:SizeToContentsY()
|
||||
|
||||
self:SetScrollEnabled(self.Label:GetTall() > self:GetTall())
|
||||
|
||||
self.Label:InvalidateLayout(true)
|
||||
self:InvalidateLayout(true)
|
||||
end
|
||||
|
||||
function PANEL:SetText(txt)
|
||||
if not self.Label then return end
|
||||
|
||||
self.Label:SetText(txt)
|
||||
self:UpdateScrollState()
|
||||
|
||||
-- I give up. VGUI, you have won. Here is your ugly hack to make the label
|
||||
-- resize to the proper height, after you have completely mangled it the
|
||||
-- first time I call SizeToContents. I don't know how or what happens to the
|
||||
-- Label's internal state that makes it work when resizing a second time a
|
||||
-- tick later (it certainly isn't any variant of PerformLayout I can find),
|
||||
-- but it does.
|
||||
local pnl = self.Panel
|
||||
timer.Simple(0, function()
|
||||
if IsValid(pnl) then
|
||||
pnl:UpdateScrollState()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function PANEL:PerformLayout()
|
||||
if not self.Scroll then return end
|
||||
|
||||
self.Label:SetVisible(self:IsVisible())
|
||||
|
||||
self.Scroll:SetPos(self:GetWide() - 16, 0)
|
||||
self.Scroll:SetSize(16, self:GetTall())
|
||||
|
||||
local was_on = self.Scroll.Enabled
|
||||
self.Scroll:SetUp(self:GetTall(), self.Label:GetTall())
|
||||
self.Scroll:SetEnabled(was_on) -- setup mangles enabled state
|
||||
|
||||
self.Label:SetPos( 0, self.Scroll:GetOffset() )
|
||||
self.Label:SetSize( self:GetWide() - (self.Scroll.Enabled and 16 or 0), self.Label:GetTall() )
|
||||
end
|
||||
|
||||
vgui.Register("ScrollLabel", PANEL, "Panel")
|
||||
Reference in New Issue
Block a user