mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
89 lines
2.4 KiB
Lua
89 lines
2.4 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/
|
|
--]]
|
|
|
|
|
|
--- 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")
|