mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
Upload
This commit is contained in:
254
lua/sui/vgui/sui_zcollapse_category.lua
Normal file
254
lua/sui/vgui/sui_zcollapse_category.lua
Normal file
@@ -0,0 +1,254 @@
|
||||
--[[
|
||||
| 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")
|
||||
Reference in New Issue
Block a user