Clients/Client2018/content/internal/AppShell/Modules/Shell/LoadingWidget.lua

103 lines
2.3 KiB
Lua

--[[
// LoadingWidget.lua
// Created by Kip Turner
// Copyright Roblox 2015
]]
local CoreGui = game:GetService("CoreGui")
local GuiRoot = CoreGui:FindFirstChild("RobloxGui")
local Modules = GuiRoot:FindFirstChild("Modules")
local ShellModules = Modules:FindFirstChild("Shell")
local Utility = require(ShellModules:FindFirstChild('Utility'))
local function CreateLoadingWidget(properties, loadingFunctions)
properties = properties or {}
loadingFunctions = loadingFunctions or {}
local this = {}
local completedFunctions = {}
local cancelled = false
local ImageTransparency = properties.ImageTransparency or 0
local finishedConn = Utility.Signal()
local loadIcon = Utility.Create'ImageLabel'
{
Name = "LoadIcon";
BackgroundTransparency = 1;
Image = 'rbxasset://textures/ui/Shell/Icons/LoadingSpinner@1080.png';
Size = properties.Size or UDim2.new(0, 100, 0, 100);
ZIndex = properties.ZIndex or 7;
Parent = properties.Parent;
ImageTransparency = ImageTransparency;
AnchorPoint = Vector2.new(0.5, 0.5);
Position = properties.Position or UDim2.new(0.5, 0, 0.5, 0);
}
if properties.Visible == false then
loadIcon.Visible = false
end
local function isLoadingComplete()
return #completedFunctions == #loadingFunctions
end
function this:AwaitFinished()
if isLoadingComplete() then
return true
end
finishedConn:wait()
if cancelled then
return false
end
return true
end
function this:Cleanup()
loadIcon.Parent = nil
loadIcon.ImageTransparency = 1
loadIcon:Destroy()
cancelled = true
end
function this:SetTransparency(transparency)
ImageTransparency = transparency
end
function this:SetParent(parent)
loadIcon.Parent = parent
end
function this:GetTransparency()
return ImageTransparency
end
-- Run it!
for _, loadingFunction in pairs(loadingFunctions) do
spawn(function()
loadingFunction()
table.insert(completedFunctions, loadingFunction)
end)
end
spawn(function()
local t = tick()
while not (cancelled or isLoadingComplete()) do
local now = tick()
local rotation = (now - t) * 360
if loadIcon.Parent then
loadIcon.ImageTransparency = ImageTransparency
loadIcon.Rotation = loadIcon.Rotation + rotation
end
t = now
wait()
end
finishedConn.fire()
end)
return this
end
return CreateLoadingWidget