add gs
This commit is contained in:
@@ -0,0 +1,298 @@
|
||||
--[[
|
||||
// VoteView.lua
|
||||
|
||||
// Manages the vote view for the game details page
|
||||
]]
|
||||
local CoreGui = game:GetService("CoreGui")
|
||||
local GuiRoot = CoreGui:FindFirstChild("RobloxGui")
|
||||
local Modules = GuiRoot:FindFirstChild("Modules")
|
||||
local ShellModules = Modules:FindFirstChild("Shell")
|
||||
|
||||
local EventHub = require(ShellModules:FindFirstChild('EventHub'))
|
||||
local GlobalSettings = require(ShellModules:FindFirstChild('GlobalSettings'))
|
||||
local Strings = require(ShellModules:FindFirstChild('LocalizedStrings'))
|
||||
local Utility = require(ShellModules:FindFirstChild('Utility'))
|
||||
local VoteFrame = require(ShellModules:FindFirstChild('VoteFrame'))
|
||||
local ScreenManager = require(ShellModules:FindFirstChild('ScreenManager'))
|
||||
local ErrorOverlayModule = require(ShellModules:FindFirstChild('ErrorOverlay'))
|
||||
local Errors = require(ShellModules:FindFirstChild('Errors'))
|
||||
local SoundManager = require(ShellModules:FindFirstChild('SoundManager'))
|
||||
local UserData = require(ShellModules:FindFirstChild('UserData'))
|
||||
|
||||
local function createVoteView()
|
||||
local this = {}
|
||||
|
||||
local canVote = false
|
||||
local myVote = nil
|
||||
local upVotes = 0
|
||||
local downVotes = 0
|
||||
local thisGameData = nil
|
||||
local defaultSelection = nil
|
||||
|
||||
this.Container = Utility.Create'Frame'
|
||||
{
|
||||
Name = "VoteContainer";
|
||||
Size = UDim2.new(1, 0, 0, 114);
|
||||
BackgroundTransparency = 1;
|
||||
Visible = false;
|
||||
}
|
||||
|
||||
-- Can't Vote Objects
|
||||
-- override selection image
|
||||
local SelectionImage = Utility.Create'ImageLabel'
|
||||
{
|
||||
Name = "SelectionImage";
|
||||
Size = UDim2.new(1, 32, 1, 32);
|
||||
Position = UDim2.new(0, -16, 0, -16);
|
||||
Image = 'rbxasset://textures/ui/SelectionBox.png';
|
||||
ScaleType = Enum.ScaleType.Slice;
|
||||
SliceCenter = Rect.new(21,21,41,41);
|
||||
BackgroundTransparency = 1;
|
||||
}
|
||||
local CannotVoteSelection = Utility.Create'TextButton'
|
||||
{
|
||||
Name = "CannotVoteSelection";
|
||||
Text = '';
|
||||
Size = UDim2.new(1, 0, 0, 94);
|
||||
Position = UDim2.new(0, 0, 0, 5);
|
||||
BackgroundTransparency = 1;
|
||||
Selectable = true;
|
||||
SelectionImageObject = SelectionImage;
|
||||
SoundManager:CreateSound('MoveSelection');
|
||||
}
|
||||
local CannotVoteText = Utility.Create'TextLabel'
|
||||
{
|
||||
Name = "CannotVoteText";
|
||||
Size = UDim2.new(0.8, 0, 1, 0);
|
||||
Position = UDim2.new(0.1, 0, 0, 0);
|
||||
BackgroundTransparency = 1;
|
||||
Font = GlobalSettings.BoldFont;
|
||||
FontSize = GlobalSettings.SubHeaderSize;
|
||||
TextColor3 = GlobalSettings.WhiteTextColor;
|
||||
Visible = false;
|
||||
TextWrapped = true;
|
||||
Text = Strings:LocalizedString("CannotVoteWord");
|
||||
Parent = CannotVoteSelection;
|
||||
}
|
||||
|
||||
-- Vote Objects
|
||||
local VoteWidget = VoteFrame(this.Container, UDim2.new(0, 88, 0, 34))
|
||||
local VoteContainer = VoteWidget:GetContainer()
|
||||
local ThumbsUpImage = Utility.Create'ImageLabel'
|
||||
{
|
||||
Name = "ThumbsUpImage";
|
||||
Size = UDim2.new(0, 48, 0, 48);
|
||||
BackgroundTransparency = 1;
|
||||
}
|
||||
local ThumbsDownImage = ThumbsUpImage:Clone()
|
||||
ThumbsDownImage.Name = "ThumbsDownImage"
|
||||
-- Buttons act as buffers for selection gui
|
||||
local ThumbsUpButton = Utility.Create'ImageButton'
|
||||
{
|
||||
Name = "ThumbsUpButton";
|
||||
Size = UDim2.new(0, ThumbsUpImage.Size.X.Offset + 18, 0, ThumbsUpImage.Size.Y.Offset + 18);
|
||||
BackgroundTransparency = 1;
|
||||
Image = "";
|
||||
Parent = VoteContainer;
|
||||
SoundManager:CreateSound('MoveSelection');
|
||||
}
|
||||
ThumbsUpButton.Position = UDim2.new(0, -ThumbsUpButton.Size.X.Offset - 12, 0,
|
||||
-ThumbsUpButton.Size.Y.Offset / 2 + VoteContainer.Size.Y.Offset / 2)
|
||||
local ThumbsDownButton = ThumbsUpButton:Clone()
|
||||
ThumbsDownButton.Name = "ThumbsDownButton"
|
||||
ThumbsDownButton.Position = UDim2.new(1, 12, 0, ThumbsDownButton.Position.Y.Offset)
|
||||
ThumbsDownButton.Parent = VoteContainer
|
||||
|
||||
this.ThumbsUpButton = ThumbsUpButton
|
||||
this.ThumbsDownButton = ThumbsDownButton
|
||||
|
||||
ThumbsUpImage.Parent = ThumbsUpButton
|
||||
ThumbsDownImage.Parent = ThumbsDownButton
|
||||
ThumbsUpImage.Position = UDim2.new(0.5, -ThumbsUpImage.Size.X.Offset / 2, 0.5, -ThumbsUpImage.Size.Y.Offset / 2)
|
||||
ThumbsDownImage.Position = UDim2.new(0.5, -ThumbsDownImage.Size.X.Offset / 2, 0.5, -ThumbsDownImage.Size.Y.Offset / 2)
|
||||
|
||||
local RatingText = Utility.Create'TextLabel'
|
||||
{
|
||||
Name = "RatingText";
|
||||
Size = UDim2.new(0, 0, 0, 0);
|
||||
Position = UDim2.new(0, VoteContainer.Position.X.Offset + VoteContainer.Size.X.Offset / 2, 1, -20);
|
||||
BackgroundTransparency = 1;
|
||||
Font = GlobalSettings.BoldFont;
|
||||
FontSize = GlobalSettings.SubHeaderSize;
|
||||
Text = "";
|
||||
Parent = this.Container;
|
||||
}
|
||||
local UpCountText = Utility.Create'TextLabel'
|
||||
{
|
||||
Name = "UpCountText";
|
||||
Size = UDim2.new(0, 0, 0, 0);
|
||||
Position = UDim2.new(0, 43, 1, RatingText.Position.Y.Offset);
|
||||
BackgroundTransparency = 1;
|
||||
Font = GlobalSettings.RegularFont;
|
||||
FontSize = GlobalSettings.SubHeaderSize;
|
||||
TextColor3 = GlobalSettings.GreenTextColor;
|
||||
Text = "";
|
||||
Parent = this.Container;
|
||||
}
|
||||
local DownCountText = UpCountText:Clone()
|
||||
DownCountText.Name = "DownCountText"
|
||||
DownCountText.Position = UDim2.new(0, 336, 1, RatingText.Position.Y.Offset)
|
||||
DownCountText.TextColor3 = GlobalSettings.RedTextColor;
|
||||
DownCountText.Parent = this.Container;
|
||||
|
||||
local function setImagesAndText(vote, noVote)
|
||||
ThumbsUpImage.Image = vote == true and "rbxasset://textures/ui/Shell/Icons/ThumbsUpFilled@1080.png"
|
||||
or "rbxasset://textures/ui/Shell/Icons/ThumbsUp@1080.png"
|
||||
ThumbsUpImage.Size = UDim2.new(0,48,0,48)
|
||||
|
||||
ThumbsDownImage.Image = vote == false and "rbxasset://textures/ui/Shell/Icons/ThumbsDownFilled@1080.png"
|
||||
or "rbxasset://textures/ui/Shell/Icons/ThumbsDown@1080.png"
|
||||
ThumbsDownImage.Size = UDim2.new(0,48,0,48)
|
||||
|
||||
RatingText.TextColor3 =
|
||||
(vote == true and GlobalSettings.GreenTextColor) or
|
||||
(vote == false and GlobalSettings.RedTextColor) or GlobalSettings.GreyTextColor
|
||||
local textWord = (noVote and "FirstToRateWord") or
|
||||
(vote == true and "LikedWord") or (vote == false and "DislikedWord") or nil
|
||||
RatingText.Text = textWord and Strings:LocalizedString(textWord) or ""
|
||||
end
|
||||
|
||||
local function updateView(newVote)
|
||||
local noVote = upVotes == 0 and downVotes == 0
|
||||
|
||||
VoteWidget:SetPercentFilled(not noVote and (upVotes / (upVotes + downVotes)) or nil)
|
||||
setImagesAndText(newVote, noVote)
|
||||
UpCountText.Text = Utility.FormatNumberString(noVote and "" or upVotes)
|
||||
DownCountText.Text = Utility.FormatNumberString(noVote and "" or downVotes)
|
||||
|
||||
ThumbsUpButton.Selectable = canVote
|
||||
ThumbsDownButton.Selectable = canVote
|
||||
|
||||
CannotVoteSelection.Parent = not canVote and this.Container.Parent or nil
|
||||
defaultSelection = not canVote and CannotVoteSelection or ThumbsUpButton
|
||||
end
|
||||
|
||||
local function updateVoteCount(prevVote, newVote)
|
||||
-- we must check for a unique vote before sending off the achivement event
|
||||
-- unique votes are when prevVote is null.
|
||||
if prevVote == nil then
|
||||
UserData:IncrementVote()
|
||||
elseif newVote == nil then
|
||||
UserData:DecrementVote()
|
||||
end
|
||||
EventHub:dispatchEvent(EventHub.Notifications["VotedOnPlace"])
|
||||
end
|
||||
|
||||
local isVotingDebouce = false
|
||||
local function postVoteAsync(newVote)
|
||||
if isVotingDebouce then return end
|
||||
isVotingDebouce = true
|
||||
local success, reason = nil, nil
|
||||
if thisGameData then
|
||||
success, reason = thisGameData:PostVoteAsync(newVote)
|
||||
else
|
||||
success = false
|
||||
end
|
||||
if success then
|
||||
local prevVote = myVote
|
||||
if newVote == true then
|
||||
upVotes = upVotes + 1
|
||||
if prevVote == false then
|
||||
downVotes = downVotes - 1
|
||||
end
|
||||
elseif newVote == false then
|
||||
downVotes = downVotes + 1
|
||||
if prevVote == true then
|
||||
upVotes = upVotes - 1
|
||||
end
|
||||
elseif newVote == nil then
|
||||
if prevVote == true then
|
||||
upVotes = upVotes - 1
|
||||
elseif prevVote == false then
|
||||
downVotes = downVotes - 1
|
||||
end
|
||||
end
|
||||
myVote = newVote
|
||||
updateView(newVote)
|
||||
updateVoteCount(prevVote, newVote)
|
||||
else
|
||||
if reason and Errors.Vote[reason] then
|
||||
ScreenManager:OpenScreen(ErrorOverlayModule(Errors.Vote[reason]), false)
|
||||
else
|
||||
ScreenManager:OpenScreen(ErrorOverlayModule(Errors.Default), false)
|
||||
end
|
||||
end
|
||||
isVotingDebouce = false
|
||||
end
|
||||
|
||||
local function toggleCannotVoteDisplay()
|
||||
CannotVoteText.Visible = not CannotVoteText.Visible
|
||||
this.Container.Visible = not this.Container.Visible
|
||||
end
|
||||
CannotVoteSelection.SelectionGained:connect(toggleCannotVoteDisplay)
|
||||
CannotVoteSelection.SelectionLost:connect(toggleCannotVoteDisplay)
|
||||
|
||||
ThumbsUpButton.MouseButton1Click:connect(function()
|
||||
local newVote = true
|
||||
if myVote == true then
|
||||
newVote = nil
|
||||
end
|
||||
postVoteAsync(newVote)
|
||||
end)
|
||||
ThumbsDownButton.MouseButton1Click:connect(function()
|
||||
local newVote = false
|
||||
if myVote == false then
|
||||
newVote = nil
|
||||
end
|
||||
postVoteAsync(newVote)
|
||||
end)
|
||||
|
||||
--[[ Public API ]]--
|
||||
function this:SetParent(newParent)
|
||||
self.Container.Parent = newParent
|
||||
updateView(myVote)
|
||||
end
|
||||
|
||||
function this:SetPosition(newPosition)
|
||||
self.Container.Position = newPosition
|
||||
CannotVoteSelection.Position = UDim2.new(0, 0, 0, self.Container.Position.Y.Offset + 5)
|
||||
end
|
||||
|
||||
function this:SetVisible(value)
|
||||
self.Container.Visible = value
|
||||
end
|
||||
|
||||
function this:GetDefaultSelection()
|
||||
return defaultSelection
|
||||
end
|
||||
|
||||
function this:SetCanVote(value)
|
||||
canVote = value
|
||||
if thisGameData then
|
||||
thisGameData:SetCanVote(value)
|
||||
end
|
||||
updateView(myVote)
|
||||
end
|
||||
|
||||
function this:GetCanVote()
|
||||
return canVote
|
||||
end
|
||||
|
||||
function this:InitializeAsync(gameData)
|
||||
thisGameData = gameData
|
||||
local voteData = gameData:GetVoteDataAsync()
|
||||
if voteData then
|
||||
upVotes = voteData.UpVotes
|
||||
downVotes = voteData.DownVotes
|
||||
myVote = voteData.UserVote
|
||||
canVote = voteData.CanVote or (voteData.CantVoteReason ~= "PlayGame")
|
||||
end
|
||||
|
||||
updateView(myVote)
|
||||
VoteWidget:SetVisible(true)
|
||||
end
|
||||
|
||||
return this
|
||||
end
|
||||
|
||||
return createVoteView
|
||||
Reference in New Issue
Block a user