SyntaxGameServer/RCCService2018/content/LuaPackages/LocalizationPlugin/Components/Dropdown.lua

194 lines
5.0 KiB
Lua

local CorePackages = game:GetService("CorePackages")
local Roact = require(CorePackages.Roact)
local Modalifier = require(script.Parent.Modalifier)
local Dropdown = Roact.Component:extend("Dropdown")
function Dropdown:init()
self.state = {
Open = false,
Hovered = false,
}
end
function Dropdown:render()
local listChildren = {
Layout = Roact.createElement("UIListLayout", {
SortOrder = Enum.SortOrder.LayoutOrder,
}),
}
for index, listItem in ipairs(self.props.ListItems) do
listChildren["ListObject"..index] = Roact.createElement("Frame", {
Size = UDim2.new(1, 0, 0, self.props.ListItemHeight),
LayoutOrder = index,
BorderSizePixel = 0,
BackgroundTransparency = 1,
}, {
Padding = Roact.createElement("UIPadding", {
PaddingBottom = UDim.new(0, 4),
}),
Button = Roact.createElement("TextButton", {
BorderSizePixel = 0,
Size = UDim2.new(1, 0, 1, 0),
TextColor3 = self.props.TextColor3,
Text = "",
BackgroundColor3 = self.props.BackgroundColor3,
[Roact.Event.Activated] = function()
listItem.OnActivated()
self:setState({
Open = false,
})
end,
}, {
Padding = Roact.createElement("UIPadding", {
PaddingLeft = UDim.new(0, 4),
}),
Text = Roact.createElement("TextLabel", {
BackgroundTransparency = 1,
TextColor3 = self.props.TextColor3,
Size = UDim2.new(1, 0, 1, 0),
Text = listItem.Text,
TextXAlignment = Enum.TextXAlignment.Left,
}),
}),
})
end
local visibleChildren
if self.state.Open then
visibleChildren = {
Button = Roact.createElement("TextButton", {
Size = UDim2.new(1, 0, 1, 0),
BorderColor3 = self.props.BorderColor3,
AutoButtonColor = false,
BackgroundTransparency = 0,
Text = "",
BackgroundColor3 = self.props.ButtonDownColor3,
TextXAlignment = Enum.TextXAlignment.Left,
[Roact.Event.Activated] = function()
self:setState({
Open = false,
})
end,
-- Empty functions here work around bug-147 in Roact
[Roact.Event.InputBegan] = function()
end,
[Roact.Event.InputEnded] = function()
end,
}, {
Padding = Roact.createElement("UIPadding", {
PaddingLeft = UDim.new(0, 4),
}),
TextLabel = Roact.createElement("TextLabel", {
Size = UDim2.new(1, 0, 1, 0),
TextColor3 = self.props.TextColor3,
BackgroundTransparency = 1,
BorderSizePixel = 0,
TextXAlignment = Enum.TextXAlignment.Left,
Text = self.props.CurrentText,
}),
Arrow = Roact.createElement("ImageLabel", {
Position = UDim2.new(1, -15, 0.5, 0),
AnchorPoint = Vector2.new(0.5, 0.5),
Size = UDim2.new(0, 5, 0, 3),
BorderSizePixel = 0,
BackgroundTransparency = 1,
Image = "rbxasset://textures/menuDownArrow.png",
}),
}),
Modalifier = Roact.createElement(Modalifier, {
Window = self.props.Window,
OnClosed = function()
self:setState({
Open = false,
})
end,
Render = function(position)
return Roact.createElement("Frame", {
Position = UDim2.new(0, position.X, 0, position.Y + self.props.ListItemHeight),
Size = UDim2.new(0, 160, 0, #(self.props.ListItems) * self.props.ListItemHeight),
BackgroundTransparency = 0,
BackgroundColor3 = self.props.BackgroundColor3,
BorderColor3 = self.props.BorderColor3,
}, listChildren)
end,
}),
}
else
visibleChildren = {
Button = Roact.createElement("TextButton", {
Size = UDim2.new(1, 0, 1, 0),
BorderColor3 = self.props.BorderColor3,
AutoButtonColor = false,
BackgroundTransparency = 0,
BackgroundColor3 = self.state.Hovered and self.props.ButtonHoverColor3 or self.props.BackgroundColor3,
Text = "",
TextXAlignment = Enum.TextXAlignment.Left,
[Roact.Event.Activated] = function()
self:setState({
Open = true,
Hovered = false,
})
end,
[Roact.Event.InputBegan] = function(gui, input)
if input.UserInputType == Enum.UserInputType.MouseMovement then
self:setState({
Hovered = true,
})
end
end,
[Roact.Event.InputEnded] = function(gui, input)
if input.UserInputType == Enum.UserInputType.MouseMovement then
self:setState({
Hovered = false,
})
end
end,
}, {
Padding = Roact.createElement("UIPadding", {
PaddingLeft = UDim.new(0, 4),
}),
TextLabel = Roact.createElement("TextLabel", {
Size = UDim2.new(1, 0, 1, 0),
TextColor3 = self.props.TextColor3,
BackgroundTransparency = 1,
BorderSizePixel = 0,
TextXAlignment = Enum.TextXAlignment.Left,
Text = self.props.CurrentText,
}),
Arrow = Roact.createElement("ImageLabel", {
Position = UDim2.new(1, -15, 0.5, 0),
AnchorPoint = Vector2.new(0.5, 0.5),
Size = UDim2.new(0, 5, 0, 3),
BorderSizePixel = 0,
BackgroundTransparency = 1,
Image = "rbxasset://textures/menuDownArrow.png",
}),
}),
}
end
return Roact.createElement("Frame", {
Size = UDim2.new(1, 0, 1, 0),
}, visibleChildren)
end
return Dropdown