mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
261 lines
8.4 KiB
Lua
261 lines
8.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/
|
|
--]]
|
|
|
|
|
|
-- Copyright (c) 2018-2020 TFA Base Devs
|
|
|
|
-- Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
-- of this software and associated documentation files (the "Software"), to deal
|
|
-- in the Software without restriction, including without limitation the rights
|
|
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
-- copies of the Software, and to permit persons to whom the Software is
|
|
-- furnished to do so, subject to the following conditions:
|
|
|
|
-- The above copyright notice and this permission notice shall be included in all
|
|
-- copies or substantial portions of the Software.
|
|
|
|
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
-- SOFTWARE.
|
|
|
|
if SERVER then
|
|
AddCSLuaFile()
|
|
return
|
|
end
|
|
|
|
local padding = TFA.Attachments.UIPadding
|
|
local PANEL = {}
|
|
|
|
PANEL.Wep = nil
|
|
PANEL.Header = nil
|
|
PANEL.TextTable = {}
|
|
PANEL.DefaultWidth = 0
|
|
PANEL.DefaultHeight = 0
|
|
|
|
function PANEL:SetWidthNeue( val )
|
|
self.DefaultWidth = val
|
|
end
|
|
|
|
function PANEL:SetHeightNeue( val )
|
|
self.DefaultHeight = val
|
|
end
|
|
|
|
function PANEL:Init()
|
|
self.Wep = nil
|
|
self.Header = nil
|
|
self.TextTable = {}
|
|
self.DefaultHeight = 0
|
|
self.DefaultWidth = 0
|
|
self:SetMouseInputEnabled(false)
|
|
self:SetZPos(0)
|
|
self.SetWidthOld = self.SetWidthOld or self.SetWidth
|
|
self.SetWidth = self.SetWidthNeue
|
|
self.SetHeightOld = self.SetHeightOld or self.SetHeight
|
|
self.SetHeight = self.SetHeightNeue
|
|
end
|
|
|
|
function PANEL:SetWeapon( wepv )
|
|
if IsValid(wepv) then
|
|
self.Wep = wepv
|
|
end
|
|
end
|
|
|
|
function PANEL:SetAttachment( att )
|
|
if att ~= nil then
|
|
self:SetZPos( 200 - att )
|
|
end
|
|
end
|
|
|
|
function PANEL:SetHeader( h )
|
|
self.Header = h
|
|
end
|
|
|
|
function PANEL:SetTextTable( t )
|
|
self.TextTable = t or {}
|
|
end
|
|
|
|
PANEL.HeaderFont = "TFAAttachmentTTHeader"
|
|
PANEL.BodyFont = "TFAAttachmentTTBody"
|
|
|
|
function PANEL:GetHeaderHeight()
|
|
if not IsValid(self.Wep) then return 0 end
|
|
if not self.Header then return 0 end
|
|
surface.SetFont(self.HeaderFont)
|
|
local _, th = surface.GetTextSize( language.GetPhrase(self.Header) )
|
|
return th + padding * 2
|
|
end
|
|
|
|
function PANEL:GetHeaderSize()
|
|
if not IsValid(self.Wep) then return 0, 0 end
|
|
if not self.Header then return 0, 0 end
|
|
surface.SetFont(self.HeaderFont)
|
|
local tw, th = surface.GetTextSize( language.GetPhrase(self.Header) )
|
|
return tw + padding * 2, th + padding * 2
|
|
end
|
|
|
|
function PANEL:GetTextTableHeight()
|
|
if not self.TextTable or #self.TextTable <= 0 then return 0 end
|
|
local hv = padding
|
|
surface.SetFont(self.BodyFont)
|
|
for _,v in pairs(self.TextTable) do
|
|
if type(v) == "string" then
|
|
v = language.GetPhrase(v)
|
|
local _, th = surface.GetTextSize( v )
|
|
hv = hv + th
|
|
end
|
|
end
|
|
hv = hv + padding
|
|
return hv
|
|
end
|
|
|
|
function PANEL:GetTextTableSize( )
|
|
if not self.TextTable or #self.TextTable <= 0 then return 0, 0 end
|
|
local mw = 0
|
|
local hv = padding
|
|
surface.SetFont(self.BodyFont)
|
|
for _,v in pairs(self.TextTable) do
|
|
if type(v) == "string" then
|
|
v = language.GetPhrase(v)
|
|
local tw, th = surface.GetTextSize( v )
|
|
hv = hv + th
|
|
mw = math.max( mw, tw )
|
|
end
|
|
end
|
|
hv = hv + padding
|
|
return mw + padding * 2, hv
|
|
end
|
|
|
|
function PANEL:DrawHeader( w, h )
|
|
if not self.Header then return 0 end
|
|
surface.SetFont(self.HeaderFont)
|
|
|
|
local header = language.GetPhrase(self.Header)
|
|
local _, th = surface.GetTextSize( header )
|
|
draw.RoundedBox( 0, 0, 0, w, th + padding * 2, ColorAlpha( TFA.Attachments.Colors["background"], self.Wep:GetInspectingProgress() * 192 ) )
|
|
if self.AnchoredH then
|
|
draw.DrawText( header, self.HeaderFont, self:GetWide() / 2 , padding, ColorAlpha( TFA.Attachments.Colors["primary"], self.Wep:GetInspectingProgress() * 225 ), TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP )
|
|
--draw.RoundedBox( 0, w / 2 - tw / 2, padding + th + padding / 4, tw, padding / 2, ColorAlpha( TFA.Attachments.Colors["primary"], self.Wep:GetInspectingProgress() * 225 ) )
|
|
|
|
--draw.DrawText( header, self.HeaderFont, self:GetWide() - padding, padding, ColorAlpha( TFA.Attachments.Colors["primary"], self.Wep:GetInspectingProgress() * 225 ), TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP )
|
|
--draw.RoundedBox( 0, w - padding - tw, padding + th + padding / 4, tw, padding / 2, ColorAlpha( TFA.Attachments.Colors["primary"], self.Wep:GetInspectingProgress() * 225 ) )
|
|
else
|
|
draw.DrawText( header, self.HeaderFont, padding, padding, ColorAlpha( TFA.Attachments.Colors["primary"], self.Wep:GetInspectingProgress() * 225 ), TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP )
|
|
--draw.RoundedBox( 0, padding, padding + th + padding / 4, tw, padding / 2, ColorAlpha( TFA.Attachments.Colors["primary"], self.Wep:GetInspectingProgress() * 225 ) )
|
|
end
|
|
return th + padding * 2
|
|
end
|
|
|
|
function PANEL:DrawTextTable( x, y )
|
|
if not self.TextTable then return 0 end
|
|
--y = y + padding
|
|
local hv = padding
|
|
local acol = TFA.Attachments.Colors["primary"]
|
|
surface.SetFont(self.BodyFont)
|
|
for _,v in pairs(self.TextTable) do
|
|
if type(v) == "table" or type(v) == "vector" then
|
|
if v.r then
|
|
acol = Color( v.r or 0, v.g or 0, v.b or 0, v.a or 255 )
|
|
elseif v.x then
|
|
acol = Color( v.x or 0, v.y or 0, v.z or 0, v.a or 255 )
|
|
end
|
|
end
|
|
if type(v) == "string" then
|
|
v = language.GetPhrase(v)
|
|
local _, th = surface.GetTextSize( v )
|
|
if self.AnchoredH then
|
|
--draw.DrawText( v, self.BodyFont, x + self:GetWide() - padding, y + hv, ColorAlpha( acol, self.Wep:GetInspectingProgress() * 225 ), TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP )
|
|
draw.DrawText( v, self.BodyFont, x + padding * 2, y + hv, ColorAlpha( acol, self.Wep:GetInspectingProgress() * 225 ), TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP )
|
|
else
|
|
draw.DrawText( v, self.BodyFont, x + padding * 2, y + hv, ColorAlpha( acol, self.Wep:GetInspectingProgress() * 225 ), TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP )
|
|
end
|
|
hv = hv + th
|
|
end
|
|
end
|
|
hv = hv + padding
|
|
return hv
|
|
end
|
|
|
|
function PANEL:CalcSize()
|
|
local header_w, header_h = self:GetHeaderSize()
|
|
local text_w, text_h = self:GetTextTableSize()
|
|
self:SetWidthOld( math.max( self.DefaultWidth, math.max( header_w, text_w ) + padding * 2 ))
|
|
local h = header_h + text_h
|
|
if text_h > 0 then
|
|
h = h + padding * 2
|
|
end
|
|
if IsValid( self.ContentPanel ) and not self:GetActive() then
|
|
local _, cph = self.ContentPanel:LocalToScreen(0,self.ContentPanel:GetTall())
|
|
local _, yy = self:LocalToScreen(0,0)
|
|
h = math.min( h, cph - yy )
|
|
end
|
|
self:SetHeightOld( h )
|
|
end
|
|
|
|
function PANEL:CalcPos()
|
|
if IsValid(self.Anchor) then
|
|
local x,y = self.Anchor:LocalToScreen(0,0)
|
|
y = y
|
|
if self.Anchor:GetAnchoredH() then
|
|
self.AnchoredH = true
|
|
if IsValid( self.ContentPanel ) and self:GetActive() then
|
|
local _, cph = self.ContentPanel:LocalToScreen(0,self.ContentPanel:GetTall())
|
|
self:SetPos( x + self.Anchor:GetWide() - self:GetWide() , math.min( y + self.Anchor:GetTall(), cph - self:GetTall() ) )
|
|
else
|
|
self:SetPos( x + self.Anchor:GetWide() - self:GetWide() , math.min( y + self.Anchor:GetTall(), ScrH() - self:GetTall() ) )
|
|
end
|
|
else
|
|
self.AnchoredH = false
|
|
self:SetPos( x, y + self.Anchor:GetTall() )
|
|
end
|
|
end
|
|
end
|
|
|
|
function PANEL:Think()
|
|
self:CalcSize()
|
|
self:CalcPos()
|
|
end
|
|
|
|
function PANEL:SetContentPanel( p )
|
|
if IsValid(p) then
|
|
self.ContentPanel = p
|
|
else
|
|
self.ContentPanel = nil
|
|
end
|
|
end
|
|
|
|
function PANEL:Paint( w, h )
|
|
if not IsValid(self.Wep) then return end
|
|
if ( self.Wep:GetInspectingProgress() or 0 ) < 0.01 then self:Remove() end
|
|
if IsValid( self.ContentPanel ) and not self:GetActive() then
|
|
local _, cph = self.ContentPanel:LocalToScreen(0,math.max(self.ContentPanel:GetTall(),32))
|
|
local _, yy = self:LocalToScreen(0,0)
|
|
if cph - yy <= 0 then
|
|
return
|
|
end
|
|
end
|
|
draw.RoundedBox( 0, 0, 0, w, h, ColorAlpha( TFA.Attachments.Colors["background"], self.Wep:GetInspectingProgress() * 192 ) )
|
|
local hh = self:DrawHeader( w, h )
|
|
self:DrawTextTable( 0, hh )
|
|
render.SetScissorRect(0,0,ScrW(),ScrH(),false)
|
|
end
|
|
|
|
function PANEL:SetActive( a )
|
|
self.Active = a
|
|
end
|
|
|
|
function PANEL:GetActive( a )
|
|
return self.Active
|
|
end
|
|
|
|
vgui.Register( "TFAAttachmentTip", PANEL, "Panel" ) |