Files
wnsrc/gamemodes/helix/plugins/willardinterface/derma/cl_help.lua

356 lines
10 KiB
Lua
Raw Normal View History

2024-08-04 23:54:45 +03:00
--[[
| 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 backgroundColor = Color(0, 0, 0, 66)
local titlePushDown = 30
local PANEL = {}
AccessorFunc(PANEL, "maxWidth", "MaxWidth", FORCE_NUMBER)
function PANEL:Init()
self:SetWide(SScaleMin(180 / 3))
self:Dock(LEFT)
self.maxWidth = ScrW() * 0.2
end
function PANEL:Paint(width, height)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, width, height)
end
function PANEL:SizeToContents()
local width = 0
for _, v in ipairs(self:GetChildren()) do
width = math.max(width, v:GetWide())
end
self:SetSize(math.max(SScaleMin(32 / 3), math.min(width, self.maxWidth)), self:GetParent():GetTall())
end
vgui.Register("ixHelpMenuCategories", PANEL, "EditablePanel")
-- help menu
PANEL = {}
function PANEL:Init()
local titlePushDown = SScaleMin(30 / 3)
local topPushDown = SScaleMin(150 / 3)
local scale780 = SScaleMin(780 / 3)
local scale120 = SScaleMin(120 / 3)
self:SetWide(ScrW() - (topPushDown * 2))
local sizeXtitle, sizeYtitle = self:GetWide(), scale120
local sizeXcontent, sizeYcontent = self:GetWide(), (scale780)
self.titlePanel = self:Add("Panel")
self.titlePanel:SetSize(sizeXtitle, sizeYtitle)
self.titlePanel:SetPos(self:GetWide() * 0.5 - self.titlePanel:GetWide() * 0.5)
self:CreateTitleText()
self.contentFrame = self:Add("Panel")
self.contentFrame:SetSize(sizeXcontent, sizeYcontent)
self.contentFrame:SetPos(self:GetWide() * 0.5 - self.contentFrame:GetWide() * 0.5, titlePushDown)
self:SetTall(scale120 + scale780 + titlePushDown)
self:Center()
self.categories = {}
self.categorySubpanels = {}
self.categoryPanel = self.contentFrame:Add("ixHelpMenuCategories")
self.canvasPanel = self.contentFrame:Add("EditablePanel")
self.canvasPanel:Dock(FILL)
self.idlePanel = self.canvasPanel:Add("Panel")
self.idlePanel:Dock(FILL)
self.idlePanel:DockMargin(SScaleMin(8 / 3), 0, 0, 0)
self.idlePanel.Paint = function(_, width, height)
local curTime = CurTime()
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, width, height)
surface.SetDrawColor(Color(255, 255, 255, 255))
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/wn_logo_base.png"))
surface.DrawTexturedRect(width * 0.5 - SScaleMin(195 / 3) * 0.5, height * 0.5 - SScaleMin(196 / 3) * 0.5, SScaleMin(195 / 3), SScaleMin(196 / 3))
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/wn_logo_circle1.png"))
surface.DrawTexturedRectRotated((width * 0.5) + 2, (height * 0.5) - 2, SScaleMin(195 / 3), SScaleMin(196 / 3), curTime * -15)
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/wn_logo_circle2.png"))
surface.DrawTexturedRectRotated((width * 0.5) - 2, (height * 0.5) + 2, SScaleMin(195 / 3), SScaleMin(196 / 3), curTime * -15)
end
local categories = {}
hook.Run("PopulateHelpMenu", categories)
for k, v in SortedPairs(categories) do
if (!isstring(k)) then
ErrorNoHalt("expected string for help menu key\n")
continue
elseif (!isfunction(v)) then
ErrorNoHalt(string.format("expected function for help menu entry '%s'\n", k))
continue
end
self:AddCategory(k)
self.categories[k] = v
end
self.categoryPanel:SizeToContents()
if (ix.gui.lastHelpMenuTab) then
self:OnCategorySelected(ix.gui.lastHelpMenuTab)
end
end
function PANEL:AddCategory(name)
local button = self.categoryPanel:Add("ixMenuButton")
button:SetText(L(name))
if (L(name)) == "credits" then
button:SetText("Kredi")
end
-- @todo don't hardcode this but it's the only panel that needs docking at the bottom so it'll do for now
button:Dock(name == "credits" and BOTTOM or TOP)
button.DoClick = function()
self:OnCategorySelected(name)
end
local panel = self.canvasPanel:Add("DScrollPanel")
panel:SetVisible(false)
panel:Dock(FILL)
panel:DockMargin(SScaleMin(8 / 3), 0, 0, 0)
panel:GetCanvas():DockPadding(SScaleMin(8 / 3), SScaleMin(8 / 3), SScaleMin(8 / 3), SScaleMin(8 / 3))
panel.Paint = function(_, width, height)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, width, height)
end
-- reverts functionality back to a standard panel in the case that a category will manage its own scrolling
panel.DisableScrolling = function()
panel:GetCanvas():SetVisible(false)
panel:GetVBar():SetVisible(false)
panel.OnChildAdded = function() end
end
self.categorySubpanels[name] = panel
end
function PANEL:OnCategorySelected(name)
local panel = self.categorySubpanels[name]
if (!IsValid(panel)) then
return
end
if (!panel.bPopulated) then
self.categories[name](panel)
panel.bPopulated = true
end
if (IsValid(self.activeCategory)) then
self.activeCategory:SetVisible(false)
end
panel:SetVisible(true)
self.idlePanel:SetVisible(false)
self.activeCategory = panel
ix.gui.lastHelpMenuTab = name
end
function PANEL:CreateTitleText()
local informationTitleIcon = self.titlePanel:Add("DImage")
informationTitleIcon:SetImage("willardnetworks/tabmenu/navicons/info.png")
informationTitleIcon:SetSize(SScaleMin(17 / 3), SScaleMin(17 / 3))
local informationTitle = self.titlePanel:Add("DLabel")
informationTitle:SetFont("TitlesFontNoClamp")
informationTitle:SetText("Bilgi")
informationTitle:SizeToContents()
informationTitle:SetPos(SScaleMin(28 / 3), informationTitleIcon:GetTall() * 0.5 - informationTitle:GetTall() * 0.5)
end
vgui.Register("ixHelpMenu", PANEL, "EditablePanel")
hook.Add("CreateMenuButtons", "ixHelpMenu", function(tabs)
tabs["Bilgi"] = {
RowNumber = 4,
Width = 17,
Height = 17,
Icon = "willardnetworks/tabmenu/navicons/info.png",
Create = function(info, container)
local helpMenu = container:Add("ixHelpMenu")
end
}
end)
hook.Add("PopulateHelpMenu", "ixHelpMenu", function(tabs)
tabs["commands"] = function(container)
-- info text
local info = container:Add("DLabel")
info:SetFont("MenuFontLargerNoClamp")
info:SetText(L("helpCommands"))
info:SetContentAlignment(5)
info:SetTextColor(color_white)
info:SetExpensiveShadow(1, color_black)
info:Dock(TOP)
info:DockMargin(0, 0, 0, SScaleMin(8 / 3))
info:SizeToContents()
info:SetTall(info:GetTall() + SScaleMin(16 / 3))
info.Paint = function(_, width, height)
surface.SetDrawColor(Color(0, 0, 0, 50))
surface.DrawRect(0, 0, width, height)
end
-- commands
for uniqueID, command in SortedPairs(ix.command.list) do
if (command.OnCheckAccess and !command:OnCheckAccess(LocalPlayer())) then
continue
end
local bIsAlias = false
local aliasText = ""
-- we want to show aliases in the same entry for better readability
if (command.alias) then
local alias = istable(command.alias) and command.alias or {command.alias}
for _, v in ipairs(alias) do
if (v:utf8lower() == uniqueID) then
bIsAlias = true
break
end
aliasText = aliasText .. ", /" .. v
end
if (bIsAlias) then
continue
end
end
-- command name
local title = container:Add("DLabel")
title:SetFont("TitlesFontNoBoldNoClamp")
title:SetText("/" .. command.name .. aliasText)
title:Dock(TOP)
title:SetTextColor(Color(211, 86, 89, 255))
title:SetExpensiveShadow(1, color_black)
title:SizeToContents()
-- syntax
local syntaxText = command.syntax
local syntax
if (syntaxText != "" and syntaxText != "[none]") then
syntax = container:Add("DLabel")
syntax:SetFont("TitlesFontNoBoldNoClamp")
syntax:SetText(syntaxText)
syntax:Dock(TOP)
syntax:SetTextColor(color_white)
syntax:SetExpensiveShadow(1, color_black)
syntax:SetWrap(true)
syntax:SetAutoStretchVertical(true)
syntax:SizeToContents()
end
-- description
local descriptionText = command:GetDescription()
if (descriptionText != "") then
local description = container:Add("DLabel")
description:SetFont("MenuFontLargerNoClamp")
description:SetText(descriptionText)
description:Dock(TOP)
description:SetTextColor(color_white)
description:SetExpensiveShadow(1, color_black)
description:SetWrap(true)
description:SetAutoStretchVertical(true)
description:SizeToContents()
description:DockMargin(0, 0, 0, SScaleMin(8 / 3))
elseif (syntax) then
syntax:DockMargin(0, 0, 0, SScaleMin(8 / 3))
else
title:DockMargin(0, 0, 0, SScaleMin(8 / 3))
end
end
end
tabs["flags"] = function(container)
-- info text
local info = container:Add("DLabel")
info:SetFont("MenuFontLargerNoClamp")
info:SetText(L("helpFlags"))
info:SetContentAlignment(5)
info:SetTextColor(color_white)
info:SetExpensiveShadow(1, color_black)
info:Dock(TOP)
info:DockMargin(0, 0, 0, SScaleMin(8 / 3))
info:SizeToContents()
info:SetTall(info:GetTall() + SScaleMin(16 / 3))
info.Paint = function(_, width, height)
surface.SetDrawColor(Color(0, 0, 0, 50))
surface.DrawRect(0, 0, width, height)
end
-- flags
for k, v in SortedPairs(ix.flag.list) do
local background = ColorAlpha(
LocalPlayer():GetCharacter():HasFlags(k) and derma.GetColor("Success", info) or derma.GetColor("Error", info), 88
)
local panel = container:Add("Panel")
panel:Dock(TOP)
panel:DockMargin(0, 0, 0, SScaleMin(8 / 3))
panel:DockPadding(SScaleMin(4 / 3), SScaleMin(4 / 3), SScaleMin(4 / 3), SScaleMin(4 / 3))
panel.Paint = function(_, width, height)
derma.SkinFunc("DrawImportantBackground", 0, 0, width, height, background)
end
local flag = panel:Add("DLabel")
flag:SetFont("TitlesFontNoBoldNoClamp")
flag:SetText(string.format("[%s]", k))
flag:Dock(LEFT)
flag:SetTextColor(color_white)
flag:SetExpensiveShadow(1, color_black)
flag:SetTextInset(SScaleMin(4 / 3), 0)
flag:SizeToContents()
flag:SetTall(flag:GetTall() + SScaleMin(8 / 3))
local description = panel:Add("DLabel")
description:SetFont("TitlesFontNoBoldNoClamp")
description:SetText(v.description)
description:Dock(FILL)
description:SetTextColor(color_white)
description:SetExpensiveShadow(1, color_black)
description:SetTextInset(SScaleMin(8 / 3), 0)
description:SizeToContents()
description:SetTall(description:GetTall() + SScaleMin(8 / 3))
panel:SizeToChildren(false, true)
end
end
end)