-- venyx ui lib reuploaded by me
-- init
local player = game.Players.LocalPlayer
local mouse = player:GetMouse()
-- services
local input = game:GetService("UserInputService")
local run = game:GetService("RunService")
local tween = game:GetService("TweenService")
local tweeninfo = TweenInfo.new
-- additional
local utility = {}
-- themes
local objects = {}
local themes = {
Background = Color3.fromRGB(24, 24, 24),
Glow = Color3.fromRGB(0, 0, 0),
Accent = Color3.fromRGB(10, 10, 10),
LightContrast = Color3.fromRGB(20, 20, 20),
DarkContrast = Color3.fromRGB(14, 14, 14),
TextColor = Color3.fromRGB(255, 255, 255)
}
do
function utility:Create(instance, properties, children)
local object = Instance.new(instance)
for i, v in pairs(properties or {}) do
object[i] = v
if typeof(v) == "Color3" then -- save for theme changer later
local theme = utility:Find(themes, v)
if theme then
objects[theme] = objects[theme] or {}
objects[theme][i] = objects[theme][i] or setmetatable({}, {_mode = "k"})
table.insert(objects[theme][i], object)
end
end
end
for i, module in pairs(children or {}) do
module.Parent = object
end
return object
end
function utility:Tween(instance, properties, duration, ...)
tween:Create(instance, tweeninfo(duration, ...), properties):Play()
end
function utility:Wait()
run.RenderStepped:Wait()
return true
end
function utility:Find(table, value) -- table.find doesn't work for dictionaries
for i, v in pairs(table) do
if v == value then
return i
end
end
end
function utility:Sort(pattern, values)
local new = {}
pattern = pattern:lower()
if pattern == "" then
return values
end
for i, value in pairs(values) do
if tostring(value):lower():find(pattern) then
table.insert(new, value)
end
end
return new
end
function utility:Pop(object, shrink)
local clone = object:Clone()
clone.AnchorPoint = Vector2.new(0.5, 0.5)
clone.Size = clone.Size - UDim2.new(0, shrink, 0, shrink)
clone.Position = UDim2.new(0.5, 0, 0.5, 0)
clone.Parent = object
clone:ClearAllChildren()
object.ImageTransparency = 1
utility:Tween(clone, {Size = object.Size}, 0.2)
spawn(function()
wait(0.2)
object.ImageTransparency = 0
clone:Destroy()
end)
return clone
end
function utility:InitializeKeybind()
self.keybinds = {}
self.ended = {}
input.InputBegan:Connect(function(key,proc)
if self.keybinds[key.KeyCode] and not proc then
for i, bind in pairs(self.keybinds[key.KeyCode]) do
bind()
end
end
end)
input.InputEnded:Connect(function(key)
if key.UserInputType == Enum.UserInputType.MouseButton1 then
for i, callback in pairs(self.ended) do
callback()
end
end
end)
end
function utility:BindToKey(key, callback)
self.keybinds[key] = self.keybinds[key] or {}
table.insert(self.keybinds[key], callback)
return {
UnBind = function()
for i, bind in pairs(self.keybinds[key]) do
if bind == callback then
table.remove(self.keybinds[key], i)
end
end
end
}
end
function utility:KeyPressed() -- yield until next key is pressed
local key = input.InputBegan:Wait()
while key.UserInputType ~= Enum.UserInputType.Keyboard do
key = input.InputBegan:Wait()
end
wait() -- overlapping connection
return key
end
function utility:DraggingEnabled(frame, parent)
parent = parent or frame
-- stolen from wally or kiriot, kek
local dragging = false
local dragInput, mousePos, framePos
frame.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
dragging = true
mousePos = input.Position
framePos = parent.Position
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then
dragging = false
end
end)
end
end)
frame.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement then
dragInput = input
end
end)
input.InputChanged:Connect(function(input)
if input == dragInput and dragging then
local delta = input.Position - mousePos
parent.Position = UDim2.new(framePos.X.Scale, framePos.X.Offset + delta.X, framePos.Y.Scale, framePos.Y.Offset + delta.Y)
end
end)
end
function utility:DraggingEnded(callback)
table.insert(self.ended, callback)
end
end
-- classes
local library = {} -- main
local page = {}
local section = {}
do
library.__index = library
page.__index = page
section.__index = section
-- new classes
function library.new(title)
local container = utility:Create("ScreenGui", {
Name = title,
Parent = game.CoreGui
}, {
utility:Create("ImageLabel", {
Name = "Main",
BackgroundTransparency = 1,
Position = UDim2.new(0.25, 0, 0.052435593, 0),
Size = UDim2.new(0, 511, 0, 428),
Image = "rbxassetid://4641149554",
ImageColor3 = themes.Background,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(4, 4, 296, 296)
}, {
utility:Create("ImageLabel", {
Name = "Glow",
BackgroundTransparency = 1,
Position = UDim2.new(0, -15, 0, -15),
Size = UDim2.new(1, 30, 1, 30),
ZIndex = 0,
Image = "rbxassetid://5028857084",
ImageColor3 = themes.Glow,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(24, 24, 276, 276)
}),
utility:Create("ImageLabel", {
Name = "Pages",
BackgroundTransparency = 1,
ClipsDescendants = true,
Position = UDim2.new(0, 0, 0, 38),
Size = UDim2.new(0, 126, 1, -38),
ZIndex = 3,
Image = "rbxassetid://5012534273",
ImageColor3 = themes.DarkContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(4, 4, 296, 296)
}, {
utility:Create("ScrollingFrame", {
Name = "Pages_Container",
Active = true,
BackgroundTransparency = 1,
Position = UDim2.new(0, 0, 0, 10),
Size = UDim2.new(1, 0, 1, -20),
CanvasSize = UDim2.new(0, 0, 0, 314),
ScrollBarThickness = 0
}, {
utility:Create("UIListLayout", {
SortOrder = Enum.SortOrder.LayoutOrder,
Padding = UDim.new(0, 10)
})
})
}),
utility:Create("ImageLabel", {
Name = "TopBar",
BackgroundTransparency = 1,
ClipsDescendants = true,
Size = UDim2.new(1, 0, 0, 38),
ZIndex = 5,
Image = "rbxassetid://4595286933",
ImageColor3 = themes.Accent,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(4, 4, 296, 296)
}, {
utility:Create("TextLabel", { -- title
Name = "Title",
AnchorPoint = Vector2.new(0, 0.5),
BackgroundTransparency = 1,
Position = UDim2.new(0, 12, 0, 19),
Size = UDim2.new(1, -46, 0, 16),
ZIndex = 5,
Font = Enum.Font.GothamBold,
Text = title,
TextColor3 = themes.TextColor,
TextSize = 14,
TextXAlignment = Enum.TextXAlignment.Left
})
})
})
})
utility:InitializeKeybind()
utility:DraggingEnabled(container.Main.TopBar, container.Main)
return setmetatable({
container = container,
pagesContainer = container.Main.Pages.Pages_Container,
pages = {}
}, library)
end
function page.new(library, title, icon)
local button = utility:Create("TextButton", {
Name = title,
Parent = library.pagesContainer,
BackgroundTransparency = 1,
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 0, 26),
ZIndex = 3,
AutoButtonColor = false,
Font = Enum.Font.Gotham,
Text = "",
TextSize = 14
}, {
utility:Create("TextLabel", {
Name = "Title",
AnchorPoint = Vector2.new(0, 0.5),
BackgroundTransparency = 1,
Position = UDim2.new(0, 40, 0.5, 0),
Size = UDim2.new(0, 76, 1, 0),
ZIndex = 3,
Font = Enum.Font.Gotham,
Text = title,
TextColor3 = themes.TextColor,
TextSize = 12,
TextTransparency = 0.65,
TextXAlignment = Enum.TextXAlignment.Left
}),
icon and utility:Create("ImageLabel", {
Name = "Icon",
AnchorPoint = Vector2.new(0, 0.5),
BackgroundTransparency = 1,
Position = UDim2.new(0, 12, 0.5, 0),
Size = UDim2.new(0, 16, 0, 16),
ZIndex = 3,
Image = "rbxassetid://" .. tostring(icon),
ImageColor3 = themes.TextColor,
ImageTransparency = 0.64
}) or {}
})
local container = utility:Create("ScrollingFrame", {
Name = title,
Parent = library.container.Main,
Active = true,
BackgroundTransparency = 1,
BorderSizePixel = 0,
Position = UDim2.new(0, 134, 0, 46),
Size = UDim2.new(1, -142, 1, -56),
CanvasSize = UDim2.new(0, 0, 0, 466),
ScrollBarThickness = 3,
ScrollBarImageColor3 = themes.DarkContrast,
Visible = false
}, {
utility:Create("UIListLayout", {
SortOrder = Enum.SortOrder.LayoutOrder,
Padding = UDim.new(0, 10)
})
})
return setmetatable({
library = library,
container = container,
button = button,
sections = {}
}, page)
end
function section.new(page, title)
local container = utility:Create("ImageLabel", {
Name = title,
Parent = page.container,
BackgroundTransparency = 1,
Size = UDim2.new(1, -10, 0, 28),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.LightContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(4, 4, 296, 296),
ClipsDescendants = true
}, {
utility:Create("Frame", {
Name = "Container",
Active = true,
BackgroundTransparency = 1,
BorderSizePixel = 0,
Position = UDim2.new(0, 8, 0, 8),
Size = UDim2.new(1, -16, 1, -16)
}, {
utility:Create("TextLabel", {
Name = "Title",
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 20),
ZIndex = 2,
Font = Enum.Font.GothamSemibold,
Text = title,
TextColor3 = themes.TextColor,
TextSize = 12,
TextXAlignment = Enum.TextXAlignment.Left,
TextTransparency = 1
}),
utility:Create("UIListLayout", {
SortOrder = Enum.SortOrder.LayoutOrder,
Padding = UDim.new(0, 4)
})
})
})
return setmetatable({
page = page,
container = container.Container,
colorpickers = {},
modules = {},
binds = {},
lists = {},
}, section)
end
function library:addPage(...)
local page = page.new(self, ...)
local button = page.button
table.insert(self.pages, page)
button.MouseButton1Click:Connect(function()
self:SelectPage(page, true)
end)
return page
end
function page:addSection(...)
local section = section.new(self, ...)
table.insert(self.sections, section)
return section
end
-- functions
function library:setTheme(theme, color3)
themes[theme] = color3
for property, objects in pairs(objects[theme]) do
for i, object in pairs(objects) do
if not object.Parent or (object.Name == "Button" and object.Parent.Name == "ColorPicker") then
objects[i] = nil -- i can do this because weak tables :D
else
object[property] = color3
end
end
end
end
function library:toggle()
if self.toggling then
return
end
self.toggling = true
local container = self.container.Main
local topbar = container.TopBar
if self.position then
utility:Tween(container, {
Size = UDim2.new(0, 511, 0, 428),
Position = self.position
}, 0.2)
wait(0.2)
utility:Tween(topbar, {Size = UDim2.new(1, 0, 0, 38)}, 0.2)
wait(0.2)
container.ClipsDescendants = false
self.position = nil
else
self.position = container.Position
container.ClipsDescendants = true
utility:Tween(topbar, {Size = UDim2.new(1, 0, 1, 0)}, 0.2)
wait(0.2)
utility:Tween(container, {
Size = UDim2.new(0, 511, 0, 0),
Position = self.position + UDim2.new(0, 0, 0, 428)
}, 0.2)
wait(0.2)
end
self.toggling = false
end
-- new modules
function library:Notify(title, text, callback)
-- overwrite last notification
if self.activeNotification then
self.activeNotification = self.activeNotification()
end
-- standard create
local notification = utility:Create("ImageLabel", {
Name = "Notification",
Parent = self.container,
BackgroundTransparency = 1,
Size = UDim2.new(0, 200, 0, 60),
Image = "rbxassetid://5028857472",
ImageColor3 = themes.Background,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(4, 4, 296, 296),
ZIndex = 3,
ClipsDescendants = true
}, {
utility:Create("ImageLabel", {
Name = "Flash",
Size = UDim2.new(1, 0, 1, 0),
BackgroundTransparency = 1,
Image = "rbxassetid://4641149554",
ImageColor3 = themes.TextColor,
ZIndex = 5
}),
utility:Create("ImageLabel", {
Name = "Glow",
BackgroundTransparency = 1,
Position = UDim2.new(0, -15, 0, -15),
Size = UDim2.new(1, 30, 1, 30),
ZIndex = 2,
Image = "rbxassetid://5028857084",
ImageColor3 = themes.Glow,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(24, 24, 276, 276)
}),
utility:Create("TextLabel", {
Name = "Title",
BackgroundTransparency = 1,
Position = UDim2.new(0, 10, 0, 8),
Size = UDim2.new(1, -40, 0, 16),
ZIndex = 4,
Font = Enum.Font.GothamSemibold,
TextColor3 = themes.TextColor,
TextSize = 14.000,
TextXAlignment = Enum.TextXAlignment.Left
}),
utility:Create("TextLabel", {
Name = "Text",
BackgroundTransparency = 1,
Position = UDim2.new(0, 10, 1, -24),
Size = UDim2.new(1, -40, 0, 16),
ZIndex = 4,
Font = Enum.Font.Gotham,
TextColor3 = themes.TextColor,
TextSize = 12.000,
TextXAlignment = Enum.TextXAlignment.Left
}),
utility:Create("ImageButton", {
Name = "Accept",
BackgroundTransparency = 1,
Position = UDim2.new(1, -26, 0, 8),
Size = UDim2.new(0, 16, 0, 16),
Image = "rbxassetid://5012538259",
ImageColor3 = themes.TextColor,
ZIndex = 4
}),
utility:Create("ImageButton", {
Name = "Decline",
BackgroundTransparency = 1,
Position = UDim2.new(1, -26, 1, -24),
Size = UDim2.new(0, 16, 0, 16),
Image = "rbxassetid://5012538583",
ImageColor3 = themes.TextColor,
ZIndex = 4
})
})
-- dragging
utility:DraggingEnabled(notification)
-- position and size
title = title or "Notification"
text = text or ""
notification.Title.Text = title
notification.Text.Text = text
local padding = 10
local textSize = game:GetService("TextService"):GetTextSize(text, 12, Enum.Font.Gotham, Vector2.new(math.huge, 16))
notification.Position = library.lastNotification or UDim2.new(0, padding, 1, -(notification.AbsoluteSize.Y + padding))
notification.Size = UDim2.new(0, 0, 0, 60)
utility:Tween(notification, {Size = UDim2.new(0, textSize.X + 70, 0, 60)}, 0.2)
wait(0.2)
notification.ClipsDescendants = false
utility:Tween(notification.Flash, {
Size = UDim2.new(0, 0, 0, 60),
Position = UDim2.new(1, 0, 0, 0)
}, 0.2)
-- callbacks
local active = true
local close = function()
if not active then
return
end
active = false
notification.ClipsDescendants = true
library.lastNotification = notification.Position
notification.Flash.Position = UDim2.new(0, 0, 0, 0)
utility:Tween(notification.Flash, {Size = UDim2.new(1, 0, 1, 0)}, 0.2)
wait(0.2)
utility:Tween(notification, {
Size = UDim2.new(0, 0, 0, 60),
Position = notification.Position + UDim2.new(0, textSize.X + 70, 0, 0)
}, 0.2)
wait(0.2)
notification:Destroy()
end
self.activeNotification = close
notification.Accept.MouseButton1Click:Connect(function()
if not active then
return
end
if callback then
callback(true)
end
close()
end)
notification.Decline.MouseButton1Click:Connect(function()
if not active then
return
end
if callback then
callback(false)
end
close()
end)
end
function section:addButton(title, callback)
local button = utility:Create("ImageButton", {
Name = "Button",
Parent = self.container,
BackgroundTransparency = 1,
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 0, 30),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.DarkContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("TextLabel", {
Name = "Title",
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 1, 0),
ZIndex = 3,
Font = Enum.Font.Gotham,
Text = title,
TextColor3 = themes.TextColor,
TextSize = 12,
TextTransparency = 0.10000000149012
})
})
table.insert(self.modules, button)
--self:Resize()
local text = button.Title
local debounce
button.MouseButton1Click:Connect(function()
if debounce then
return
end
-- animation
utility:Pop(button, 10)
debounce = true
text.TextSize = 0
utility:Tween(button.Title, {TextSize = 14}, 0.2)
wait(0.2)
utility:Tween(button.Title, {TextSize = 12}, 0.2)
if callback then
callback(function(...)
self:updateButton(button, ...)
end)
end
debounce = false
end)
return button
end
function section:addToggle(title, default, callback)
local toggle = utility:Create("ImageButton", {
Name = "Toggle",
Parent = self.container,
BackgroundTransparency = 1,
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 0, 30),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.DarkContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
},{
utility:Create("TextLabel", {
Name = "Title",
AnchorPoint = Vector2.new(0, 0.5),
BackgroundTransparency = 1,
Position = UDim2.new(0, 10, 0.5, 1),
Size = UDim2.new(0.5, 0, 1, 0),
ZIndex = 3,
Font = Enum.Font.Gotham,
Text = title,
TextColor3 = themes.TextColor,
TextSize = 12,
TextTransparency = 0.10000000149012,
TextXAlignment = Enum.TextXAlignment.Left
}),
utility:Create("ImageLabel", {
Name = "Button",
BackgroundTransparency = 1,
BorderSizePixel = 0,
Position = UDim2.new(1, -50, 0.5, -8),
Size = UDim2.new(0, 40, 0, 16),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.LightContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("ImageLabel", {
Name = "Frame",
BackgroundTransparency = 1,
Position = UDim2.new(0, 2, 0.5, -6),
Size = UDim2.new(1, -22, 1, -4),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.TextColor,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
})
})
})
table.insert(self.modules, toggle)
--self:Resize()
local active = default
self:updateToggle(toggle, nil, active)
toggle.MouseButton1Click:Connect(function()
active = not active
self:updateToggle(toggle, nil, active)
if callback then
callback(active, function(...)
self:updateToggle(toggle, ...)
end)
end
end)
return toggle
end
function section:addTextbox(title, default, callback)
local textbox = utility:Create("ImageButton", {
Name = "Textbox",
Parent = self.container,
BackgroundTransparency = 1,
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 0, 30),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.DarkContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("TextLabel", {
Name = "Title",
AnchorPoint = Vector2.new(0, 0.5),
BackgroundTransparency = 1,
Position = UDim2.new(0, 10, 0.5, 1),
Size = UDim2.new(0.5, 0, 1, 0),
ZIndex = 3,
Font = Enum.Font.Gotham,
Text = title,
TextColor3 = themes.TextColor,
TextSize = 12,
TextTransparency = 0.10000000149012,
TextXAlignment = Enum.TextXAlignment.Left
}),
utility:Create("ImageLabel", {
Name = "Button",
BackgroundTransparency = 1,
Position = UDim2.new(1, -110, 0.5, -8),
Size = UDim2.new(0, 100, 0, 16),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.LightContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("TextBox", {
Name = "Textbox",
BackgroundTransparency = 1,
TextTruncate = Enum.TextTruncate.AtEnd,
Position = UDim2.new(0, 5, 0, 0),
Size = UDim2.new(1, -10, 1, 0),
ZIndex = 3,
Font = Enum.Font.GothamSemibold,
Text = default or "",
TextColor3 = themes.TextColor,
TextSize = 11
})
})
})
table.insert(self.modules, textbox)
--self:Resize()
local button = textbox.Button
local input = button.Textbox
textbox.MouseButton1Click:Connect(function()
if textbox.Button.Size ~= UDim2.new(0, 100, 0, 16) then
return
end
utility:Tween(textbox.Button, {
Size = UDim2.new(0, 200, 0, 16),
Position = UDim2.new(1, -210, 0.5, -8)
}, 0.2)
wait()
input.TextXAlignment = Enum.TextXAlignment.Left
input:CaptureFocus()
end)
input:GetPropertyChangedSignal("Text"):Connect(function()
if button.ImageTransparency == 0 and (button.Size == UDim2.new(0, 200, 0, 16) or button.Size == UDim2.new(0, 100, 0, 16)) then -- i know, i dont like this either
utility:Pop(button, 10)
end
if callback then
callback(input.Text, nil, function(...)
self:updateTextbox(textbox, ...)
end)
end
end)
input.FocusLost:Connect(function()
input.TextXAlignment = Enum.TextXAlignment.Center
utility:Tween(textbox.Button, {
Size = UDim2.new(0, 100, 0, 16),
Position = UDim2.new(1, -110, 0.5, -8)
}, 0.2)
if callback then
callback(input.Text, true, function(...)
self:updateTextbox(textbox, ...)
end)
end
end)
return textbox
end
function section:addKeybind(title, default, callback, changedCallback)
local keybind = utility:Create("ImageButton", {
Name = "Keybind",
Parent = self.container,
BackgroundTransparency = 1,
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 0, 30),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.DarkContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("TextLabel", {
Name = "Title",
AnchorPoint = Vector2.new(0, 0.5),
BackgroundTransparency = 1,
Position = UDim2.new(0, 10, 0.5, 1),
Size = UDim2.new(1, 0, 1, 0),
ZIndex = 3,
Font = Enum.Font.Gotham,
Text = title,
TextColor3 = themes.TextColor,
TextSize = 12,
TextTransparency = 0.10000000149012,
TextXAlignment = Enum.TextXAlignment.Left
}),
utility:Create("ImageLabel", {
Name = "Button",
BackgroundTransparency = 1,
Position = UDim2.new(1, -110, 0.5, -8),
Size = UDim2.new(0, 100, 0, 16),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.LightContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("TextLabel", {
Name = "Text",
BackgroundTransparency = 1,
ClipsDescendants = true,
Size = UDim2.new(1, 0, 1, 0),
ZIndex = 3,
Font = Enum.Font.GothamSemibold,
Text = default and default.Name or "None",
TextColor3 = themes.TextColor,
TextSize = 11
})
})
})
table.insert(self.modules, keybind)
--self:Resize()
local text = keybind.Button.Text
local button = keybind.Button
local animate = function()
if button.ImageTransparency == 0 then
utility:Pop(button, 10)
end
end
self.binds[keybind] = {callback = function()
animate()
if callback then
callback(function(...)
self:updateKeybind(keybind, ...)
end)
end
end}
if default and callback then
self:updateKeybind(keybind, nil, default)
end
keybind.MouseButton1Click:Connect(function()
animate()
if self.binds[keybind].connection then -- unbind
return self:updateKeybind(keybind)
end
if text.Text == "None" then -- new bind
text.Text = "..."
local key = utility:KeyPressed()
self:updateKeybind(keybind, nil, key.KeyCode)
animate()
if changedCallback then
changedCallback(key, function(...)
self:updateKeybind(keybind, ...)
end)
end
end
end)
return keybind
end
function section:addColorPicker(title, default, callback)
local colorpicker = utility:Create("ImageButton", {
Name = "ColorPicker",
Parent = self.container,
BackgroundTransparency = 1,
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 0, 30),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.DarkContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
},{
utility:Create("TextLabel", {
Name = "Title",
AnchorPoint = Vector2.new(0, 0.5),
BackgroundTransparency = 1,
Position = UDim2.new(0, 10, 0.5, 1),
Size = UDim2.new(0.5, 0, 1, 0),
ZIndex = 3,
Font = Enum.Font.Gotham,
Text = title,
TextColor3 = themes.TextColor,
TextSize = 12,
TextTransparency = 0.10000000149012,
TextXAlignment = Enum.TextXAlignment.Left
}),
utility:Create("ImageButton", {
Name = "Button",
BackgroundTransparency = 1,
BorderSizePixel = 0,
Position = UDim2.new(1, -50, 0.5, -7),
Size = UDim2.new(0, 40, 0, 14),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = Color3.fromRGB(255, 255, 255),
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
})
})
local tab = utility:Create("ImageLabel", {
Name = "ColorPicker",
Parent = self.page.library.container,
BackgroundTransparency = 1,
Position = UDim2.new(0.75, 0, 0.400000006, 0),
Selectable = true,
AnchorPoint = Vector2.new(0.5, 0.5),
Size = UDim2.new(0, 162, 0, 169),
Image = "rbxassetid://5028857472",
ImageColor3 = themes.Background,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298),
Visible = false,
}, {
utility:Create("ImageLabel", {
Name = "Glow",
BackgroundTransparency = 1,
Position = UDim2.new(0, -15, 0, -15),
Size = UDim2.new(1, 30, 1, 30),
ZIndex = 0,
Image = "rbxassetid://5028857084",
ImageColor3 = themes.Glow,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(22, 22, 278, 278)
}),
utility:Create("TextLabel", {
Name = "Title",
BackgroundTransparency = 1,
Position = UDim2.new(0, 10, 0, 8),
Size = UDim2.new(1, -40, 0, 16),
ZIndex = 2,
Font = Enum.Font.GothamSemibold,
Text = title,
TextColor3 = themes.TextColor,
TextSize = 14,
TextXAlignment = Enum.TextXAlignment.Left
}),
utility:Create("ImageButton", {
Name = "Close",
BackgroundTransparency = 1,
Position = UDim2.new(1, -26, 0, 8),
Size = UDim2.new(0, 16, 0, 16),
ZIndex = 2,
Image = "rbxassetid://5012538583",
ImageColor3 = themes.TextColor
}),
utility:Create("Frame", {
Name = "Container",
BackgroundTransparency = 1,
Position = UDim2.new(0, 8, 0, 32),
Size = UDim2.new(1, -18, 1, -40)
}, {
utility:Create("UIListLayout", {
SortOrder = Enum.SortOrder.LayoutOrder,
Padding = UDim.new(0, 6)
}),
utility:Create("ImageButton", {
Name = "Canvas",
BackgroundTransparency = 1,
BorderColor3 = themes.LightContrast,
Size = UDim2.new(1, 0, 0, 60),
AutoButtonColor = false,
Image = "rbxassetid://5108535320",
ImageColor3 = Color3.fromRGB(255, 0, 0),
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("ImageLabel", {
Name = "White_Overlay",
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 60),
Image = "rbxassetid://5107152351",
SliceCenter = Rect.new(2, 2, 298, 298)
}),
utility:Create("ImageLabel", {
Name = "Black_Overlay",
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 60),
Image = "rbxassetid://5107152095",
SliceCenter = Rect.new(2, 2, 298, 298)
}),
utility:Create("ImageLabel", {
Name = "Cursor",
BackgroundColor3 = themes.TextColor,
AnchorPoint = Vector2.new(0.5, 0.5),
BackgroundTransparency = 1.000,
Size = UDim2.new(0, 10, 0, 10),
Position = UDim2.new(0, 0, 0, 0),
Image = "rbxassetid://5100115962",
SliceCenter = Rect.new(2, 2, 298, 298)
})
}),
utility:Create("ImageButton", {
Name = "Color",
BackgroundTransparency = 1,
BorderSizePixel = 0,
Position = UDim2.new(0, 0, 0, 4),
Selectable = false,
Size = UDim2.new(1, 0, 0, 16),
ZIndex = 2,
AutoButtonColor = false,
Image = "rbxassetid://5028857472",
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("Frame", {
Name = "Select",
BackgroundColor3 = themes.TextColor,
BorderSizePixel = 1,
Position = UDim2.new(1, 0, 0, 0),
Size = UDim2.new(0, 2, 1, 0),
ZIndex = 2
}),
utility:Create("UIGradient", { -- rainbow canvas
Color = ColorSequence.new({
ColorSequenceKeypoint.new(0.00, Color3.fromRGB(255, 0, 0)),
ColorSequenceKeypoint.new(0.17, Color3.fromRGB(255, 255, 0)),
ColorSequenceKeypoint.new(0.33, Color3.fromRGB(0, 255, 0)),
ColorSequenceKeypoint.new(0.50, Color3.fromRGB(0, 255, 255)),
ColorSequenceKeypoint.new(0.66, Color3.fromRGB(0, 0, 255)),
ColorSequenceKeypoint.new(0.82, Color3.fromRGB(255, 0, 255)),
ColorSequenceKeypoint.new(1.00, Color3.fromRGB(255, 0, 0))
})
})
}),
utility:Create("Frame", {
Name = "Inputs",
BackgroundTransparency = 1,
Position = UDim2.new(0, 10, 0, 158),
Size = UDim2.new(1, 0, 0, 16)
}, {
utility:Create("UIListLayout", {
FillDirection = Enum.FillDirection.Horizontal,
SortOrder = Enum.SortOrder.LayoutOrder,
Padding = UDim.new(0, 6)
}),
utility:Create("ImageLabel", {
Name = "R",
BackgroundTransparency = 1,
BorderSizePixel = 0,
Size = UDim2.new(0.305, 0, 1, 0),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.DarkContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("TextLabel", {
Name = "Text",
BackgroundTransparency = 1,
Size = UDim2.new(0.400000006, 0, 1, 0),
ZIndex = 2,
Font = Enum.Font.Gotham,
Text = "R:",
TextColor3 = themes.TextColor,
TextSize = 10.000
}),
utility:Create("TextBox", {
Name = "Textbox",
BackgroundTransparency = 1,
Position = UDim2.new(0.300000012, 0, 0, 0),
Size = UDim2.new(0.600000024, 0, 1, 0),
ZIndex = 2,
Font = Enum.Font.Gotham,
PlaceholderColor3 = themes.DarkContrast,
Text = "255",
TextColor3 = themes.TextColor,
TextSize = 10.000
})
}),
utility:Create("ImageLabel", {
Name = "G",
BackgroundTransparency = 1,
BorderSizePixel = 0,
Size = UDim2.new(0.305, 0, 1, 0),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.DarkContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("TextLabel", {
Name = "Text",
BackgroundTransparency = 1,
ZIndex = 2,
Size = UDim2.new(0.400000006, 0, 1, 0),
Font = Enum.Font.Gotham,
Text = "G:",
TextColor3 = themes.TextColor,
TextSize = 10.000
}),
utility:Create("TextBox", {
Name = "Textbox",
BackgroundTransparency = 1,
Position = UDim2.new(0.300000012, 0, 0, 0),
Size = UDim2.new(0.600000024, 0, 1, 0),
ZIndex = 2,
Font = Enum.Font.Gotham,
Text = "255",
TextColor3 = themes.TextColor,
TextSize = 10.000
})
}),
utility:Create("ImageLabel", {
Name = "B",
BackgroundTransparency = 1,
BorderSizePixel = 0,
Size = UDim2.new(0.305, 0, 1, 0),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.DarkContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("TextLabel", {
Name = "Text",
BackgroundTransparency = 1,
Size = UDim2.new(0.400000006, 0, 1, 0),
ZIndex = 2,
Font = Enum.Font.Gotham,
Text = "B:",
TextColor3 = themes.TextColor,
TextSize = 10.000
}),
utility:Create("TextBox", {
Name = "Textbox",
BackgroundTransparency = 1,
Position = UDim2.new(0.300000012, 0, 0, 0),
Size = UDim2.new(0.600000024, 0, 1, 0),
ZIndex = 2,
Font = Enum.Font.Gotham,
Text = "255",
TextColor3 = themes.TextColor,
TextSize = 10.000
})
}),
}),
utility:Create("ImageButton", {
Name = "Button",
BackgroundTransparency = 1,
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 0, 20),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.DarkContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("TextLabel", {
Name = "Text",
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 1, 0),
ZIndex = 3,
Font = Enum.Font.Gotham,
Text = "Submit",
TextColor3 = themes.TextColor,
TextSize = 11.000
})
})
})
})
utility:DraggingEnabled(tab)
table.insert(self.modules, colorpicker)
--self:Resize()
local allowed = {
[""] = true
}
local canvas = tab.Container.Canvas
local color = tab.Container.Color
local canvasSize, canvasPosition = canvas.AbsoluteSize, canvas.AbsolutePosition
local colorSize, colorPosition = color.AbsoluteSize, color.AbsolutePosition
local draggingColor, draggingCanvas
local color3 = default or Color3.fromRGB(255, 255, 255)
local hue, sat, brightness = 0, 0, 1
local rgb = {
r = 255,
g = 255,
b = 255
}
self.colorpickers[colorpicker] = {
tab = tab,
callback = function(prop, value)
rgb[prop] = value
hue, sat, brightness = Color3.toHSV(Color3.fromRGB(rgb.r, rgb.g, rgb.b))
end
}
local callback = function(value)
if callback then
callback(value, function(...)
self:updateColorPicker(colorpicker, ...)
end)
end
end
utility:DraggingEnded(function()
draggingColor, draggingCanvas = false, false
end)
if default then
self:updateColorPicker(colorpicker, nil, default)
hue, sat, brightness = Color3.toHSV(default)
default = Color3.fromHSV(hue, sat, brightness)
for i, prop in pairs({"r", "g", "b"}) do
rgb[prop] = default[prop:upper()] * 255
end
end
for i, container in pairs(tab.Container.Inputs:GetChildren()) do -- i know what you are about to say, so shut up
if container:IsA("ImageLabel") then
local textbox = container.Textbox
local focused
textbox.Focused:Connect(function()
focused = true
end)
textbox.FocusLost:Connect(function()
focused = false
if not tonumber(textbox.Text) then
textbox.Text = math.floor(rgb[container.Name:lower()])
end
end)
textbox:GetPropertyChangedSignal("Text"):Connect(function()
local text = textbox.Text
if not allowed[text] and not tonumber(text) then
textbox.Text = text:sub(1, #text - 1)
elseif focused and not allowed[text] then
rgb[container.Name:lower()] = math.clamp(tonumber(textbox.Text), 0, 255)
local color3 = Color3.fromRGB(rgb.r, rgb.g, rgb.b)
hue, sat, brightness = Color3.toHSV(color3)
self:updateColorPicker(colorpicker, nil, color3)
callback(color3)
end
end)
end
end
canvas.MouseButton1Down:Connect(function()
draggingCanvas = true
while draggingCanvas do
local x, y = mouse.X, mouse.Y
sat = math.clamp((x - canvasPosition.X) / canvasSize.X, 0, 1)
brightness = 1 - math.clamp((y - canvasPosition.Y) / canvasSize.Y, 0, 1)
color3 = Color3.fromHSV(hue, sat, brightness)
for i, prop in pairs({"r", "g", "b"}) do
rgb[prop] = color3[prop:upper()] * 255
end
self:updateColorPicker(colorpicker, nil, {hue, sat, brightness}) -- roblox is literally retarded
utility:Tween(canvas.Cursor, {Position = UDim2.new(sat, 0, 1 - brightness, 0)}, 0.1) -- overwrite
callback(color3)
utility:Wait()
end
end)
color.MouseButton1Down:Connect(function()
draggingColor = true
while draggingColor do
hue = 1 - math.clamp(1 - ((mouse.X - colorPosition.X) / colorSize.X), 0, 1)
color3 = Color3.fromHSV(hue, sat, brightness)
for i, prop in pairs({"r", "g", "b"}) do
rgb[prop] = color3[prop:upper()] * 255
end
local x = hue -- hue is updated
self:updateColorPicker(colorpicker, nil, {hue, sat, brightness}) -- roblox is literally retarded
utility:Tween(tab.Container.Color.Select, {Position = UDim2.new(x, 0, 0, 0)}, 0.1) -- overwrite
callback(color3)
utility:Wait()
end
end)
-- click events
local button = colorpicker.Button
local toggle, debounce, animate
lastColor = Color3.fromHSV(hue, sat, brightness)
animate = function(visible, overwrite)
if overwrite then
if not toggle then
return
end
if debounce then
while debounce do
utility:Wait()
end
end
elseif not overwrite then
if debounce then
return
end
if button.ImageTransparency == 0 then
utility:Pop(button, 10)
end
end
toggle = visible
debounce = true
if visible then
if self.page.library.activePicker and self.page.library.activePicker ~= animate then
self.page.library.activePicker(nil, true)
end
self.page.library.activePicker = animate
lastColor = Color3.fromHSV(hue, sat, brightness)
local x1, x2 = button.AbsoluteSize.X / 2, 162--tab.AbsoluteSize.X
local px, py = button.AbsolutePosition.X, button.AbsolutePosition.Y
tab.ClipsDescendants = true
tab.Visible = true
tab.Size = UDim2.new(0, 0, 0, 0)
tab.Position = UDim2.new(0, x1 + x2 + px, 0, py)
utility:Tween(tab, {Size = UDim2.new(0, 162, 0, 169)}, 0.2)
-- update size and position
wait(0.2)
tab.ClipsDescendants = false
canvasSize, canvasPosition = canvas.AbsoluteSize, canvas.AbsolutePosition
colorSize, colorPosition = color.AbsoluteSize, color.AbsolutePosition
else
utility:Tween(tab, {Size = UDim2.new(0, 0, 0, 0)}, 0.2)
tab.ClipsDescendants = true
wait(0.2)
tab.Visible = false
end
debounce = false
end
local toggleTab = function()
animate(not toggle)
end
button.MouseButton1Click:Connect(toggleTab)
colorpicker.MouseButton1Click:Connect(toggleTab)
tab.Container.Button.MouseButton1Click:Connect(function()
animate()
end)
tab.Close.MouseButton1Click:Connect(function()
self:updateColorPicker(colorpicker, nil, lastColor)
animate()
end)
return colorpicker
end
function section:addSlider(title, default, min, max, callback)
local slider = utility:Create("ImageButton", {
Name = "Slider",
Parent = self.container,
BackgroundTransparency = 1,
BorderSizePixel = 0,
Position = UDim2.new(0.292817682, 0, 0.299145311, 0),
Size = UDim2.new(1, 0, 0, 50),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.DarkContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("TextLabel", {
Name = "Title",
BackgroundTransparency = 1,
Position = UDim2.new(0, 10, 0, 6),
Size = UDim2.new(0.5, 0, 0, 16),
ZIndex = 3,
Font = Enum.Font.Gotham,
Text = title,
TextColor3 = themes.TextColor,
TextSize = 12,
TextTransparency = 0.10000000149012,
TextXAlignment = Enum.TextXAlignment.Left
}),
utility:Create("TextBox", {
Name = "TextBox",
BackgroundTransparency = 1,
BorderSizePixel = 0,
Position = UDim2.new(1, -30, 0, 6),
Size = UDim2.new(0, 20, 0, 16),
ZIndex = 3,
Font = Enum.Font.GothamSemibold,
Text = default or min,
TextColor3 = themes.TextColor,
TextSize = 12,
TextXAlignment = Enum.TextXAlignment.Right
}),
utility:Create("TextLabel", {
Name = "Slider",
BackgroundTransparency = 1,
Position = UDim2.new(0, 10, 0, 28),
Size = UDim2.new(1, -20, 0, 16),
ZIndex = 3,
Text = "",
}, {
utility:Create("ImageLabel", {
Name = "Bar",
AnchorPoint = Vector2.new(0, 0.5),
BackgroundTransparency = 1,
Position = UDim2.new(0, 0, 0.5, 0),
Size = UDim2.new(1, 0, 0, 4),
ZIndex = 3,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.LightContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("ImageLabel", {
Name = "Fill",
BackgroundTransparency = 1,
Size = UDim2.new(0.8, 0, 1, 0),
ZIndex = 3,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.TextColor,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("ImageLabel", {
Name = "Circle",
AnchorPoint = Vector2.new(0.5, 0.5),
BackgroundTransparency = 1,
ImageTransparency = 1.000,
ImageColor3 = themes.TextColor,
Position = UDim2.new(1, 0, 0.5, 0),
Size = UDim2.new(0, 10, 0, 10),
ZIndex = 3,
Image = "rbxassetid://4608020054"
})
})
})
})
})
table.insert(self.modules, slider)
--self:Resize()
local allowed = {
[""] = true,
["-"] = true
}
local textbox = slider.TextBox
local circle = slider.Slider.Bar.Fill.Circle
local value = default or min
local dragging, last
local callback = function(value)
if callback then
callback(value, function(...)
self:updateSlider(slider, ...)
end)
end
end
self:updateSlider(slider, nil, value, min, max)
utility:DraggingEnded(function()
dragging = false
end)
slider.MouseButton1Down:Connect(function(input)
dragging = true
while dragging do
utility:Tween(circle, {ImageTransparency = 0}, 0.1)
value = self:updateSlider(slider, nil, nil, min, max, value)
callback(value)
utility:Wait()
end
wait(0.5)
utility:Tween(circle, {ImageTransparency = 1}, 0.2)
end)
textbox.FocusLost:Connect(function()
if not tonumber(textbox.Text) then
value = self:updateSlider(slider, nil, default or min, min, max)
callback(value)
end
end)
textbox:GetPropertyChangedSignal("Text"):Connect(function()
local text = textbox.Text
if not allowed[text] and not tonumber(text) then
textbox.Text = text:sub(1, #text - 1)
elseif not allowed[text] then
value = self:updateSlider(slider, nil, tonumber(text) or value, min, max)
callback(value)
end
end)
return slider
end
function section:addDropdown(title, list, callback)
local dropdown = utility:Create("Frame", {
Name = "Dropdown",
Parent = self.container,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 30),
ClipsDescendants = true
}, {
utility:Create("UIListLayout", {
SortOrder = Enum.SortOrder.LayoutOrder,
Padding = UDim.new(0, 4)
}),
utility:Create("ImageLabel", {
Name = "Search",
BackgroundTransparency = 1,
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 0, 30),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.DarkContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("TextBox", {
Name = "TextBox",
AnchorPoint = Vector2.new(0, 0.5),
BackgroundTransparency = 1,
TextTruncate = Enum.TextTruncate.AtEnd,
Position = UDim2.new(0, 10, 0.5, 1),
Size = UDim2.new(1, -42, 1, 0),
ZIndex = 3,
Font = Enum.Font.Gotham,
Text = title,
TextColor3 = themes.TextColor,
TextSize = 12,
TextTransparency = 0.10000000149012,
TextXAlignment = Enum.TextXAlignment.Left
}),
utility:Create("ImageButton", {
Name = "Button",
BackgroundTransparency = 1,
BorderSizePixel = 0,
Position = UDim2.new(1, -28, 0.5, -9),
Size = UDim2.new(0, 18, 0, 18),
ZIndex = 3,
Image = "rbxassetid://5012539403",
ImageColor3 = themes.TextColor,
SliceCenter = Rect.new(2, 2, 298, 298)
})
}),
utility:Create("ImageLabel", {
Name = "List",
BackgroundTransparency = 1,
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 1, -34),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.Background,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("ScrollingFrame", {
Name = "Frame",
Active = true,
BackgroundTransparency = 1,
BorderSizePixel = 0,
Position = UDim2.new(0, 4, 0, 4),
Size = UDim2.new(1, -8, 1, -8),
CanvasPosition = Vector2.new(0, 28),
CanvasSize = UDim2.new(0, 0, 0, 120),
ZIndex = 2,
ScrollBarThickness = 3,
ScrollBarImageColor3 = themes.DarkContrast
}, {
utility:Create("UIListLayout", {
SortOrder = Enum.SortOrder.LayoutOrder,
Padding = UDim.new(0, 4)
})
})
})
})
table.insert(self.modules, dropdown)
--self:Resize()
local search = dropdown.Search
local focused
list = list or {}
search.Button.MouseButton1Click:Connect(function()
if search.Button.Rotation == 0 then
self:updateDropdown(dropdown, nil, list, callback)
else
self:updateDropdown(dropdown, nil, nil, callback)
end
end)
search.TextBox.Focused:Connect(function()
if search.Button.Rotation == 0 then
self:updateDropdown(dropdown, nil, list, callback)
end
focused = true
end)
search.TextBox.FocusLost:Connect(function()
focused = false
end)
search.TextBox:GetPropertyChangedSignal("Text"):Connect(function()
if focused then
local list = utility:Sort(search.TextBox.Text, list)
list = #list ~= 0 and list
self:updateDropdown(dropdown, nil, list, callback)
end
end)
dropdown:GetPropertyChangedSignal("Size"):Connect(function()
self:Resize()
end)
return dropdown
end
-- class functions
function library:SelectPage(page, toggle)
if toggle and self.focusedPage == page then -- already selected
return
end
local button = page.button
if toggle then
-- page button
button.Title.TextTransparency = 0
button.Title.Font = Enum.Font.GothamSemibold
if button:FindFirstChild("Icon") then
button.Icon.ImageTransparency = 0
end
-- update selected page
local focusedPage = self.focusedPage
self.focusedPage = page
if focusedPage then
self:SelectPage(focusedPage)
end
-- sections
local existingSections = focusedPage and #focusedPage.sections or 0
local sectionsRequired = #page.sections - existingSections
page:Resize()
for i, section in pairs(page.sections) do
section.container.Parent.ImageTransparency = 0
end
if sectionsRequired < 0 then -- "hides" some sections
for i = existingSections, #page.sections + 1, -1 do
local section = focusedPage.sections[i].container.Parent
utility:Tween(section, {ImageTransparency = 1}, 0.1)
end
end
wait(0.1)
page.container.Visible = true
if focusedPage then
focusedPage.container.Visible = false
end
if sectionsRequired > 0 then -- "creates" more section
for i = existingSections + 1, #page.sections do
local section = page.sections[i].container.Parent
section.ImageTransparency = 1
utility:Tween(section, {ImageTransparency = 0}, 0.05)
end
end
wait(0.05)
for i, section in pairs(page.sections) do
utility:Tween(section.container.Title, {TextTransparency = 0}, 0.1)
section:Resize(true)
wait(0.05)
end
wait(0.05)
page:Resize(true)
else
-- page button
button.Title.Font = Enum.Font.Gotham
button.Title.TextTransparency = 0.65
if button:FindFirstChild("Icon") then
button.Icon.ImageTransparency = 0.65
end
-- sections
for i, section in pairs(page.sections) do
utility:Tween(section.container.Parent, {Size = UDim2.new(1, -10, 0, 28)}, 0.1)
utility:Tween(section.container.Title, {TextTransparency = 1}, 0.1)
end
wait(0.1)
page.lastPosition = page.container.CanvasPosition.Y
page:Resize()
end
end
function page:Resize(scroll)
local padding = 10
local size = 0
for i, section in pairs(self.sections) do
size = size + section.container.Parent.AbsoluteSize.Y + padding
end
self.container.CanvasSize = UDim2.new(0, 0, 0, size)
self.container.ScrollBarImageTransparency = size > self.container.AbsoluteSize.Y
if scroll then
utility:Tween(self.container, {CanvasPosition = Vector2.new(0, self.lastPosition or 0)}, 0.2)
end
end
function section:Resize(smooth)
if self.page.library.focusedPage ~= self.page then
return
end
local padding = 4
local size = (4 * padding) + self.container.Title.AbsoluteSize.Y -- offset
for i, module in pairs(self.modules) do
size = size + module.AbsoluteSize.Y + padding
end
if smooth then
utility:Tween(self.container.Parent, {Size = UDim2.new(1, -10, 0, size)}, 0.05)
else
self.container.Parent.Size = UDim2.new(1, -10, 0, size)
self.page:Resize()
end
end
function section:getModule(info)
if table.find(self.modules, info) then
return info
end
for i, module in pairs(self.modules) do
if (module:FindFirstChild("Title") or module:FindFirstChild("TextBox", true)).Text == info then
return module
end
end
error("No module found under "..tostring(info))
end
-- updates
function section:updateButton(button, title)
button = self:getModule(button)
button.Title.Text = title
end
function section:updateToggle(toggle, title, value)
toggle = self:getModule(toggle)
local position = {
In = UDim2.new(0, 2, 0.5, -6),
Out = UDim2.new(0, 20, 0.5, -6)
}
local frame = toggle.Button.Frame
value = value and "Out" or "In"
if title then
toggle.Title.Text = title
end
utility:Tween(frame, {
Size = UDim2.new(1, -22, 1, -9),
Position = position[value] + UDim2.new(0, 0, 0, 2.5)
}, 0.2)
wait(0.1)
utility:Tween(frame, {
Size = UDim2.new(1, -22, 1, -4),
Position = position[value]
}, 0.1)
end
function section:updateTextbox(textbox, title, value)
textbox = self:getModule(textbox)
if title then
textbox.Title.Text = title
end
if value then
textbox.Button.Textbox.Text = value
end
end
function section:updateKeybind(keybind, title, key)
keybind = self:getModule(keybind)
local text = keybind.Button.Text
local bind = self.binds[keybind]
if title then
keybind.Title.Text = title
end
if bind.connection then
bind.connection = bind.connection:UnBind()
end
if key then
self.binds[keybind].connection = utility:BindToKey(key, bind.callback)
text.Text = key.Name
else
text.Text = "None"
end
end
function section:updateColorPicker(colorpicker, title, color)
colorpicker = self:getModule(colorpicker)
local picker = self.colorpickers[colorpicker]
local tab = picker.tab
local callback = picker.callback
if title then
colorpicker.Title.Text = title
tab.Title.Text = title
end
local color3
local hue, sat, brightness
if type(color) == "table" then -- roblox is literally retarded x2
hue, sat, brightness = unpack(color)
color3 = Color3.fromHSV(hue, sat, brightness)
else
color3 = color
hue, sat, brightness = Color3.toHSV(color3)
end
utility:Tween(colorpicker.Button, {ImageColor3 = color3}, 0.5)
utility:Tween(tab.Container.Color.Select, {Position = UDim2.new(hue, 0, 0, 0)}, 0.1)
utility:Tween(tab.Container.Canvas, {ImageColor3 = Color3.fromHSV(hue, 1, 1)}, 0.5)
utility:Tween(tab.Container.Canvas.Cursor, {Position = UDim2.new(sat, 0, 1 - brightness)}, 0.5)
for i, container in pairs(tab.Container.Inputs:GetChildren()) do
if container:IsA("ImageLabel") then
local value = math.clamp(color3[container.Name], 0, 1) * 255
container.Textbox.Text = math.floor(value)
--callback(container.Name:lower(), value)
end
end
end
function section:updateSlider(slider, title, value, min, max, lvalue)
slider = self:getModule(slider)
if title then
slider.Title.Text = title
end
local bar = slider.Slider.Bar
local percent = (mouse.X - bar.AbsolutePosition.X) / bar.AbsoluteSize.X
if value then -- support negative ranges
percent = (value - min) / (max - min)
end
percent = math.clamp(percent, 0, 1)
value = value or math.floor(min + (max - min) * percent)
slider.TextBox.Text = value
utility:Tween(bar.Fill, {Size = UDim2.new(percent, 0, 1, 0)}, 0.1)
if value ~= lvalue and slider.ImageTransparency == 0 then
utility:Pop(slider, 10)
end
return value
end
function section:updateDropdown(dropdown, title, list, callback)
dropdown = self:getModule(dropdown)
if title then
dropdown.Search.TextBox.Text = title
end
local entries = 0
utility:Pop(dropdown.Search, 10)
for i, button in pairs(dropdown.List.Frame:GetChildren()) do
if button:IsA("ImageButton") then
button:Destroy()
end
end
for i, value in pairs(list or {}) do
local button = utility:Create("ImageButton", {
Parent = dropdown.List.Frame,
BackgroundTransparency = 1,
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 0, 30),
ZIndex = 2,
Image = "rbxassetid://5028857472",
ImageColor3 = themes.DarkContrast,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(2, 2, 298, 298)
}, {
utility:Create("TextLabel", {
BackgroundTransparency = 1,
Position = UDim2.new(0, 10, 0, 0),
Size = UDim2.new(1, -10, 1, 0),
ZIndex = 3,
Font = Enum.Font.Gotham,
Text = value,
TextColor3 = themes.TextColor,
TextSize = 12,
TextXAlignment = "Left",
TextTransparency = 0.10000000149012
})
})
button.MouseButton1Click:Connect(function()
if callback then
callback(value, function(...)
self:updateDropdown(dropdown, ...)
end)
end
self:updateDropdown(dropdown, value, nil, callback)
end)
entries = entries + 1
end
local frame = dropdown.List.Frame
utility:Tween(dropdown, {Size = UDim2.new(1, 0, 0, (entries == 0 and 30) or math.clamp(entries, 0, 3) * 34 + 38)}, 0.3)
utility:Tween(dropdown.Search.Button, {Rotation = list and 180 or 0}, 0.3)
if entries > 3 then
for i, button in pairs(dropdown.List.Frame:GetChildren()) do
if button:IsA("ImageButton") then
button.Size = UDim2.new(1, -6, 0, 30)
end
end
frame.CanvasSize = UDim2.new(0, 0, 0, (entries * 34) - 4)
frame.ScrollBarImageTransparency = 0
else
frame.CanvasSize = UDim2.new(0, 0, 0, 0)
frame.ScrollBarImageTransparency = 1
end
end
end
return library Write, Run & Share Lua code online using OneCompiler's Lua online compiler for free. It's one of the robust, feature-rich online compilers for Lua language, running the latest Lua version 5.4. Getting started with the OneCompiler's Lua editor is easy and fast. The editor shows sample boilerplate code when you choose language as Lua and start coding.
OneCompiler's Lua online editor supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample Lua program which takes name as input and prints hello message with your name.
name = io.read("*a")
print ("Hello ", name)
Lua is a light weight embeddable scripting language which is built on top of C. It is used in almost all kind of applications like games, web applications, mobile applications, image processing etc. It's a very powerful, fast, easy to learn, open-source scripting language.
-- global variables
a = 10
-- local variables
local x = 30
| Value Type | Description |
|---|---|
| number | Represents numbers |
| string | Represents text |
| nil | Differentiates values whether it has data or not |
| boolean | Value can be either true or false |
| function | Represents a sub-routine |
| userdata | Represents arbitary C data |
| thread | Represents independent threads of execution. |
| table | Can hold any value except nil |
While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.
while(condition)
do
--code
end
Repeat-Until is also used to iterate a set of statements based on a condition. It is very similar to Do-While, it is mostly used when you need to execute the statements atleast once.
repeat
--code
until( condition )
For loop is used to iterate a set of statements based on a condition.
for init,max/min value, increment
do
--code
end
Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increase re-usuability and modularity.
optional_function_scope function function_name( argument1, argument2, argument3........, argumentn)
--code
return params with comma seperated
end