add gs
This commit is contained in:
@@ -0,0 +1,435 @@
|
||||
--[[
|
||||
// ConfirmPrompt.lua
|
||||
// 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 ContextActionService = game:GetService("ContextActionService")
|
||||
local GuiService = game:GetService('GuiService')
|
||||
|
||||
local UserDataModule = require(ShellModules:FindFirstChild('UserData'))
|
||||
|
||||
local AssetManager = require(ShellModules:FindFirstChild('AssetManager'))
|
||||
local GlobalSettings = require(ShellModules:FindFirstChild('GlobalSettings'))
|
||||
local Utility = require(ShellModules:FindFirstChild('Utility'))
|
||||
local Strings = require(ShellModules:FindFirstChild('LocalizedStrings'))
|
||||
|
||||
local ScreenManager = require(ShellModules:FindFirstChild('ScreenManager'))
|
||||
local SoundManager = require(ShellModules:FindFirstChild('SoundManager'))
|
||||
local CurrencyWidgetModule = require(ShellModules:FindFirstChild('CurrencyWidget'))
|
||||
|
||||
local Analytics = require(ShellModules:FindFirstChild('Analytics'))
|
||||
|
||||
local MOCKUP_WIDTH = 1920
|
||||
local MOCKUP_HEIGHT = 1080
|
||||
local CONTENT_WIDTH = 1920
|
||||
local CONTENT_HEIGHT = 690
|
||||
local PACKAGE_CONTAINER_WIDTH = 780
|
||||
local PACKAGE_CONTAINER_HEIGHT = 690
|
||||
local PACKAGE_BACKGROUND_WIDTH = 580
|
||||
local PACKAGE_BACKGROUND_HEIGHT = 640
|
||||
|
||||
local CONTENT_POSITION = Vector2.new(0, 225)
|
||||
|
||||
local DETAILS_CONTAINER_WIDTH = 1140 --CONTENT_WIDTH - PACKAGE_CONTAINER_WIDTH
|
||||
local DETAILS_CONTAINER_HEIGHT = 690
|
||||
|
||||
local BUY_BUTTON_WIDTH = 320
|
||||
local BUY_BUTTON_HEIGHT = 64
|
||||
|
||||
local BUY_BUTTON_OFFSET = Vector2.new(0, -50)
|
||||
|
||||
local function CreateConfirmPrompt(confirmDetails, properties)
|
||||
local this = {}
|
||||
|
||||
properties = properties or {}
|
||||
|
||||
local MyParent = nil
|
||||
|
||||
local InFocus = false
|
||||
local Result = nil
|
||||
local ResultEvent = Utility.Signal()
|
||||
|
||||
local OnResultCallbacks = {}
|
||||
|
||||
local productName = confirmDetails.ProductName
|
||||
|
||||
local ConfirmPrompt = Utility.Create'Frame'
|
||||
{
|
||||
Name = "ConfirmPrompt";
|
||||
Size = UDim2.new(1, 0, 1, 0);
|
||||
BackgroundTransparency = 1;
|
||||
BackgroundColor3 = GlobalSettings.ModalBackgroundColor;
|
||||
BorderSizePixel = 0;
|
||||
}
|
||||
|
||||
local ContentContainer = Utility.Create'Frame'
|
||||
{
|
||||
Name = "ContentContainer";
|
||||
Size = UDim2.new(CONTENT_WIDTH/MOCKUP_WIDTH, 0, CONTENT_HEIGHT/MOCKUP_HEIGHT, 0);
|
||||
Position = UDim2.new(CONTENT_POSITION.x/MOCKUP_WIDTH, 0, CONTENT_POSITION.y/MOCKUP_HEIGHT, 0);
|
||||
BackgroundTransparency = 0;
|
||||
BackgroundColor3 = GlobalSettings.OverlayColor;
|
||||
BorderSizePixel = 0;
|
||||
Parent = ConfirmPrompt;
|
||||
}
|
||||
|
||||
local PackageContainer = Utility.Create'Frame'
|
||||
{
|
||||
Name = "PackageContainer";
|
||||
Size = UDim2.new(PACKAGE_CONTAINER_WIDTH/CONTENT_WIDTH, 0, PACKAGE_CONTAINER_HEIGHT/CONTENT_HEIGHT, 0);
|
||||
Position = UDim2.new(0,0,0,0);
|
||||
BackgroundTransparency = 1;
|
||||
BorderSizePixel = 0;
|
||||
Parent = ContentContainer;
|
||||
}
|
||||
local PackageBackground = Utility.Create'Frame'
|
||||
{
|
||||
Name = "PackageBackground";
|
||||
Size = UDim2.new(PACKAGE_BACKGROUND_WIDTH/PACKAGE_CONTAINER_WIDTH, 0, PACKAGE_BACKGROUND_HEIGHT/CONTENT_HEIGHT, 0);
|
||||
BackgroundTransparency = 0;
|
||||
BackgroundColor3 = GlobalSettings.ForegroundGreyColor;
|
||||
BorderSizePixel = 0;
|
||||
ZIndex = 2;
|
||||
Parent = PackageContainer;
|
||||
AssetManager.CreateShadow(1);
|
||||
AnchorPoint = Vector2.new(0.5, 0.5);
|
||||
Position = UDim2.new(0.5, 0, 0.5, 0);
|
||||
}
|
||||
local PackageImage = Utility.Create'ImageLabel'
|
||||
{
|
||||
Name = 'PackageImage';
|
||||
Size = UDim2.new(1,0,1,0);
|
||||
Image = '';
|
||||
BackgroundTransparency = 1;
|
||||
ZIndex = PackageBackground.ZIndex;
|
||||
Parent = PackageBackground;
|
||||
};
|
||||
if confirmDetails and confirmDetails.ProductImage then
|
||||
PackageImage.Image = confirmDetails.ProductImage
|
||||
else
|
||||
PackageBackground.Visible = false
|
||||
end
|
||||
|
||||
|
||||
local DetailsContainer = Utility.Create'Frame'
|
||||
{
|
||||
Name = "DetailsContainer";
|
||||
Size = UDim2.new(DETAILS_CONTAINER_WIDTH/CONTENT_WIDTH, 0, DETAILS_CONTAINER_HEIGHT/CONTENT_HEIGHT, 0);
|
||||
Position = UDim2.new(PACKAGE_CONTAINER_WIDTH/CONTENT_WIDTH,0,0,0);
|
||||
BackgroundTransparency = 1;
|
||||
BorderSizePixel = 0;
|
||||
Parent = ContentContainer;
|
||||
}
|
||||
local ConfirmTitle = Utility.Create'TextLabel'
|
||||
{
|
||||
Name = 'ConfirmTitle';
|
||||
Text = Strings:LocalizedString('ConfirmPurchaseTitle');
|
||||
Position = UDim2.new(0, 0, 0, 66);
|
||||
Size = UDim2.new(1,0,0,25);
|
||||
TextXAlignment = 'Left';
|
||||
TextColor3 = GlobalSettings.WhiteTextColor;
|
||||
Font = GlobalSettings.HeadingFont;
|
||||
FontSize = GlobalSettings.HeaderSize;
|
||||
BackgroundTransparency = 1;
|
||||
Parent = DetailsContainer;
|
||||
};
|
||||
|
||||
local formattedPackageCost = "";
|
||||
if confirmDetails.Cost then
|
||||
if type(confirmDetails.Cost) == 'string' then
|
||||
formattedPackageCost = confirmDetails.Cost
|
||||
else
|
||||
formattedPackageCost = (confirmDetails.CurrencySymbol or '') .. Utility.FormatNumberString(confirmDetails.Cost)
|
||||
end
|
||||
end
|
||||
|
||||
local RobuxIcon = Utility.Create'ImageLabel'
|
||||
{
|
||||
Name = 'RobuxIcon';
|
||||
Position = UDim2.new(0,0,0,125);
|
||||
Size = UDim2.new(0,(properties.ShowRobuxIcon == true) and 50 or 0,0,50);
|
||||
BackgroundTransparency = 1;
|
||||
Parent = DetailsContainer;
|
||||
};
|
||||
if confirmDetails.Currency == "Robux" then
|
||||
RobuxIcon.Image = "rbxasset://textures/ui/Shell/Icons/ROBUXIcon@1080.png"
|
||||
RobuxIcon.Size = UDim2.new(0,42,0,42)
|
||||
end
|
||||
local PackageCost = Utility.Create'TextLabel'
|
||||
{
|
||||
Name = 'PackageCost';
|
||||
Text = formattedPackageCost;
|
||||
Size = UDim2.new(0,0,1,0);
|
||||
Position = UDim2.new(1.3,0,0,0);
|
||||
TextXAlignment = 'Left';
|
||||
TextColor3 = GlobalSettings.GreenTextColor;
|
||||
Font = GlobalSettings.RegularFont;
|
||||
FontSize = GlobalSettings.HeaderSize;
|
||||
BackgroundTransparency = 1;
|
||||
Parent = RobuxIcon;
|
||||
};
|
||||
|
||||
if confirmDetails and confirmDetails.Cost and confirmDetails.Cost == 0 then
|
||||
PackageCost.Text = Strings:LocalizedString('FreeWord')
|
||||
end
|
||||
|
||||
|
||||
local areYouSurePhrase;
|
||||
if confirmDetails.Cost and confirmDetails.Cost == 0 then
|
||||
areYouSurePhrase = string.format(Strings:LocalizedString('AreYouSureTakePhrase'), tostring(productName))
|
||||
elseif properties.ConfirmWithPrice then
|
||||
areYouSurePhrase = string.format(Strings:LocalizedString('AreYouSureWithPricePhrase'), tostring(productName), tostring(formattedPackageCost))
|
||||
else
|
||||
areYouSurePhrase = string.format(Strings:LocalizedString('AreYouSurePhrase'), tostring(productName))
|
||||
end
|
||||
|
||||
local ConfirmItemDetail = Utility.Create'TextLabel'
|
||||
{
|
||||
Name = 'ConfirmItemDetail';
|
||||
Text = areYouSurePhrase;
|
||||
Position = UDim2.new(0, 0, 0, 205);
|
||||
Size = UDim2.new(1,0,0,25);
|
||||
TextXAlignment = 'Left';
|
||||
TextColor3 = GlobalSettings.WhiteTextColor;
|
||||
Font = GlobalSettings.LightFont;
|
||||
FontSize = GlobalSettings.TitleSize;
|
||||
BackgroundTransparency = 1;
|
||||
Parent = DetailsContainer;
|
||||
};
|
||||
|
||||
local RemaningBalance = Utility.Create'TextLabel'
|
||||
{
|
||||
Name = 'RemaningBalance';
|
||||
Text = '';
|
||||
Position = UDim2.new(0, 0, 0, 285);
|
||||
Size = UDim2.new(1,0,0,25);
|
||||
TextXAlignment = 'Left';
|
||||
TextColor3 = GlobalSettings.WhiteTextColor;
|
||||
Font = GlobalSettings.LightFont;
|
||||
FontSize = GlobalSettings.TitleSize;
|
||||
BackgroundTransparency = 1;
|
||||
Visible = properties.ShowRemainingBalance == true;
|
||||
Parent = DetailsContainer;
|
||||
};
|
||||
|
||||
|
||||
|
||||
local ConfirmButton = Utility.Create'ImageButton'
|
||||
{
|
||||
Name = "ConfirmButton";
|
||||
Size = UDim2.new(0, BUY_BUTTON_WIDTH, 0, BUY_BUTTON_HEIGHT); --Use offset so we can resize button correctly
|
||||
BorderSizePixel = 0;
|
||||
BackgroundColor3 = GlobalSettings.BlueButtonColor;
|
||||
BackgroundTransparency = 0;
|
||||
Parent = DetailsContainer;
|
||||
AnchorPoint = Vector2.new(0, 1);
|
||||
Position = UDim2.new(0, 0, 1 + BUY_BUTTON_OFFSET.Y/DETAILS_CONTAINER_HEIGHT, 0);
|
||||
}
|
||||
local ConfirmText = Utility.Create'TextLabel'
|
||||
{
|
||||
Name = 'ConfirmText';
|
||||
Text = Strings:LocalizedString('ConfirmWord');
|
||||
Size = UDim2.new(1,0,1,0);
|
||||
TextColor3 = GlobalSettings.TextSelectedColor;
|
||||
Font = GlobalSettings.HeadingFont;
|
||||
FontSize = GlobalSettings.ButtonSize;
|
||||
BackgroundTransparency = 1;
|
||||
Parent = ConfirmButton;
|
||||
};
|
||||
Utility.ResizeButtonWithText(ConfirmButton, ConfirmText, GlobalSettings.TextHorizontalPadding)
|
||||
|
||||
|
||||
local function SetResult(value)
|
||||
Result = value
|
||||
while #OnResultCallbacks > 0 do
|
||||
local callback = table.remove(OnResultCallbacks, #OnResultCallbacks)
|
||||
callback(Result)
|
||||
end
|
||||
end
|
||||
|
||||
local function Decline()
|
||||
if this == ScreenManager:GetTopScreen() then
|
||||
SetResult(false)
|
||||
ScreenManager:CloseCurrent()
|
||||
end
|
||||
end
|
||||
|
||||
local function Confirm()
|
||||
if this == ScreenManager:GetTopScreen() then
|
||||
SetResult(true)
|
||||
ScreenManager:CloseCurrent()
|
||||
end
|
||||
end
|
||||
|
||||
function this:ResultAsync()
|
||||
if Result then
|
||||
return Result
|
||||
end
|
||||
ResultEvent:wait()
|
||||
return Result
|
||||
end
|
||||
|
||||
function this:AddResultCallback(callback)
|
||||
if Result ~= nil then
|
||||
callback(Result)
|
||||
else
|
||||
table.insert(OnResultCallbacks, callback)
|
||||
end
|
||||
end
|
||||
|
||||
function this:FadeInBackground()
|
||||
Utility.PropertyTweener(ConfirmPrompt, "BackgroundTransparency", 1, GlobalSettings.ModalBackgroundTransparency, 0.25, Utility.EaseInOutQuad, true)
|
||||
end
|
||||
|
||||
function this:GetDefaultSelectableObject()
|
||||
return ConfirmButton
|
||||
end
|
||||
|
||||
function this:GetPriority()
|
||||
return GlobalSettings.OverlayPriority
|
||||
end
|
||||
|
||||
local currencyWidget = nil
|
||||
local RobuxChangedConn = nil
|
||||
function this:Show()
|
||||
ConfirmPrompt.Visible = true
|
||||
ConfirmPrompt.Parent = ScreenManager:GetScreenGuiByPriority(self:GetPriority())
|
||||
|
||||
if self.BackgroundTween then
|
||||
self.BackgroundTween:Cancel()
|
||||
end
|
||||
self.BackgroundTween = Utility.PropertyTweener(ConfirmPrompt, "BackgroundTransparency", 1, GlobalSettings.ModalBackgroundTransparency, 0, Utility.EaseInOutQuad, nil)
|
||||
SoundManager:Play('OverlayOpen')
|
||||
|
||||
local function onPackageBackgroundResize()
|
||||
local rawImageSize = Vector2.new(420, 420)
|
||||
if confirmDetails.ProductImageSize then
|
||||
rawImageSize = confirmDetails.ProductImageSize
|
||||
end
|
||||
PackageImage.Size = Utility.CalculateFill(PackageBackground, rawImageSize)
|
||||
PackageImage.AnchorPoint = Vector2.new(0.5, 0.5)
|
||||
PackageImage.Position = UDim2.new(0.5, 0, 0.5, 0)
|
||||
end
|
||||
|
||||
self.PackageBackgroundChangedConn = Utility.DisconnectEvent(self.PackageBackgroundChangedConn)
|
||||
self.PackageBackgroundChangedConn = PackageBackground:GetPropertyChangedSignal('AbsoluteSize'):connect(function()
|
||||
onPackageBackgroundResize()
|
||||
end)
|
||||
onPackageBackgroundResize()
|
||||
|
||||
local function onBalanceLoaded(newBalance)
|
||||
local balance = newBalance
|
||||
if properties.ShowRemainingBalance then
|
||||
if balance and confirmDetails and confirmDetails.Cost then
|
||||
if confirmDetails.Cost and confirmDetails.Cost > 0 then
|
||||
local newBalance = balance and confirmDetails.Cost and balance - confirmDetails.Cost
|
||||
RemaningBalance.Text = string.format(Strings:LocalizedString('RemainingBalancePhrase'), Utility.FormatNumberString(tostring(newBalance)));
|
||||
else
|
||||
RemaningBalance.Text = ''
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if confirmDetails.Balance then
|
||||
onBalanceLoaded(confirmDetails.Balance)
|
||||
else
|
||||
spawn(function()
|
||||
local balance = UserDataModule.GetPlatformUserBalanceAsync()
|
||||
onBalanceLoaded(balance)
|
||||
end)
|
||||
end
|
||||
|
||||
if not currencyWidget then
|
||||
currencyWidget = CurrencyWidgetModule({Parent = ConfirmPrompt; Position = UDim2.new(0.052, 0, 0.88, 0); })
|
||||
end
|
||||
Utility.DisconnectEvent(RobuxChangedConn)
|
||||
RobuxChangedConn = currencyWidget.RobuxChanged:connect(onBalanceLoaded)
|
||||
|
||||
end
|
||||
|
||||
function this:Hide()
|
||||
ConfirmPrompt.Visible = false
|
||||
ConfirmPrompt.Parent = nil
|
||||
|
||||
if self.BackgroundTween then
|
||||
self.BackgroundTween:Cancel()
|
||||
end
|
||||
self.BackgroundTween = nil
|
||||
|
||||
self.PackageBackgroundChangedConn = Utility.DisconnectEvent(self.PackageBackgroundChangedConn)
|
||||
RobuxChangedConn = Utility.DisconnectEvent(RobuxChangedConn)
|
||||
end
|
||||
|
||||
function this:ScreenRemoved()
|
||||
if currencyWidget then
|
||||
currencyWidget:Destroy()
|
||||
currencyWidget = nil
|
||||
end
|
||||
if Result == nil then
|
||||
SetResult(false)
|
||||
end
|
||||
ResultEvent:fire(Result)
|
||||
end
|
||||
|
||||
function this:GetAnalyticsInfo()
|
||||
return
|
||||
{
|
||||
[Analytics.WidgetNames('WidgetId')] = Analytics.WidgetNames('ConfirmPromptId');
|
||||
ProductName = confirmDetails.ProductName;
|
||||
--Here the ProductId refers to assetid if it's a roblox product,
|
||||
--refers to productId if it's a Xbox product
|
||||
ProductId = confirmDetails.ProductId;
|
||||
}
|
||||
end
|
||||
|
||||
function this:Focus()
|
||||
InFocus = true
|
||||
ContextActionService:BindCoreAction("ReturnFromCurrentConfirmScreen",
|
||||
function(actionName, inputState, inputObject)
|
||||
if inputState == Enum.UserInputState.End then
|
||||
Decline()
|
||||
end
|
||||
end,
|
||||
false,
|
||||
Enum.KeyCode.ButtonB)
|
||||
|
||||
local isConfirmingPurchase = false
|
||||
self.ConfirmButtonConn = Utility.DisconnectEvent(self.ConfirmButtonConn)
|
||||
self.ConfirmButtonConn = ConfirmButton.MouseButton1Click:connect(function()
|
||||
if isConfirmingPurchase then return end
|
||||
isConfirmingPurchase = true
|
||||
SoundManager:Play('ButtonPress')
|
||||
Confirm()
|
||||
isConfirmingPurchase = false
|
||||
end)
|
||||
|
||||
GuiService:AddSelectionParent("ConfirmOptionsSelectionGroup", ContentContainer)
|
||||
if InFocus and GuiService.SelectedCoreObject == nil then
|
||||
Utility.SetSelectedCoreObject(self:GetDefaultSelectableObject())
|
||||
end
|
||||
end
|
||||
|
||||
function this:RemoveFocus()
|
||||
ContextActionService:UnbindCoreAction("ReturnFromCurrentConfirmScreen")
|
||||
GuiService:RemoveSelectionGroup("ConfirmOptionsSelectionGroup")
|
||||
self.ConfirmButtonConn = Utility.DisconnectEvent(self.ConfirmButtonConn)
|
||||
Utility.SetSelectedCoreObject(nil)
|
||||
InFocus = false
|
||||
end
|
||||
|
||||
|
||||
function this:SetParent(parent)
|
||||
MyParent = parent
|
||||
ConfirmPrompt.Parent = MyParent
|
||||
end
|
||||
|
||||
|
||||
return this
|
||||
end
|
||||
|
||||
return CreateConfirmPrompt
|
||||
Reference in New Issue
Block a user