mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
297 lines
7.4 KiB
Lua
297 lines
7.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/
|
|
--]]
|
|
|
|
|
|
local realmColors = {}
|
|
realmColors[ "menu" ] = Color( 121, 221, 100 )
|
|
realmColors[ "client" ] = Color( 255, 222, 102 )
|
|
realmColors[ "server" ] = Color( 137, 222, 255 )
|
|
|
|
surface.CreateFont( "DermaMedium", {
|
|
font = "Roboto",
|
|
size = 24,
|
|
weight = 500
|
|
} )
|
|
|
|
local PANEL = {}
|
|
|
|
function PANEL:Init()
|
|
|
|
self:Dock( TOP )
|
|
self:DockMargin( 0, 0, 0, 1 )
|
|
|
|
self.CopyBtn = self:Add( "DImageButton" )
|
|
self.CopyBtn:SetImage( "icon16/page_copy.png" )
|
|
self.CopyBtn:SetSize( 16, 16 )
|
|
self.CopyBtn.DoClick = function( btm )
|
|
if ( !self.Problem ) then return end
|
|
|
|
local prepend = ""
|
|
if ( self.Problem.title and self.Problem.title:len() > 0 and self.Problem.title != "Other" ) then prepend = "[" .. self.Problem.title .. "] " end
|
|
SetClipboardText( prepend .. self.Problem.text )
|
|
end
|
|
|
|
end
|
|
|
|
function PANEL:PerformLayout( w, h )
|
|
|
|
surface.SetFont( "DermaDefault" )
|
|
|
|
if ( self.Problem ) then
|
|
local _, th = surface.GetTextSize( self.Problem.text )
|
|
self:SetTall( th + 10 )
|
|
end
|
|
|
|
local bW, bH = self.CopyBtn:GetSize()
|
|
self.CopyBtn:SetPos( w - bW - 8, h / 2 - bH / 2 )
|
|
|
|
end
|
|
|
|
local bgClr = Color( 75, 75, 75, 255 )
|
|
local fgClr = Color( 255, 255, 255, 255 )
|
|
function PANEL:Paint( w, h )
|
|
|
|
bgClr.a = self:GetAlpha()
|
|
|
|
-- No info yet
|
|
if ( !self.Problem ) then
|
|
draw.RoundedBox( 0, 0, 0, w, h, bgClr )
|
|
return
|
|
end
|
|
|
|
-- Get the colors
|
|
local clr = table.Copy( realmColors[ self.Problem.realm ] or fgClr )
|
|
clr.a = self:GetAlpha()
|
|
|
|
-- Background color
|
|
local bgClrH = bgClr
|
|
if ( self.Problem.lastOccurence ) then
|
|
local add = 75 + math.max( 25 - ( SysTime() - self.Problem.lastOccurence ) * 25, 0 )
|
|
bgClrH = Color( add, add, add, self:GetAlpha() )
|
|
end
|
|
|
|
draw.RoundedBox( 0, 0, 0, w, h, bgClrH )
|
|
|
|
-- Draw background
|
|
local count = 0
|
|
if ( self.Problem and self.Problem.count ) then count = self.Problem.count end
|
|
|
|
-- The error count
|
|
if ( count > 0 ) then
|
|
local txt = "x" .. count
|
|
surface.SetFont( "DermaMedium" )
|
|
local tW, tH = surface.GetTextSize( txt )
|
|
tW = tW
|
|
|
|
draw.SimpleText( txt, "DermaMedium", w - 16 - 16, h / 2, clr, draw.TEXT_ALIGN_RIGHT, draw.TEXT_ALIGN_CENTER )
|
|
end
|
|
|
|
-- The error
|
|
draw.DrawText( self.Problem.text, "DermaDefault", 5, 5, clr )
|
|
|
|
end
|
|
|
|
function PANEL:Setup( problem )
|
|
|
|
self.Problem = problem
|
|
|
|
end
|
|
|
|
vgui.Register( "LuaProblem", PANEL, "Panel" )
|
|
|
|
--[[ ////////////////////////////////////////////////// GROUP ////////////////////////////////////////////////// ]] --
|
|
|
|
local PANEL = {}
|
|
|
|
local arrowMat = Material( "gui/point.png" )
|
|
local collapsedCache = {}
|
|
|
|
function PANEL:Init()
|
|
|
|
self:Dock( TOP )
|
|
self:SetTall( 20 )
|
|
self:DockMargin( 0, 0, 0, 5 )
|
|
|
|
self.ErrorPanels = {}
|
|
|
|
self.LuaErrorList = self:Add( "Panel" )
|
|
|
|
self.ClearButton = self:Add( "DImageButton" )
|
|
self.ClearButton:SetImage( "gui/cross.png" )
|
|
self.ClearButton:SetSize( 18, 18 )
|
|
self.ClearButton.DoClick = function( s ) self:ClearThisGroup() end
|
|
|
|
self.Collapsed = false
|
|
|
|
end
|
|
|
|
local white = Color( 255, 255, 255, 255 )
|
|
local bg = Color( 50, 50, 50, 255 )
|
|
function PANEL:Paint( w, h )
|
|
|
|
white.a = self:GetAlpha()
|
|
bg.a = self:GetAlpha()
|
|
|
|
draw.RoundedBox( 4, 0, 0, w, h, bg )
|
|
draw.SimpleText( self.Title, "DermaLarge", 4, 2, white, draw.TEXT_ALIGN_LEFT, draw.TEXT_ALIGN_TOP )
|
|
|
|
surface.SetMaterial( arrowMat )
|
|
surface.SetDrawColor( white )
|
|
surface.DrawTexturedRectRotated( w - 20, 18, 20, 12, self.Collapsed and 180 or 0 )
|
|
|
|
local h2 = self.LuaErrorList:GetTall()
|
|
local _, lY = self.LuaErrorList:GetPos()
|
|
|
|
draw.DrawText( self:GetExplainerText(), "DermaDefault", w / 2, lY + h2 + 5, white, draw.TEXT_ALIGN_CENTER )
|
|
|
|
end
|
|
|
|
function PANEL:ClearThisGroup()
|
|
|
|
ClearLuaErrorGroup( self.GroupID )
|
|
|
|
end
|
|
|
|
function PANEL:OnMousePressed( code )
|
|
|
|
if ( code != MOUSE_LEFT ) then return end
|
|
|
|
self.Collapsed = !self.Collapsed
|
|
self:InvalidateLayout()
|
|
|
|
collapsedCache[ self.Title ] = self.Collapsed
|
|
|
|
end
|
|
|
|
function PANEL:GetExplainerText()
|
|
|
|
if ( self.Title == "Other" and self.AddonID and self.AddonID:len() < 2 ) then
|
|
return language.GetPhrase( "problems.generic_lua_error" )
|
|
end
|
|
|
|
-- Not a workshop addon, or a floating .gma (WSID=0)
|
|
if ( self.AddonID and self.AddonID:len() < 2 ) then
|
|
return language.GetPhrase( "problems.addon_lua_error" ):format( self.Title )
|
|
end
|
|
|
|
return language.GetPhrase( "problems.workshop_lua_error" ):format( self.Title )
|
|
|
|
end
|
|
|
|
function PANEL:SetTitleAndID( title, id, groupid )
|
|
|
|
self.Title = title
|
|
self.AddonID = id
|
|
self.GroupID = groupid
|
|
|
|
self.Collapsed = collapsedCache[ self.Title ]
|
|
|
|
if ( self.AddonID and self.AddonID:len() > 1 ) then
|
|
self.DisableBtn = self:Add( "DButton" )
|
|
self.DisableBtn:SetText( "#problems.disable" )
|
|
self.DisableBtn:SizeToContentsX( 10 )
|
|
self.DisableBtn.DoClick = function() steamworks.SetShouldMountAddon( self.AddonID, false ) steamworks.ApplyAddons() end
|
|
|
|
self.OpenWSBtn = self:Add( "DButton" )
|
|
self.OpenWSBtn:SetText( "#problems.open_on_workshop" )
|
|
self.OpenWSBtn:SizeToContentsX( 10 )
|
|
self.OpenWSBtn.DoClick = function() steamworks.ViewFile( self.AddonID ) end
|
|
|
|
self.UninstallBtn = self:Add( "DButton" )
|
|
self.UninstallBtn:SetText( "#problems.uninstall" )
|
|
self.UninstallBtn:SizeToContentsX( 10 )
|
|
self.UninstallBtn.DoClick = function() steamworks.Unsubscribe( self.AddonID ) end
|
|
|
|
local maxS = math.max( self.DisableBtn:GetWide(), self.OpenWSBtn:GetWide(), self.UninstallBtn:GetWide() )
|
|
self.DisableBtn:SetWide( maxS )
|
|
self.OpenWSBtn:SetWide( maxS )
|
|
self.UninstallBtn:SetWide( maxS )
|
|
end
|
|
|
|
end
|
|
|
|
function PANEL:PerformLayout( w, h )
|
|
|
|
self.ClearButton:SetPos( w - 56, 9 )
|
|
|
|
self.LuaErrorList:InvalidateLayout( true )
|
|
self.LuaErrorList:SizeToChildren( false, true )
|
|
|
|
surface.SetFont( "DermaLarge" )
|
|
local _, headerSize = surface.GetTextSize( self.Title )
|
|
|
|
self.LuaErrorList:SetPos( 4, 4 + headerSize )
|
|
self.LuaErrorList:SetWide( self:GetWide() - 8 )
|
|
|
|
|
|
surface.SetFont( "DermaDefault" )
|
|
local _, etH = surface.GetTextSize( self:GetExplainerText() )
|
|
|
|
if ( IsValid( self.DisableBtn ) ) then
|
|
local h2 = self.LuaErrorList:GetTall()
|
|
local _, lY = self.LuaErrorList:GetPos()
|
|
local y = lY + h2 + 5 + etH + 5
|
|
|
|
self.OpenWSBtn:SetPos( w * 0.25 - self.OpenWSBtn:GetWide() / 2, y )
|
|
self.DisableBtn:SetPos( w * 0.5 - self.DisableBtn:GetWide() / 2, y )
|
|
self.UninstallBtn:SetPos( w * 0.75 - self.UninstallBtn:GetWide() / 2, y )
|
|
etH = etH + self.DisableBtn:GetTall() + 5
|
|
end
|
|
|
|
if ( self.Collapsed ) then
|
|
self:SetTall( headerSize + 5 )
|
|
return
|
|
end
|
|
|
|
self:SetTall( self.LuaErrorList:GetTall() + ( 8 + headerSize ) + ( etH + 5 ) )
|
|
|
|
end
|
|
|
|
function PANEL:Think()
|
|
|
|
if ( IsValid( self.DisableBtn ) ) then
|
|
self.DisableBtn:SetEnabled( steamworks.IsSubscribed( self.AddonID ) and steamworks.ShouldMountAddon( self.AddonID ) )
|
|
self.UninstallBtn:SetEnabled( steamworks.IsSubscribed( self.AddonID ) )
|
|
end
|
|
|
|
end
|
|
|
|
function PANEL:ReceivedError( uid, err )
|
|
|
|
local pnl = self.ErrorPanels[ uid ]
|
|
|
|
local shouldSort = false
|
|
if ( !IsValid( pnl ) ) then
|
|
pnl = self.LuaErrorList:Add( "LuaProblem" )
|
|
self.ErrorPanels[ uid ] = pnl
|
|
self:InvalidateLayout()
|
|
|
|
shouldSort = true
|
|
end
|
|
|
|
pnl:Setup( err )
|
|
|
|
if ( shouldSort ) then
|
|
local sorted = {}
|
|
for gid, epnl in pairs( self.ErrorPanels ) do
|
|
sorted[ epnl.Problem.firstOccurence ] = epnl
|
|
end
|
|
|
|
local z = 0
|
|
for sort, spnl in SortedPairs( sorted ) do
|
|
spnl:SetZPos( z )
|
|
z = z + 1
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
vgui.Register( "LuaProblemGroup", PANEL, "Panel" )
|