--[[ // 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