194 lines
5.0 KiB
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
|