219 lines
7.0 KiB
Lua
219 lines
7.0 KiB
Lua
--[[
|
|
// ImageOverlay.lua
|
|
// Creates an image overlay. Used with the game details page to see more thumbnails
|
|
]]
|
|
local CoreGui = game:GetService("CoreGui")
|
|
local GuiRoot = CoreGui:FindFirstChild("RobloxGui")
|
|
local Modules = GuiRoot:FindFirstChild("Modules")
|
|
local ShellModules = Modules:FindFirstChild("Shell")
|
|
local GuiService = game:GetService('GuiService')
|
|
local ContextActionService = game:GetService("ContextActionService")
|
|
|
|
local GlobalSettings = require(ShellModules:FindFirstChild('GlobalSettings'))
|
|
local Utility = require(ShellModules:FindFirstChild('Utility'))
|
|
local SoundManager = require(ShellModules:FindFirstChild('SoundManager'))
|
|
local ScreenManager = require(ShellModules:FindFirstChild('ScreenManager'))
|
|
local ThumbnailLoader = require(ShellModules:FindFirstChild('ThumbnailLoader'))
|
|
local Analytics = require(ShellModules:FindFirstChild('Analytics'))
|
|
|
|
local createImageOverlay = function(thumbIds, selectedThumbIndex)
|
|
local this = {}
|
|
|
|
local thumbCount = #thumbIds
|
|
if selectedThumbIndex < 1 or selectedThumbIndex > thumbCount then
|
|
Utility.DebugLog("ImageOverlay: Invalid index to selectedThumbIndex")
|
|
return
|
|
end
|
|
|
|
local thumbnailImages = nil
|
|
local currentSelectedIndex = selectedThumbIndex
|
|
|
|
local shield = Utility.Create'Frame'
|
|
{
|
|
Name = "Shield";
|
|
Size = UDim2.new(1, 0, 1, 0);
|
|
BackgroundTransparency = 1;
|
|
BackgroundColor3 = Color3.new(0, 0, 0);
|
|
BorderSizePixel = 0;
|
|
}
|
|
local container = Utility.Create'Frame'
|
|
{
|
|
Name = "ImageOverlayContainer";
|
|
Size = UDim2.new(1, 0, 0, 668);
|
|
Position = UDim2.new(0, 0, 0, 226);
|
|
BorderSizePixel = 0;
|
|
BackgroundColor3 = GlobalSettings.OverlayColor;
|
|
}
|
|
local dummySelectionImage = Utility.Create'TextButton'
|
|
{
|
|
Name = "DummySelectionImage";
|
|
Size = UDim2.new(0, 0, 0, 0);
|
|
Visible = false;
|
|
}
|
|
local imageSelection = Utility.Create'Frame'
|
|
{
|
|
Name = "imageSelection";
|
|
Size = UDim2.new(0, 1030, 0, 580);
|
|
Position = UDim2.new(0.5, -1030/2, 0.5, -580/2);
|
|
BackgroundTransparency = 1;
|
|
Selectable = true;
|
|
SelectionImageObject = dummySelectionImage;
|
|
Parent = container;
|
|
SoundManager:CreateSound('MoveSelection');
|
|
}
|
|
local leftArrowImage = Utility.Create'ImageButton'
|
|
{
|
|
Name = "LeftArrowImage";
|
|
Size = UDim2.new(0, 26, 0, 45);
|
|
Position = UDim2.new(0.5, imageSelection.Position.X.Offset - 18 - 75, 0.5, -45/2);
|
|
BackgroundTransparency = 1;
|
|
Image = 'rbxasset://textures/ui/Settings/Slider/Left.png';
|
|
SelectionImageObject = dummySelectionImage;
|
|
Parent = container;
|
|
SoundManager:CreateSound('MoveSelection');
|
|
}
|
|
local rightArrowImage = leftArrowImage:Clone()
|
|
rightArrowImage.Name = "RightArrowImage"
|
|
rightArrowImage.Position = UDim2.new(0.5, imageSelection.Position.X.Offset + imageSelection.Size.X.Offset + 75, 0.5, -45/2)
|
|
rightArrowImage.Image = 'rbxasset://textures/ui/Settings/Slider/Right.png';
|
|
rightArrowImage.Parent = container
|
|
|
|
local selectedText = Utility.Create'TextLabel'
|
|
{
|
|
Name = "SelectedText";
|
|
Size = UDim2.new();
|
|
Position = UDim2.new(0.5, 0, 1, -24);
|
|
BackgroundTransparency = 1;
|
|
Font = GlobalSettings.RegularFont;
|
|
FontSize = GlobalSettings.ButtonSize;
|
|
TextColor3 = GlobalSettings.WhiteTextColor;
|
|
Text = "";
|
|
Parent = container;
|
|
}
|
|
|
|
local function createThumbImages()
|
|
if not thumbnailImages then
|
|
thumbnailImages = {}
|
|
for i = 1, #thumbIds do
|
|
local image = Utility.Create'ImageLabel'
|
|
{
|
|
Name = tostring(i);
|
|
Size = imageSelection.Size;
|
|
Position = imageSelection.Position;
|
|
BackgroundTransparency = 1;
|
|
Parent = container;
|
|
SoundManager:CreateSound('MoveSelection');
|
|
}
|
|
local loader = ThumbnailLoader:Create(image, thumbIds[i],
|
|
ThumbnailLoader.Sizes.Large, ThumbnailLoader.AssetType.Icon, false)
|
|
spawn(function()
|
|
loader:LoadAsync(true, true, { ZIndex = image.ZIndex } )
|
|
end)
|
|
thumbnailImages[i] = image
|
|
end
|
|
end
|
|
end
|
|
|
|
local function setImagePositions(startIndex)
|
|
for i = 1, #thumbnailImages do
|
|
local image = thumbnailImages[i]
|
|
local xScale = i == startIndex and 0.5 or 1.5
|
|
image.Position = UDim2.new(xScale, -image.Size.X.Offset / 2, 0.5, image.Position.Y.Offset)
|
|
end
|
|
end
|
|
|
|
local function tweenImagePositions(currentIndex, nextIndex, direction)
|
|
if currentIndex == nextIndex then return end
|
|
local nextStartPosition = direction * 1.5
|
|
local currentEndPosition = -nextStartPosition
|
|
--
|
|
local currentImage = thumbnailImages[currentIndex]
|
|
local nextImage = thumbnailImages[nextIndex]
|
|
nextImage.Position = UDim2.new(nextStartPosition, -nextImage.Size.X.Offset / 2, 0.5, nextImage.Position.Y.Offset)
|
|
--
|
|
Utility.SetSelectedCoreObject(imageSelection)
|
|
Utility.TweenPositionOrSet(currentImage, UDim2.new(currentEndPosition, -currentImage.Size.X.Offset / 2, 0.5, currentImage.Position.Y.Offset),
|
|
Enum.EasingDirection.InOut, Enum.EasingStyle.Quad, 0.25, true)
|
|
Utility.TweenPositionOrSet(nextImage, UDim2.new(0.5, -nextImage.Size.X.Offset / 2, 0.5, nextImage.Position.Y.Offset),
|
|
Enum.EasingDirection.InOut, Enum.EasingStyle.Quad, 0.25, true)
|
|
selectedText.Text = tostring(nextIndex)..'/'..tostring(#thumbnailImages)
|
|
end
|
|
|
|
local function onArrowSelected(direction)
|
|
local nextIndex = nil
|
|
nextIndex = currentSelectedIndex + direction
|
|
if nextIndex < 1 then
|
|
nextIndex = thumbCount
|
|
elseif nextIndex > thumbCount then
|
|
nextIndex = 1
|
|
end
|
|
if nextIndex then
|
|
tweenImagePositions(currentSelectedIndex, nextIndex, direction)
|
|
currentSelectedIndex = nextIndex
|
|
end
|
|
end
|
|
|
|
--[[ Public API ]]--
|
|
function this:GetAnalyticsInfo()
|
|
return
|
|
{
|
|
[Analytics.WidgetNames('WidgetId')] = Analytics.WidgetNames('ImageOverlayId');
|
|
Selected = tostring(currentSelectedIndex).."/"..tostring(thumbCount);
|
|
}
|
|
end
|
|
|
|
function this:GetPriority()
|
|
return GlobalSettings.OverlayPriority
|
|
end
|
|
|
|
function this:Show()
|
|
createThumbImages()
|
|
setImagePositions(currentSelectedIndex)
|
|
selectedText.Text = tostring(currentSelectedIndex).."/"..tostring(thumbCount)
|
|
if thumbCount == 1 then
|
|
leftArrowImage.Visible = false
|
|
rightArrowImage.Visible = false
|
|
end
|
|
|
|
shield.Parent = ScreenManager:GetScreenGuiByPriority(self:GetPriority())
|
|
container.Parent = shield.Parent
|
|
local shieldTweenIn = Utility.PropertyTweener(shield, "BackgroundTransparency", 1, 0.3, 0.25, Utility.EaseInOutQuad, nil)
|
|
end
|
|
|
|
function this:Hide()
|
|
local shieldTweenOut = Utility.PropertyTweener(shield, "BackgroundTransparency", 0.3, 1, 0.25, Utility.EaseInOutQuad, true, function()
|
|
shield:Destroy()
|
|
end)
|
|
container:Destroy()
|
|
end
|
|
|
|
function this:Focus()
|
|
ContextActionService:BindCoreAction("CloseImageOverlay",
|
|
function(actionName, inputState, inputObject)
|
|
if inputState == Enum.UserInputState.End then
|
|
ScreenManager:CloseCurrent()
|
|
end
|
|
end,
|
|
false, Enum.KeyCode.ButtonB)
|
|
|
|
leftArrowImage.SelectionGained:connect(function()
|
|
onArrowSelected(-1)
|
|
end)
|
|
rightArrowImage.SelectionGained:connect(function()
|
|
onArrowSelected(1)
|
|
end)
|
|
|
|
GuiService:AddSelectionParent("ImageOverlay", container)
|
|
Utility.SetSelectedCoreObject(imageSelection)
|
|
end
|
|
|
|
function this:RemoveFocus()
|
|
ContextActionService:UnbindCoreAction("CloseImageOverlay")
|
|
GuiService:RemoveSelectionGroup("ImageOverlay")
|
|
end
|
|
|
|
return this
|
|
end
|
|
|
|
return createImageOverlay
|