Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- ThonnyHub Interface Suite
- by thonny_dev
- ]]
- local InterfaceBuild = 'A1'
- local Release = "Build 1.0.0"
- local ThonnyHubFolder = "ThonnyHub"
- local ConfigurationFolder = ThonnyHubFolder.."/Configurations"
- local ConfigurationExtension = ".rfld""UserInputService")
- local TweenService = game:GetService("TweenService")
- local HttpService = game:GetService("HttpService")
- local RunService = game:GetService("RunService")
- local Players = game:GetService("Players")
- local CoreGui = game:GetService("CoreGui")
- -- Environment Check
- local useStudio
- if RunService:IsStudio() then
- useStudio = true
- end
- -- Interface Management
- local ThonnyHub = useStudio and script.Parent:FindFirstChild('ThonnyHub') or game:GetObjects("rbxassetid://104978590152599")[1]
- local buildAttempts = 0
- local correctBuild = false
- local warned
- repeat
- if ThonnyHub:FindFirstChild('Build') and ThonnyHub.Build.Value == InterfaceBuild then
- correctBuild = true
- break
- end
- correctBuild = false
- if not warned then
- warn('ThonnyHub | Build Mismatch')
- print('ThonnyHub may encounter issues as you are running an incompatible version ('.. ((ThonnyHub:FindFirstChild('Build') and ThonnyHub.Build.Value) or 'No Build') ..').\n\nThis version of Thonny Hub is intended for build '..InterfaceBuild..'.')
- warned = true
- end
- toDestroy, ThonnyHub = ThonnyHub, useStudio and script.Parent:FindFirstChild('ThonnyHub') or game:GetObjects("rbxassetid://104978590152599")[1]
- if toDestroy and not useStudio then toDestroy:Destroy() end
- buildAttempts = buildAttempts + 1
- until buildAttempts >= 2
- ThonnyHub.Enabled = false
- if not useStudio and CoreGui:FindFirstChild("RobloxGui") then
- ThonnyHub.Parent = CoreGui:FindFirstChild("RobloxGui")
- elseif not useStudio then
- ThonnyHub.Parent = CoreGui
- end
- if not useStudio then
- for _, Interface in ipairs(CoreGui:GetChildren()) do
- if Interface.Name == ThonnyHub.Name and Interface ~= ThonnyHub then
- Interface.Enabled = false
- Interface.Name = "ThonnyHub-Old"
- end
- end
- end
- local minSize = Vector2.new(1024, 768)
- local useMobileSizing
- if ThonnyHub.AbsoluteSize.X < minSize.X and ThonnyHub.AbsoluteSize.Y < minSize.Y then
- useMobileSizing = true
- end
- if UserInputService.TouchEnabled then
- useMobilePrompt = true
- end
- -- Object Variables
- local Main = ThonnyHub.Main
- local MPrompt = ThonnyHub:FindFirstChild('Prompt')
- local Topbar = Main.Topbar
- local Elements = Main.Elements
- local LoadingFrame = Main.LoadingFrame
- local TabList = Main.TabList
- local dragBar = ThonnyHub:FindFirstChild('Drag')
- local dragInteract = dragBar and dragBar.Interact or nil
- local dragBarCosmetic = dragBar and dragBar.Drag or nil
- ThonnyHub.DisplayOrder = 100
- LoadingFrame.Version.Text = Release
- -- Variables
- local request = (syn and syn.request) or (http and http.request) or http_request
- local CFileName = nil
- local CEnabled = false
- local Minimised = false
- local Hidden = false
- local Debounce = false
- local searchOpen = false
- local Notifications = ThonnyHub.Notifications
- local SelectedTheme = ThonnyHubLibrary.Theme.Default
- local function ChangeTheme(Theme)
- if typeof(Theme) == 'string' then
- SelectedTheme = ThonnyHubLibrary.Theme[Theme]
- elseif typeof(Theme) == 'table' then
- SelectedTheme = Theme
- end
- ThonnyHub.Main.BackgroundColor3 = SelectedTheme.Background
- ThonnyHub.Main.Topbar.BackgroundColor3 = SelectedTheme.Topbar
- ThonnyHub.Main.Topbar.CornerRepair.BackgroundColor3 = SelectedTheme.Topbar
- ThonnyHub.Main.Shadow.Image.ImageColor3 = SelectedTheme.Shadow
- ThonnyHub.Main.Topbar.ChangeSize.ImageColor3 = SelectedTheme.TextColor
- ThonnyHub.Main.Topbar.Hide.ImageColor3 = SelectedTheme.TextColor
- ThonnyHub.Main.Topbar.Search.ImageColor3 = SelectedTheme.TextColor
- ThonnyHub.Main.Topbar.Divider.BackgroundColor3 = SelectedTheme.ElementStroke
- Main.Search.BackgroundColor3 = SelectedTheme.TextColor
- Main.Search.Shadow.ImageColor3 = SelectedTheme.TextColor
- Main.Search.Search.ImageColor3 = SelectedTheme.TextColor
- Main.Search.Input.PlaceholderColor3 = SelectedTheme.TextColor
- Main.Search.UIStroke.Color = SelectedTheme.SecondaryElementStroke
- if Main:FindFirstChild('Notice') then
- Main.Notice.BackgroundColor3 = SelectedTheme.Background
- end
- for _, text in ipairs(ThonnyHub:GetDescendants()) do
- if text.Parent.Parent ~= Notifications then
- if text:IsA('TextLabel') or text:IsA('TextBox') then text.TextColor3 = SelectedTheme.TextColor end
- end
- end
- for _, TabPage in ipairs(Elements:GetChildren()) do
- for _, Element in ipairs(TabPage:GetChildren()) do
- if Element.ClassName == "Frame" and Element.Name ~= "Placeholder" and Element.Name ~= "SectionSpacing" and Element.Name ~= "Divider" and Element.Name ~= "SectionTitle" and Element.Name ~= "SearchTitle-fsefsefesfsefesfesfThanks" then
- Element.BackgroundColor3 = SelectedTheme.ElementBackground
- Element.UIStroke.Color = SelectedTheme.ElementStroke
- end
- end
- end
- end
- local function getIcon(name : string)
- -- full credit to latte softworks :)
- local iconData = not useStudio and game:HttpGet('https://raw.githubusercontent.com/Thonny-Developer/thonny_hub/refs/heads/main/Icons.luau')
- local icons = useStudio and require(script.Parent.icons) or loadstring(iconData)()
- name = string.match(string.lower(name), "^%s*(.*)%s*$") :: string
- local sizedicons = icons['48px']
- local r = sizedicons[name]
- if not r then
- error("Lucide Icons: Failed to find icon by the name of \"" .. name .. "\.", 2)
- end
- local rirs = r[2]
- local riro = r[3]
- if type(r[1]) ~= "number" or type(rirs) ~= "table" or type(riro) ~= "table" then
- error("Lucide Icons: Internal error: Invalid auto-generated asset entry")
- end
- local irs = Vector2.new(rirs[1], rirs[2])
- local iro = Vector2.new(riro[1], riro[2])
- local asset = {
- id = r[1],
- imageRectSize = irs,
- imageRectOffset = iro,
- }
- return asset
- end
- local function makeDraggable(object, dragObject, enableTaptic, tapticOffset)
- local dragging = false
- local relative = nil
- local offset = Vector2.zero
- local screenGui = object:FindFirstAncestorWhichIsA("ScreenGui")
- if screenGui and screenGui.IgnoreGuiInset then
- offset += game:GetService('GuiService'):GetGuiInset()
- end
- local function connectFunctions()
- if dragBar and enableTaptic then
- dragBar.MouseEnter:Connect(function()
- if not dragging then
- TweenService:Create(dragBarCosmetic, TweenInfo.new(0.25, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {BackgroundTransparency = 0.5, Size = UDim2.new(0, 120, 0, 4)}):Play()
- end
- end)
- dragBar.MouseLeave:Connect(function()
- if not dragging then
- TweenService:Create(dragBarCosmetic, TweenInfo.new(0.25, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {BackgroundTransparency = 0.7, Size = UDim2.new(0, 100, 0, 4)}):Play()
- end
- end)
- end
- end
- connectFunctions()
- dragObject.InputBegan:Connect(function(input, processed)
- if processed then return end
- local inputType = input.UserInputType.Name
- if inputType == "MouseButton1" or inputType == "Touch" then
- dragging = true
- relative = object.AbsolutePosition + object.AbsoluteSize * object.AnchorPoint - UserInputService:GetMouseLocation()
- if enableTaptic then
- TweenService:Create(dragBarCosmetic, TweenInfo.new(0.35, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {Size = UDim2.new(0, 110, 0, 4), BackgroundTransparency = 0}):Play()
- end
- end
- end)
- local inputEnded = UserInputService.InputEnded:Connect(function(input)
- if not dragging then return end
- local inputType = input.UserInputType.Name
- if inputType == "MouseButton1" or inputType == "Touch" then
- dragging = false
- connectFunctions()
- if enableTaptic then
- TweenService:Create(dragBarCosmetic, TweenInfo.new(0.35, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {Size = UDim2.new(0, 100, 0, 4), BackgroundTransparency = 0.7}):Play()
- end
- end
- end)
- local renderStepped = RunService.RenderStepped:Connect(function()
- if dragging then
- local position = UserInputService:GetMouseLocation() + relative + offset
- if enableTaptic and tapticOffset then
- TweenService:Create(object, TweenInfo.new(0.4, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Position = UDim2.fromOffset(position.X, position.Y)}):Play()
- TweenService:Create(dragObject.Parent, TweenInfo.new(0.05, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Position = UDim2.fromOffset(position.X, position.Y + ((useMobileSizing and tapticOffset[2]) or tapticOffset[1]))}):Play()
- else
- if dragBar and tapticOffset then
- dragBar.Position = UDim2.fromOffset(position.X, position.Y + ((useMobileSizing and tapticOffset[2]) or tapticOffset[1]))
- end
- object.Position = UDim2.fromOffset(position.X, position.Y)
- end
- end
- end)
- object.Destroying:Connect(function()
- if inputEnded then inputEnded:Disconnect() end
- if renderStepped then renderStepped:Disconnect() end
- end)
- end
- local function PackColor(Color)
- return {R = Color.R * 255, G = Color.G * 255, B = Color.B * 255}
- end
- local function UnpackColor(Color)
- return Color3.fromRGB(Color.R, Color.G, Color.B)
- end
- local function LoadConfiguration(Configuration)
- local Data = HttpService:JSONDecode(Configuration)
- local changed
- -- Iterate through current UI elements' flags
- for FlagName, Flag in pairs(ThonnyHubLibrary.Flags) do
- local FlagValue = Data[FlagName]
- if FlagValue then
- task.spawn(function()
- if Flag.Type == "ColorPicker" then
- changed = true
- Flag:Set(UnpackColor(FlagValue))
- else
- if (Flag.CurrentValue or Flag.CurrentKeybind or Flag.CurrentOption or Flag.Color) ~= FlagValue then
- changed = true
- Flag:Set(FlagValue)
- end
- end
- end)
- else
- warn("ThonnyHub | Unable to find '"..FlagName.. "' in the save file.")
- print("The error above may not be an issue if new elements have been added or not been set values.")
- --ThonnyHubLibrary:Notify({Title = "ThonnyHub Flags", Content = "ThonnyHub was unable to find '"..FlagName.. "' in the save file. Check sirius.menu/discord for help.", Image = 3944688398})
- end
- end
- return changed
- end
- local function SaveConfiguration()
- if not CEnabled then return end
- local Data = {}
- for i, v in pairs(ThonnyHubLibrary.Flags) do
- if v.Type == "ColorPicker" then
- Data[i] = PackColor(v.Color)
- else
- if typeof(v.CurrentValue) == 'boolean' then
- if v.CurrentValue == false then
- Data[i] = false
- else
- Data[i] = v.CurrentValue or v.CurrentKeybind or v.CurrentOption or v.Color
- end
- else
- Data[i] = v.CurrentValue or v.CurrentKeybind or v.CurrentOption or v.Color
- end
- end
- end
- if useStudio then
- if script.Parent:FindFirstChild('configuration') then script.Parent.configuration:Destroy() end
- local ScreenGui = Instance.new("ScreenGui")
- ScreenGui.Parent = script.Parent
- ScreenGui.Name = 'configuration'
- local TextBox = Instance.new("TextBox")
- TextBox.Parent = ScreenGui
- TextBox.Size = UDim2.new(0, 800, 0, 50)
- TextBox.AnchorPoint = Vector2.new(0.5, 0)
- TextBox.Position = UDim2.new(0.5, 0, 0, 30)
- TextBox.Text = HttpService:JSONEncode(Data)
- TextBox.ClearTextOnFocus = false
- end
- if writefile then
- writefile(ConfigurationFolder .. "/" .. CFileName .. ConfigurationExtension, tostring(HttpService:JSONEncode(Data)))
- end
- end
- function ThonnyHubLibrary:Notify(data) -- action e.g open messages
- task.spawn(function()
- -- Notification Object Creation
- local newNotification = Notifications.Template:Clone()
- newNotification.Name = data.Title or 'Thonny Hub Notification'
- newNotification.Parent = Notifications
- newNotification.LayoutOrder = #Notifications:GetChildren()
- newNotification.Visible = false
- -- Set Data
- newNotification.Title.Text = data.Title or "Thonny Hub Notification"
- newNotification.Description.Text = data.Content or "Unknown Content"
- if data.Image then
- if typeof(data.Image) == 'string' then
- local asset = getIcon(data.Image)
- newNotification.Icon.Image = 'rbxassetid://'..asset.id
- newNotification.Icon.ImageRectOffset = asset.imageRectOffset
- newNotification.Icon.ImageRectSize = asset.imageRectSize
- else
- newNotification.Icon.Image = "rbxassetid://" .. (data.Image or 0)
- end
- else
- newNotification.Icon.Image = "rbxassetid://0"
- end
- -- Set initial transparency values
- newNotification.Title.TextColor3 = SelectedTheme.TextColor
- newNotification.Description.TextColor3 = SelectedTheme.TextColor
- newNotification.BackgroundColor3 = SelectedTheme.Background
- newNotification.UIStroke.Color = SelectedTheme.TextColor
- newNotification.Icon.ImageColor3 = SelectedTheme.TextColor
- newNotification.BackgroundTransparency = 1
- newNotification.Title.TextTransparency = 1
- newNotification.Description.TextTransparency = 1
- newNotification.UIStroke.Transparency = 1
- newNotification.Shadow.ImageTransparency = 1
- newNotification.Size = UDim2.new(1, 0, 0, 800)
- newNotification.Icon.ImageTransparency = 1
- newNotification.Icon.BackgroundTransparency = 1
- task.wait()
- newNotification.Visible = true
- --if data.Actions then
- -- warn('ThonnyHub | Not seeing your actions in notifications?')
- -- print("Notification Actions are being sunset for now, keep up to date on when they're back in the discord. (sirius.menu/discord)")
- --end
- -- Calculate textbounds and set initial values
- local bounds = {newNotification.Title.TextBounds.Y, newNotification.Description.TextBounds.Y}
- newNotification.Size = UDim2.new(1, -60, 0, -Notifications:FindFirstChild("UIListLayout").Padding.Offset)
- newNotification.Icon.Size = UDim2.new(0, 32, 0, 32)
- newNotification.Icon.Position = UDim2.new(0, 20, 0.5, 0)
- TweenService:Create(newNotification, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Size = UDim2.new(1, 0, 0, math.max(bounds[1] + bounds[2] + 31, 60))}):Play()
- task.wait(0.15)
- TweenService:Create(newNotification, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0.45}):Play()
- TweenService:Create(newNotification.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- task.wait(0.05)
- TweenService:Create(newNotification.Icon, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ImageTransparency = 0}):Play()
- task.wait(0.05)
- TweenService:Create(newNotification.Description, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 0.35}):Play()
- TweenService:Create(newNotification.UIStroke, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {Transparency = 0.95}):Play()
- TweenService:Create(newNotification.Shadow, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ImageTransparency = 0.82}):Play()
- local waitDuration = math.min(math.max((#newNotification.Description.Text * 0.1) + 2.5, 3), 10)
- task.wait(data.Duration or waitDuration)
- newNotification.Icon.Visible = false
- TweenService:Create(newNotification, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(newNotification.UIStroke, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(newNotification.Shadow, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ImageTransparency = 1}):Play()
- TweenService:Create(newNotification.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(newNotification.Description, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(newNotification, TweenInfo.new(1, Enum.EasingStyle.Exponential), {Size = UDim2.new(1, -90, 0, 0)}):Play()
- task.wait(1)
- TweenService:Create(newNotification, TweenInfo.new(1, Enum.EasingStyle.Exponential), {Size = UDim2.new(1, -90, 0, -Notifications:FindFirstChild("UIListLayout").Padding.Offset)}):Play()
- newNotification.Visible = false
- newNotification:Destroy()
- end)
- end
- local function openSearch()
- searchOpen = true
- Main.Search.BackgroundTransparency = 1
- Main.Search.Shadow.ImageTransparency = 1
- Main.Search.Input.TextTransparency = 1
- Main.Search.Search.ImageTransparency = 1
- Main.Search.UIStroke.Transparency = 1
- Main.Search.Size = UDim2.new(1, 0, 0, 80)
- Main.Search.Position = UDim2.new(0.5, 0, 0, 70)
- Main.Search.Input.Interactable = true
- Main.Search.Visible = true
- for _, tabbtn in ipairs(TabList:GetChildren()) do
- if tabbtn.ClassName == "Frame" and tabbtn.Name ~= "Placeholder" then
- tabbtn.Interact.Visible = false
- TweenService:Create(tabbtn, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(tabbtn.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(tabbtn.Image, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ImageTransparency = 1}):Play()
- TweenService:Create(tabbtn.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- end
- end
- Main.Search.Input:CaptureFocus()
- TweenService:Create(Main.Search.Shadow, TweenInfo.new(0.05, Enum.EasingStyle.Quint), {ImageTransparency = 0.95}):Play()
- TweenService:Create(Main.Search, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Position = UDim2.new(0.5, 0, 0, 57), BackgroundTransparency = 0.9}):Play()
- TweenService:Create(Main.Search.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 0.8}):Play()
- TweenService:Create(Main.Search.Input, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 0.2}):Play()
- TweenService:Create(Main.Search.Search, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ImageTransparency = 0.5}):Play()
- TweenService:Create(Main.Search, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Size = UDim2.new(1, -35, 0, 35)}):Play()
- end
- local function closeSearch()
- searchOpen = false
- TweenService:Create(Main.Search, TweenInfo.new(0.35, Enum.EasingStyle.Quint), {BackgroundTransparency = 1, Size = UDim2.new(1, -55, 0, 30)}):Play()
- TweenService:Create(Main.Search.Search, TweenInfo.new(0.15, Enum.EasingStyle.Quint), {ImageTransparency = 1}):Play()
- TweenService:Create(Main.Search.Shadow, TweenInfo.new(0.15, Enum.EasingStyle.Quint), {ImageTransparency = 1}):Play()
- TweenService:Create(Main.Search.UIStroke, TweenInfo.new(0.15, Enum.EasingStyle.Quint), {Transparency = 1}):Play()
- TweenService:Create(Main.Search.Input, TweenInfo.new(0.15, Enum.EasingStyle.Quint), {TextTransparency = 1}):Play()
- for _, tabbtn in ipairs(TabList:GetChildren()) do
- if tabbtn.ClassName == "Frame" and tabbtn.Name ~= "Placeholder" then
- tabbtn.Interact.Visible = true
- if tostring(Elements.UIPageLayout.CurrentPage) == tabbtn.Title.Text then
- TweenService:Create(tabbtn, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(tabbtn.Image, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ImageTransparency = 0}):Play()
- TweenService:Create(tabbtn.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- TweenService:Create(tabbtn.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- else
- TweenService:Create(tabbtn, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0.7}):Play()
- TweenService:Create(tabbtn.Image, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ImageTransparency = 0.2}):Play()
- TweenService:Create(tabbtn.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 0.2}):Play()
- TweenService:Create(tabbtn.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 0.5}):Play()
- end
- end
- end
- Main.Search.Input.Text = ''
- Main.Search.Input.Interactable = false
- end
- local function Hide(notify: boolean?)
- if MPrompt then
- MPrompt.Title.TextColor3 = Color3.fromRGB(255, 255, 255)
- MPrompt.Position = UDim2.new(0.5, 0, 0, -50)
- MPrompt.Size = UDim2.new(0, 40, 0, 10)
- MPrompt.BackgroundTransparency = 1
- MPrompt.Title.TextTransparency = 1
- MPrompt.Visible = true
- end
- task.spawn(closeSearch)
- Debounce = true
- if notify then
- if useMobilePrompt then
- ThonnyHubLibrary:Notify({Title = "Interface Hiden", Content = "The interface has been hidden, you can show the interface by clicking 'Show Thonny Hub'", Duration = 7, Image = 4400697855})
- else
- ThonnyHubLibrary:Notify({Title = "Interface Hiden", Content = "The interface has been hidden, you can show the interface by pressing [K]", Duration = 7, Image = 4400697855})
- end
- end
- TweenService:Create(Main, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 470, 0, 0)}):Play()
- TweenService:Create(Main.Topbar, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 470, 0, 45)}):Play()
- TweenService:Create(Main, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(Main.Topbar, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(Main.Topbar.Divider, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(Main.Topbar.CornerRepair, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(Main.Topbar.Title, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(Main.Shadow.Image, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {ImageTransparency = 1}):Play()
- TweenService:Create(Topbar.UIStroke, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(dragBarCosmetic, TweenInfo.new(0.25, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {BackgroundTransparency = 1}):Play()
- if useMobilePrompt and MPrompt then
- TweenService:Create(MPrompt, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 120, 0, 30), Position = UDim2.new(0.5, 0, 0, 20), BackgroundTransparency = 0.3}):Play()
- TweenService:Create(MPrompt.Title, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 0.3}):Play()
- end
- for _, TopbarButton in ipairs(Topbar:GetChildren()) do
- if TopbarButton.ClassName == "ImageButton" then
- TweenService:Create(TopbarButton, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {ImageTransparency = 1}):Play()
- end
- end
- for _, tabbtn in ipairs(TabList:GetChildren()) do
- if tabbtn.ClassName == "Frame" and tabbtn.Name ~= "Placeholder" then
- TweenService:Create(tabbtn, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(tabbtn.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(tabbtn.Image, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ImageTransparency = 1}):Play()
- TweenService:Create(tabbtn.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- end
- end
- for _, tab in ipairs(Elements:GetChildren()) do
- if tab.Name ~= "Template" and tab.ClassName == "ScrollingFrame" and tab.Name ~= "Placeholder" then
- for _, element in ipairs(tab:GetChildren()) do
- if element.ClassName == "Frame" then
- if element.Name ~= "SectionSpacing" and element.Name ~= "Placeholder" then
- if element.Name == "SectionTitle" or element.Name == 'SearchTitle-fsefsefesfsefesfesfThanks' then
- TweenService:Create(element.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- elseif element.Name == 'Divider' then
- TweenService:Create(element.Divider, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- else
- TweenService:Create(element, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(element.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(element.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- end
- for _, child in ipairs(element:GetChildren()) do
- if child.ClassName == "Frame" or child.ClassName == "TextLabel" or child.ClassName == "TextBox" or child.ClassName == "ImageButton" or child.ClassName == "ImageLabel" then
- child.Visible = false
- end
- end
- end
- end
- end
- end
- end
- task.wait(0.5)
- Main.Visible = false
- Debounce = false
- end
- local function Maximise()
- Debounce = true
- Topbar.ChangeSize.Image = "rbxassetid://"..10137941941
- TweenService:Create(Topbar.UIStroke, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(Main.Shadow.Image, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {ImageTransparency = 0.6}):Play()
- TweenService:Create(Topbar.CornerRepair, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(Topbar.Divider, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(dragBarCosmetic, TweenInfo.new(0.25, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {BackgroundTransparency = 0.7}):Play()
- TweenService:Create(Main, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Size = useMobileSizing and UDim2.new(0, 500, 0, 275) or UDim2.new(0, 500, 0, 475)}):Play()
- TweenService:Create(Topbar, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 500, 0, 45)}):Play()
- TabList.Visible = true
- task.wait(0.2)
- Elements.Visible = true
- for _, tab in ipairs(Elements:GetChildren()) do
- if tab.Name ~= "Template" and tab.ClassName == "ScrollingFrame" and tab.Name ~= "Placeholder" then
- for _, element in ipairs(tab:GetChildren()) do
- if element.ClassName == "Frame" then
- if element.Name ~= "SectionSpacing" and element.Name ~= "Placeholder" then
- if element.Name == "SectionTitle" or element.Name == 'SearchTitle-fsefsefesfsefesfesfThanks' then
- TweenService:Create(element.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 0.4}):Play()
- elseif element.Name == 'Divider' then
- TweenService:Create(element.Divider, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0.85}):Play()
- else
- TweenService:Create(element, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(element.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- TweenService:Create(element.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- end
- for _, child in ipairs(element:GetChildren()) do
- if child.ClassName == "Frame" or child.ClassName == "TextLabel" or child.ClassName == "TextBox" or child.ClassName == "ImageButton" or child.ClassName == "ImageLabel" then
- child.Visible = true
- end
- end
- end
- end
- end
- end
- end
- task.wait(0.1)
- for _, tabbtn in ipairs(TabList:GetChildren()) do
- if tabbtn.ClassName == "Frame" and tabbtn.Name ~= "Placeholder" then
- if tostring(Elements.UIPageLayout.CurrentPage) == tabbtn.Title.Text then
- TweenService:Create(tabbtn, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(tabbtn.Image, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ImageTransparency = 0}):Play()
- TweenService:Create(tabbtn.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- TweenService:Create(tabbtn.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- else
- TweenService:Create(tabbtn, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0.7}):Play()
- TweenService:Create(tabbtn.Image, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ImageTransparency = 0.2}):Play()
- TweenService:Create(tabbtn.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 0.2}):Play()
- TweenService:Create(tabbtn.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 0.5}):Play()
- end
- end
- end
- task.wait(0.5)
- Debounce = false
- end
- local function Unhide()
- Debounce = true
- Main.Position = UDim2.new(0.5, 0, 0.5, 0)
- Main.Visible = true
- TweenService:Create(Main, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Size = useMobileSizing and UDim2.new(0, 500, 0, 275) or UDim2.new(0, 500, 0, 475)}):Play()
- TweenService:Create(Main.Topbar, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 500, 0, 45)}):Play()
- TweenService:Create(Main.Shadow.Image, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {ImageTransparency = 0.6}):Play()
- TweenService:Create(Main, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(Main.Topbar, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(Main.Topbar.Divider, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(Main.Topbar.CornerRepair, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(Main.Topbar.Title, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- if MPrompt then
- TweenService:Create(MPrompt, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 40, 0, 10), Position = UDim2.new(0.5, 0, 0, -50), BackgroundTransparency = 1}):Play()
- TweenService:Create(MPrompt.Title, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- task.spawn(function()
- task.wait(0.5)
- MPrompt.Visible = false
- end)
- end
- if Minimised then
- task.spawn(Maximise)
- end
- for _, TopbarButton in ipairs(Topbar:GetChildren()) do
- if TopbarButton.ClassName == "ImageButton" then
- if TopbarButton.Name == 'Icon' then
- TweenService:Create(TopbarButton, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {ImageTransparency = 0}):Play()
- else
- TweenService:Create(TopbarButton, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {ImageTransparency = 0.8}):Play()
- end
- end
- end
- for _, tabbtn in ipairs(TabList:GetChildren()) do
- if tabbtn.ClassName == "Frame" and tabbtn.Name ~= "Placeholder" then
- if tostring(Elements.UIPageLayout.CurrentPage) == tabbtn.Title.Text then
- TweenService:Create(tabbtn, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(tabbtn.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- TweenService:Create(tabbtn.Image, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ImageTransparency = 0}):Play()
- TweenService:Create(tabbtn.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- else
- TweenService:Create(tabbtn, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0.7}):Play()
- TweenService:Create(tabbtn.Image, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ImageTransparency = 0.2}):Play()
- TweenService:Create(tabbtn.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 0.2}):Play()
- TweenService:Create(tabbtn.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 0.5}):Play()
- end
- end
- end
- for _, tab in ipairs(Elements:GetChildren()) do
- if tab.Name ~= "Template" and tab.ClassName == "ScrollingFrame" and tab.Name ~= "Placeholder" then
- for _, element in ipairs(tab:GetChildren()) do
- if element.ClassName == "Frame" then
- if element.Name ~= "SectionSpacing" and element.Name ~= "Placeholder" then
- if element.Name == "SectionTitle" or element.Name == 'SearchTitle-fsefsefesfsefesfesfThanks' then
- TweenService:Create(element.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 0.4}):Play()
- elseif element.Name == 'Divider' then
- TweenService:Create(element.Divider, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0.85}):Play()
- else
- TweenService:Create(element, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(element.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- TweenService:Create(element.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- end
- for _, child in ipairs(element:GetChildren()) do
- if child.ClassName == "Frame" or child.ClassName == "TextLabel" or child.ClassName == "TextBox" or child.ClassName == "ImageButton" or child.ClassName == "ImageLabel" then
- child.Visible = true
- end
- end
- end
- end
- end
- end
- end
- TweenService:Create(dragBarCosmetic, TweenInfo.new(0.25, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {BackgroundTransparency = 0.5}):Play()
- task.wait(0.5)
- Minimised = false
- Debounce = false
- end
- local function Minimise()
- Debounce = true
- Topbar.ChangeSize.Image = "rbxassetid://"..11036884234
- Topbar.UIStroke.Color = SelectedTheme.ElementStroke
- task.spawn(closeSearch)
- for _, tabbtn in ipairs(TabList:GetChildren()) do
- if tabbtn.ClassName == "Frame" and tabbtn.Name ~= "Placeholder" then
- TweenService:Create(tabbtn, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(tabbtn.Image, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ImageTransparency = 1}):Play()
- TweenService:Create(tabbtn.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(tabbtn.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- end
- end
- for _, tab in ipairs(Elements:GetChildren()) do
- if tab.Name ~= "Template" and tab.ClassName == "ScrollingFrame" and tab.Name ~= "Placeholder" then
- for _, element in ipairs(tab:GetChildren()) do
- if element.ClassName == "Frame" then
- if element.Name ~= "SectionSpacing" and element.Name ~= "Placeholder" then
- if element.Name == "SectionTitle" or element.Name == 'SearchTitle-fsefsefesfsefesfesfThanks' then
- TweenService:Create(element.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- elseif element.Name == 'Divider' then
- TweenService:Create(element.Divider, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- else
- TweenService:Create(element, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(element.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(element.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- end
- for _, child in ipairs(element:GetChildren()) do
- if child.ClassName == "Frame" or child.ClassName == "TextLabel" or child.ClassName == "TextBox" or child.ClassName == "ImageButton" or child.ClassName == "ImageLabel" then
- child.Visible = false
- end
- end
- end
- end
- end
- end
- end
- TweenService:Create(dragBarCosmetic, TweenInfo.new(0.25, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {BackgroundTransparency = 1}):Play()
- TweenService:Create(Topbar.UIStroke, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- TweenService:Create(Main.Shadow.Image, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {ImageTransparency = 1}):Play()
- TweenService:Create(Topbar.CornerRepair, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(Topbar.Divider, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(Main, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 495, 0, 45)}):Play()
- TweenService:Create(Topbar, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 495, 0, 45)}):Play()
- task.wait(0.3)
- Elements.Visible = false
- TabList.Visible = false
- task.wait(0.2)
- Debounce = false
- end
- function ThonnyHubLibrary:CreateWindow(Settings)
- if not correctBuild and not Settings.DisableBuildWarnings then
- task.delay(3,
- function()
- ThonnyHubLibrary:Notify(
- {
- Title = 'Outdated script',
- Content = 'Your Thonny Hub script runs on versions ('.. ((ThonnyHub:FindFirstChild('Build') and ThonnyHub.Build.Value) or 'without version') ..').\n\nThis version of Thonny Hub is designed to build a versioning interface '..InterfaceBuild..'.\n\nTry re-entering the game and then running the script',
- Image = 4335487866,
- Duration = 15
- })
- end)
- end
- local Passthrough = false
- Topbar.Title.Text = Settings.Name
- Main.Size = UDim2.new(0, 420, 0, 100)
- Main.Visible = true
- Main.BackgroundTransparency = 1
- if Main:FindFirstChild('Notice') then Main.Notice.Visible = false end
- Main.Shadow.Image.ImageTransparency = 1
- LoadingFrame.Title.TextTransparency = 1
- LoadingFrame.Subtitle.TextTransparency = 1
- LoadingFrame.Version.TextTransparency = 1
- LoadingFrame.Title.Text = Settings.LoadingTitle or "Loading Thonny Hub"
- LoadingFrame.Subtitle.Text = Settings.LoadingSubtitle or "Interface package"
- LoadingFrame.Version.Text = Release
- if Settings.Icon and Settings.Icon ~= 0 and Topbar:FindFirstChild('Icon') then
- Topbar.Icon.Visible = true
- Topbar.Title.Position = UDim2.new(0, 47, 0.5, 0)
- if Settings.Icon then
- if typeof(Settings.Icon) == 'string' then
- local asset = getIcon(Settings.Icon)
- Topbar.Icon.Image = 'rbxassetid://'..asset.id
- Topbar.Icon.ImageRectOffset = asset.imageRectOffset
- Topbar.Icon.ImageRectSize = asset.imageRectSize
- else
- Topbar.Icon.Image = "rbxassetid://" .. (Settings.Icon or 0)
- end
- else
- Topbar.Icon.Image = "rbxassetid://" .. 0
- end
- end
- if dragBar then
- dragBar.Visible = false
- dragBarCosmetic.BackgroundTransparency = 1
- dragBar.Visible = true
- end
- if Settings.Theme then
- local success, result = pcall(ChangeTheme, Settings.Theme)
- if not success then
- local success, result2 = pcall(ChangeTheme, 'Default')
- if not success then
- warn('CRITICAL ERROR - NO DEFAULT THEME')
- print(result2)
- end
- warn('problem with displaying theme. there is no theme in the file')
- print(result)
- end
- end
- Topbar.Visible = false
- Elements.Visible = false
- LoadingFrame.Visible = true
- if not Settings.DisableThonnyHubPrompts then
- task.spawn(function()
- while true do
- task.wait(math.random(180, 600))
- ThonnyHubLibrary:Notify({
- Title = "Thonny Hub",
- Content = "Like the script? Visit our server: https://discord.gg/7k6NJcDEKS",
- Duration = 7,
- Image = 4370033185,
- })
- end
- end)
- end
- pcall(function()
- if not Settings.ConfigurationSaving.FileName then
- Settings.ConfigurationSaving.FileName = tostring(game.PlaceId)
- end
- if Settings.ConfigurationSaving.Enabled == nil then
- Settings.ConfigurationSaving.Enabled = false
- end
- CFileName = Settings.ConfigurationSaving.FileName
- ConfigurationFolder = Settings.ConfigurationSaving.FolderName or ConfigurationFolder
- CEnabled = Settings.ConfigurationSaving.Enabled
- if Settings.ConfigurationSaving.Enabled then
- if not isfolder(ConfigurationFolder) then
- makefolder(ConfigurationFolder)
- end
- end
- end)
- makeDraggable(Main, Topbar, false, {255, 150})
- if dragBar then dragBar.Position = useMobileSizing and UDim2.new(0.5, 0, 0.5, 150) or UDim2.new(0.5, 0, 0.5, 255) makeDraggable(Main, dragInteract, true, {255, 150}) end
- for _, TabButton in ipairs(TabList:GetChildren()) do
- if TabButton.ClassName == "Frame" and TabButton.Name ~= "Placeholder" then
- TabButton.BackgroundTransparency = 1
- TabButton.Title.TextTransparency = 1
- TabButton.Image.ImageTransparency = 1
- TabButton.UIStroke.Transparency = 1
- end
- end
- if Settings.Discord and not useStudio then
- if not isfolder(ThonnyHubFolder.."/Discord Invites") then
- makefolder(ThonnyHubFolder.."/Discord Invites")
- end
- if not isfile(ThonnyHubFolder.."/Discord Invites".."/"..Settings.Discord.Invite..ConfigurationExtension) then
- if request then
- request({
- Url = 'http://127.0.0.1:6463/rpc?v=1',
- Method = 'POST',
- Headers = {
- ['Content-Type'] = 'application/json',
- Origin = 'https://discord.com'
- },
- Body = HttpService:JSONEncode({
- cmd = 'INVITE_BROWSER',
- nonce = HttpService:GenerateGUID(false),
- args = {code = Settings.Discord.Invite}
- })
- })
- end
- if Settings.Discord.RememberJoins then
- writefile(ThonnyHubFolder.."/Discord Invites".."/"..Settings.Discord.Invite..ConfigurationExtension,"Thonny Hub Remember Joins is True for this invitation, this invitation will not ask you to join again")
- end
- end
- end
- if (Settings.KeySystem) then
- if not Settings.KeySettings then
- Passthrough = true
- return
- end
- if isfolder and not isfolder(ThonnyHubFolder.."/Key System") then
- makefolder(ThonnyHubFolder.."/Key System")
- end
- if typeof(Settings.KeySettings.Key) == "string" then Settings.KeySettings.Key = {Settings.KeySettings.Key} end
- if Settings.KeySettings.GrabKeyFromSite then
- for i, Key in ipairs(Settings.KeySettings.Key) do
- local Success, Response = pcall(function()
- Settings.KeySettings.Key[i] = tostring(game:HttpGet(Key):gsub("[\n\r]", " "))
- Settings.KeySettings.Key[i] = string.gsub(Settings.KeySettings.Key[i], " ", "")
- end)
- if not Success then
- print("ThonnyHub | "..Key.." Error " ..tostring(Response))
- end
- end
- end
- if not Settings.KeySettings.FileName then
- Settings.KeySettings.FileName = "No file name specified"
- end
- if isfile and isfile(ThonnyHubFolder.."/Key System".."/"..Settings.KeySettings.FileName..ConfigurationExtension) then
- for _, MKey in ipairs(Settings.KeySettings.Key) do
- if string.find(readfile(ThonnyHubFolder.."/Key System".."/"..Settings.KeySettings.FileName..ConfigurationExtension), MKey) then
- Passthrough = true
- end
- end
- end
- if not Passthrough then
- local AttemptsRemaining = math.random(2, 5)
- ThonnyHub.Enabled = false
- local KeyUI = useStudio and script.Parent:FindFirstChild('Key') or game:GetObjects("rbxassetid://70391968119365")[1]
- KeyUI.Enabled = true
- if gethui then
- KeyUI.Parent = gethui()
- elseif syn and syn.protect_gui then
- syn.protect_gui(KeyUI)
- KeyUI.Parent = CoreGui
- elseif not useStudio and CoreGui:FindFirstChild("RobloxGui") then
- KeyUI.Parent = CoreGui:FindFirstChild("RobloxGui")
- elseif not useStudio then
- KeyUI.Parent = CoreGui
- end
- if gethui then
- for _, Interface in ipairs(gethui():GetChildren()) do
- if Interface.Name == KeyUI.Name and Interface ~= KeyUI then
- Interface.Enabled = false
- Interface.Name = "KeyUI-Old"
- end
- end
- elseif not useStudio then
- for _, Interface in ipairs(CoreGui:GetChildren()) do
- if Interface.Name == KeyUI.Name and Interface ~= KeyUI then
- Interface.Enabled = false
- Interface.Name = "KeyUI-Old"
- end
- end
- end
- local KeyMain = KeyUI.Main
- KeyMain.Title.Text = Settings.KeySettings.Title or Settings.Name
- KeyMain.Subtitle.Text = Settings.KeySettings.Subtitle or "Key System"
- KeyMain.NoteMessage.Text = Settings.KeySettings.Note or "No instructions"
- KeyMain.Size = UDim2.new(0, 467, 0, 175)
- KeyMain.BackgroundTransparency = 1
- KeyMain.Shadow.Image.ImageTransparency = 1
- KeyMain.Title.TextTransparency = 1
- KeyMain.Subtitle.TextTransparency = 1
- KeyMain.KeyNote.TextTransparency = 1
- KeyMain.Input.BackgroundTransparency = 1
- KeyMain.Input.UIStroke.Transparency = 1
- KeyMain.Input.InputBox.TextTransparency = 1
- KeyMain.NoteTitle.TextTransparency = 1
- KeyMain.NoteMessage.TextTransparency = 1
- KeyMain.Hide.ImageTransparency = 1
- TweenService:Create(KeyMain, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(KeyMain, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 500, 0, 187)}):Play()
- TweenService:Create(KeyMain.Shadow.Image, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {ImageTransparency = 0.5}):Play()
- task.wait(0.05)
- TweenService:Create(KeyMain.Title, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- TweenService:Create(KeyMain.Subtitle, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- task.wait(0.05)
- TweenService:Create(KeyMain.KeyNote, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- TweenService:Create(KeyMain.Input, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(KeyMain.Input.UIStroke, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- TweenService:Create(KeyMain.Input.InputBox, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- task.wait(0.05)
- TweenService:Create(KeyMain.NoteTitle, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- TweenService:Create(KeyMain.NoteMessage, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- task.wait(0.15)
- TweenService:Create(KeyMain.Hide, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {ImageTransparency = 0.3}):Play()
- KeyUI.Main.Input.InputBox.FocusLost:Connect(function()
- if #KeyUI.Main.Input.InputBox.Text == 0 then return end
- local KeyFound = false
- local FoundKey = ''
- for _, MKey in ipairs(Settings.KeySettings.Key) do
- --if string.find(KeyMain.Input.InputBox.Text, MKey) then
- -- KeyFound = true
- -- FoundKey = MKey
- --end
- -- stricter key check
- if KeyMain.Input.InputBox.Text == MKey then
- KeyFound = true
- FoundKey = MKey
- end
- end
- if KeyFound then
- TweenService:Create(KeyMain, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(KeyMain, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 467, 0, 175)}):Play()
- TweenService:Create(KeyMain.Shadow.Image, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {ImageTransparency = 1}):Play()
- TweenService:Create(KeyMain.Title, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.Subtitle, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.KeyNote, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.Input, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(KeyMain.Input.UIStroke, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(KeyMain.Input.InputBox, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.NoteTitle, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.NoteMessage, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.Hide, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {ImageTransparency = 1}):Play()
- task.wait(0.51)
- Passthrough = true
- KeyMain.Visible = false
- if Settings.KeySettings.SaveKey then
- if writefile then
- writefile(ThonnyHubFolder.."/Key System".."/"..Settings.KeySettings.FileName..ConfigurationExtension, FoundKey)
- ThonnyHubLibrary:Notify({Title = "Thonny Hub", Content = "The key for the script has been saved successfully..", Image = 3605522284})
- end
- end
- else
- if AttemptsRemaining == 0 then
- TweenService:Create(KeyMain, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(KeyMain, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 467, 0, 175)}):Play()
- TweenService:Create(KeyMain.Shadow.Image, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {ImageTransparency = 1}):Play()
- TweenService:Create(KeyMain.Title, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.Subtitle, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.KeyNote, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.Input, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(KeyMain.Input.UIStroke, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(KeyMain.Input.InputBox, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.NoteTitle, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.NoteMessage, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.Hide, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {ImageTransparency = 1}):Play()
- task.wait(0.45)
- game.Players.LocalPlayer:Kick("Attempt limit exceeded")
- game:Shutdown()
- end
- KeyMain.Input.InputBox.Text = ""
- AttemptsRemaining = AttemptsRemaining - 1
- TweenService:Create(KeyMain, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 467, 0, 175)}):Play()
- TweenService:Create(KeyMain, TweenInfo.new(0.4, Enum.EasingStyle.Elastic), {Position = UDim2.new(0.495,0,0.5,0)}):Play()
- task.wait(0.1)
- TweenService:Create(KeyMain, TweenInfo.new(0.4, Enum.EasingStyle.Elastic), {Position = UDim2.new(0.505,0,0.5,0)}):Play()
- task.wait(0.1)
- TweenService:Create(KeyMain, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {Position = UDim2.new(0.5,0,0.5,0)}):Play()
- TweenService:Create(KeyMain, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 500, 0, 187)}):Play()
- end
- end)
- KeyMain.Hide.MouseButton1Click:Connect(function()
- TweenService:Create(KeyMain, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(KeyMain, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 467, 0, 175)}):Play()
- TweenService:Create(KeyMain.Shadow.Image, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {ImageTransparency = 1}):Play()
- TweenService:Create(KeyMain.Title, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.Subtitle, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.KeyNote, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.Input, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(KeyMain.Input.UIStroke, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(KeyMain.Input.InputBox, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.NoteTitle, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.NoteMessage, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(KeyMain.Hide, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {ImageTransparency = 1}):Play()
- task.wait(0.51)
- ThonnyHubLibrary:Destroy()
- KeyUI:Destroy()
- end)
- else
- Passthrough = true
- end
- end
- if Settings.KeySystem then
- repeat task.wait() until Passthrough
- end
- Notifications.Template.Visible = false
- Notifications.Visible = true
- ThonnyHub.Enabled = true
- task.wait(0.5)
- TweenService:Create(Main, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(Main.Shadow.Image, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {ImageTransparency = 0.6}):Play()
- task.wait(0.1)
- TweenService:Create(LoadingFrame.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- task.wait(0.05)
- TweenService:Create(LoadingFrame.Subtitle, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- task.wait(0.05)
- TweenService:Create(LoadingFrame.Version, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- Elements.Template.LayoutOrder = 100000
- Elements.Template.Visible = false
- Elements.UIPageLayout.FillDirection = Enum.FillDirection.Horizontal
- TabList.Template.Visible = false
- -- Tab
- local FirstTab = false
- local Window = {}
- function Window:CreateTab(Name, Image)
- local SDone = false
- local TabButton = TabList.Template:Clone()
- TabButton.Name = Name
- TabButton.Title.Text = Name
- TabButton.Parent = TabList
- TabButton.Title.TextWrapped = false
- TabButton.Size = UDim2.new(0, TabButton.Title.TextBounds.X + 30, 0, 30)
- if Image then
- if typeof(Image) == 'string' then
- local asset = getIcon(Image)
- TabButton.Image.Image = 'rbxassetid://'..asset.id
- TabButton.Image.ImageRectOffset = asset.imageRectOffset
- TabButton.Image.ImageRectSize = asset.imageRectSize
- else
- TabButton.Image.Image = "rbxassetid://"..Image
- end
- TabButton.Title.AnchorPoint = Vector2.new(0, 0.5)
- TabButton.Title.Position = UDim2.new(0, 37, 0.5, 0)
- TabButton.Image.Visible = true
- TabButton.Title.TextXAlignment = Enum.TextXAlignment.Left
- TabButton.Size = UDim2.new(0, TabButton.Title.TextBounds.X + 52, 0, 30)
- end
- TabButton.BackgroundTransparency = 1
- TabButton.Title.TextTransparency = 1
- TabButton.Image.ImageTransparency = 1
- TabButton.UIStroke.Transparency = 1
- TabButton.Visible = true
- -- Create Elements Page
- local TabPage = Elements.Template:Clone()
- TabPage.Name = Name
- TabPage.Visible = true
- TabPage.LayoutOrder = #Elements:GetChildren()
- for _, TemplateElement in ipairs(TabPage:GetChildren()) do
- if TemplateElement.ClassName == "Frame" and TemplateElement.Name ~= "Placeholder" then
- TemplateElement:Destroy()
- end
- end
- TabPage.Parent = Elements
- if not FirstTab then
- Elements.UIPageLayout.Animated = false
- Elements.UIPageLayout:JumpTo(TabPage)
- Elements.UIPageLayout.Animated = true
- end
- TabButton.UIStroke.Color = SelectedTheme.TabStroke
- if Elements.UIPageLayout.CurrentPage == TabPage then
- TabButton.BackgroundColor3 = SelectedTheme.TabBackgroundSelected
- TabButton.Image.ImageColor3 = SelectedTheme.SelectedTabTextColor
- TabButton.Title.TextColor3 = SelectedTheme.SelectedTabTextColor
- else
- TabButton.BackgroundColor3 = SelectedTheme.TabBackground
- TabButton.Image.ImageColor3 = SelectedTheme.TabTextColor
- TabButton.Title.TextColor3 = SelectedTheme.TabTextColor
- end
- -- Animate
- task.wait(0.1)
- if FirstTab then
- TabButton.BackgroundColor3 = SelectedTheme.TabBackground
- TabButton.Image.ImageColor3 = SelectedTheme.TabTextColor
- TabButton.Title.TextColor3 = SelectedTheme.TabTextColor
- TweenService:Create(TabButton, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0.7}):Play()
- TweenService:Create(TabButton.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0.2}):Play()
- TweenService:Create(TabButton.Image, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {ImageTransparency = 0.2}):Play()
- TweenService:Create(TabButton.UIStroke, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {Transparency = 0.5}):Play()
- else
- FirstTab = Name
- TabButton.BackgroundColor3 = SelectedTheme.TabBackgroundSelected
- TabButton.Image.ImageColor3 = SelectedTheme.SelectedTabTextColor
- TabButton.Title.TextColor3 = SelectedTheme.SelectedTabTextColor
- TweenService:Create(TabButton.Image, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {ImageTransparency = 0}):Play()
- TweenService:Create(TabButton, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(TabButton.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- end
- TabButton.Interact.MouseButton1Click:Connect(function()
- if Minimised then return end
- TweenService:Create(TabButton, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(TabButton.UIStroke, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(TabButton.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- TweenService:Create(TabButton.Image, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {ImageTransparency = 0}):Play()
- TweenService:Create(TabButton, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.TabBackgroundSelected}):Play()
- TweenService:Create(TabButton.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextColor3 = SelectedTheme.SelectedTabTextColor}):Play()
- TweenService:Create(TabButton.Image, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {ImageColor3 = SelectedTheme.SelectedTabTextColor}):Play()
- for _, OtherTabButton in ipairs(TabList:GetChildren()) do
- if OtherTabButton.Name ~= "Template" and OtherTabButton.ClassName == "Frame" and OtherTabButton ~= TabButton and OtherTabButton.Name ~= "Placeholder" then
- TweenService:Create(OtherTabButton, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.TabBackground}):Play()
- TweenService:Create(OtherTabButton.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextColor3 = SelectedTheme.TabTextColor}):Play()
- TweenService:Create(OtherTabButton.Image, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {ImageColor3 = SelectedTheme.TabTextColor}):Play()
- TweenService:Create(OtherTabButton, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0.7}):Play()
- TweenService:Create(OtherTabButton.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0.2}):Play()
- TweenService:Create(OtherTabButton.Image, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {ImageTransparency = 0.2}):Play()
- TweenService:Create(OtherTabButton.UIStroke, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {Transparency = 0.5}):Play()
- end
- end
- if Elements.UIPageLayout.CurrentPage ~= TabPage then
- Elements.UIPageLayout:JumpTo(TabPage)
- end
- end)
- local Tab = {}
- -- Button
- function Tab:CreateButton(ButtonSettings)
- local ButtonValue = {}
- local Button = Elements.Template.Button:Clone()
- Button.Name = ButtonSettings.Name
- Button.Title.Text = ButtonSettings.Name
- Button.Visible = true
- Button.Parent = TabPage
- Button.BackgroundTransparency = 1
- Button.UIStroke.Transparency = 1
- Button.Title.TextTransparency = 1
- TweenService:Create(Button, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(Button.UIStroke, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- TweenService:Create(Button.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- Button.Interact.MouseButton1Click:Connect(function()
- local Success, Response = pcall(ButtonSettings.Callback)
- if not Success then
- TweenService:Create(Button, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = Color3.fromRGB(85, 0, 0)}):Play()
- TweenService:Create(Button.ElementIndicator, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(Button.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- Button.Title.Text = "Conditions Not Met"
- print("ThonnyHub | "..ButtonSettings.Name.." Callback Error " ..tostring(Response))
- task.wait(0.5)
- Button.Title.Text = ButtonSettings.Name
- TweenService:Create(Button, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Button.ElementIndicator, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {TextTransparency = 0.9}):Play()
- TweenService:Create(Button.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- else
- local Success, Response = pcall(function()
- SaveConfiguration()
- TweenService:Create(Button, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackgroundHover}):Play()
- TweenService:Create(Button.ElementIndicator, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(Button.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- task.wait(0.2)
- TweenService:Create(Button, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Button.ElementIndicator, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {TextTransparency = 0.9}):Play()
- TweenService:Create(Button.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- end)
- end
- end)
- Button.MouseEnter:Connect(function()
- TweenService:Create(Button, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackgroundHover}):Play()
- TweenService:Create(Button.ElementIndicator, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {TextTransparency = 0.7}):Play()
- end)
- Button.MouseLeave:Connect(function()
- TweenService:Create(Button, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Button.ElementIndicator, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {TextTransparency = 0.9}):Play()
- end)
- function ButtonValue:Set(NewButton)
- Button.Title.Text = NewButton
- Button.Name = NewButton
- end
- return ButtonValue
- end
- -- ColorPicker
- function Tab:CreateColorPicker(ColorPickerSettings)
- ColorPickerSettings.Type = "ColorPicker"
- local ColorPicker = Elements.Template.ColorPicker:Clone()
- local Background = ColorPicker.CPBackground
- local Display = Background.Display
- local Main = Background.MainCP
- local Slider = ColorPicker.ColorSlider
- ColorPicker.ClipsDescendants = true
- ColorPicker.Name = ColorPickerSettings.Name
- ColorPicker.Title.Text = ColorPickerSettings.Name
- ColorPicker.Visible = true
- ColorPicker.Parent = TabPage
- ColorPicker.Size = UDim2.new(1, -10, 0, 45)
- Background.Size = UDim2.new(0, 39, 0, 22)
- Display.BackgroundTransparency = 0
- Main.MainPoint.ImageTransparency = 1
- ColorPicker.Interact.Size = UDim2.new(1, 0, 1, 0)
- ColorPicker.Interact.Position = UDim2.new(0.5, 0, 0.5, 0)
- ColorPicker.RGB.Position = UDim2.new(0, 17, 0, 70)
- ColorPicker.HexInput.Position = UDim2.new(0, 17, 0, 90)
- Main.ImageTransparency = 1
- Background.BackgroundTransparency = 1
- for _, rgbinput in ipairs(ColorPicker.RGB:GetChildren()) do
- if rgbinput:IsA("Frame") then
- rgbinput.BackgroundColor3 = SelectedTheme.InputBackground
- rgbinput.UIStroke.Color = SelectedTheme.InputStroke
- end
- end
- ColorPicker.HexInput.BackgroundColor3 = SelectedTheme.InputBackground
- ColorPicker.HexInput.UIStroke.Color = SelectedTheme.InputStroke
- local opened = false
- local mouse = game.Players.LocalPlayer:GetMouse()
- Main.Image = "http://www.roblox.com/asset/?id=11415645739"
- local mainDragging = false
- local sliderDragging = false
- ColorPicker.Interact.MouseButton1Down:Connect(function()
- task.spawn(function()
- TweenService:Create(ColorPicker, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackgroundHover}):Play()
- TweenService:Create(ColorPicker.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- task.wait(0.2)
- TweenService:Create(ColorPicker, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(ColorPicker.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- end)
- if not opened then
- opened = true
- TweenService:Create(Background, TweenInfo.new(0.45, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 18, 0, 15)}):Play()
- task.wait(0.1)
- TweenService:Create(ColorPicker, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Size = UDim2.new(1, -10, 0, 120)}):Play()
- TweenService:Create(Background, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 173, 0, 86)}):Play()
- TweenService:Create(Display, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(ColorPicker.Interact, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Position = UDim2.new(0.289, 0, 0.5, 0)}):Play()
- TweenService:Create(ColorPicker.RGB, TweenInfo.new(0.8, Enum.EasingStyle.Exponential), {Position = UDim2.new(0, 17, 0, 40)}):Play()
- TweenService:Create(ColorPicker.HexInput, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Position = UDim2.new(0, 17, 0, 73)}):Play()
- TweenService:Create(ColorPicker.Interact, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Size = UDim2.new(0.574, 0, 1, 0)}):Play()
- TweenService:Create(Main.MainPoint, TweenInfo.new(0.2, Enum.EasingStyle.Exponential), {ImageTransparency = 0}):Play()
- TweenService:Create(Main, TweenInfo.new(0.2, Enum.EasingStyle.Exponential), {ImageTransparency = SelectedTheme ~= ThonnyHubLibrary.Theme.Default and 0.25 or 0.1}):Play()
- TweenService:Create(Background, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- else
- opened = false
- TweenService:Create(ColorPicker, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Size = UDim2.new(1, -10, 0, 45)}):Play()
- TweenService:Create(Background, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Size = UDim2.new(0, 39, 0, 22)}):Play()
- TweenService:Create(ColorPicker.Interact, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Size = UDim2.new(1, 0, 1, 0)}):Play()
- TweenService:Create(ColorPicker.Interact, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Position = UDim2.new(0.5, 0, 0.5, 0)}):Play()
- TweenService:Create(ColorPicker.RGB, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Position = UDim2.new(0, 17, 0, 70)}):Play()
- TweenService:Create(ColorPicker.HexInput, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Position = UDim2.new(0, 17, 0, 90)}):Play()
- TweenService:Create(Display, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(Main.MainPoint, TweenInfo.new(0.2, Enum.EasingStyle.Exponential), {ImageTransparency = 1}):Play()
- TweenService:Create(Main, TweenInfo.new(0.2, Enum.EasingStyle.Exponential), {ImageTransparency = 1}):Play()
- TweenService:Create(Background, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- end
- end)
- UserInputService.InputEnded:Connect(function(input, gameProcessed) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
- mainDragging = false
- sliderDragging = false
- end end)
- Main.MouseButton1Down:Connect(function()
- if opened then
- mainDragging = true
- end
- end)
- Main.MainPoint.MouseButton1Down:Connect(function()
- if opened then
- mainDragging = true
- end
- end)
- Slider.MouseButton1Down:Connect(function()
- sliderDragging = true
- end)
- Slider.SliderPoint.MouseButton1Down:Connect(function()
- sliderDragging = true
- end)
- local h,s,v = ColorPickerSettings.Color:ToHSV()
- local color = Color3.fromHSV(h,s,v)
- local hex = string.format("#%02X%02X%02X",color.R*0xFF,color.G*0xFF,color.B*0xFF)
- ColorPicker.HexInput.InputBox.Text = hex
- local function setDisplay()
- --Main
- Main.MainPoint.Position = UDim2.new(s,-Main.MainPoint.AbsoluteSize.X/2,1-v,-Main.MainPoint.AbsoluteSize.Y/2)
- Main.MainPoint.ImageColor3 = Color3.fromHSV(h,s,v)
- Background.BackgroundColor3 = Color3.fromHSV(h,1,1)
- Display.BackgroundColor3 = Color3.fromHSV(h,s,v)
- --Slider
- local x = h * Slider.AbsoluteSize.X
- Slider.SliderPoint.Position = UDim2.new(0,x-Slider.SliderPoint.AbsoluteSize.X/2,0.5,0)
- Slider.SliderPoint.ImageColor3 = Color3.fromHSV(h,1,1)
- local color = Color3.fromHSV(h,s,v)
- local r,g,b = math.floor((color.R*255)+0.5),math.floor((color.G*255)+0.5),math.floor((color.B*255)+0.5)
- ColorPicker.RGB.RInput.InputBox.Text = tostring(r)
- ColorPicker.RGB.GInput.InputBox.Text = tostring(g)
- ColorPicker.RGB.BInput.InputBox.Text = tostring(b)
- hex = string.format("#%02X%02X%02X",color.R*0xFF,color.G*0xFF,color.B*0xFF)
- ColorPicker.HexInput.InputBox.Text = hex
- end
- setDisplay()
- ColorPicker.HexInput.InputBox.FocusLost:Connect(function()
- if not pcall(function()
- local r, g, b = string.match(ColorPicker.HexInput.InputBox.Text, "^#?(%w%w)(%w%w)(%w%w)$")
- local rgbColor = Color3.fromRGB(tonumber(r, 16),tonumber(g, 16), tonumber(b, 16))
- h,s,v = rgbColor:ToHSV()
- hex = ColorPicker.HexInput.InputBox.Text
- setDisplay()
- ColorPickerSettings.Color = rgbColor
- end)
- then
- ColorPicker.HexInput.InputBox.Text = hex
- end
- pcall(function()ColorPickerSettings.Callback(Color3.fromHSV(h,s,v))end)
- local r,g,b = math.floor((h*255)+0.5),math.floor((s*255)+0.5),math.floor((v*255)+0.5)
- ColorPickerSettings.Color = Color3.fromRGB(r,g,b)
- SaveConfiguration()
- end)
- --RGB
- local function rgbBoxes(box,toChange)
- local value = tonumber(box.Text)
- local color = Color3.fromHSV(h,s,v)
- local oldR,oldG,oldB = math.floor((color.R*255)+0.5),math.floor((color.G*255)+0.5),math.floor((color.B*255)+0.5)
- local save
- if toChange == "R" then save = oldR;oldR = value elseif toChange == "G" then save = oldG;oldG = value else save = oldB;oldB = value end
- if value then
- value = math.clamp(value,0,255)
- h,s,v = Color3.fromRGB(oldR,oldG,oldB):ToHSV()
- setDisplay()
- else
- box.Text = tostring(save)
- end
- local r,g,b = math.floor((h*255)+0.5),math.floor((s*255)+0.5),math.floor((v*255)+0.5)
- ColorPickerSettings.Color = Color3.fromRGB(r,g,b)
- SaveConfiguration()
- end
- ColorPicker.RGB.RInput.InputBox.FocusLost:connect(function()
- rgbBoxes(ColorPicker.RGB.RInput.InputBox,"R")
- pcall(function()ColorPickerSettings.Callback(Color3.fromHSV(h,s,v))end)
- end)
- ColorPicker.RGB.GInput.InputBox.FocusLost:connect(function()
- rgbBoxes(ColorPicker.RGB.GInput.InputBox,"G")
- pcall(function()ColorPickerSettings.Callback(Color3.fromHSV(h,s,v))end)
- end)
- ColorPicker.RGB.BInput.InputBox.FocusLost:connect(function()
- rgbBoxes(ColorPicker.RGB.BInput.InputBox,"B")
- pcall(function()ColorPickerSettings.Callback(Color3.fromHSV(h,s,v))end)
- end)
- RunService.RenderStepped:connect(function()
- if mainDragging then
- local localX = math.clamp(mouse.X-Main.AbsolutePosition.X,0,Main.AbsoluteSize.X)
- local localY = math.clamp(mouse.Y-Main.AbsolutePosition.Y,0,Main.AbsoluteSize.Y)
- Main.MainPoint.Position = UDim2.new(0,localX-Main.MainPoint.AbsoluteSize.X/2,0,localY-Main.MainPoint.AbsoluteSize.Y/2)
- s = localX / Main.AbsoluteSize.X
- v = 1 - (localY / Main.AbsoluteSize.Y)
- Display.BackgroundColor3 = Color3.fromHSV(h,s,v)
- Main.MainPoint.ImageColor3 = Color3.fromHSV(h,s,v)
- Background.BackgroundColor3 = Color3.fromHSV(h,1,1)
- local color = Color3.fromHSV(h,s,v)
- local r,g,b = math.floor((color.R*255)+0.5),math.floor((color.G*255)+0.5),math.floor((color.B*255)+0.5)
- ColorPicker.RGB.RInput.InputBox.Text = tostring(r)
- ColorPicker.RGB.GInput.InputBox.Text = tostring(g)
- ColorPicker.RGB.BInput.InputBox.Text = tostring(b)
- ColorPicker.HexInput.InputBox.Text = string.format("#%02X%02X%02X",color.R*0xFF,color.G*0xFF,color.B*0xFF)
- pcall(function()ColorPickerSettings.Callback(Color3.fromHSV(h,s,v))end)
- ColorPickerSettings.Color = Color3.fromRGB(r,g,b)
- SaveConfiguration()
- end
- if sliderDragging then
- local localX = math.clamp(mouse.X-Slider.AbsolutePosition.X,0,Slider.AbsoluteSize.X)
- h = localX / Slider.AbsoluteSize.X
- Display.BackgroundColor3 = Color3.fromHSV(h,s,v)
- Slider.SliderPoint.Position = UDim2.new(0,localX-Slider.SliderPoint.AbsoluteSize.X/2,0.5,0)
- Slider.SliderPoint.ImageColor3 = Color3.fromHSV(h,1,1)
- Background.BackgroundColor3 = Color3.fromHSV(h,1,1)
- Main.MainPoint.ImageColor3 = Color3.fromHSV(h,s,v)
- local color = Color3.fromHSV(h,s,v)
- local r,g,b = math.floor((color.R*255)+0.5),math.floor((color.G*255)+0.5),math.floor((color.B*255)+0.5)
- ColorPicker.RGB.RInput.InputBox.Text = tostring(r)
- ColorPicker.RGB.GInput.InputBox.Text = tostring(g)
- ColorPicker.RGB.BInput.InputBox.Text = tostring(b)
- ColorPicker.HexInput.InputBox.Text = string.format("#%02X%02X%02X",color.R*0xFF,color.G*0xFF,color.B*0xFF)
- pcall(function()ColorPickerSettings.Callback(Color3.fromHSV(h,s,v))end)
- ColorPickerSettings.Color = Color3.fromRGB(r,g,b)
- SaveConfiguration()
- end
- end)
- if Settings.ConfigurationSaving then
- if Settings.ConfigurationSaving.Enabled and ColorPickerSettings.Flag then
- ThonnyHubLibrary.Flags[ColorPickerSettings.Flag] = ColorPickerSettings
- end
- end
- function ColorPickerSettings:Set(RGBColor)
- ColorPickerSettings.Color = RGBColor
- h,s,v = ColorPickerSettings.Color:ToHSV()
- color = Color3.fromHSV(h,s,v)
- setDisplay()
- end
- ColorPicker.MouseEnter:Connect(function()
- TweenService:Create(ColorPicker, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackgroundHover}):Play()
- end)
- ColorPicker.MouseLeave:Connect(function()
- TweenService:Create(ColorPicker, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- end)
- ThonnyHub.Main:GetPropertyChangedSignal('BackgroundColor3'):Connect(function()
- for _, rgbinput in ipairs(ColorPicker.RGB:GetChildren()) do
- if rgbinput:IsA("Frame") then
- rgbinput.BackgroundColor3 = SelectedTheme.InputBackground
- rgbinput.UIStroke.Color = SelectedTheme.InputStroke
- end
- end
- ColorPicker.HexInput.BackgroundColor3 = SelectedTheme.InputBackground
- ColorPicker.HexInput.UIStroke.Color = SelectedTheme.InputStroke
- end)
- return ColorPickerSettings
- end
- -- Section
- function Tab:CreateSection(SectionName)
- local SectionValue = {}
- if SDone then
- local SectionSpace = Elements.Template.SectionSpacing:Clone()
- SectionSpace.Visible = true
- SectionSpace.Parent = TabPage
- end
- local Section = Elements.Template.SectionTitle:Clone()
- Section.Title.Text = SectionName
- Section.Visible = true
- Section.Parent = TabPage
- Section.Title.TextTransparency = 1
- TweenService:Create(Section.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0.4}):Play()
- function SectionValue:Set(NewSection)
- Section.Title.Text = NewSection
- end
- SDone = true
- return SectionValue
- end
- -- Divider
- function Tab:CreateDivider()
- local DividerValue = {}
- local Divider = Elements.Template.Divider:Clone()
- Divider.Visible = true
- Divider.Parent = TabPage
- Divider.Divider.BackgroundTransparency = 1
- TweenService:Create(Divider.Divider, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0.85}):Play()
- function DividerValue:Set(Value)
- Divider.Visible = Value
- end
- return DividerValue
- end
- -- Label
- function Tab:CreateLabel(LabelText : string, Icon: number, Color : Color3, IgnoreTheme : boolean)
- local LabelValue = {}
- local Label = Elements.Template.Label:Clone()
- Label.Title.Text = LabelText
- Label.Visible = true
- Label.Parent = TabPage
- Label.BackgroundColor3 = Color or SelectedTheme.SecondaryElementBackground
- Label.UIStroke.Color = Color or SelectedTheme.SecondaryElementStroke
- if Icon then
- if typeof(Icon) == 'string' then
- local asset = getIcon(Icon)
- Label.Icon.Image = 'rbxassetid://'..asset.id
- Label.Icon.ImageRectOffset = asset.imageRectOffset
- Label.Icon.ImageRectSize = asset.imageRectSize
- else
- Label.Icon.Image = "rbxassetid://" .. (Icon or 0)
- end
- else
- Label.Icon.Image = "rbxassetid://" .. 0
- end
- if Icon and Label:FindFirstChild('Icon') then
- Label.Title.Position = UDim2.new(0, 45, 0.5, 0)
- Label.Title.Size = UDim2.new(1, -100, 0, 14)
- if Icon then
- if typeof(Icon) == 'string' then
- local asset = getIcon(Icon)
- Label.Icon.Image = 'rbxassetid://'..asset.id
- Label.Icon.ImageRectOffset = asset.imageRectOffset
- Label.Icon.ImageRectSize = asset.imageRectSize
- else
- Label.Icon.Image = "rbxassetid://" .. (Icon or 0)
- end
- else
- Label.Icon.Image = "rbxassetid://" .. 0
- end
- Label.Icon.Visible = true
- end
- Label.Icon.ImageTransparency = 1
- Label.BackgroundTransparency = 1
- Label.UIStroke.Transparency = 1
- Label.Title.TextTransparency = 1
- TweenService:Create(Label, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundTransparency = Color and 0.8 or 0}):Play()
- TweenService:Create(Label.UIStroke, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {Transparency = Color and 0.7 or 0}):Play()
- TweenService:Create(Label.Icon, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {ImageTransparency = 0.2}):Play()
- TweenService:Create(Label.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = Color and 0.2 or 0}):Play()
- function LabelValue:Set(NewLabel, Icon, Color)
- Label.Title.Text = NewLabel
- if Color then
- Label.BackgroundColor3 = Color or SelectedTheme.SecondaryElementBackground
- Label.UIStroke.Color = Color or SelectedTheme.SecondaryElementStroke
- end
- if Icon and Label:FindFirstChild('Icon') then
- Label.Title.Position = UDim2.new(0, 45, 0.5, 0)
- Label.Title.Size = UDim2.new(1, -100, 0, 14)
- if Icon then
- if typeof(Icon) == 'string' then
- local asset = getIcon(Icon)
- Label.Icon.Image = 'rbxassetid://'..asset.id
- Label.Icon.ImageRectOffset = asset.imageRectOffset
- Label.Icon.ImageRectSize = asset.imageRectSize
- else
- Label.Icon.Image = "rbxassetid://" .. (Icon or 0)
- end
- else
- Label.Icon.Image = "rbxassetid://" .. 0
- end
- Label.Icon.Visible = true
- end
- end
- ThonnyHub.Main:GetPropertyChangedSignal('BackgroundColor3'):Connect(function()
- Label.BackgroundColor3 = IgnoreTheme and (Color or Label.BackgroundColor3) or SelectedTheme.SecondaryElementBackground
- Label.UIStroke.Color = IgnoreTheme and (Color or Label.BackgroundColor3) or SelectedTheme.SecondaryElementStroke
- end)
- return LabelValue
- end
- -- Paragraph
- function Tab:CreateParagraph(ParagraphSettings)
- local ParagraphValue = {}
- local Paragraph = Elements.Template.Paragraph:Clone()
- Paragraph.Title.Text = ParagraphSettings.Title
- Paragraph.Content.Text = ParagraphSettings.Content
- Paragraph.Visible = true
- Paragraph.Parent = TabPage
- Paragraph.BackgroundTransparency = 1
- Paragraph.UIStroke.Transparency = 1
- Paragraph.Title.TextTransparency = 1
- Paragraph.Content.TextTransparency = 1
- Paragraph.BackgroundColor3 = SelectedTheme.SecondaryElementBackground
- Paragraph.UIStroke.Color = SelectedTheme.SecondaryElementStroke
- TweenService:Create(Paragraph, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(Paragraph.UIStroke, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- TweenService:Create(Paragraph.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- TweenService:Create(Paragraph.Content, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- function ParagraphValue:Set(NewParagraphSettings)
- Paragraph.Title.Text = NewParagraphSettings.Title
- Paragraph.Content.Text = NewParagraphSettings.Content
- end
- ThonnyHub.Main:GetPropertyChangedSignal('BackgroundColor3'):Connect(function()
- Paragraph.BackgroundColor3 = SelectedTheme.SecondaryElementBackground
- Paragraph.UIStroke.Color = SelectedTheme.SecondaryElementStroke
- end)
- return ParagraphValue
- end
- -- Input
- function Tab:CreateInput(InputSettings)
- local Input = Elements.Template.Input:Clone()
- Input.Name = InputSettings.Name
- Input.Title.Text = InputSettings.Name
- Input.Visible = true
- Input.Parent = TabPage
- Input.BackgroundTransparency = 1
- Input.UIStroke.Transparency = 1
- Input.Title.TextTransparency = 1
- Input.InputFrame.InputBox.Text = InputSettings.CurrentValue or ''
- Input.InputFrame.BackgroundColor3 = SelectedTheme.InputBackground
- Input.InputFrame.UIStroke.Color = SelectedTheme.InputStroke
- TweenService:Create(Input, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(Input.UIStroke, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- TweenService:Create(Input.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- Input.InputFrame.InputBox.PlaceholderText = InputSettings.PlaceholderText
- Input.InputFrame.Size = UDim2.new(0, Input.InputFrame.InputBox.TextBounds.X + 24, 0, 30)
- Input.InputFrame.InputBox.FocusLost:Connect(function()
- local Success, Response = pcall(function()
- InputSettings.Callback(Input.InputFrame.InputBox.Text)
- InputSettings.CurrentValue = Input.InputFrame.InputBox.Text
- end)
- if not Success then
- TweenService:Create(Input, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = Color3.fromRGB(85, 0, 0)}):Play()
- TweenService:Create(Input.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- Input.Title.Text = "Conditions Not Met"
- print("ThonnyHub | "..InputSettings.Name.." Callback Error " ..tostring(Response))
- task.wait(0.5)
- Input.Title.Text = InputSettings.Name
- TweenService:Create(Input, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Input.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- end
- if InputSettings.RemoveTextAfterFocusLost then
- Input.InputFrame.InputBox.Text = ""
- end
- SaveConfiguration()
- end)
- Input.MouseEnter:Connect(function()
- TweenService:Create(Input, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackgroundHover}):Play()
- end)
- Input.MouseLeave:Connect(function()
- TweenService:Create(Input, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- end)
- Input.InputFrame.InputBox:GetPropertyChangedSignal("Text"):Connect(function()
- TweenService:Create(Input.InputFrame, TweenInfo.new(0.55, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Size = UDim2.new(0, Input.InputFrame.InputBox.TextBounds.X + 24, 0, 30)}):Play()
- end)
- function InputSettings:Set(text)
- Input.InputFrame.InputBox.Text = text
- SaveConfiguration()
- end
- if Settings.ConfigurationSaving then
- if Settings.ConfigurationSaving.Enabled and InputSettings.Flag then
- ThonnyHubLibrary.Flags[InputSettings.Flag] = InputSettings
- end
- end
- ThonnyHub.Main:GetPropertyChangedSignal('BackgroundColor3'):Connect(function()
- Input.InputFrame.BackgroundColor3 = SelectedTheme.InputBackground
- Input.InputFrame.UIStroke.Color = SelectedTheme.InputStroke
- end)
- return InputSettings
- end
- -- Dropdown
- function Tab:CreateDropdown(DropdownSettings)
- local Dropdown = Elements.Template.Dropdown:Clone()
- if string.find(DropdownSettings.Name,"closed") then
- Dropdown.Name = "Dropdown"
- else
- Dropdown.Name = DropdownSettings.Name
- end
- Dropdown.Title.Text = DropdownSettings.Name
- Dropdown.Visible = true
- Dropdown.Parent = TabPage
- Dropdown.List.Visible = false
- if DropdownSettings.CurrentOption then
- if type(DropdownSettings.CurrentOption) == "string" then
- DropdownSettings.CurrentOption = {DropdownSettings.CurrentOption}
- end
- if not DropdownSettings.MultipleOptions and type(DropdownSettings.CurrentOption) == "table" then
- DropdownSettings.CurrentOption = {DropdownSettings.CurrentOption[1]}
- end
- else
- DropdownSettings.CurrentOption = {}
- end
- if DropdownSettings.MultipleOptions then
- if DropdownSettings.CurrentOption and type(DropdownSettings.CurrentOption) == "table" then
- if #DropdownSettings.CurrentOption == 1 then
- Dropdown.Selected.Text = DropdownSettings.CurrentOption[1]
- elseif #DropdownSettings.CurrentOption == 0 then
- Dropdown.Selected.Text = "None"
- else
- Dropdown.Selected.Text = "Various"
- end
- else
- DropdownSettings.CurrentOption = {}
- Dropdown.Selected.Text = "None"
- end
- else
- Dropdown.Selected.Text = DropdownSettings.CurrentOption[1] or "None"
- end
- Dropdown.Toggle.ImageColor3 = SelectedTheme.TextColor
- TweenService:Create(Dropdown, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- Dropdown.BackgroundTransparency = 1
- Dropdown.UIStroke.Transparency = 1
- Dropdown.Title.TextTransparency = 1
- Dropdown.Size = UDim2.new(1, -10, 0, 45)
- TweenService:Create(Dropdown, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(Dropdown.UIStroke, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- TweenService:Create(Dropdown.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- for _, ununusedoption in ipairs(Dropdown.List:GetChildren()) do
- if ununusedoption.ClassName == "Frame" and ununusedoption.Name ~= "Placeholder" then
- ununusedoption:Destroy()
- end
- end
- Dropdown.Toggle.Rotation = 180
- Dropdown.Interact.MouseButton1Click:Connect(function()
- TweenService:Create(Dropdown, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackgroundHover}):Play()
- TweenService:Create(Dropdown.UIStroke, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- task.wait(0.1)
- TweenService:Create(Dropdown, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Dropdown.UIStroke, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- if Debounce then return end
- if Dropdown.List.Visible then
- Debounce = true
- TweenService:Create(Dropdown, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Size = UDim2.new(1, -10, 0, 45)}):Play()
- for _, DropdownOpt in ipairs(Dropdown.List:GetChildren()) do
- if DropdownOpt.ClassName == "Frame" and DropdownOpt.Name ~= "Placeholder" then
- TweenService:Create(DropdownOpt, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(DropdownOpt.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(DropdownOpt.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- end
- end
- TweenService:Create(Dropdown.List, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ScrollBarImageTransparency = 1}):Play()
- TweenService:Create(Dropdown.Toggle, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {Rotation = 180}):Play()
- task.wait(0.35)
- Dropdown.List.Visible = false
- Debounce = false
- else
- TweenService:Create(Dropdown, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Size = UDim2.new(1, -10, 0, 180)}):Play()
- Dropdown.List.Visible = true
- TweenService:Create(Dropdown.List, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ScrollBarImageTransparency = 0.7}):Play()
- TweenService:Create(Dropdown.Toggle, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {Rotation = 0}):Play()
- for _, DropdownOpt in ipairs(Dropdown.List:GetChildren()) do
- if DropdownOpt.ClassName == "Frame" and DropdownOpt.Name ~= "Placeholder" then
- if DropdownOpt.Name ~= Dropdown.Selected.Text then
- TweenService:Create(DropdownOpt.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- end
- TweenService:Create(DropdownOpt, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(DropdownOpt.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- end
- end
- end
- end)
- Dropdown.MouseEnter:Connect(function()
- if not Dropdown.List.Visible then
- TweenService:Create(Dropdown, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackgroundHover}):Play()
- end
- end)
- Dropdown.MouseLeave:Connect(function()
- TweenService:Create(Dropdown, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- end)
- local function SetDropdownOptions()
- for _, Option in ipairs(DropdownSettings.Options) do
- local DropdownOption = Elements.Template.Dropdown.List.Template:Clone()
- DropdownOption.Name = Option
- DropdownOption.Title.Text = Option
- DropdownOption.Parent = Dropdown.List
- DropdownOption.Visible = true
- DropdownOption.BackgroundTransparency = 1
- DropdownOption.UIStroke.Transparency = 1
- DropdownOption.Title.TextTransparency = 1
- --local Dropdown = Tab:CreateDropdown({
- -- Name = "Dropdown Example",
- -- Options = {"Option 1","Option 2"},
- -- CurrentOption = {"Option 1"},
- -- MultipleOptions = true,
- -- Flag = "Dropdown1",
- -- Callback = function(TableOfOptions)
- -- end,
- --})
- DropdownOption.Interact.ZIndex = 50
- DropdownOption.Interact.MouseButton1Click:Connect(function()
- if not DropdownSettings.MultipleOptions and table.find(DropdownSettings.CurrentOption, Option) then
- return
- end
- if table.find(DropdownSettings.CurrentOption, Option) then
- table.remove(DropdownSettings.CurrentOption, table.find(DropdownSettings.CurrentOption, Option))
- if DropdownSettings.MultipleOptions then
- if #DropdownSettings.CurrentOption == 1 then
- Dropdown.Selected.Text = DropdownSettings.CurrentOption[1]
- elseif #DropdownSettings.CurrentOption == 0 then
- Dropdown.Selected.Text = "None"
- else
- Dropdown.Selected.Text = "Various"
- end
- else
- Dropdown.Selected.Text = DropdownSettings.CurrentOption[1]
- end
- else
- if not DropdownSettings.MultipleOptions then
- table.clear(DropdownSettings.CurrentOption)
- end
- table.insert(DropdownSettings.CurrentOption, Option)
- if DropdownSettings.MultipleOptions then
- if #DropdownSettings.CurrentOption == 1 then
- Dropdown.Selected.Text = DropdownSettings.CurrentOption[1]
- elseif #DropdownSettings.CurrentOption == 0 then
- Dropdown.Selected.Text = "None"
- else
- Dropdown.Selected.Text = "Various"
- end
- else
- Dropdown.Selected.Text = DropdownSettings.CurrentOption[1]
- end
- TweenService:Create(DropdownOption.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(DropdownOption, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.DropdownSelected}):Play()
- Debounce = true
- end
- local Success, Response = pcall(function()
- DropdownSettings.Callback(DropdownSettings.CurrentOption)
- end)
- if not Success then
- TweenService:Create(Dropdown, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = Color3.fromRGB(85, 0, 0)}):Play()
- TweenService:Create(Dropdown.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- Dropdown.Title.Text = "Callback Error"
- print("ThonnyHub | "..DropdownSettings.Name.." Callback Error " ..tostring(Response))
- task.wait(0.5)
- Dropdown.Title.Text = DropdownSettings.Name
- TweenService:Create(Dropdown, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Dropdown.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- end
- for _, droption in ipairs(Dropdown.List:GetChildren()) do
- if droption.ClassName == "Frame" and droption.Name ~= "Placeholder" and not table.find(DropdownSettings.CurrentOption, droption.Name) then
- TweenService:Create(droption, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.DropdownUnselected}):Play()
- end
- end
- if not DropdownSettings.MultipleOptions then
- task.wait(0.1)
- TweenService:Create(Dropdown, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {Size = UDim2.new(1, -10, 0, 45)}):Play()
- for _, DropdownOpt in ipairs(Dropdown.List:GetChildren()) do
- if DropdownOpt.ClassName == "Frame" and DropdownOpt.Name ~= "Placeholder" then
- TweenService:Create(DropdownOpt, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {BackgroundTransparency = 1}):Play()
- TweenService:Create(DropdownOpt.UIStroke, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(DropdownOpt.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- end
- end
- TweenService:Create(Dropdown.List, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {ScrollBarImageTransparency = 1}):Play()
- TweenService:Create(Dropdown.Toggle, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {Rotation = 180}):Play()
- task.wait(0.35)
- Dropdown.List.Visible = false
- end
- Debounce = false
- SaveConfiguration()
- end)
- ThonnyHub.Main:GetPropertyChangedSignal('BackgroundColor3'):Connect(function()
- DropdownOption.UIStroke.Color = SelectedTheme.ElementStroke
- end)
- end
- end
- SetDropdownOptions()
- for _, droption in ipairs(Dropdown.List:GetChildren()) do
- if droption.ClassName == "Frame" and droption.Name ~= "Placeholder" then
- if not table.find(DropdownSettings.CurrentOption, droption.Name) then
- droption.BackgroundColor3 = SelectedTheme.DropdownUnselected
- else
- droption.BackgroundColor3 = SelectedTheme.DropdownSelected
- end
- ThonnyHub.Main:GetPropertyChangedSignal('BackgroundColor3'):Connect(function()
- if not table.find(DropdownSettings.CurrentOption, droption.Name) then
- droption.BackgroundColor3 = SelectedTheme.DropdownUnselected
- else
- droption.BackgroundColor3 = SelectedTheme.DropdownSelected
- end
- end)
- end
- end
- function DropdownSettings:Set(NewOption)
- DropdownSettings.CurrentOption = NewOption
- if typeof(DropdownSettings.CurrentOption) == "string" then
- DropdownSettings.CurrentOption = {DropdownSettings.CurrentOption}
- end
- if not DropdownSettings.MultipleOptions then
- DropdownSettings.CurrentOption = {DropdownSettings.CurrentOption[1]}
- end
- if DropdownSettings.MultipleOptions then
- if #DropdownSettings.CurrentOption == 1 then
- Dropdown.Selected.Text = DropdownSettings.CurrentOption[1]
- elseif #DropdownSettings.CurrentOption == 0 then
- Dropdown.Selected.Text = "None"
- else
- Dropdown.Selected.Text = "Various"
- end
- else
- Dropdown.Selected.Text = DropdownSettings.CurrentOption[1]
- end
- local Success, Response = pcall(function()
- DropdownSettings.Callback(NewOption)
- end)
- if not Success then
- TweenService:Create(Dropdown, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = Color3.fromRGB(85, 0, 0)}):Play()
- TweenService:Create(Dropdown.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- Dropdown.Title.Text = "Callback Error"
- print("Thonny Hub | "..DropdownSettings.Name.." Callback Error " ..tostring(Response))
- task.wait(0.5)
- Dropdown.Title.Text = DropdownSettings.Name
- TweenService:Create(Dropdown, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Dropdown.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- end
- for _, droption in ipairs(Dropdown.List:GetChildren()) do
- if droption.ClassName == "Frame" and droption.Name ~= "Placeholder" then
- if not table.find(DropdownSettings.CurrentOption, droption.Name) then
- droption.BackgroundColor3 = SelectedTheme.DropdownUnselected
- else
- droption.BackgroundColor3 = SelectedTheme.DropdownSelected
- end
- end
- end
- --SaveConfiguration()
- end
- function DropdownSettings:Refresh(optionsTable: table) -- updates a dropdown with new options from optionsTable
- DropdownSettings.Options = optionsTable
- for _, option in Dropdown.List:GetChildren() do
- if option.ClassName == "Frame" and option.Name ~= "Placeholder" then
- option:Destroy()
- end
- end
- SetDropdownOptions()
- end
- if Settings.ConfigurationSaving then
- if Settings.ConfigurationSaving.Enabled and DropdownSettings.Flag then
- ThonnyHubLibrary.Flags[DropdownSettings.Flag] = DropdownSettings
- end
- end
- ThonnyHub.Main:GetPropertyChangedSignal('BackgroundColor3'):Connect(function()
- Dropdown.Toggle.ImageColor3 = SelectedTheme.TextColor
- TweenService:Create(Dropdown, TweenInfo.new(0.4, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- end)
- return DropdownSettings
- end
- -- Keybind
- function Tab:CreateKeybind(KeybindSettings)
- local CheckingForKey = false
- local Keybind = Elements.Template.Keybind:Clone()
- Keybind.Name = KeybindSettings.Name
- Keybind.Title.Text = KeybindSettings.Name
- Keybind.Visible = true
- Keybind.Parent = TabPage
- Keybind.BackgroundTransparency = 1
- Keybind.UIStroke.Transparency = 1
- Keybind.Title.TextTransparency = 1
- Keybind.KeybindFrame.BackgroundColor3 = SelectedTheme.InputBackground
- Keybind.KeybindFrame.UIStroke.Color = SelectedTheme.InputStroke
- TweenService:Create(Keybind, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(Keybind.UIStroke, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- TweenService:Create(Keybind.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- Keybind.KeybindFrame.KeybindBox.Text = KeybindSettings.CurrentKeybind
- Keybind.KeybindFrame.Size = UDim2.new(0, Keybind.KeybindFrame.KeybindBox.TextBounds.X + 24, 0, 30)
- Keybind.KeybindFrame.KeybindBox.Focused:Connect(function()
- CheckingForKey = true
- Keybind.KeybindFrame.KeybindBox.Text = ""
- end)
- Keybind.KeybindFrame.KeybindBox.FocusLost:Connect(function()
- CheckingForKey = false
- if Keybind.KeybindFrame.KeybindBox.Text == nil or "" then
- Keybind.KeybindFrame.KeybindBox.Text = KeybindSettings.CurrentKeybind
- SaveConfiguration()
- end
- end)
- Keybind.MouseEnter:Connect(function()
- TweenService:Create(Keybind, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackgroundHover}):Play()
- end)
- Keybind.MouseLeave:Connect(function()
- TweenService:Create(Keybind, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- end)
- UserInputService.InputBegan:Connect(function(input, processed)
- if CheckingForKey then
- if input.KeyCode ~= Enum.KeyCode.Unknown and input.KeyCode ~= Enum.KeyCode.K then
- local SplitMessage = string.split(tostring(input.KeyCode), ".")
- local NewKeyNoEnum = SplitMessage[3]
- Keybind.KeybindFrame.KeybindBox.Text = tostring(NewKeyNoEnum)
- KeybindSettings.CurrentKeybind = tostring(NewKeyNoEnum)
- Keybind.KeybindFrame.KeybindBox:ReleaseFocus()
- SaveConfiguration()
- end
- elseif KeybindSettings.CurrentKeybind ~= nil and (input.KeyCode == Enum.KeyCode[KeybindSettings.CurrentKeybind] and not processed) then -- Test
- local Held = true
- local Connection
- Connection = input.Changed:Connect(function(prop)
- if prop == "UserInputState" then
- Connection:Disconnect()
- Held = false
- end
- end)
- if not KeybindSettings.HoldToInteract then
- local Success, Response = pcall(KeybindSettings.Callback)
- if not Success then
- TweenService:Create(Keybind, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = Color3.fromRGB(85, 0, 0)}):Play()
- TweenService:Create(Keybind.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- Keybind.Title.Text = "Callback Error"
- print("Thonny Hub | "..KeybindSettings.Name.." Callback Error " ..tostring(Response))
- task.wait(0.5)
- Keybind.Title.Text = KeybindSettings.Name
- TweenService:Create(Keybind, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Keybind.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- end
- else
- task.wait(0.25)
- if Held then
- local Loop; Loop = RunService.Stepped:Connect(function()
- if not Held then
- KeybindSettings.Callback(false) -- maybe pcall this
- Loop:Disconnect()
- else
- KeybindSettings.Callback(true) -- maybe pcall this
- end
- end)
- end
- end
- end
- end)
- Keybind.KeybindFrame.KeybindBox:GetPropertyChangedSignal("Text"):Connect(function()
- TweenService:Create(Keybind.KeybindFrame, TweenInfo.new(0.55, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Size = UDim2.new(0, Keybind.KeybindFrame.KeybindBox.TextBounds.X + 24, 0, 30)}):Play()
- end)
- function KeybindSettings:Set(NewKeybind)
- Keybind.KeybindFrame.KeybindBox.Text = tostring(NewKeybind)
- KeybindSettings.CurrentKeybind = tostring(NewKeybind)
- Keybind.KeybindFrame.KeybindBox:ReleaseFocus()
- SaveConfiguration()
- end
- if Settings.ConfigurationSaving then
- if Settings.ConfigurationSaving.Enabled and KeybindSettings.Flag then
- ThonnyHubLibrary.Flags[KeybindSettings.Flag] = KeybindSettings
- end
- end
- ThonnyHub.Main:GetPropertyChangedSignal('BackgroundColor3'):Connect(function()
- Keybind.KeybindFrame.BackgroundColor3 = SelectedTheme.InputBackground
- Keybind.KeybindFrame.UIStroke.Color = SelectedTheme.InputStroke
- end)
- return KeybindSettings
- end
- -- Toggle
- function Tab:CreateToggle(ToggleSettings)
- local ToggleValue = {}
- local Toggle = Elements.Template.Toggle:Clone()
- Toggle.Name = ToggleSettings.Name
- Toggle.Title.Text = ToggleSettings.Name
- Toggle.Visible = true
- Toggle.Parent = TabPage
- Toggle.BackgroundTransparency = 1
- Toggle.UIStroke.Transparency = 1
- Toggle.Title.TextTransparency = 1
- Toggle.Switch.BackgroundColor3 = SelectedTheme.ToggleBackground
- if SelectedTheme ~= ThonnyHubLibrary.Theme.Default then
- Toggle.Switch.Shadow.Visible = false
- end
- TweenService:Create(Toggle, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(Toggle.UIStroke, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- TweenService:Create(Toggle.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- if ToggleSettings.CurrentValue == true then
- Toggle.Switch.Indicator.Position = UDim2.new(1, -20, 0.5, 0)
- Toggle.Switch.Indicator.UIStroke.Color = SelectedTheme.ToggleEnabledStroke
- Toggle.Switch.Indicator.BackgroundColor3 = SelectedTheme.ToggleEnabled
- Toggle.Switch.UIStroke.Color = SelectedTheme.ToggleEnabledOuterStroke
- else
- Toggle.Switch.Indicator.Position = UDim2.new(1, -40, 0.5, 0)
- Toggle.Switch.Indicator.UIStroke.Color = SelectedTheme.ToggleDisabledStroke
- Toggle.Switch.Indicator.BackgroundColor3 = SelectedTheme.ToggleDisabled
- Toggle.Switch.UIStroke.Color = SelectedTheme.ToggleDisabledOuterStroke
- end
- Toggle.MouseEnter:Connect(function()
- TweenService:Create(Toggle, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackgroundHover}):Play()
- end)
- Toggle.MouseLeave:Connect(function()
- TweenService:Create(Toggle, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- end)
- Toggle.Interact.MouseButton1Click:Connect(function()
- if ToggleSettings.CurrentValue == true then
- ToggleSettings.CurrentValue = false
- TweenService:Create(Toggle, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackgroundHover}):Play()
- TweenService:Create(Toggle.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(Toggle.Switch.Indicator, TweenInfo.new(0.45, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Position = UDim2.new(1, -40, 0.5, 0)}):Play()
- TweenService:Create(Toggle.Switch.Indicator.UIStroke, TweenInfo.new(0.55, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Color = SelectedTheme.ToggleDisabledStroke}):Play()
- TweenService:Create(Toggle.Switch.Indicator, TweenInfo.new(0.8, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {BackgroundColor3 = SelectedTheme.ToggleDisabled}):Play()
- TweenService:Create(Toggle.Switch.UIStroke, TweenInfo.new(0.55, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Color = SelectedTheme.ToggleDisabledOuterStroke}):Play()
- TweenService:Create(Toggle, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Toggle.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- else
- ToggleSettings.CurrentValue = true
- TweenService:Create(Toggle, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackgroundHover}):Play()
- TweenService:Create(Toggle.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(Toggle.Switch.Indicator, TweenInfo.new(0.5, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Position = UDim2.new(1, -20, 0.5, 0)}):Play()
- TweenService:Create(Toggle.Switch.Indicator.UIStroke, TweenInfo.new(0.55, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Color = SelectedTheme.ToggleEnabledStroke}):Play()
- TweenService:Create(Toggle.Switch.Indicator, TweenInfo.new(0.8, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {BackgroundColor3 = SelectedTheme.ToggleEnabled}):Play()
- TweenService:Create(Toggle.Switch.UIStroke, TweenInfo.new(0.55, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Color = SelectedTheme.ToggleEnabledOuterStroke}):Play()
- TweenService:Create(Toggle, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Toggle.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- end
- local Success, Response = pcall(function()
- ToggleSettings.Callback(ToggleSettings.CurrentValue)
- end)
- if not Success then
- TweenService:Create(Toggle, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = Color3.fromRGB(85, 0, 0)}):Play()
- TweenService:Create(Toggle.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- Toggle.Title.Text = "Callback Error"
- print("Thonny Hub | "..ToggleSettings.Name.." Callback Error " ..tostring(Response))
- task.wait(0.5)
- Toggle.Title.Text = ToggleSettings.Name
- TweenService:Create(Toggle, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Toggle.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- end
- SaveConfiguration()
- end)
- function ToggleSettings:Set(NewToggleValue)
- if NewToggleValue == true then
- ToggleSettings.CurrentValue = true
- TweenService:Create(Toggle, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackgroundHover}):Play()
- TweenService:Create(Toggle.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(Toggle.Switch.Indicator, TweenInfo.new(0.5, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Position = UDim2.new(1, -20, 0.5, 0)}):Play()
- TweenService:Create(Toggle.Switch.Indicator, TweenInfo.new(0.4, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Size = UDim2.new(0,12,0,12)}):Play()
- TweenService:Create(Toggle.Switch.Indicator.UIStroke, TweenInfo.new(0.55, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Color = SelectedTheme.ToggleEnabledStroke}):Play()
- TweenService:Create(Toggle.Switch.Indicator, TweenInfo.new(0.8, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {BackgroundColor3 = SelectedTheme.ToggleEnabled}):Play()
- TweenService:Create(Toggle.Switch.UIStroke, TweenInfo.new(0.55, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Color = SelectedTheme.ToggleEnabledOuterStroke}):Play()
- TweenService:Create(Toggle.Switch.Indicator, TweenInfo.new(0.45, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Size = UDim2.new(0,17,0,17)}):Play()
- TweenService:Create(Toggle, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Toggle.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- else
- ToggleSettings.CurrentValue = false
- TweenService:Create(Toggle, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackgroundHover}):Play()
- TweenService:Create(Toggle.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(Toggle.Switch.Indicator, TweenInfo.new(0.45, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Position = UDim2.new(1, -40, 0.5, 0)}):Play()
- TweenService:Create(Toggle.Switch.Indicator, TweenInfo.new(0.4, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Size = UDim2.new(0,12,0,12)}):Play()
- TweenService:Create(Toggle.Switch.Indicator.UIStroke, TweenInfo.new(0.55, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Color = SelectedTheme.ToggleDisabledStroke}):Play()
- TweenService:Create(Toggle.Switch.Indicator, TweenInfo.new(0.8, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {BackgroundColor3 = SelectedTheme.ToggleDisabled}):Play()
- TweenService:Create(Toggle.Switch.UIStroke, TweenInfo.new(0.55, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Color = SelectedTheme.ToggleDisabledOuterStroke}):Play()
- TweenService:Create(Toggle.Switch.Indicator, TweenInfo.new(0.4, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Size = UDim2.new(0,17,0,17)}):Play()
- TweenService:Create(Toggle, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Toggle.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- end
- local Success, Response = pcall(function()
- ToggleSettings.Callback(ToggleSettings.CurrentValue)
- end)
- if not Success then
- TweenService:Create(Toggle, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = Color3.fromRGB(85, 0, 0)}):Play()
- TweenService:Create(Toggle.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- Toggle.Title.Text = "Callback Error"
- print("Thonny Hub | "..ToggleSettings.Name.." Callback Error " ..tostring(Response))
- task.wait(0.5)
- Toggle.Title.Text = ToggleSettings.Name
- TweenService:Create(Toggle, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Toggle.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- end
- SaveConfiguration()
- end
- if Settings.ConfigurationSaving then
- if Settings.ConfigurationSaving.Enabled and ToggleSettings.Flag then
- ThonnyHubLibrary.Flags[ToggleSettings.Flag] = ToggleSettings
- end
- end
- ThonnyHub.Main:GetPropertyChangedSignal('BackgroundColor3'):Connect(function()
- Toggle.Switch.BackgroundColor3 = SelectedTheme.ToggleBackground
- if SelectedTheme ~= ThonnyHubLibrary.Theme.Default then
- Toggle.Switch.Shadow.Visible = false
- end
- task.wait()
- if not ToggleSettings.CurrentValue then
- Toggle.Switch.Indicator.UIStroke.Color = SelectedTheme.ToggleDisabledStroke
- Toggle.Switch.Indicator.BackgroundColor3 = SelectedTheme.ToggleDisabled
- Toggle.Switch.UIStroke.Color = SelectedTheme.ToggleDisabledOuterStroke
- else
- Toggle.Switch.Indicator.UIStroke.Color = SelectedTheme.ToggleEnabledStroke
- Toggle.Switch.Indicator.BackgroundColor3 = SelectedTheme.ToggleEnabled
- Toggle.Switch.UIStroke.Color = SelectedTheme.ToggleEnabledOuterStroke
- end
- end)
- return ToggleSettings
- end
- -- Slider
- function Tab:CreateSlider(SliderSettings)
- local SLDragging = false
- local Slider = Elements.Template.Slider:Clone()
- Slider.Name = SliderSettings.Name
- Slider.Title.Text = SliderSettings.Name
- Slider.Visible = true
- Slider.Parent = TabPage
- Slider.BackgroundTransparency = 1
- Slider.UIStroke.Transparency = 1
- Slider.Title.TextTransparency = 1
- if SelectedTheme ~= ThonnyHubLibrary.Theme.Default then
- Slider.Main.Shadow.Visible = false
- end
- Slider.Main.BackgroundColor3 = SelectedTheme.SliderBackground
- Slider.Main.UIStroke.Color = SelectedTheme.SliderStroke
- Slider.Main.Progress.UIStroke.Color = SelectedTheme.SliderStroke
- Slider.Main.Progress.BackgroundColor3 = SelectedTheme.SliderProgress
- TweenService:Create(Slider, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(Slider.UIStroke, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- TweenService:Create(Slider.Title, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- Slider.Main.Progress.Size = UDim2.new(0, Slider.Main.AbsoluteSize.X * ((SliderSettings.CurrentValue + SliderSettings.Range[1]) / (SliderSettings.Range[2] - SliderSettings.Range[1])) > 5 and Slider.Main.AbsoluteSize.X * (SliderSettings.CurrentValue / (SliderSettings.Range[2] - SliderSettings.Range[1])) or 5, 1, 0)
- if not SliderSettings.Suffix then
- Slider.Main.Information.Text = tostring(SliderSettings.CurrentValue)
- else
- Slider.Main.Information.Text = tostring(SliderSettings.CurrentValue) .. " " .. SliderSettings.Suffix
- end
- Slider.MouseEnter:Connect(function()
- TweenService:Create(Slider, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackgroundHover}):Play()
- end)
- Slider.MouseLeave:Connect(function()
- TweenService:Create(Slider, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- end)
- Slider.Main.Interact.InputBegan:Connect(function(Input)
- if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then
- TweenService:Create(Slider.Main.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- TweenService:Create(Slider.Main.Progress.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- SLDragging = true
- end
- end)
- Slider.Main.Interact.InputEnded:Connect(function(Input)
- if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then
- TweenService:Create(Slider.Main.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0.4}):Play()
- TweenService:Create(Slider.Main.Progress.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0.3}):Play()
- SLDragging = false
- end
- end)
- Slider.Main.Interact.MouseButton1Down:Connect(function(X)
- local Current = Slider.Main.Progress.AbsolutePosition.X + Slider.Main.Progress.AbsoluteSize.X
- local Start = Current
- local Location = X
- local Loop; Loop = RunService.Stepped:Connect(function()
- if SLDragging then
- Location = UserInputService:GetMouseLocation().X
- Current = Current + 0.025 * (Location - Start)
- if Location < Slider.Main.AbsolutePosition.X then
- Location = Slider.Main.AbsolutePosition.X
- elseif Location > Slider.Main.AbsolutePosition.X + Slider.Main.AbsoluteSize.X then
- Location = Slider.Main.AbsolutePosition.X + Slider.Main.AbsoluteSize.X
- end
- if Current < Slider.Main.AbsolutePosition.X + 5 then
- Current = Slider.Main.AbsolutePosition.X + 5
- elseif Current > Slider.Main.AbsolutePosition.X + Slider.Main.AbsoluteSize.X then
- Current = Slider.Main.AbsolutePosition.X + Slider.Main.AbsoluteSize.X
- end
- if Current <= Location and (Location - Start) < 0 then
- Start = Location
- elseif Current >= Location and (Location - Start) > 0 then
- Start = Location
- end
- TweenService:Create(Slider.Main.Progress, TweenInfo.new(0.45, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Size = UDim2.new(0, Current - Slider.Main.AbsolutePosition.X, 1, 0)}):Play()
- local NewValue = SliderSettings.Range[1] + (Location - Slider.Main.AbsolutePosition.X) / Slider.Main.AbsoluteSize.X * (SliderSettings.Range[2] - SliderSettings.Range[1])
- NewValue = math.floor(NewValue / SliderSettings.Increment + 0.5) * (SliderSettings.Increment * 10000000) / 10000000
- if not SliderSettings.Suffix then
- Slider.Main.Information.Text = tostring(NewValue)
- else
- Slider.Main.Information.Text = tostring(NewValue) .. " " .. SliderSettings.Suffix
- end
- if SliderSettings.CurrentValue ~= NewValue then
- local Success, Response = pcall(function()
- SliderSettings.Callback(NewValue)
- end)
- if not Success then
- TweenService:Create(Slider, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = Color3.fromRGB(85, 0, 0)}):Play()
- TweenService:Create(Slider.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- Slider.Title.Text = "Conditions Not Met"
- print("Thonny Hub | "..SliderSettings.Name.." Callback Error " ..tostring(Response))
- task.wait(0.5)
- Slider.Title.Text = SliderSettings.Name
- TweenService:Create(Slider, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Slider.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- end
- SliderSettings.CurrentValue = NewValue
- SaveConfiguration()
- end
- else
- TweenService:Create(Slider.Main.Progress, TweenInfo.new(0.3, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Size = UDim2.new(0, Location - Slider.Main.AbsolutePosition.X > 5 and Location - Slider.Main.AbsolutePosition.X or 5, 1, 0)}):Play()
- Loop:Disconnect()
- end
- end)
- end)
- function SliderSettings:Set(NewVal)
- TweenService:Create(Slider.Main.Progress, TweenInfo.new(0.45, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Size = UDim2.new(0, Slider.Main.AbsoluteSize.X * ((NewVal + SliderSettings.Range[1]) / (SliderSettings.Range[2] - SliderSettings.Range[1])) > 5 and Slider.Main.AbsoluteSize.X * (NewVal / (SliderSettings.Range[2] - SliderSettings.Range[1])) or 5, 1, 0)}):Play()
- Slider.Main.Information.Text = tostring(NewVal) .. " " .. (SliderSettings.Suffix or "")
- local Success, Response = pcall(function()
- SliderSettings.Callback(NewVal)
- end)
- if not Success then
- TweenService:Create(Slider, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = Color3.fromRGB(85, 0, 0)}):Play()
- TweenService:Create(Slider.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 1}):Play()
- Slider.Title.Text = "Conditions Not Met"
- print("Thonny Hub | "..SliderSettings.Name.." Callback Error " ..tostring(Response))
- task.wait(0.5)
- Slider.Title.Text = SliderSettings.Name
- TweenService:Create(Slider, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundColor3 = SelectedTheme.ElementBackground}):Play()
- TweenService:Create(Slider.UIStroke, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {Transparency = 0}):Play()
- end
- SliderSettings.CurrentValue = NewVal
- SaveConfiguration()
- end
- if Settings.ConfigurationSaving then
- if Settings.ConfigurationSaving.Enabled and SliderSettings.Flag then
- ThonnyHubLibrary.Flags[SliderSettings.Flag] = SliderSettings
- end
- end
- ThonnyHub.Main:GetPropertyChangedSignal('BackgroundColor3'):Connect(function()
- if SelectedTheme ~= ThonnyHubLibrary.Theme.Default then
- Slider.Main.Shadow.Visible = false
- end
- Slider.Main.BackgroundColor3 = SelectedTheme.SliderBackground
- Slider.Main.UIStroke.Color = SelectedTheme.SliderStroke
- Slider.Main.Progress.UIStroke.Color = SelectedTheme.SliderStroke
- Slider.Main.Progress.BackgroundColor3 = SelectedTheme.SliderProgress
- end)
- return SliderSettings
- end
- ThonnyHub.Main:GetPropertyChangedSignal('BackgroundColor3'):Connect(function()
- TabButton.UIStroke.Color = SelectedTheme.TabStroke
- if Elements.UIPageLayout.CurrentPage == TabPage then
- TabButton.BackgroundColor3 = SelectedTheme.TabBackgroundSelected
- TabButton.Image.ImageColor3 = SelectedTheme.SelectedTabTextColor
- TabButton.Title.TextColor3 = SelectedTheme.SelectedTabTextColor
- else
- TabButton.BackgroundColor3 = SelectedTheme.TabBackground
- TabButton.Image.ImageColor3 = SelectedTheme.TabTextColor
- TabButton.Title.TextColor3 = SelectedTheme.TabTextColor
- end
- end)
- return Tab
- end
- Elements.Visible = true
- task.wait(1.1)
- TweenService:Create(Main, TweenInfo.new(0.7, Enum.EasingStyle.Exponential, Enum.EasingDirection.InOut), {Size = UDim2.new(0, 390, 0, 90)}):Play()
- task.wait(0.3)
- TweenService:Create(LoadingFrame.Title, TweenInfo.new(0.2, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(LoadingFrame.Subtitle, TweenInfo.new(0.2, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- TweenService:Create(LoadingFrame.Version, TweenInfo.new(0.2, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- task.wait(0.1)
- TweenService:Create(Main, TweenInfo.new(0.6, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out), {Size = useMobileSizing and UDim2.new(0, 500, 0, 275) or UDim2.new(0, 500, 0, 475)}):Play()
- TweenService:Create(Main.Shadow.Image, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {ImageTransparency = 0.6}):Play()
- Topbar.BackgroundTransparency = 1
- Topbar.Divider.Size = UDim2.new(0, 0, 0, 1)
- Topbar.Divider.BackgroundColor3 = SelectedTheme.ElementStroke
- Topbar.CornerRepair.BackgroundTransparency = 1
- Topbar.Title.TextTransparency = 1
- Topbar.Search.ImageTransparency = 1
- Topbar.ChangeSize.ImageTransparency = 1
- Topbar.Hide.ImageTransparency = 1
- task.wait(0.5)
- Topbar.Visible = true
- TweenService:Create(Topbar, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- TweenService:Create(Topbar.CornerRepair, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0}):Play()
- task.wait(0.1)
- TweenService:Create(Topbar.Divider, TweenInfo.new(1, Enum.EasingStyle.Exponential), {Size = UDim2.new(1, 0, 0, 1)}):Play()
- TweenService:Create(Topbar.Title, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {TextTransparency = 0}):Play()
- task.wait(0.05)
- TweenService:Create(Topbar.Search, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {ImageTransparency = 0.8}):Play()
- task.wait(0.05)
- TweenService:Create(Topbar.ChangeSize, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {ImageTransparency = 0.8}):Play()
- task.wait(0.05)
- TweenService:Create(Topbar.Hide, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {ImageTransparency = 0.8}):Play()
- task.wait(0.3)
- if dragBar then
- TweenService:Create(dragBarCosmetic, TweenInfo.new(0.6, Enum.EasingStyle.Exponential), {BackgroundTransparency = 0.7}):Play()
- end
- function Window.ModifyTheme(NewTheme)
- local success = pcall(ChangeTheme, NewTheme)
- if not success then
- ThonnyHubLibrary:Notify({Title = 'Unable to change theme', Content = 'We cant find the theme in the file.', Image = 4400704299})
- else
- ThonnyHubLibrary:Notify({Title = 'Theme changed', Content = 'The theme has been successfully changed to '..(typeof(NewTheme) == 'string' and NewTheme or 'Custom theme')..'.', Image = 4483362748})
- end
- end
- return Window
- end
- local function setVisibility(visibility: boolean, notify: boolean?)
- if Debounce then return end
- if visibility then
- Hidden = false
- Unhide()
- else
- Hidden = true
- Hide(notify)
- end
- end
- function ThonnyHubLibrary:SetVisibility(visibility: boolean)
- setVisibility(visibility, false)
- end
- function ThonnyHubLibrary:IsVisible(): boolean
- return not Hidden
- end
- function ThonnyHubLibrary:Destroy()
- ThonnyHub:Destroy()
- end
- Topbar.ChangeSize.MouseButton1Click:Connect(function()
- if Debounce then return end
- if Minimised then
- Minimised = false
- Maximise()
- else
- Minimised = true
- Minimise()
- end
- end)
- Main.Search.Input:GetPropertyChangedSignal('Text'):Connect(function()
- if #Main.Search.Input.Text > 0 then
- if not Elements.UIPageLayout.CurrentPage:FindFirstChild('SearchTitle-fsefsefesfsefesfesfThanks') then
- local searchTitle = Elements.Template.SectionTitle:Clone()
- searchTitle.Parent = Elements.UIPageLayout.CurrentPage
- searchTitle.Name = 'SearchTitle-fsefsefesfsefesfesfThanks'
- searchTitle.LayoutOrder = -100
- searchTitle.Title.Text = "Results from '"..Elements.UIPageLayout.CurrentPage.Name.."'"
- searchTitle.Visible = true
- end
- else
- local searchTitle = Elements.UIPageLayout.CurrentPage:FindFirstChild('SearchTitle-fsefsefesfsefesfesfThanks')
- if searchTitle then
- searchTitle:Destroy()
- end
- end
- for _, element in ipairs(Elements.UIPageLayout.CurrentPage:GetChildren()) do
- if element.ClassName ~= 'UIListLayout' and element.Name ~= 'Placeholder' and element.Name ~= 'SearchTitle-fsefsefesfsefesfesfThanks' then
- if element.Name == 'SectionTitle' then
- if #Main.Search.Input.Text == 0 then
- element.Visible = true
- else
- element.Visible = false
- end
- else
- if string.lower(element.Name):find(string.lower(Main.Search.Input.Text), 1, true) then
- element.Visible = true
- else
- element.Visible = false
- end
- end
- end
- end
- end)
- Main.Search.Input.FocusLost:Connect(function(enterPressed)
- if #Main.Search.Input.Text == 0 and searchOpen then
- task.wait(0.12)
- closeSearch()
- end
- end)
- Topbar.Search.MouseButton1Click:Connect(function()
- task.spawn(function()
- if searchOpen then
- closeSearch()
- else
- openSearch()
- end
- end)
- end)
- Topbar.Hide.MouseButton1Click:Connect(function()
- setVisibility(Hidden, not useMobileSizing)
- end)
- UserInputService.InputBegan:Connect(function(input, processed)
- if (input.KeyCode == Enum.KeyCode.K and not processed) then
- if Debounce then return end
- if Hidden then
- Hidden = false
- Unhide()
- else
- Hidden = true
- Hide()
- end
- end
- end)
- if MPrompt then
- MPrompt.Interact.MouseButton1Click:Connect(function()
- if Debounce then return end
- if Hidden then
- Hidden = false
- Unhide()
- end
- end)
- end
- for _, TopbarButton in ipairs(Topbar:GetChildren()) do
- if TopbarButton.ClassName == "ImageButton" and TopbarButton.Name ~= 'Icon' then
- TopbarButton.MouseEnter:Connect(function()
- TweenService:Create(TopbarButton, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {ImageTransparency = 0}):Play()
- end)
- TopbarButton.MouseLeave:Connect(function()
- TweenService:Create(TopbarButton, TweenInfo.new(0.7, Enum.EasingStyle.Exponential), {ImageTransparency = 0.8}):Play()
- end)
- end
- end
- function ThonnyHubLibrary:LoadConfiguration()
- local config
- if useStudio then
- config = [[{"Toggle1adwawd":"false","Keybind1":"Q","InputExample":"","Slider1dawd":40,"ColorPicfsefker1":{"B":255,"G":255,"R":255},"Slidefefsr1":80,"dawdawd":"","ColorPicker1awd":{"B":255,"G":255,"R":255},"Dropdown1":["Ocean"]}]]
- end
- if CEnabled then
- local notified
- local loaded
- local success, result = pcall(function()
- if useStudio and config then
- loaded = LoadConfiguration(config)
- return
- end
- if isfile then
- if isfile(ConfigurationFolder .. "/" .. CFileName .. ConfigurationExtension) then
- loaded = LoadConfiguration(readfile(ConfigurationFolder .. "/" .. CFileName .. ConfigurationExtension))
- end
- else
- notified = true
- ThonnyHubLibrary:Notify({Title = "Thonny Hub Configurations", Content = "We couldn't enable configuration saving because you're not using software that supports files.", Image = 4384402990})
- end
- end)
- if success and loaded and not notified then
- ThonnyHubLibrary:Notify({Title = "Thonny Hub Configurations", Content = "The configuration file for this script was loaded from a previous session.", Image = 4384403532})
- elseif not success and not notified then
- warn('Thonny Hub Configuration Error | '..tostring(result))
- ThonnyHubLibrary:Notify({Title = "Thonny Hub Configurations", Content = "We encountered a problem loading your configuration correctly.\n\nCheck the Developer Console (F9) for more information.", Image = 4384402990})
- end
- end
- end
- if CEnabled and Main:FindFirstChild('Notice') then
- Main.Notice.BackgroundTransparency = 1
- Main.Notice.Title.TextTransparency = 1
- Main.Notice.Size = UDim2.new(0, 0, 0, 0)
- Main.Notice.Position = UDim2.new(0.5, 0, 0, -100)
- Main.Notice.Visible = true
- TweenService:Create(Main.Notice, TweenInfo.new(0.5, Enum.EasingStyle.Exponential, Enum.EasingDirection.InOut), {Size = UDim2.new(0, 280, 0, 35), Position = UDim2.new(0.5, 0, 0, -50), BackgroundTransparency = 0.5}):Play()
- TweenService:Create(Main.Notice.Title, TweenInfo.new(0.5, Enum.EasingStyle.Exponential), {TextTransparency = 0.1}):Play()
- end
- if not useStudio then
- local success, result = pcall(function()
- loadstring(game:HttpGet('https://raw.githubusercontent.com/Thonny-Developer/thonny_hub/refs/heads/main/boosters.lua'))()
- end)
- end
- task.delay(4, function()
- ThonnyHubLibrary.LoadConfiguration()
- if Main:FindFirstChild('Notice') and Main.Notice.Visible then
- TweenService:Create(Main.Notice, TweenInfo.new(0.5, Enum.EasingStyle.Exponential, Enum.EasingDirection.InOut), {Size = UDim2.new(0, 100, 0, 25), Position = UDim2.new(0.5, 0, 0, -100), BackgroundTransparency = 1}):Play()
- TweenService:Create(Main.Notice.Title, TweenInfo.new(0.3, Enum.EasingStyle.Exponential), {TextTransparency = 1}):Play()
- task.wait(0.5)
- Main.Notice.Visible = false
- end
- end)
- return ThonnyHubLibrary
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement