139 lines
4.8 KiB
Lua
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")
|