Files
VnUtest/garrysmod/lua/binder/vgui/cl_frame.lua
2026-03-31 10:27:04 +03:00

139 lines
4.8 KiB
Lua

-- Garry's Mod Binder - Custom Frame
local PANEL = {}
function PANEL:Init()
self:SetSize(ScrW() * 0.8, ScrH() * 0.8)
self:Center()
self:MakePopup()
self.AccentColor = Binder.Config.AccentColor
self.CurrentTab = "Profiles"
self.HeaderHeight = 60
self.TabHeight = 40
-- Tabs definitions
self.Tabs = {
{id = "Profiles", name = Binder.GetPhrase("profiles")},
{id = "Keybinds", name = Binder.GetPhrase("keybinds")},
{id = "Radial", name = Binder.GetPhrase("radial")},
{id = "Settings", name = Binder.GetPhrase("settings")},
}
-- Close Button
self.CloseBtn = vgui.Create("DButton", self)
self.CloseBtn:SetText("")
self.CloseBtn:SetFont("Binder_Main")
self.CloseBtn:SetTextColor(Color(255, 255, 255, 150))
self.CloseBtn.DoClick = function() self:Remove() end
self.CloseBtn.Paint = function(s, w, h)
if s:IsHovered() then
s:SetTextColor(Color(255, 255, 255, 255))
else
s:SetTextColor(Color(255, 255, 255, 150))
end
end
-- Tab Content Container
self.Content = vgui.Create("DPanel", self)
self.Content:Dock(FILL)
self.Content:DockMargin(0, self.HeaderHeight + self.TabHeight, 0, 0)
self.Content.Paint = function(s, w, h) end
self:SwitchTab("Profiles")
end
include("binder/vgui/cl_profiles_tab.lua")
include("binder/vgui/cl_keybind_tab.lua")
include("binder/vgui/cl_radial_tab.lua")
include("binder/vgui/cl_settings_tab.lua")
function PANEL:SwitchTab(id)
self.CurrentTab = id
self.Content:Clear()
if id == "Profiles" then
self.ActiveTab = vgui.Create("Binder_ProfilesTab", self.Content)
elseif id == "Keybinds" then
self.ActiveTab = vgui.Create("Binder_KeybindsTab", self.Content)
elseif id == "Radial" then
self.ActiveTab = vgui.Create("Binder_RadialTab", self.Content)
elseif id == "Settings" then
self.ActiveTab = vgui.Create("Binder_SettingsTab", self.Content)
else
local label = vgui.Create("DLabel", self.Content)
label:SetText("Content for " .. id)
label:SetFont("Binder_Title")
label:SizeToContents()
label:Center()
end
end
function PANEL:RefreshActiveTab()
if IsValid(self.ActiveTab) and self.ActiveTab.Refresh then
self.ActiveTab:Refresh()
elseif self.CurrentTab == "Profiles" and IsValid(self.ActiveTab) then
-- Fallback if the tab logic doesn't have a specific refresh method,
-- though we should add :Refresh to all of them.
self:SwitchTab(self.CurrentTab)
end
end
function PANEL:PerformLayout(w, h)
if IsValid(self.CloseBtn) then
self.CloseBtn:SetSize(30, 30)
self.CloseBtn:SetPos(w - 40, 15)
end
end
function PANEL:Paint(w, h)
-- Background with blur
draw.RoundedBox(8, 0, 0, w, h, Color(30, 30, 30, 200))
-- Header
draw.RoundedBoxEx(8, 0, 0, w, self.HeaderHeight, self.AccentColor, true, true, false, false)
draw.SimpleText(Binder.GetPhrase("title"), "Binder_Title", 20, self.HeaderHeight / 2, Color(255, 255, 255), TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
-- Tabs Bar
draw.RoundedBox(0, 0, self.HeaderHeight, w, self.TabHeight, Color(45, 45, 45))
local tabWidth = w / #self.Tabs
for i, tab in ipairs(self.Tabs) do
local x = (i - 1) * tabWidth
local isActive = self.CurrentTab == tab.id
if isActive then
draw.RoundedBox(0, x, self.HeaderHeight, tabWidth, self.TabHeight, Color(255, 255, 255, 10))
draw.RoundedBox(0, x + 20, self.HeaderHeight + self.TabHeight - 3, tabWidth - 40, 3, Color(255, 255, 255))
end
local isHovered = gui.MouseX() >= self:GetPos() + x and gui.MouseX() < self:GetPos() + x + tabWidth and
gui.MouseY() >= self:GetY() + self.HeaderHeight and gui.MouseY() < self:GetY() + self.HeaderHeight + self.TabHeight
if isHovered and not isActive then
draw.RoundedBox(0, x, self.HeaderHeight, tabWidth, self.TabHeight, Color(255, 255, 255, 5))
end
draw.SimpleText(tab.name, "Binder_Tab", x + tabWidth / 2, self.HeaderHeight + self.TabHeight / 2,
isActive and Color(255, 255, 255) or Color(150, 150, 150),
TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
-- Hidden button for tab click
if not self.TabButtons then self.TabButtons = {} end
if not self.TabButtons[i] then
local btn = vgui.Create("DButton", self)
btn:SetText("")
btn.Paint = function() end
btn.DoClick = function() self:SwitchTab(tab.id) end
self.TabButtons[i] = btn
end
self.TabButtons[i]:SetSize(tabWidth, self.TabHeight)
self.TabButtons[i]:SetPos(x, self.HeaderHeight)
end
end
vgui.Register("Binder_Frame", PANEL, "EditablePanel")