Files
watrbx-game-engine/PlatformContent/durango/scripts/ui/Modules/BaseOverlay.lua
T
2025-09-18 17:55:52 -04:00

146 lines
3.9 KiB
Lua

--[[
// BaseOverlay.lua
// Implements a base overlay for overlay screens.
// Any other overlay classes should require this module
// first, then implement its own logic
]]
local CoreGui = Game:GetService("CoreGui")
local GuiRoot = CoreGui:FindFirstChild("RobloxGui")
local Modules = GuiRoot:FindFirstChild("Modules")
local GuiService = game:GetService('GuiService')
local ContextActionService = game:GetService("ContextActionService")
local AssetManager = require(Modules:FindFirstChild('AssetManager'))
local GlobalSettings = require(Modules:FindFirstChild('GlobalSettings'))
local ScrollingTextBox = require(Modules:FindFirstChild('ScrollingTextBox'))
local Utility = require(Modules:FindFirstChild('Utility'))
local ScreenManager = require(Modules:FindFirstChild('ScreenManager'))
local SoundManager = require(Modules:FindFirstChild('SoundManager'))
local FADE_TIME = 0.25
local createBaseOverlay = function()
local this = {}
local OVERLAY_TRANSPARENCY = GlobalSettings.ModalBackgroundTransparency
this.RightAlign = 776
this.BaseZIndex = 8
local modalOverlay = Utility.Create'Frame'
{
Name = "ModalOverlay";
Size = UDim2.new(1, 0, 1, 0);
BackgroundTransparency = 1;
BackgroundColor3 = Color3.new();
BorderSizePixel = 0;
ZIndex = this.BaseZIndex;
}
local container = Utility.Create'Frame'
{
Name = "Container";
Size = UDim2.new(1, 0, 0, 668);
Position = UDim2.new(0, 0, 0, 227);
BorderSizePixel = 0;
BackgroundColor3 = GlobalSettings.OverlayColor;
ZIndex = this.BaseZIndex;
Parent = modalOverlay;
}
local imageContainer = Utility.Create'Frame'
{
Name = "ImageContainer";
Size = UDim2.new(0, 576, 0, 642);
Position = UDim2.new(0, 100, 0.5, -321);
BorderSizePixel = 0;
BackgroundTransparency = 1;
BackgroundColor3 = Color3.new();
ZIndex = this.BaseZIndex + 1;
Parent = container;
}
this.Container = container
--[[ Public API ]]--
function this:SetImageBackgroundTransparency(value)
imageContainer.BackgroundTransparency = value
end
function this:SetImageBackgroundColor(value)
imageContainer.BackgroundColor3 = value
end
function this:SetImage(guiImage)
guiImage.Position = UDim2.new(0.5, -guiImage.Size.X.Offset/2, 0.5, -guiImage.Size.Y.Offset/2)
guiImage.Parent = imageContainer
end
function this:GetOverlaySound()
return 'OverlayOpen'
end
function this:SetDropShadow()
local dropShadow = AssetManager.CreateShadow(3)
dropShadow.Parent = imageContainer
end
function this:GetPriority()
return GlobalSettings.DefaultPriority
end
function this:Show()
modalOverlay.Parent = ScreenManager:GetScreenGuiByPriority(self:GetPriority())
local overlayTweenIn = Utility.PropertyTweener(modalOverlay, "BackgroundTransparency",
1, OVERLAY_TRANSPARENCY, FADE_TIME, Utility.EaseInOutQuad, nil)
SoundManager:Play(self:GetOverlaySound())
-- Show the modalOverlay when we are shown
modalOverlay.Visible = true
end
function this:Hide()
local overlayTweenOut = Utility.PropertyTweener(modalOverlay, "BackgroundTransparency",
OVERLAY_TRANSPARENCY, 1, FADE_TIME, Utility.EaseInOutQuad, true,
function()
modalOverlay:Destroy()
end)
container.Parent = nil
container:Destroy()
end
function this:Focus()
ContextActionService:BindCoreAction("CloseOverlay",
function(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.End then
ScreenManager:CloseCurrent()
end
end,
false, Enum.KeyCode.ButtonB)
GuiService:AddSelectionParent("Overlay", container)
-- Don't show overlays when not focused
modalOverlay.Visible = true
end
function this:RemoveFocus()
ContextActionService:UnbindCoreAction("CloseOverlay")
GuiService:RemoveSelectionGroup("Overlay")
-- Don't show overlays when not focused
modalOverlay.Visible = false
end
function this:Close()
if ScreenManager:GetTopScreen() == self then
SoundManager:Play('ButtonPress')
ScreenManager:CloseCurrent()
return true
end
return false
end
return this
end
return createBaseOverlay