add sborka
This commit is contained in:
138
garrysmod/lua/binder/vgui/cl_frame.lua
Normal file
138
garrysmod/lua/binder/vgui/cl_frame.lua
Normal file
@@ -0,0 +1,138 @@
|
||||
-- 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")
|
||||
Reference in New Issue
Block a user