Files
wnsrc/lua/sui/vgui/sui_zcollapse_category.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

254 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/
--]]
local sui = sui
local draw_material = sui.draw_material
local SUI, NAME = CURRENT_SUI, CURRENT_SUI.name
local GetColor = SUI.GetColor
local RoundedBox = sui.TDLib.LibClasses.RoundedBox
local TextColor = sui.TDLib.LibClasses.TextColor
local TABS_FONT = SUI.CreateFont("CategoryListTabs", "Roboto Bold", 13)
local ITEMS_FONT = SUI.CreateFont("CategoryListItems", "Roboto Medium", 14)
local Panel = {}
local item_OnRemove = function(s)
local parent = s.parent
local items = parent.items
for k, v in ipairs(items) do
if v == s then
table.remove(items, k)
break
end
end
if #items == 0 then
local category = s.category
category:Remove()
parent.categories[category.name] = nil
end
end
local item_DoClick = function(s)
local parent = s.parent
parent:select_item(s)
end
function Panel:Init()
local categories = {}
local items = {}
self.categories = categories
self.items = items
self:SetVBarPadding(1)
local get_category = function(name)
local category = categories[name]
if category then return category end
local expanded = false
category = self:Add("Panel")
category:Dock(TOP)
category:DockMargin(0, 0, 0, 3)
category.name = name
local header = category:Add("DButton")
header:Dock(TOP)
header:DockMargin(0, 0, 0, 3)
header:SetFont(TABS_FONT)
header:SetContentAlignment(4)
header:SetTextInset(6, 0)
header:SetText(name)
header:SizeToContentsY(SUI.Scale(14))
local cur_col
local cur_col_text = Color(GetColor("collapse_category_header_text"):Unpack())
function header:Paint(w, h)
if expanded then
cur_col = GetColor("collapse_category_header_active")
cur_col_text = GetColor("collapse_category_header_text_active")
elseif self.Hovered then
cur_col = GetColor("collapse_category_header_hover")
cur_col_text = GetColor("collapse_category_header_text_hover")
else
cur_col = GetColor("collapse_category_header")
cur_col_text = GetColor("collapse_category_header_text")
end
RoundedBox(self, "Background", 3, 0, 0, w, h, cur_col)
TextColor(self, cur_col_text)
end
local image = header:Add(NAME .. ".Image")
image:Dock(FILL)
image:SetImage("https://raw.githubusercontent.com/Srlion/Addons-Data/main/icons/sui/arrow.png")
function image:Draw(w, h)
local size = SUI.ScaleEven(10)
draw_material(nil, w - (size / 2) - 6, h / 2, size, cur_col_text, expanded and 180)
end
local current_h
function category.RefreshHeight()
local h
if expanded then
local _
_, h = category:ChildrenSize()
if self.searching and h == header:GetTall() then
h = 0
end
else
h = header:GetTall()
end
if current_h == h then return end
if h > 0 then
category:SetVisible(true)
end
current_h = h
category:Stop()
category:SizeTo(-1, h, 0.2, 0, -1, function()
if h == 0 then
category:SetVisible(false)
end
end)
end
function category.SetExpanded(_, set_expanded)
if expanded == set_expanded then return end
if sam.isbool(set_expanded) then
expanded = set_expanded
else
expanded = not expanded
end
category.RefreshHeight()
if expanded then
self:OnCategoryExpanded(category)
end
self:InvalidateLayout(true)
end
header.DoClick = category.SetExpanded
category:SetTall(header:GetTall())
categories[name] = category
return category
end
function self:add_item(name, category_name)
local category = get_category(category_name)
local item = category:Add("DButton")
item:Dock(TOP)
item:DockMargin(0, 0, 0, 3)
item:SetFont(ITEMS_FONT)
item:SetText(name)
item:SizeToContentsY(SUI.Scale(3 * 2))
item.name = name
item.parent = self
item.category = category
local cur_col
local cur_col_text = Color(GetColor("collapse_category_item_text"):Unpack())
function item:Paint(w, h)
if self.selected then
cur_col = GetColor("collapse_category_item_active")
cur_col_text = GetColor("collapse_category_item_text_active")
elseif self.Hovered then
cur_col = GetColor("collapse_category_item_hover")
cur_col_text = GetColor("collapse_category_item_text_hover")
else
cur_col = GetColor("collapse_category_item")
cur_col_text = GetColor("collapse_category_item_text")
end
RoundedBox(self, "Background", 4, 0, 0, w, h, cur_col)
TextColor(self, cur_col_text)
end
item.DoClick = item_DoClick
item.OnRemove = item_OnRemove
table.insert(items, item)
return item
end
end
function Panel:OnCategoryExpanded(category)
end
function Panel:select_item(item)
if self.selected_item ~= item then
if IsValid(self.selected_item) then
self.selected_item.selected = false
end
item.selected = true
self.selected_item = item
self:item_selected(item)
end
end
function Panel:item_selected()
end
function Panel:Search(text, names)
local items = self.items
self.searching = true
for i = 1, #items do
local item = items[i]
local category = item.category
category:SetExpanded(true)
if not names then
if item.name:find(text, nil, true) then
item:SetVisible(true)
else
item:SetVisible(false)
end
else
local found = false
for _, name in ipairs(item.names) do
if name:find(text, nil, true) then
found = true
item:SetVisible(true)
end
end
if not found then
item:SetVisible(false)
end
end
if text == "" then
category:SetExpanded(false)
end
category:RefreshHeight()
category:InvalidateLayout(true)
end
self.searching = false
end
sui.register("CollapseCategory", Panel, NAME .. ".ScrollPanel")