mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
356 lines
10 KiB
Lua
356 lines
10 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 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("Credits")
|
||
|
|
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("Information")
|
||
|
|
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["Information"] = {
|
||
|
|
|
||
|
|
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)
|