mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
233 lines
5.7 KiB
Lua
233 lines
5.7 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/
|
|
--]]
|
|
|
|
if SAM_LOADED then return end
|
|
if SERVER then return end
|
|
|
|
local sam = sam
|
|
local SUI = sam.SUI
|
|
local type = sam.type
|
|
|
|
local Line = sui.TDLib.LibClasses.Line
|
|
|
|
local COMMAND_HELP = SUI.CreateFont("CommandHelp", "Roboto", 14)
|
|
local COMMAND_RUN = SUI.CreateFont("CommandRun", "Roboto Medium", 14)
|
|
|
|
sam.menu.add_tab("https://raw.githubusercontent.com/Srlion/Addons-Data/main/icons/sam/command_window.png", function(column_sheet)
|
|
local tab_body = column_sheet:Add("Panel")
|
|
tab_body:Dock(FILL)
|
|
tab_body:DockMargin(0, 1, 0, 0)
|
|
|
|
do
|
|
local title = tab_body:Add("SAM.Label")
|
|
title:Dock(TOP)
|
|
title:DockMargin(10, 10, 0, 0)
|
|
title:SetFont(SAM_TAB_TITLE_FONT)
|
|
title:SetText("Commands")
|
|
title:SetTextColor(SUI.GetColor("menu_tabs_title"))
|
|
title:SizeToContents()
|
|
end
|
|
|
|
local body = tab_body:Add("Panel")
|
|
body:Dock(FILL)
|
|
body:DockMargin(10, 5, 10, 10)
|
|
|
|
Line(body)
|
|
|
|
local left_body = body:Add("SAM.Panel")
|
|
left_body:Dock(LEFT)
|
|
left_body:SetWide(148)
|
|
|
|
local search_entry = left_body:Add("SAM.TextEntry")
|
|
search_entry:Dock(TOP)
|
|
search_entry:SetNoBar(true)
|
|
search_entry:SetPlaceholder("Search...")
|
|
search_entry:SetRadius(4)
|
|
search_entry:SetTall(27)
|
|
|
|
local category_list = left_body:Add("SAM.CollapseCategory")
|
|
category_list:Dock(FILL)
|
|
category_list:DockMargin(0, SUI.Scale(10), 0, 0)
|
|
|
|
local canvas = category_list:GetCanvas()
|
|
|
|
local commands_refresh = function()
|
|
if not IsValid(category_list) then return end
|
|
|
|
canvas:Clear()
|
|
table.Empty(category_list.items)
|
|
table.Empty(category_list.categories)
|
|
|
|
for k, v in ipairs(sam.command.get_commands()) do
|
|
if (v.permission and not LocalPlayer():HasPermission(v.permission)) or v.menu_hide then
|
|
continue
|
|
end
|
|
|
|
local item = category_list:add_item(v.name, v.category)
|
|
item:InvalidateParent(true)
|
|
item.help = v.help
|
|
item.command = v
|
|
|
|
item.names = {v.name:lower()}
|
|
for _, aliase in ipairs(v.aliases) do
|
|
table.insert(item.names, aliase:lower())
|
|
end
|
|
end
|
|
end
|
|
commands_refresh()
|
|
|
|
do
|
|
local hooks = {
|
|
"SAM.CommandAdded", "SAM.CommandModified", "SAM.CommandRemoved",
|
|
"SAM.RemovedPermission",
|
|
{"SAM.ChangedPlayerRank", func = function(ply, rank, old_rank)
|
|
if rank == old_rank then return end
|
|
if ply == LocalPlayer() then
|
|
commands_refresh()
|
|
end
|
|
end},
|
|
{
|
|
"SAM.RankPermissionGiven", "SAM.RankPermissionTaken", "SAM.ChangedInheritRank",
|
|
func = function(rank)
|
|
if rank == LocalPlayer():sam_getrank() then
|
|
commands_refresh()
|
|
end
|
|
end
|
|
},
|
|
{
|
|
"SAM.AddedPermission", "SAM.PermissionModified",
|
|
func = function(_, _, rank)
|
|
if rank == LocalPlayer():sam_getrank() then
|
|
commands_refresh()
|
|
end
|
|
end
|
|
}
|
|
}
|
|
for _, v in ipairs(hooks) do
|
|
if type(v) == "table" then
|
|
for _, v2 in ipairs(v) do
|
|
hook.Add(v2, "SAM.Menu.RefreshCommands", v.func)
|
|
end
|
|
else
|
|
hook.Add(v, "SAM.Menu.RefreshCommands", commands_refresh)
|
|
end
|
|
end
|
|
end
|
|
|
|
function search_entry:OnValueChange(text)
|
|
category_list:Search(text:lower())
|
|
end
|
|
|
|
do
|
|
local line = Line(body, LEFT)
|
|
line:DockMargin(10, 0, 10, 0)
|
|
line:SetWide(1)
|
|
end
|
|
|
|
local buttons = body:Add("SAM.ScrollPanel")
|
|
buttons:Dock(FILL)
|
|
|
|
local childs = {}
|
|
local pos = 0
|
|
buttons:GetCanvas():On("OnChildAdded", function(s, child)
|
|
child:Dock(TOP)
|
|
child:DockMargin(0, 0, 0, 5)
|
|
child:SetAlpha(0)
|
|
child:SetVisible(false)
|
|
table.insert(childs, child)
|
|
|
|
pos = pos + 1
|
|
child:SetZPos(pos)
|
|
end)
|
|
|
|
local run_command = buttons:Add("SAM.Button")
|
|
run_command:Dock(TOP)
|
|
run_command:SetTall(25)
|
|
run_command:SetFont(COMMAND_RUN)
|
|
run_command:SetZPos(100)
|
|
run_command:SetEnabled(false)
|
|
|
|
run_command:On("DoClick", function(self)
|
|
LocalPlayer():ConCommand("sam\"" .. self:GetText() .. "\"\"" .. table.concat(self.input_arguments, "\"\"") .. "\"")
|
|
end)
|
|
|
|
local help = buttons:Add("SAM.Label")
|
|
help:Dock(TOP)
|
|
help:SetFont(COMMAND_HELP)
|
|
help:SetZPos(101)
|
|
help:SetWrap(true)
|
|
help:SetAutoStretchVertical(true)
|
|
|
|
sam.menu.get():On("OnKeyCodePressed", function(s, key_code)
|
|
if key_code == KEY_ENTER and IsValid(run_command) and run_command:IsEnabled() and run_command:IsMouseInputEnabled() and tab_body:IsVisible() then
|
|
run_command:DoClick()
|
|
end
|
|
end)
|
|
|
|
function category_list:item_selected(item)
|
|
local arguments = sam.command.get_arguments()
|
|
local command = item.command
|
|
local command_arguments = command.args
|
|
local input_arguments = {}
|
|
|
|
for i = #childs, 3, -1 do
|
|
local v = childs[i]
|
|
if not v.no_change or not command:HasArg(v.no_change) then
|
|
if v.no_remove ~= true then
|
|
v:Remove()
|
|
else
|
|
v:Hide()
|
|
end
|
|
end
|
|
end
|
|
|
|
local NIL = {}
|
|
for _, v in ipairs(command_arguments) do
|
|
local func = arguments[v.name]["menu"]
|
|
if not func then continue end
|
|
|
|
local i = table.insert(input_arguments, NIL)
|
|
local p = func(function(allow)
|
|
if not IsValid(run_command) then return end
|
|
input_arguments[i] = allow == nil and NIL or allow
|
|
for i_2 = 1, #input_arguments do
|
|
if input_arguments[i_2] == NIL then
|
|
run_command:SetEnabled(false)
|
|
return
|
|
end
|
|
end
|
|
run_command:SetEnabled(true)
|
|
end, body, buttons, v, childs)
|
|
if p then
|
|
p:AnimatedSetVisible(true)
|
|
end
|
|
end
|
|
|
|
if #command_arguments == 0 then
|
|
run_command:SetEnabled(true)
|
|
end
|
|
|
|
run_command:SetText(command.name)
|
|
run_command:AnimatedSetVisible(true)
|
|
run_command.input_arguments = input_arguments
|
|
|
|
if command.help then
|
|
help:SetText(command.help)
|
|
help:AnimatedSetVisible(true)
|
|
help:SizeToContents()
|
|
else
|
|
help:AnimatedSetVisible(false)
|
|
end
|
|
|
|
buttons:InvalidateLayout(true)
|
|
end
|
|
|
|
return tab_body
|
|
end, nil, 1) |