3978 lines
112 KiB
Plaintext
3978 lines
112 KiB
Plaintext
import "macros" as { $ }
|
|
$load $FILE
|
|
|
|
t = {}
|
|
|
|
ScopedConnect = (parentInstance, instance, event, signalFunc, syncFunc, removeFunc) ->
|
|
local eventConnection
|
|
|
|
--Connection on parentInstance is scoped by parentInstance (when destroyed, it goes away)
|
|
tryConnect = ->
|
|
if game\IsAncestorOf parentInstance
|
|
--Entering the world, make sure we are connected/synced
|
|
if not eventConnection
|
|
eventConnection = instance[event]\connect signalFunc
|
|
if syncFunc
|
|
syncFunc!
|
|
|
|
|
|
else
|
|
--Probably leaving the world, so disconnect for now
|
|
if eventConnection
|
|
eventConnection\disconnect!
|
|
if removeFunc
|
|
removeFunc!
|
|
|
|
|
|
--Hook it up to ancestryChanged signal
|
|
connection = parentInstance.AncestryChanged\connect tryConnect
|
|
|
|
--Now connect us if we're already in the world
|
|
tryConnect!
|
|
|
|
connection
|
|
|
|
|
|
getScreenGuiAncestor = (instance) ->
|
|
localInstance = instance
|
|
while localInstance and not localInstance\IsA "ScreenGui"
|
|
localInstance = localInstance.Parent
|
|
|
|
localInstance
|
|
|
|
|
|
CreateButtons = (frame, buttons, yPos, ySize) ->
|
|
buttonNum = 1
|
|
buttonObjs = {}
|
|
for _, obj in ipairs buttons
|
|
button = Instance.new "TextButton"
|
|
button.Name = "Button" .. buttonNum
|
|
button.Font = Enum.Font.Arial
|
|
button.FontSize = Enum.FontSize.Size18
|
|
button.AutoButtonColor = true
|
|
button.Modal = true
|
|
if obj["Style"]
|
|
button.Style = obj.Style
|
|
else
|
|
button.Style = Enum.ButtonStyle.RobloxButton
|
|
|
|
button.Text = obj.Text
|
|
button.TextColor3 = Color3.new 1, 1, 1
|
|
button.MouseButton1Click\connect obj.Function
|
|
button.Parent = frame
|
|
buttonObjs[buttonNum] = button
|
|
|
|
buttonNum += 1
|
|
|
|
numButtons = buttonNum - 1
|
|
|
|
if numButtons == 1
|
|
frame.Button1.Position = UDim2.new 0.35, 0, yPos.Scale, yPos.Offset
|
|
frame.Button1.Size = UDim2.new 0.4, 0, ySize.Scale, ySize.Offset
|
|
elseif numButtons == 2
|
|
frame.Button1.Position = UDim2.new 0.1, 0, yPos.Scale, yPos.Offset
|
|
frame.Button1.Size = UDim2.new 0.8 / 3, 0, ySize.Scale, ySize.Offset
|
|
|
|
frame.Button2.Position = UDim2.new 0.55, 0, yPos.Scale, yPos.Offset
|
|
frame.Button2.Size = UDim2.new 0.35, 0, ySize.Scale, ySize.Offset
|
|
elseif numButtons >= 3
|
|
spacing = 0.1 / numButtons
|
|
buttonSize = 0.9 / numButtons
|
|
|
|
buttonNum = 1
|
|
while buttonNum <= numButtons
|
|
buttonObjs[buttonNum].Position = UDim2.new spacing * buttonNum + (buttonNum - 1) * buttonSize, 0, yPos.Scale, yPos.Offset
|
|
buttonObjs[buttonNum].Size = UDim2.new buttonSize, 0, ySize.Scale, ySize.Offset
|
|
buttonNum += 1
|
|
|
|
|
|
setSliderPos = (newAbsPosX, slider, sliderPosition, bar, steps) ->
|
|
newStep = steps - 1 --otherwise we really get one more step than we want
|
|
relativePosX = math.min 1, math.max(0, (newAbsPosX - bar.AbsolutePosition.X) / bar.AbsoluteSize.X)
|
|
wholeNum, remainder = math.modf relativePosX * newStep
|
|
if remainder > 0.5
|
|
wholeNum += 1
|
|
|
|
relativePosX = wholeNum / newStep
|
|
|
|
result = math.ceil relativePosX * newStep
|
|
if sliderPosition.Value ~= (result + 1) --only update if we moved a step
|
|
sliderPosition.Value = result + 1
|
|
slider.Position = UDim2.new relativePosX, -slider.AbsoluteSize.X / 2, slider.Position.Y.Scale, slider.Position.Y.Offset
|
|
|
|
|
|
cancelSlide = (areaSoak) ->
|
|
areaSoak.Visible = false
|
|
if areaSoakMouseMoveCon
|
|
areaSoakMouseMoveCon\disconnect!
|
|
|
|
|
|
t.CreateStyledMessageDialog = (title, message, style, buttons) ->
|
|
frame = Instance.new "Frame"
|
|
frame.Size = UDim2.new 0.5, 0, 0, 165
|
|
frame.Position = UDim2.new 0.25, 0, 0.5, -72.5
|
|
frame.Name = "MessageDialog"
|
|
frame.Active = true
|
|
frame.Style = Enum.FrameStyle.RobloxRound
|
|
|
|
styleImage = Instance.new "ImageLabel"
|
|
styleImage.Name = "StyleImage"
|
|
styleImage.BackgroundTransparency = 1
|
|
styleImage.Position = UDim2.new 0, 5, 0, 15
|
|
if style == "error" or style == "Error"
|
|
styleImage.Size = UDim2.new 0, 71, 0, 71
|
|
styleImage.Image = "http://www.roblox.com/asset?id=42565285"
|
|
elseif style == "notify" or style == "Notify"
|
|
styleImage.Size = UDim2.new 0, 71, 0, 71
|
|
styleImage.Image = "http://www.roblox.com/asset?id=42604978"
|
|
elseif style == "confirm" or style == "Confirm"
|
|
styleImage.Size = UDim2.new 0, 74, 0, 76
|
|
styleImage.Image = "http://www.roblox.com/asset?id=42557901"
|
|
else
|
|
return t.CreateMessageDialog title, message, buttons
|
|
|
|
styleImage.Parent = frame
|
|
|
|
titleLabel = Instance.new "TextLabel"
|
|
titleLabel.Name = "Title"
|
|
titleLabel.Text = title
|
|
titleLabel.TextStrokeTransparency = 0
|
|
titleLabel.BackgroundTransparency = 1
|
|
titleLabel.TextColor3 = Color3.new 221 / 255, 221 / 255, 221 / 255
|
|
titleLabel.Position = UDim2.new 0, 80, 0, 0
|
|
titleLabel.Size = UDim2.new 1, -80, 0, 40
|
|
titleLabel.Font = Enum.Font.ArialBold
|
|
titleLabel.FontSize = Enum.FontSize.Size36
|
|
titleLabel.TextXAlignment = Enum.TextXAlignment.Center
|
|
titleLabel.TextYAlignment = Enum.TextYAlignment.Center
|
|
titleLabel.Parent = frame
|
|
|
|
messageLabel = Instance.new "TextLabel"
|
|
messageLabel.Name = "Message"
|
|
messageLabel.Text = message
|
|
messageLabel.TextStrokeTransparency = 0
|
|
messageLabel.TextColor3 = Color3.new 221 / 255, 221 / 255, 221 / 255
|
|
messageLabel.Position = UDim2.new 0.025, 80, 0, 45
|
|
messageLabel.Size = UDim2.new 0.95, -80, 0, 55
|
|
messageLabel.BackgroundTransparency = 1
|
|
messageLabel.Font = Enum.Font.Arial
|
|
messageLabel.FontSize = Enum.FontSize.Size18
|
|
messageLabel.TextWrap = true
|
|
messageLabel.TextXAlignment = Enum.TextXAlignment.Left
|
|
messageLabel.TextYAlignment = Enum.TextYAlignment.Top
|
|
messageLabel.Parent = frame
|
|
|
|
CreateButtons frame, buttons, UDim.new(0, 105), UDim.new(0, 40)
|
|
|
|
frame
|
|
|
|
|
|
t.CreateMessageDialog = (title, message, buttons) ->
|
|
frame = Instance.new "Frame"
|
|
frame.Size = UDim2.new 0.5, 0, 0.5, 0
|
|
frame.Position = UDim2.new 0.25, 0, 0.25, 0
|
|
frame.Name = "MessageDialog"
|
|
frame.Active = true
|
|
frame.Style = Enum.FrameStyle.RobloxRound
|
|
|
|
titleLabel = Instance.new "TextLabel"
|
|
titleLabel.Name = "Title"
|
|
titleLabel.Text = title
|
|
titleLabel.BackgroundTransparency = 1
|
|
titleLabel.TextColor3 = Color3.new 221 / 255, 221 / 255, 221 / 255
|
|
titleLabel.Position = UDim2.new 0, 0, 0, 0
|
|
titleLabel.Size = UDim2.new 1, 0, 0.15, 0
|
|
titleLabel.Font = Enum.Font.ArialBold
|
|
titleLabel.FontSize = Enum.FontSize.Size36
|
|
titleLabel.TextXAlignment = Enum.TextXAlignment.Center
|
|
titleLabel.TextYAlignment = Enum.TextYAlignment.Center
|
|
titleLabel.Parent = frame
|
|
|
|
messageLabel = Instance.new "TextLabel"
|
|
messageLabel.Name = "Message"
|
|
messageLabel.Text = message
|
|
messageLabel.TextColor3 = Color3.new 221 / 255, 221 / 255, 221 / 255
|
|
messageLabel.Position = UDim2.new 0.025, 0, 0.175, 0
|
|
messageLabel.Size = UDim2.new 0.95, 0, 0.55, 0
|
|
messageLabel.BackgroundTransparency = 1
|
|
messageLabel.Font = Enum.Font.Arial
|
|
messageLabel.FontSize = Enum.FontSize.Size18
|
|
messageLabel.TextWrap = true
|
|
messageLabel.TextXAlignment = Enum.TextXAlignment.Left
|
|
messageLabel.TextYAlignment = Enum.TextYAlignment.Top
|
|
messageLabel.Parent = frame
|
|
|
|
CreateButtons frame, buttons, UDim.new(0.8, 0), UDim.new(0.15, 0)
|
|
|
|
frame
|
|
|
|
|
|
t.CreateDropDownMenu = (items, onSelect, forRoblox) ->
|
|
width = UDim.new 0, 100
|
|
height = UDim.new 0, 32
|
|
|
|
frame = Instance.new "Frame"
|
|
frame.Name = "DropDownMenu"
|
|
frame.BackgroundTransparency = 1
|
|
frame.Size = UDim2.new width, height
|
|
|
|
dropDownMenu = Instance.new "TextButton"
|
|
dropDownMenu.Name = "DropDownMenuButton"
|
|
dropDownMenu.TextWrap = true
|
|
dropDownMenu.TextColor3 = Color3.new 1, 1, 1
|
|
dropDownMenu.Text = "Choose One"
|
|
dropDownMenu.Font = Enum.Font.ArialBold
|
|
dropDownMenu.FontSize = Enum.FontSize.Size18
|
|
dropDownMenu.TextXAlignment = Enum.TextXAlignment.Left
|
|
dropDownMenu.TextYAlignment = Enum.TextYAlignment.Center
|
|
dropDownMenu.BackgroundTransparency = 1
|
|
dropDownMenu.AutoButtonColor = true
|
|
dropDownMenu.Style = Enum.ButtonStyle.RobloxButton
|
|
dropDownMenu.Size = UDim2.new 1, 0, 1, 0
|
|
dropDownMenu.Parent = frame
|
|
dropDownMenu.ZIndex = 2
|
|
|
|
dropDownIcon = Instance.new "ImageLabel"
|
|
dropDownIcon.Name = "Icon"
|
|
dropDownIcon.Active = false
|
|
dropDownIcon.Image = "http://www.roblox.com/asset/?id=45732894"
|
|
dropDownIcon.BackgroundTransparency = 1
|
|
dropDownIcon.Size = UDim2.new 0, 11, 0, 6
|
|
dropDownIcon.Position = UDim2.new 1, -11, 0.5, -2
|
|
dropDownIcon.Parent = dropDownMenu
|
|
dropDownIcon.ZIndex = 2
|
|
|
|
itemCount = #items
|
|
dropDownItemCount = #items
|
|
useScrollButtons = false
|
|
if dropDownItemCount > 6
|
|
useScrollButtons = true
|
|
dropDownItemCount = 6
|
|
|
|
|
|
droppedDownMenu = Instance.new "TextButton"
|
|
droppedDownMenu.Name = "List"
|
|
droppedDownMenu.Text = ""
|
|
droppedDownMenu.BackgroundTransparency = 1
|
|
--droppedDownMenu.AutoButtonColor = true
|
|
droppedDownMenu.Style = Enum.ButtonStyle.RobloxButton
|
|
droppedDownMenu.Visible = false
|
|
droppedDownMenu.Active = true --Blocks clicks
|
|
droppedDownMenu.Position = UDim2.new 0, 0, 0, 0
|
|
droppedDownMenu.Size = UDim2.new 1, 0, (1 + dropDownItemCount) * 0.8, 0
|
|
droppedDownMenu.Parent = frame
|
|
droppedDownMenu.ZIndex = 2
|
|
|
|
choiceButton = Instance.new "TextButton"
|
|
choiceButton.Name = "ChoiceButton"
|
|
choiceButton.BackgroundTransparency = 1
|
|
choiceButton.BorderSizePixel = 0
|
|
choiceButton.Text = "ReplaceMe"
|
|
choiceButton.TextColor3 = Color3.new 1, 1, 1
|
|
choiceButton.TextXAlignment = Enum.TextXAlignment.Left
|
|
choiceButton.TextYAlignment = Enum.TextYAlignment.Center
|
|
choiceButton.BackgroundColor3 = Color3.new 1, 1, 1
|
|
choiceButton.Font = Enum.Font.Arial
|
|
choiceButton.FontSize = Enum.FontSize.Size18
|
|
if useScrollButtons
|
|
choiceButton.Size = UDim2.new 1, -13, 0.8 / ((dropDownItemCount + 1) * 0.8), 0
|
|
else
|
|
choiceButton.Size = UDim2.new 1, 0, 0.8 / ((dropDownItemCount + 1) * 0.8), 0
|
|
|
|
choiceButton.TextWrap = true
|
|
choiceButton.ZIndex = 2
|
|
|
|
areaSoak = Instance.new "TextButton"
|
|
areaSoak.Name = "AreaSoak"
|
|
areaSoak.Text = ""
|
|
areaSoak.BackgroundTransparency = 1
|
|
areaSoak.Active = true
|
|
areaSoak.Size = UDim2.new 1, 0, 1, 0
|
|
areaSoak.Visible = false
|
|
areaSoak.ZIndex = 3
|
|
|
|
dropDownSelected = false
|
|
|
|
local scrollUpButton
|
|
local scrollDownButton
|
|
scrollMouseCount = 0
|
|
|
|
setZIndex = (baseZIndex) ->
|
|
droppedDownMenu.ZIndex = baseZIndex + 1
|
|
if scrollUpButton
|
|
scrollUpButton.ZIndex = baseZIndex + 3
|
|
|
|
if scrollDownButton
|
|
scrollDownButton.ZIndex = baseZIndex + 3
|
|
|
|
|
|
children = droppedDownMenu\GetChildren!
|
|
if children
|
|
for _, child in ipairs children
|
|
if child.Name == "ChoiceButton"
|
|
child.ZIndex = baseZIndex + 2
|
|
elseif child.Name == "ClickCaptureButton"
|
|
child.ZIndex = baseZIndex
|
|
|
|
|
|
scrollBarPosition = 1
|
|
updateScroll = ->
|
|
if scrollUpButton
|
|
scrollUpButton.Active = scrollBarPosition > 1
|
|
|
|
if scrollDownButton
|
|
scrollDownButton.Active = scrollBarPosition + dropDownItemCount <= itemCount
|
|
|
|
|
|
children = droppedDownMenu\GetChildren!
|
|
if not children
|
|
return
|
|
|
|
|
|
childNum = 1
|
|
for _, obj in ipairs children
|
|
if obj.Name == "ChoiceButton"
|
|
if childNum < scrollBarPosition or childNum >= scrollBarPosition + dropDownItemCount
|
|
obj.Visible = false
|
|
else
|
|
obj.Position = UDim2.new 0, 0, ((childNum - scrollBarPosition + 1) * 0.8) / ((dropDownItemCount + 1) * 0.8), 0
|
|
obj.Visible = true
|
|
|
|
obj.TextColor3 = Color3.new 1, 1, 1
|
|
obj.BackgroundTransparency = 1
|
|
|
|
childNum += 1
|
|
|
|
|
|
toggleVisibility = ->
|
|
dropDownSelected = not dropDownSelected
|
|
|
|
areaSoak.Visible = not areaSoak.Visible
|
|
dropDownMenu.Visible = not dropDownSelected
|
|
droppedDownMenu.Visible = dropDownSelected
|
|
if dropDownSelected
|
|
setZIndex 4
|
|
else
|
|
setZIndex 2
|
|
|
|
if useScrollButtons
|
|
updateScroll!
|
|
|
|
|
|
droppedDownMenu.MouseButton1Click\connect toggleVisibility
|
|
|
|
updateSelection = (text) ->
|
|
foundItem = false
|
|
children = droppedDownMenu\GetChildren!
|
|
childNum = 1
|
|
if children
|
|
for _, obj in ipairs children
|
|
if obj.Name == "ChoiceButton"
|
|
if obj.Text == text
|
|
obj.Font = Enum.Font.ArialBold
|
|
foundItem = true
|
|
scrollBarPosition = childNum
|
|
else
|
|
obj.Font = Enum.Font.Arial
|
|
|
|
childNum += 1
|
|
|
|
|
|
if not text
|
|
dropDownMenu.Text = "Choose One"
|
|
scrollBarPosition = 1
|
|
else
|
|
if not foundItem
|
|
error "Invalid Selection Update -- " .. text
|
|
|
|
|
|
if scrollBarPosition + dropDownItemCount > itemCount + 1
|
|
scrollBarPosition = itemCount - dropDownItemCount + 1
|
|
|
|
|
|
dropDownMenu.Text = text
|
|
|
|
|
|
scrollDown = ->
|
|
if scrollBarPosition + dropDownItemCount <= itemCount
|
|
scrollBarPosition += 1
|
|
updateScroll!
|
|
return true
|
|
|
|
return false
|
|
|
|
scrollUp = ->
|
|
if scrollBarPosition > 1
|
|
scrollBarPosition -= 1
|
|
updateScroll!
|
|
return true
|
|
|
|
return false
|
|
|
|
|
|
if useScrollButtons
|
|
--Make some scroll buttons
|
|
scrollUpButton = Instance.new "ImageButton"
|
|
scrollUpButton.Name = "ScrollUpButton"
|
|
scrollUpButton.BackgroundTransparency = 1
|
|
scrollUpButton.Image = "rbxasset://textures/ui/scrollbuttonUp.png"
|
|
scrollUpButton.Size = UDim2.new 0, 17, 0, 17
|
|
scrollUpButton.Position = UDim2.new 1, -11, (1 * 0.8) / ((dropDownItemCount + 1) * 0.8), 0
|
|
scrollUpButton.MouseButton1Click\connect ->
|
|
scrollMouseCount += 1
|
|
|
|
scrollUpButton.MouseLeave\connect ->
|
|
scrollMouseCount += 1
|
|
|
|
scrollUpButton.MouseButton1Down\connect ->
|
|
scrollMouseCount += 1
|
|
|
|
scrollUp!
|
|
val = scrollMouseCount
|
|
wait 0.5
|
|
while val == scrollMouseCount
|
|
if scrollUp! == false
|
|
break
|
|
|
|
wait 0.1
|
|
|
|
|
|
scrollUpButton.Parent = droppedDownMenu
|
|
|
|
scrollDownButton = Instance.new "ImageButton"
|
|
scrollDownButton.Name = "ScrollDownButton"
|
|
scrollDownButton.BackgroundTransparency = 1
|
|
scrollDownButton.Image = "rbxasset://textures/ui/scrollbuttonDown.png"
|
|
scrollDownButton.Size = UDim2.new 0, 17, 0, 17
|
|
scrollDownButton.Position = UDim2.new 1, -11, 1, -11
|
|
scrollDownButton.Parent = droppedDownMenu
|
|
scrollDownButton.MouseButton1Click\connect ->
|
|
scrollMouseCount += 1
|
|
|
|
scrollDownButton.MouseLeave\connect ->
|
|
scrollMouseCount += 1
|
|
|
|
scrollDownButton.MouseButton1Down\connect ->
|
|
scrollMouseCount += 1
|
|
|
|
scrollDown!
|
|
val = scrollMouseCount
|
|
wait 0.5
|
|
while val == scrollMouseCount
|
|
if scrollDown! == false
|
|
break
|
|
|
|
wait 0.1
|
|
|
|
|
|
scrollbar = Instance.new "ImageLabel"
|
|
scrollbar.Name = "ScrollBar"
|
|
scrollbar.Image = "rbxasset://textures/ui/scrollbar.png"
|
|
scrollbar.BackgroundTransparency = 1
|
|
scrollbar.Size = UDim2.new 0, 18, (dropDownItemCount * 0.8) / ((dropDownItemCount + 1) * 0.8), -17 - 11 - 4
|
|
scrollbar.Position = UDim2.new 1, -11, (1 * 0.8) / ((dropDownItemCount + 1) * 0.8), 17 + 2
|
|
scrollbar.Parent = droppedDownMenu
|
|
|
|
|
|
for _, item in ipairs items
|
|
-- needed to maintain local scope for items in event listeners below
|
|
button = choiceButton\clone!
|
|
if forRoblox
|
|
button.RobloxLocked = true
|
|
|
|
button.Text = item
|
|
button.Parent = droppedDownMenu
|
|
button.MouseButton1Click\connect ->
|
|
--Remove Highlight
|
|
button.TextColor3 = Color3.new 1, 1, 1
|
|
button.BackgroundTransparency = 1
|
|
|
|
updateSelection item
|
|
onSelect item
|
|
|
|
toggleVisibility!
|
|
|
|
button.MouseEnter\connect ->
|
|
--Add Highlight
|
|
button.TextColor3 = Color3.new 0, 0, 0
|
|
button.BackgroundTransparency = 0
|
|
|
|
|
|
button.MouseLeave\connect ->
|
|
--Remove Highlight
|
|
button.TextColor3 = Color3.new 1, 1, 1
|
|
button.BackgroundTransparency = 1
|
|
|
|
|
|
--This does the initial layout of the buttons
|
|
updateScroll!
|
|
|
|
frame.AncestryChanged\connect (_, parent) ->
|
|
if parent == nil
|
|
areaSoak.Parent = nil
|
|
else
|
|
areaSoak.Parent = getScreenGuiAncestor frame
|
|
|
|
|
|
dropDownMenu.MouseButton1Click\connect toggleVisibility
|
|
areaSoak.MouseButton1Click\connect toggleVisibility
|
|
return frame, updateSelection
|
|
|
|
|
|
t.CreatePropertyDropDownMenu = (instance, property, enum) ->
|
|
items = enum\GetEnumItems!
|
|
names = {}
|
|
nameToItem = {}
|
|
for i, obj in ipairs items
|
|
names[i] = obj.Name
|
|
nameToItem[obj.Name] = obj
|
|
|
|
|
|
local frame
|
|
local updateSelection
|
|
frame, updateSelection = t.CreateDropDownMenu names, (text) ->
|
|
instance[property] = nameToItem[text]
|
|
|
|
|
|
ScopedConnect(frame, instance, "Changed"
|
|
(prop) ->
|
|
if prop == property
|
|
updateSelection instance[property].Name
|
|
->
|
|
updateSelection instance[property].Name
|
|
)
|
|
|
|
return frame
|
|
|
|
|
|
t.GetFontHeight = (font, fontSize) ->
|
|
if font == nil or fontSize == nil
|
|
error "Font and FontSize must be non-nil"
|
|
|
|
|
|
if font == Enum.Font.Legacy
|
|
if fontSize == Enum.FontSize.Size8
|
|
return 12
|
|
elseif fontSize == Enum.FontSize.Size9
|
|
return 14
|
|
elseif fontSize == Enum.FontSize.Size10
|
|
return 15
|
|
elseif fontSize == Enum.FontSize.Size11
|
|
return 17
|
|
elseif fontSize == Enum.FontSize.Size12
|
|
return 18
|
|
elseif fontSize == Enum.FontSize.Size14
|
|
return 21
|
|
elseif fontSize == Enum.FontSize.Size18
|
|
return 27
|
|
elseif fontSize == Enum.FontSize.Size24
|
|
return 36
|
|
elseif fontSize == Enum.FontSize.Size36
|
|
return 54
|
|
elseif fontSize == Enum.FontSize.Size48
|
|
return 72
|
|
else
|
|
error "Unknown FontSize"
|
|
|
|
elseif font == Enum.Font.Arial or font == Enum.Font.ArialBold
|
|
if fontSize == Enum.FontSize.Size8
|
|
return 8
|
|
elseif fontSize == Enum.FontSize.Size9
|
|
return 9
|
|
elseif fontSize == Enum.FontSize.Size10
|
|
return 10
|
|
elseif fontSize == Enum.FontSize.Size11
|
|
return 11
|
|
elseif fontSize == Enum.FontSize.Size12
|
|
return 12
|
|
elseif fontSize == Enum.FontSize.Size14
|
|
return 14
|
|
elseif fontSize == Enum.FontSize.Size18
|
|
return 18
|
|
elseif fontSize == Enum.FontSize.Size24
|
|
return 24
|
|
elseif fontSize == Enum.FontSize.Size36
|
|
return 36
|
|
elseif fontSize == Enum.FontSize.Size48
|
|
return 48
|
|
else
|
|
error "Unknown FontSize"
|
|
|
|
else
|
|
error "Unknown Font " .. font
|
|
|
|
|
|
layoutGuiObjectsHelper = (frame, guiObjects, settingsTable) ->
|
|
totalPixels = frame.AbsoluteSize.Y
|
|
pixelsRemaining = frame.AbsoluteSize.Y
|
|
for _, child in ipairs guiObjects
|
|
if child\IsA"TextLabel" or child\IsA "TextButton"
|
|
isLabel = child\IsA "TextLabel"
|
|
if isLabel
|
|
pixelsRemaining -= settingsTable["TextLabelPositionPadY"]
|
|
else
|
|
pixelsRemaining -= settingsTable["TextButtonPositionPadY"]
|
|
|
|
child.Position = UDim2.new child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining
|
|
child.Size = UDim2.new child.Size.X.Scale, child.Size.X.Offset, 0, pixelsRemaining
|
|
|
|
if child.TextFits and child.TextBounds.Y < pixelsRemaining
|
|
child.Visible = true
|
|
if isLabel
|
|
child.Size = UDim2.new(
|
|
child.Size.X.Scale,
|
|
child.Size.X.Offset,
|
|
0,
|
|
child.TextBounds.Y + settingsTable["TextLabelSizePadY"]
|
|
)
|
|
else
|
|
child.Size = UDim2.new(
|
|
child.Size.X.Scale,
|
|
child.Size.X.Offset,
|
|
0,
|
|
child.TextBounds.Y + settingsTable["TextButtonSizePadY"]
|
|
)
|
|
|
|
|
|
while not child.TextFits
|
|
child.Size = UDim2.new child.Size.X.Scale, child.Size.X.Offset, 0, child.AbsoluteSize.Y + 1
|
|
|
|
pixelsRemaining -= child.AbsoluteSize.Y
|
|
|
|
if isLabel
|
|
pixelsRemaining -= settingsTable["TextLabelPositionPadY"]
|
|
else
|
|
pixelsRemaining -= settingsTable["TextButtonPositionPadY"]
|
|
|
|
else
|
|
child.Visible = false
|
|
pixelsRemaining = -1
|
|
|
|
else
|
|
--GuiObject
|
|
child.Position = UDim2.new child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining
|
|
pixelsRemaining -= child.AbsoluteSize.Y
|
|
child.Visible = (pixelsRemaining >= 0)
|
|
|
|
|
|
t.LayoutGuiObjects = (frame, guiObjects, settingsTable) ->
|
|
if not frame\IsA "GuiObject"
|
|
error "Frame must be a GuiObject"
|
|
|
|
for _, child in ipairs guiObjects
|
|
if not child\IsA "GuiObject"
|
|
error "All elements that are layed out must be of type GuiObject"
|
|
|
|
|
|
if not settingsTable
|
|
settingsTable = {}
|
|
|
|
|
|
if not settingsTable["TextLabelSizePadY"]
|
|
settingsTable["TextLabelSizePadY"] = 0
|
|
|
|
if not settingsTable["TextLabelPositionPadY"]
|
|
settingsTable["TextLabelPositionPadY"] = 0
|
|
|
|
if not settingsTable["TextButtonSizePadY"]
|
|
settingsTable["TextButtonSizePadY"] = 12
|
|
|
|
if not settingsTable["TextButtonPositionPadY"]
|
|
settingsTable["TextButtonPositionPadY"] = 2
|
|
|
|
|
|
--Wrapper frame takes care of styled objects
|
|
wrapperFrame = Instance.new "Frame"
|
|
wrapperFrame.Name = "WrapperFrame"
|
|
wrapperFrame.BackgroundTransparency = 1
|
|
wrapperFrame.Size = UDim2.new 1, 0, 1, 0
|
|
wrapperFrame.Parent = frame
|
|
|
|
for _, child in ipairs guiObjects
|
|
child.Parent = wrapperFrame
|
|
|
|
|
|
recalculate = ->
|
|
wait!
|
|
layoutGuiObjectsHelper wrapperFrame, guiObjects, settingsTable
|
|
|
|
|
|
frame.Changed\connect (prop) ->
|
|
if prop == "AbsoluteSize"
|
|
--Wait a heartbeat for it to sync in
|
|
recalculate nil
|
|
|
|
|
|
frame.AncestryChanged\connect recalculate
|
|
|
|
layoutGuiObjectsHelper wrapperFrame, guiObjects, settingsTable
|
|
|
|
|
|
t.CreateSlider = (steps, width, position) ->
|
|
sliderGui = Instance.new "Frame"
|
|
sliderGui.Size = UDim2.new 1, 0, 1, 0
|
|
sliderGui.BackgroundTransparency = 1
|
|
sliderGui.Name = "SliderGui"
|
|
|
|
sliderSteps = Instance.new "IntValue"
|
|
sliderSteps.Name = "SliderSteps"
|
|
sliderSteps.Value = steps
|
|
sliderSteps.Parent = sliderGui
|
|
|
|
areaSoak = Instance.new "TextButton"
|
|
areaSoak.Name = "AreaSoak"
|
|
areaSoak.Text = ""
|
|
areaSoak.BackgroundTransparency = 1
|
|
areaSoak.Active = false
|
|
areaSoak.Size = UDim2.new 1, 0, 1, 0
|
|
areaSoak.Visible = false
|
|
areaSoak.ZIndex = 4
|
|
|
|
sliderGui.AncestryChanged\connect (_, parent) ->
|
|
if parent == nil
|
|
areaSoak.Parent = nil
|
|
else
|
|
areaSoak.Parent = getScreenGuiAncestor sliderGui
|
|
|
|
|
|
sliderPosition = Instance.new "IntValue"
|
|
sliderPosition.Name = "SliderPosition"
|
|
sliderPosition.Value = 0
|
|
sliderPosition.Parent = sliderGui
|
|
|
|
bar = Instance.new "TextButton"
|
|
bar.Text = ""
|
|
bar.AutoButtonColor = false
|
|
bar.Name = "Bar"
|
|
bar.BackgroundColor3 = Color3.new 0, 0, 0
|
|
if type(width) == "number"
|
|
bar.Size = UDim2.new 0, width, 0, 5
|
|
else
|
|
bar.Size = UDim2.new 0, 200, 0, 5
|
|
|
|
bar.BorderColor3 = Color3.new 95 / 255, 95 / 255, 95 / 255
|
|
bar.ZIndex = 2
|
|
bar.Parent = sliderGui
|
|
|
|
if position["X"] and
|
|
position["X"]["Scale"] and
|
|
position["X"]["Offset"] and
|
|
position["Y"] and
|
|
position["Y"]["Scale"] and
|
|
position["Y"]["Offset"]
|
|
|
|
bar.Position = position
|
|
|
|
|
|
slider = Instance.new "ImageButton"
|
|
slider.Name = "Slider"
|
|
slider.BackgroundTransparency = 1
|
|
slider.Image = "rbxasset://textures/ui/Slider.png"
|
|
slider.Position = UDim2.new 0, 0, 0.5, -10
|
|
slider.Size = UDim2.new 0, 20, 0, 20
|
|
slider.ZIndex = 3
|
|
slider.Parent = bar
|
|
|
|
local areaSoakMouseMoveCon
|
|
|
|
areaSoak.MouseLeave\connect ->
|
|
if areaSoak.Visible
|
|
cancelSlide areaSoak
|
|
|
|
|
|
areaSoak.MouseButton1Up\connect ->
|
|
if areaSoak.Visible
|
|
cancelSlide areaSoak
|
|
|
|
|
|
slider.MouseButton1Down\connect ->
|
|
areaSoak.Visible = true
|
|
if areaSoakMouseMoveCon
|
|
areaSoakMouseMoveCon\disconnect!
|
|
|
|
areaSoakMouseMoveCon = areaSoak.MouseMoved\connect (x, _) ->
|
|
setSliderPos x, slider, sliderPosition, bar, steps
|
|
|
|
|
|
slider.MouseButton1Up\connect ->
|
|
cancelSlide areaSoak
|
|
|
|
|
|
sliderPosition.Changed\connect (_) ->
|
|
sliderPosition.Value = math.min steps, math.max(1, sliderPosition.Value)
|
|
relativePosX = (sliderPosition.Value - 1) / (steps - 1)
|
|
slider.Position = UDim2.new relativePosX, -slider.AbsoluteSize.X / 2, slider.Position.Y.Scale, slider.Position.Y.Offset
|
|
|
|
|
|
bar.MouseButton1Down\connect (x, _) ->
|
|
setSliderPos x, slider, sliderPosition, bar, steps
|
|
|
|
|
|
return sliderGui, sliderPosition, sliderSteps
|
|
|
|
|
|
t.CreateTrueScrollingFrame = ->
|
|
local lowY
|
|
local highY
|
|
|
|
local dragCon
|
|
local upCon
|
|
|
|
internalChange = false
|
|
|
|
descendantsChangeConMap = {}
|
|
|
|
scrollingFrame = Instance.new "Frame"
|
|
scrollingFrame.Name = "ScrollingFrame"
|
|
scrollingFrame.Active = true
|
|
scrollingFrame.Size = UDim2.new 1, 0, 1, 0
|
|
scrollingFrame.ClipsDescendants = true
|
|
|
|
controlFrame = Instance.new "Frame"
|
|
controlFrame.Name = "ControlFrame"
|
|
controlFrame.BackgroundTransparency = 1
|
|
controlFrame.Size = UDim2.new 0, 18, 1, 0
|
|
controlFrame.Position = UDim2.new 1, -20, 0, 0
|
|
controlFrame.Parent = scrollingFrame
|
|
|
|
scrollBottom = Instance.new "BoolValue"
|
|
scrollBottom.Value = false
|
|
scrollBottom.Name = "ScrollBottom"
|
|
scrollBottom.Parent = controlFrame
|
|
|
|
scrollUp = Instance.new "BoolValue"
|
|
scrollUp.Value = false
|
|
scrollUp.Name = "scrollUp"
|
|
scrollUp.Parent = controlFrame
|
|
|
|
scrollUpButton = Instance.new "TextButton"
|
|
scrollUpButton.Name = "ScrollUpButton"
|
|
scrollUpButton.Text = ""
|
|
scrollUpButton.AutoButtonColor = false
|
|
scrollUpButton.BackgroundColor3 = Color3.new 0, 0, 0
|
|
scrollUpButton.BorderColor3 = Color3.new 1, 1, 1
|
|
scrollUpButton.BackgroundTransparency = 0.5
|
|
scrollUpButton.Size = UDim2.new 0, 18, 0, 18
|
|
scrollUpButton.ZIndex = 2
|
|
scrollUpButton.Parent = controlFrame
|
|
for i = 1, 6
|
|
triFrame = Instance.new "Frame"
|
|
triFrame.BorderColor3 = Color3.new 1, 1, 1
|
|
triFrame.Name = "tri" .. "#{i}"
|
|
triFrame.ZIndex = 3
|
|
triFrame.BackgroundTransparency = 0.5
|
|
triFrame.Size = UDim2.new 0, 12 - ((i - 1) * 2), 0, 0
|
|
triFrame.Position = UDim2.new 0, 3 + (i - 1), 0.5, 2 - (i - 1)
|
|
triFrame.Parent = scrollUpButton
|
|
|
|
scrollUpButton.MouseEnter\connect ->
|
|
scrollUpButton.BackgroundTransparency = 0.1
|
|
upChildren = scrollUpButton\GetChildren!
|
|
for i = 1, #upChildren
|
|
upChildren[i].BackgroundTransparency = 0.1
|
|
|
|
|
|
scrollUpButton.MouseLeave\connect ->
|
|
scrollUpButton.BackgroundTransparency = 0.5
|
|
upChildren = scrollUpButton\GetChildren!
|
|
for i = 1, #upChildren
|
|
upChildren[i].BackgroundTransparency = 0.5
|
|
|
|
|
|
scrollDownButton = scrollUpButton\clone!
|
|
scrollDownButton.Name = "ScrollDownButton"
|
|
scrollDownButton.Position = UDim2.new 0, 0, 1, -18
|
|
downChildren = scrollDownButton\GetChildren!
|
|
for i = 1, #downChildren
|
|
downChildren[i].Position = UDim2.new 0, 3 + (i - 1), 0.5, -2 + (i - 1)
|
|
|
|
scrollDownButton.MouseEnter\connect ->
|
|
scrollDownButton.BackgroundTransparency = 0.1
|
|
downChildren = scrollDownButton\GetChildren!
|
|
for i = 1, #downChildren
|
|
downChildren[i].BackgroundTransparency = 0.1
|
|
|
|
|
|
scrollDownButton.MouseLeave\connect ->
|
|
scrollDownButton.BackgroundTransparency = 0.5
|
|
downChildren = scrollDownButton\GetChildren!
|
|
for i = 1, #downChildren
|
|
downChildren[i].BackgroundTransparency = 0.5
|
|
|
|
|
|
scrollDownButton.Parent = controlFrame
|
|
|
|
scrollTrack = Instance.new "Frame"
|
|
scrollTrack.Name = "ScrollTrack"
|
|
scrollTrack.BackgroundTransparency = 1
|
|
scrollTrack.Size = UDim2.new 0, 18, 1, -38
|
|
scrollTrack.Position = UDim2.new 0, 0, 0, 19
|
|
scrollTrack.Parent = controlFrame
|
|
|
|
scrollbar = Instance.new "TextButton"
|
|
scrollbar.BackgroundColor3 = Color3.new 0, 0, 0
|
|
scrollbar.BorderColor3 = Color3.new 1, 1, 1
|
|
scrollbar.BackgroundTransparency = 0.5
|
|
scrollbar.AutoButtonColor = false
|
|
scrollbar.Text = ""
|
|
scrollbar.Active = true
|
|
scrollbar.Name = "ScrollBar"
|
|
scrollbar.ZIndex = 2
|
|
scrollbar.BackgroundTransparency = 0.5
|
|
scrollbar.Size = UDim2.new 0, 18, 0.1, 0
|
|
scrollbar.Position = UDim2.new 0, 0, 0, 0
|
|
scrollbar.Parent = scrollTrack
|
|
|
|
scrollNub = Instance.new "Frame"
|
|
scrollNub.Name = "ScrollNub"
|
|
scrollNub.BorderColor3 = Color3.new 1, 1, 1
|
|
scrollNub.Size = UDim2.new 0, 10, 0, 0
|
|
scrollNub.Position = UDim2.new 0.5, -5, 0.5, 0
|
|
scrollNub.ZIndex = 2
|
|
scrollNub.BackgroundTransparency = 0.5
|
|
scrollNub.Parent = scrollbar
|
|
|
|
newNub = scrollNub\clone!
|
|
newNub.Position = UDim2.new 0.5, -5, 0.5, -2
|
|
newNub.Parent = scrollbar
|
|
|
|
lastNub = scrollNub\clone!
|
|
lastNub.Position = UDim2.new 0.5, -5, 0.5, 2
|
|
lastNub.Parent = scrollbar
|
|
|
|
scrollbar.MouseEnter\connect ->
|
|
scrollbar.BackgroundTransparency = 0.1
|
|
scrollNub.BackgroundTransparency = 0.1
|
|
newNub.BackgroundTransparency = 0.1
|
|
lastNub.BackgroundTransparency = 0.1
|
|
|
|
scrollbar.MouseLeave\connect ->
|
|
scrollbar.BackgroundTransparency = 0.5
|
|
scrollNub.BackgroundTransparency = 0.5
|
|
newNub.BackgroundTransparency = 0.5
|
|
lastNub.BackgroundTransparency = 0.5
|
|
|
|
|
|
mouseDrag = Instance.new "ImageButton"
|
|
mouseDrag.Active = false
|
|
mouseDrag.Size = UDim2.new 1.5, 0, 1.5, 0
|
|
mouseDrag.AutoButtonColor = false
|
|
mouseDrag.BackgroundTransparency = 1
|
|
mouseDrag.Name = "mouseDrag"
|
|
mouseDrag.Position = UDim2.new -0.25, 0, -0.25, 0
|
|
mouseDrag.ZIndex = 10
|
|
|
|
positionScrollBar = (_, y, offset) ->
|
|
oldPos = scrollbar.Position
|
|
|
|
if y < scrollTrack.AbsolutePosition.y
|
|
scrollbar.Position = UDim2.new scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 0, 0
|
|
return (oldPos ~= scrollbar.Position)
|
|
|
|
|
|
relativeSize = scrollbar.AbsoluteSize.Y / scrollTrack.AbsoluteSize.Y
|
|
|
|
if y > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y)
|
|
scrollbar.Position = UDim2.new scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 1 - relativeSize, 0
|
|
return (oldPos ~= scrollbar.Position)
|
|
|
|
newScaleYPos = (y - scrollTrack.AbsolutePosition.y - offset) / scrollTrack.AbsoluteSize.y
|
|
if newScaleYPos + relativeSize > 1
|
|
newScaleYPos = 1 - relativeSize
|
|
scrollBottom.Value = true
|
|
scrollUp.Value = false
|
|
elseif newScaleYPos <= 0
|
|
newScaleYPos = 0
|
|
scrollUp.Value = true
|
|
scrollBottom.Value = false
|
|
else
|
|
scrollUp.Value = false
|
|
scrollBottom.Value = false
|
|
|
|
scrollbar.Position = UDim2.new scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, newScaleYPos, 0
|
|
|
|
return (oldPos ~= scrollbar.Position)
|
|
|
|
|
|
drillDownSetHighLow = (instance) ->
|
|
if not instance or not instance\IsA "GuiObject"
|
|
return
|
|
|
|
if instance == controlFrame
|
|
return
|
|
|
|
if instance\IsDescendantOf controlFrame
|
|
return
|
|
|
|
if not instance.Visible
|
|
return
|
|
|
|
|
|
if (lowY and lowY > instance.AbsolutePosition.Y) or not lowY
|
|
lowY = instance.AbsolutePosition.Y
|
|
|
|
if (highY and highY < (instance.AbsolutePosition.Y + instance.AbsoluteSize.Y)) or not highY
|
|
highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y
|
|
|
|
children = instance\GetChildren!
|
|
for i = 1, #children
|
|
drillDownSetHighLow children[i]
|
|
|
|
|
|
resetHighLow = ->
|
|
firstChildren = scrollingFrame\GetChildren!
|
|
|
|
for i = 1, #firstChildren
|
|
drillDownSetHighLow firstChildren[i]
|
|
|
|
|
|
recalculate = ->
|
|
internalChange = true
|
|
|
|
percentFrame = 0
|
|
if scrollbar.Position.Y.Scale > 0
|
|
if scrollbar.Visible
|
|
percentFrame = scrollbar.Position.Y.Scale / ((scrollTrack.AbsoluteSize.Y - scrollbar.AbsoluteSize.Y) / scrollTrack.AbsoluteSize.Y)
|
|
else
|
|
percentFrame = 0
|
|
|
|
|
|
if percentFrame > 0.99
|
|
percentFrame = 1
|
|
|
|
|
|
hiddenYAmount = (scrollingFrame.AbsoluteSize.Y - (highY - lowY)) * percentFrame
|
|
|
|
guiChildren = scrollingFrame\GetChildren!
|
|
for i = 1, #guiChildren
|
|
if guiChildren[i] ~= controlFrame
|
|
guiChildren[i].Position = UDim2.new(
|
|
guiChildren[i].Position.X.Scale,
|
|
guiChildren[i].Position.X.Offset,
|
|
0,
|
|
math.ceil(guiChildren[i].AbsolutePosition.Y) - math.ceil lowY + hiddenYAmount
|
|
)
|
|
|
|
|
|
lowY = nil
|
|
highY = nil
|
|
resetHighLow!
|
|
internalChange = false
|
|
|
|
|
|
setSliderSizeAndPosition = ->
|
|
if not highY or not lowY
|
|
return
|
|
|
|
|
|
totalYSpan = math.abs highY - lowY
|
|
if totalYSpan == 0
|
|
scrollbar.Visible = false
|
|
scrollDownButton.Visible = false
|
|
scrollUpButton.Visible = false
|
|
|
|
if dragCon
|
|
dragCon\disconnect!
|
|
dragCon = nil
|
|
|
|
if upCon
|
|
upCon\disconnect!
|
|
upCon = nil
|
|
|
|
return
|
|
|
|
|
|
percentShown = scrollingFrame.AbsoluteSize.Y / totalYSpan
|
|
if percentShown >= 1
|
|
scrollbar.Visible = false
|
|
scrollDownButton.Visible = false
|
|
scrollUpButton.Visible = false
|
|
recalculate!
|
|
else
|
|
scrollbar.Visible = true
|
|
scrollDownButton.Visible = true
|
|
scrollUpButton.Visible = true
|
|
|
|
scrollbar.Size = UDim2.new scrollbar.Size.X.Scale, scrollbar.Size.X.Offset, percentShown, 0
|
|
|
|
|
|
percentPosition = (scrollingFrame.AbsolutePosition.Y - lowY) / totalYSpan
|
|
scrollbar.Position = UDim2.new(
|
|
scrollbar.Position.X.Scale,
|
|
scrollbar.Position.X.Offset,
|
|
percentPosition,
|
|
-scrollbar.AbsoluteSize.X / 2
|
|
)
|
|
|
|
if scrollbar.AbsolutePosition.y < scrollTrack.AbsolutePosition.y
|
|
scrollbar.Position = UDim2.new scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 0, 0
|
|
|
|
|
|
if (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.Y) > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y)
|
|
|
|
relativeSize = scrollbar.AbsoluteSize.Y / scrollTrack.AbsoluteSize.Y
|
|
scrollbar.Position = UDim2.new scrollbar.Position.X.Scale, scrollbar.Position.X.Offset, 1 - relativeSize, 0
|
|
|
|
|
|
buttonScrollAmountPixels = 7
|
|
reentrancyGuardScrollUp = false
|
|
doScrollUp = ->
|
|
if reentrancyGuardScrollUp
|
|
return
|
|
|
|
|
|
reentrancyGuardScrollUp = true
|
|
if positionScrollBar 0, scrollbar.AbsolutePosition.Y - buttonScrollAmountPixels, 0
|
|
recalculate!
|
|
|
|
reentrancyGuardScrollUp = false
|
|
|
|
|
|
reentrancyGuardScrollDown = false
|
|
doScrollDown = ->
|
|
if reentrancyGuardScrollDown
|
|
return
|
|
|
|
|
|
reentrancyGuardScrollDown = true
|
|
if positionScrollBar 0, scrollbar.AbsolutePosition.Y + buttonScrollAmountPixels, 0
|
|
recalculate!
|
|
|
|
reentrancyGuardScrollDown = false
|
|
|
|
|
|
scrollUp = (mouseYPos) ->
|
|
if scrollUpButton.Active
|
|
scrollStamp = tick!
|
|
current = scrollStamp
|
|
local upCon
|
|
upCon = mouseDrag.MouseButton1Up\connect ->
|
|
scrollStamp = tick!
|
|
mouseDrag.Parent = nil
|
|
upCon\disconnect!
|
|
|
|
mouseDrag.Parent = getScreenGuiAncestor scrollbar
|
|
doScrollUp!
|
|
wait 0.2
|
|
t = tick!
|
|
w = 0.1
|
|
while scrollStamp == current
|
|
doScrollUp!
|
|
if mouseYPos and mouseYPos > scrollbar.AbsolutePosition.y
|
|
break
|
|
|
|
if not scrollUpButton.Active
|
|
break
|
|
|
|
if tick! - t > 5
|
|
w = 0
|
|
elseif tick! - t > 2
|
|
w = 0.06
|
|
|
|
wait w
|
|
|
|
|
|
scrollDown = (mouseYPos) ->
|
|
if scrollDownButton.Active
|
|
scrollStamp = tick!
|
|
current = scrollStamp
|
|
local downCon
|
|
downCon = mouseDrag.MouseButton1Up\connect ->
|
|
scrollStamp = tick!
|
|
mouseDrag.Parent = nil
|
|
downCon\disconnect!
|
|
|
|
mouseDrag.Parent = getScreenGuiAncestor scrollbar
|
|
doScrollDown!
|
|
wait 0.2
|
|
t = tick!
|
|
w = 0.1
|
|
while scrollStamp == current
|
|
doScrollDown!
|
|
if mouseYPos and mouseYPos < (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.x)
|
|
break
|
|
|
|
if not scrollDownButton.Active
|
|
break
|
|
|
|
if tick! - t > 5
|
|
w = 0
|
|
elseif tick! - t > 2
|
|
w = 0.06
|
|
|
|
wait w
|
|
|
|
|
|
scrollbar.MouseButton1Down\connect (_, y) ->
|
|
if scrollbar.Active
|
|
scrollStamp = tick!
|
|
mouseOffset = y - scrollbar.AbsolutePosition.y
|
|
if dragCon
|
|
dragCon\disconnect!
|
|
dragCon = nil
|
|
|
|
if upCon
|
|
upCon\disconnect!
|
|
upCon = nil
|
|
|
|
reentrancyGuardMouseScroll = false
|
|
dragCon = mouseDrag.MouseMoved\connect (x, y) ->
|
|
if reentrancyGuardMouseScroll
|
|
return
|
|
|
|
|
|
reentrancyGuardMouseScroll = true
|
|
if positionScrollBar x, y, mouseOffset
|
|
recalculate!
|
|
|
|
reentrancyGuardMouseScroll = false
|
|
|
|
upCon = mouseDrag.MouseButton1Up\connect ->
|
|
scrollStamp = tick!
|
|
mouseDrag.Parent = nil
|
|
dragCon\disconnect!
|
|
dragCon = nil
|
|
upCon\disconnect!
|
|
global drag = nil
|
|
|
|
mouseDrag.Parent = getScreenGuiAncestor scrollbar
|
|
|
|
|
|
scrollMouseCount = 0
|
|
|
|
scrollUpButton.MouseButton1Down\connect ->
|
|
scrollUp!
|
|
|
|
scrollDownButton.MouseButton1Down\connect ->
|
|
scrollDown!
|
|
|
|
|
|
scrollTick = ->
|
|
global scrollStamp = tick!
|
|
|
|
|
|
scrollUpButton.MouseButton1Up\connect scrollTick
|
|
scrollDownButton.MouseButton1Up\connect scrollTick
|
|
scrollbar.MouseButton1Up\connect scrollTick
|
|
|
|
-- heightCheck = (instance) ->
|
|
-- if (highY and (instance.AbsolutePosition.Y + instance.AbsoluteSize.Y) > highY) or not highY
|
|
-- highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y
|
|
-- end
|
|
-- setSliderSizeAndPosition!
|
|
-- end
|
|
|
|
highLowRecheck = ->
|
|
oldLowY = lowY
|
|
oldHighY = highY
|
|
lowY = nil
|
|
highY = nil
|
|
resetHighLow!
|
|
|
|
if (lowY ~= oldLowY) or (highY ~= oldHighY)
|
|
setSliderSizeAndPosition!
|
|
|
|
|
|
descendantChanged = (this, prop) ->
|
|
if internalChange
|
|
return
|
|
|
|
if not this.Visible
|
|
return
|
|
|
|
|
|
if prop == "Size" or prop == "Position"
|
|
wait!
|
|
highLowRecheck!
|
|
|
|
|
|
scrollingFrame.DescendantAdded\connect (instance) ->
|
|
if not instance\IsA "GuiObject"
|
|
return
|
|
|
|
|
|
if instance.Visible
|
|
wait! -- wait a heartbeat for sizes to reconfig
|
|
highLowRecheck!
|
|
|
|
|
|
descendantsChangeConMap[instance] = instance.Changed\connect (prop) ->
|
|
descendantChanged instance, prop
|
|
|
|
|
|
scrollingFrame.DescendantRemoving\connect (instance) ->
|
|
if not instance\IsA "GuiObject"
|
|
return
|
|
|
|
if descendantsChangeConMap[instance]
|
|
descendantsChangeConMap[instance]\disconnect!
|
|
descendantsChangeConMap[instance] = nil
|
|
|
|
wait! -- wait a heartbeat for sizes to reconfig
|
|
highLowRecheck!
|
|
|
|
|
|
scrollingFrame.Changed\connect (prop) ->
|
|
if prop == "AbsoluteSize"
|
|
if not highY or not lowY
|
|
return
|
|
|
|
|
|
highLowRecheck!
|
|
setSliderSizeAndPosition!
|
|
|
|
|
|
return scrollingFrame, controlFrame
|
|
|
|
|
|
t.CreateScrollingFrame = (orderList, scrollStyle) ->
|
|
frame = Instance.new "Frame"
|
|
frame.Name = "ScrollingFrame"
|
|
frame.BackgroundTransparency = 1
|
|
frame.Size = UDim2.new 1, 0, 1, 0
|
|
|
|
scrollUpButton = Instance.new "ImageButton"
|
|
scrollUpButton.Name = "ScrollUpButton"
|
|
scrollUpButton.BackgroundTransparency = 1
|
|
scrollUpButton.Image = "rbxasset://textures/ui/scrollbuttonUp.png"
|
|
scrollUpButton.Size = UDim2.new 0, 17, 0, 17
|
|
|
|
scrollDownButton = Instance.new "ImageButton"
|
|
scrollDownButton.Name = "ScrollDownButton"
|
|
scrollDownButton.BackgroundTransparency = 1
|
|
scrollDownButton.Image = "rbxasset://textures/ui/scrollbuttonDown.png"
|
|
scrollDownButton.Size = UDim2.new 0, 17, 0, 17
|
|
|
|
scrollbar = Instance.new "ImageButton"
|
|
scrollbar.Name = "ScrollBar"
|
|
scrollbar.Image = "rbxasset://textures/ui/scrollbar.png"
|
|
scrollbar.BackgroundTransparency = 1
|
|
scrollbar.Size = UDim2.new 0, 18, 0, 150
|
|
|
|
scrollStamp = 0
|
|
|
|
scrollDrag = Instance.new "ImageButton"
|
|
scrollDrag.Image = "http://www.roblox.com/asset/?id=61367186"
|
|
scrollDrag.Size = UDim2.new 1, 0, 0, 16
|
|
scrollDrag.BackgroundTransparency = 1
|
|
scrollDrag.Name = "ScrollDrag"
|
|
scrollDrag.Active = true
|
|
scrollDrag.Parent = scrollbar
|
|
|
|
mouseDrag = Instance.new "ImageButton"
|
|
mouseDrag.Active = false
|
|
mouseDrag.Size = UDim2.new 1.5, 0, 1.5, 0
|
|
mouseDrag.AutoButtonColor = false
|
|
mouseDrag.BackgroundTransparency = 1
|
|
mouseDrag.Name = "mouseDrag"
|
|
mouseDrag.Position = UDim2.new -0.25, 0, -0.25, 0
|
|
mouseDrag.ZIndex = 10
|
|
|
|
style = "simple"
|
|
if scrollStyle and "#{scrollStyle}"
|
|
style = scrollStyle
|
|
|
|
|
|
scrollPosition = 1
|
|
rowSize = 0
|
|
howManyDisplayed = 0
|
|
|
|
layoutGridScrollBar = ->
|
|
howManyDisplayed = 0
|
|
guiObjects = {}
|
|
if orderList
|
|
for _, child in ipairs orderList
|
|
if child.Parent == frame
|
|
table.insert guiObjects, child
|
|
|
|
|
|
else
|
|
children = frame\GetChildren!
|
|
if children
|
|
for _, child in ipairs children
|
|
if child\IsA "GuiObject"
|
|
table.insert guiObjects, child
|
|
|
|
|
|
if #guiObjects == 0
|
|
scrollUpButton.Active = false
|
|
scrollDownButton.Active = false
|
|
scrollDrag.Active = false
|
|
scrollPosition = 1
|
|
return
|
|
|
|
|
|
if scrollPosition > #guiObjects
|
|
scrollPosition = #guiObjects
|
|
|
|
|
|
if scrollPosition < 1
|
|
scrollPosition = 1
|
|
|
|
|
|
totalPixelsY = frame.AbsoluteSize.Y
|
|
pixelsRemainingY = frame.AbsoluteSize.Y
|
|
|
|
totalPixelsX = frame.AbsoluteSize.X
|
|
|
|
xCounter = 0
|
|
rowSizeCounter = 0
|
|
setRowSize = true
|
|
|
|
pixelsBelowScrollbar = 0
|
|
pos = #guiObjects
|
|
|
|
currentRowY = 0
|
|
|
|
pos = scrollPosition
|
|
--count up from current scroll position to fill out grid
|
|
while pos <= #guiObjects and pixelsBelowScrollbar < totalPixelsY
|
|
xCounter += guiObjects[pos].AbsoluteSize.X
|
|
--previous pos was the end of a row
|
|
if xCounter >= totalPixelsX
|
|
pixelsBelowScrollbar += currentRowY
|
|
currentRowY = 0
|
|
xCounter = guiObjects[pos].AbsoluteSize.X
|
|
|
|
if guiObjects[pos].AbsoluteSize.Y > currentRowY
|
|
currentRowY = guiObjects[pos].AbsoluteSize.Y
|
|
|
|
pos += 1
|
|
|
|
--Count wherever current row left off
|
|
pixelsBelowScrollbar += currentRowY
|
|
currentRowY = 0
|
|
|
|
pos = scrollPosition - 1
|
|
xCounter = 0
|
|
|
|
--objects with varying X,Y dimensions can rarely cause minor errors
|
|
--rechecking every new scrollPosition is necessary to avoid 100% of errors
|
|
|
|
--count backwards from current scrollPosition to see if we can add more rows
|
|
while pixelsBelowScrollbar + currentRowY < totalPixelsY and pos >= 1
|
|
xCounter += guiObjects[pos].AbsoluteSize.X
|
|
rowSizeCounter += 1
|
|
if xCounter >= totalPixelsX
|
|
rowSize = rowSizeCounter - 1
|
|
rowSizeCounter = 0
|
|
xCounter = guiObjects[pos].AbsoluteSize.X
|
|
if pixelsBelowScrollbar + currentRowY <= totalPixelsY
|
|
--It fits, so back up our scroll position
|
|
pixelsBelowScrollbar += currentRowY
|
|
if scrollPosition <= rowSize
|
|
scrollPosition = 1
|
|
break
|
|
else
|
|
scrollPosition -= rowSize
|
|
|
|
currentRowY = 0
|
|
else
|
|
break
|
|
|
|
|
|
if guiObjects[pos].AbsoluteSize.Y > currentRowY
|
|
currentRowY = guiObjects[pos].AbsoluteSize.Y
|
|
|
|
|
|
pos -= 1
|
|
|
|
|
|
--Do check last time if pos = 0
|
|
if (pos == 0) and (pixelsBelowScrollbar + currentRowY <= totalPixelsY)
|
|
scrollPosition = 1
|
|
|
|
|
|
xCounter = 0
|
|
--pos = scrollPosition
|
|
rowSizeCounter = 0
|
|
setRowSize = true
|
|
lastChildSize = 0
|
|
|
|
xOffset = yOffset = 0
|
|
if guiObjects[1]
|
|
yOffset = math.ceil math.floor(math.fmod(totalPixelsY, guiObjects[1].AbsoluteSize.X)) / 2
|
|
xOffset = math.ceil math.floor(math.fmod(totalPixelsX, guiObjects[1].AbsoluteSize.Y)) / 2
|
|
|
|
|
|
for i, child in ipairs guiObjects
|
|
if i < scrollPosition
|
|
--print "Hiding " .. child.Name
|
|
child.Visible = false
|
|
else
|
|
if pixelsRemainingY < 0
|
|
--print "Out of Space " .. child.Name
|
|
child.Visible = false
|
|
else
|
|
--print "Laying out " .. child.Name
|
|
--GuiObject
|
|
if setRowSize
|
|
rowSizeCounter += 1
|
|
|
|
if xCounter + child.AbsoluteSize.X >= totalPixelsX
|
|
if setRowSize
|
|
rowSize = rowSizeCounter - 1
|
|
setRowSize = false
|
|
|
|
xCounter = 0
|
|
pixelsRemainingY -= child.AbsoluteSize.Y
|
|
|
|
child.Position = UDim2.new(
|
|
child.Position.X.Scale,
|
|
xCounter + xOffset,
|
|
0,
|
|
totalPixelsY - pixelsRemainingY + yOffset
|
|
)
|
|
xCounter += child.AbsoluteSize.X
|
|
child.Visible = ((pixelsRemainingY - child.AbsoluteSize.Y) >= 0)
|
|
if child.Visible
|
|
howManyDisplayed += 1
|
|
|
|
lastChildSize = child.AbsoluteSize
|
|
|
|
|
|
scrollUpButton.Active = (scrollPosition > 1)
|
|
if lastChildSize == 0
|
|
scrollDownButton.Active = false
|
|
else
|
|
scrollDownButton.Active = ((pixelsRemainingY - lastChildSize.Y) < 0)
|
|
|
|
scrollDrag.Active = #guiObjects > howManyDisplayed
|
|
scrollDrag.Visible = scrollDrag.Active
|
|
|
|
|
|
layoutSimpleScrollBar = ->
|
|
guiObjects = {}
|
|
howManyDisplayed = 0
|
|
|
|
if orderList
|
|
for _, child in ipairs orderList
|
|
if child.Parent == frame
|
|
table.insert guiObjects, child
|
|
|
|
|
|
else
|
|
children = frame\GetChildren!
|
|
if children
|
|
for _, child in ipairs children
|
|
if child\IsA "GuiObject"
|
|
table.insert guiObjects, child
|
|
|
|
|
|
if #guiObjects == 0
|
|
scrollUpButton.Active = false
|
|
scrollDownButton.Active = false
|
|
scrollDrag.Active = false
|
|
scrollPosition = 1
|
|
return
|
|
|
|
|
|
if scrollPosition > #guiObjects
|
|
scrollPosition = #guiObjects
|
|
|
|
|
|
totalPixels = frame.AbsoluteSize.Y
|
|
pixelsRemaining = frame.AbsoluteSize.Y
|
|
|
|
pixelsBelowScrollbar = 0
|
|
pos = #guiObjects
|
|
while pixelsBelowScrollbar < totalPixels and pos >= 1
|
|
if pos >= scrollPosition
|
|
pixelsBelowScrollbar += guiObjects[pos].AbsoluteSize.Y
|
|
else
|
|
if pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y <= totalPixels
|
|
--It fits, so back up our scroll position
|
|
pixelsBelowScrollbar += guiObjects[pos].AbsoluteSize.Y
|
|
if scrollPosition <= 1
|
|
scrollPosition = 1
|
|
break
|
|
else
|
|
--local ("Backing up ScrollPosition from -- " ..scrollPosition)
|
|
scrollPosition -= 1
|
|
|
|
else
|
|
break
|
|
|
|
|
|
pos -= 1
|
|
|
|
|
|
pos = scrollPosition
|
|
for i, child in ipairs guiObjects
|
|
if i < scrollPosition
|
|
--print "Hiding " .. child.Name
|
|
child.Visible = false
|
|
else
|
|
if pixelsRemaining < 0
|
|
--print "Out of Space " .. child.Name
|
|
child.Visible = false
|
|
else
|
|
--print "Laying out " .. child.Name
|
|
--GuiObject
|
|
child.Position = UDim2.new child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining
|
|
pixelsRemaining -= child.AbsoluteSize.Y
|
|
if pixelsRemaining >= 0
|
|
child.Visible = true
|
|
howManyDisplayed += 1
|
|
else
|
|
child.Visible = false
|
|
|
|
|
|
scrollUpButton.Active = (scrollPosition > 1)
|
|
scrollDownButton.Active = (pixelsRemaining < 0)
|
|
scrollDrag.Active = #guiObjects > howManyDisplayed
|
|
scrollDrag.Visible = scrollDrag.Active
|
|
|
|
|
|
moveDragger = ->
|
|
guiObjects = 0
|
|
children = frame\GetChildren!
|
|
if children
|
|
for _, child in ipairs children
|
|
if child\IsA "GuiObject"
|
|
guiObjects += 1
|
|
|
|
|
|
if not scrollDrag.Parent
|
|
return
|
|
|
|
|
|
dragSizeY = scrollDrag.Parent.AbsoluteSize.y * (1 / (guiObjects - howManyDisplayed + 1))
|
|
if dragSizeY < 16
|
|
dragSizeY = 16
|
|
|
|
scrollDrag.Size = UDim2.new scrollDrag.Size.X.Scale, scrollDrag.Size.X.Offset, scrollDrag.Size.Y.Scale, dragSizeY
|
|
|
|
relativeYPos = (scrollPosition - 1) / (guiObjects - howManyDisplayed)
|
|
if relativeYPos > 1
|
|
relativeYPos = 1
|
|
elseif relativeYPos < 0
|
|
relativeYPos = 0
|
|
|
|
absYPos = 0
|
|
|
|
if relativeYPos ~= 0
|
|
absYPos = (relativeYPos * scrollbar.AbsoluteSize.y) - (relativeYPos * scrollDrag.AbsoluteSize.y)
|
|
|
|
|
|
scrollDrag.Position = UDim2.new scrollDrag.Position.X.Scale, scrollDrag.Position.X.Offset, scrollDrag.Position.Y.Scale, absYPos
|
|
|
|
|
|
reentrancyGuard = false
|
|
recalculate = ->
|
|
if reentrancyGuard
|
|
return
|
|
|
|
reentrancyGuard = true
|
|
wait!
|
|
local success, err
|
|
if style == "grid"
|
|
success, err = try
|
|
layoutGridScrollBar!
|
|
|
|
elseif style == "simple"
|
|
success, err = try
|
|
layoutSimpleScrollBar!
|
|
|
|
|
|
if not success
|
|
print err
|
|
|
|
moveDragger!
|
|
reentrancyGuard = false
|
|
|
|
|
|
doScrollUp = ->
|
|
scrollPosition -= rowSize
|
|
if scrollPosition < 1
|
|
scrollPosition = 1
|
|
|
|
recalculate nil
|
|
|
|
|
|
doScrollDown = ->
|
|
scrollPosition += rowSize
|
|
recalculate nil
|
|
|
|
|
|
scrollUp = (mouseYPos) ->
|
|
if scrollUpButton.Active
|
|
scrollStamp = tick!
|
|
current = scrollStamp
|
|
local upCon
|
|
upCon = mouseDrag.MouseButton1Up\connect ->
|
|
scrollStamp = tick!
|
|
mouseDrag.Parent = nil
|
|
upCon\disconnect!
|
|
|
|
mouseDrag.Parent = getScreenGuiAncestor scrollbar
|
|
doScrollUp!
|
|
wait 0.2
|
|
t = tick!
|
|
w = 0.1
|
|
while scrollStamp == current
|
|
doScrollUp!
|
|
if mouseYPos and mouseYPos > scrollDrag.AbsolutePosition.y
|
|
break
|
|
|
|
if not scrollUpButton.Active
|
|
break
|
|
|
|
if tick! - t > 5
|
|
w = 0
|
|
elseif tick! - t > 2
|
|
w = 0.06
|
|
|
|
wait w
|
|
|
|
|
|
scrollDown = (mouseYPos) ->
|
|
if scrollDownButton.Active
|
|
scrollStamp = tick!
|
|
current = scrollStamp
|
|
local downCon
|
|
downCon = mouseDrag.MouseButton1Up\connect ->
|
|
scrollStamp = tick!
|
|
mouseDrag.Parent = nil
|
|
downCon\disconnect!
|
|
|
|
mouseDrag.Parent = getScreenGuiAncestor scrollbar
|
|
doScrollDown!
|
|
wait 0.2
|
|
t = tick!
|
|
w = 0.1
|
|
while scrollStamp == current
|
|
doScrollDown!
|
|
if mouseYPos and mouseYPos < (scrollDrag.AbsolutePosition.y + scrollDrag.AbsoluteSize.x)
|
|
break
|
|
|
|
if not scrollDownButton.Active
|
|
break
|
|
|
|
if tick! - t > 5
|
|
w = 0
|
|
elseif tick! - t > 2
|
|
w = 0.06
|
|
|
|
wait w
|
|
|
|
|
|
-- y = 0
|
|
scrollDrag.MouseButton1Down\connect (_, y) ->
|
|
if scrollDrag.Active
|
|
scrollStamp = tick!
|
|
mouseOffset = y - scrollDrag.AbsolutePosition.y
|
|
local dragCon
|
|
local upCon
|
|
dragCon = mouseDrag.MouseMoved\connect (_, y) ->
|
|
barAbsPos = scrollbar.AbsolutePosition.y
|
|
barAbsSize = scrollbar.AbsoluteSize.y
|
|
|
|
dragAbsSize = scrollDrag.AbsoluteSize.y
|
|
barAbsOne = barAbsPos + barAbsSize - dragAbsSize
|
|
y -= mouseOffset
|
|
y = y < barAbsPos and barAbsPos or y > barAbsOne and barAbsOne or y
|
|
y -= barAbsPos
|
|
|
|
guiObjects = 0
|
|
children = frame\GetChildren!
|
|
if children
|
|
for _, child in ipairs children
|
|
if child\IsA "GuiObject"
|
|
guiObjects += 1
|
|
|
|
|
|
doublePercent = y / (barAbsSize - dragAbsSize)
|
|
rowDiff = rowSize
|
|
totalScrollCount = guiObjects - (howManyDisplayed - 1)
|
|
newScrollPosition = math.floor((doublePercent * totalScrollCount) + 0.5) + rowDiff
|
|
if newScrollPosition < scrollPosition
|
|
rowDiff = -rowDiff
|
|
|
|
|
|
if newScrollPosition < 1
|
|
newScrollPosition = 1
|
|
|
|
|
|
scrollPosition = newScrollPosition
|
|
recalculate nil
|
|
|
|
upCon = mouseDrag.MouseButton1Up\connect ->
|
|
scrollStamp = tick!
|
|
mouseDrag.Parent = nil
|
|
dragCon\disconnect!
|
|
dragCon = nil
|
|
upCon\disconnect!
|
|
global drag = nil
|
|
|
|
mouseDrag.Parent = getScreenGuiAncestor scrollbar
|
|
|
|
|
|
scrollMouseCount = 0
|
|
|
|
scrollUpButton.MouseButton1Down\connect ->
|
|
scrollUp!
|
|
|
|
scrollUpButton.MouseButton1Up\connect ->
|
|
scrollStamp = tick!
|
|
|
|
|
|
scrollDownButton.MouseButton1Up\connect ->
|
|
scrollStamp = tick!
|
|
|
|
scrollDownButton.MouseButton1Down\connect ->
|
|
scrollDown!
|
|
|
|
|
|
scrollbar.MouseButton1Up\connect ->
|
|
scrollStamp = tick!
|
|
|
|
scrollbar.MouseButton1Down\connect (_, y) ->
|
|
if y > (scrollDrag.AbsoluteSize.y + scrollDrag.AbsolutePosition.y)
|
|
scrollDown y
|
|
elseif y < scrollDrag.AbsolutePosition.y
|
|
scrollUp y
|
|
|
|
|
|
frame.ChildAdded\connect ->
|
|
recalculate nil
|
|
|
|
|
|
frame.ChildRemoved\connect ->
|
|
recalculate nil
|
|
|
|
|
|
frame.Changed\connect (prop) ->
|
|
if prop == "AbsoluteSize"
|
|
--Wait a heartbeat for it to sync in
|
|
recalculate nil
|
|
|
|
|
|
frame.AncestryChanged\connect ->
|
|
recalculate nil
|
|
|
|
|
|
return frame, scrollUpButton, scrollDownButton, recalculate, scrollbar
|
|
|
|
binaryGrow = (min, max, fits) ->
|
|
if min > max
|
|
return min
|
|
|
|
biggestLegal = min
|
|
|
|
while min <= max
|
|
mid = min + math.floor (max - min) / 2
|
|
if fits mid and (biggestLegal == nil or biggestLegal < mid)
|
|
biggestLegal = mid
|
|
|
|
--Try growing
|
|
min = mid + 1
|
|
else
|
|
--Doesn't fit, shrink
|
|
max = mid - 1
|
|
|
|
|
|
return biggestLegal
|
|
|
|
|
|
binaryShrink = (min, max, fits) ->
|
|
if min > max
|
|
return min
|
|
|
|
smallestLegal = max
|
|
|
|
while min <= max
|
|
mid = min + math.floor (max - min) / 2
|
|
if fits mid and (smallestLegal == nil or smallestLegal > mid)
|
|
smallestLegal = mid
|
|
|
|
--It fits, shrink
|
|
max = mid - 1
|
|
else
|
|
--Doesn't fit, grow
|
|
min = mid + 1
|
|
|
|
|
|
return smallestLegal
|
|
|
|
|
|
getGuiOwner = (instance) ->
|
|
while instance ~= nil
|
|
if instance\IsA"ScreenGui" or instance\IsA "BillboardGui"
|
|
return instance
|
|
|
|
instance = instance.Parent
|
|
|
|
return nil
|
|
|
|
|
|
t.AutoTruncateTextObject = (textLabel) ->
|
|
text = textLabel.Text
|
|
|
|
fullLabel = textLabel\Clone!
|
|
fullLabel.Name = "Full" .. textLabel.Name
|
|
fullLabel.BorderSizePixel = 0
|
|
fullLabel.BackgroundTransparency = 0
|
|
fullLabel.Text = text
|
|
fullLabel.TextXAlignment = Enum.TextXAlignment.Center
|
|
fullLabel.Position = UDim2.new 0, -3, 0, 0
|
|
fullLabel.Size = UDim2.new 0, 100, 1, 0
|
|
fullLabel.Visible = false
|
|
fullLabel.Parent = textLabel
|
|
|
|
local shortText
|
|
local mouseEnterConnection
|
|
local mouseLeaveConnection
|
|
|
|
checkForResize = ->
|
|
if getGuiOwner textLabel == nil
|
|
return
|
|
|
|
textLabel.Text = text
|
|
if textLabel.TextFits
|
|
--Tear down the rollover if it is active
|
|
if mouseEnterConnection
|
|
mouseEnterConnection\disconnect!
|
|
mouseEnterConnection = nil
|
|
|
|
if mouseLeaveConnection
|
|
mouseLeaveConnection\disconnect!
|
|
mouseLeaveConnection = nil
|
|
|
|
else
|
|
len = string.len text
|
|
textLabel.Text = text .. "~"
|
|
|
|
--Shrink the text
|
|
textSize = binaryGrow 0, len, (pos) ->
|
|
if pos == 0
|
|
textLabel.Text = "~"
|
|
else
|
|
textLabel.Text = string.sub(text, 1, pos) .. "~"
|
|
|
|
return textLabel.TextFits
|
|
|
|
shortText = string.sub(text, 1, textSize) .. "~"
|
|
textLabel.Text = shortText
|
|
|
|
--Make sure the fullLabel fits
|
|
if not fullLabel.TextFits
|
|
--Already too small, grow it really bit to start
|
|
fullLabel.Size = UDim2.new 0, 10000, 1, 0
|
|
|
|
|
|
--Okay, now try to binary shrink it back down
|
|
fullLabelSize = binaryShrink textLabel.AbsoluteSize.X, fullLabel.AbsoluteSize.X, (size) ->
|
|
fullLabel.Size = UDim2.new 0, size, 1, 0
|
|
return fullLabel.TextFits
|
|
|
|
fullLabel.Size = UDim2.new 0, fullLabelSize + 6, 1, 0
|
|
|
|
--Now setup the rollover effects, if they are currently off
|
|
if mouseEnterConnection == nil
|
|
mouseEnterConnection = textLabel.MouseEnter\connect ->
|
|
fullLabel.ZIndex = textLabel.ZIndex + 1
|
|
fullLabel.Visible = true
|
|
--textLabel.Text = ""
|
|
|
|
|
|
if mouseLeaveConnection == nil
|
|
mouseLeaveConnection = textLabel.MouseLeave\connect ->
|
|
fullLabel.Visible = false
|
|
--textLabel.Text = shortText
|
|
|
|
|
|
textLabel.AncestryChanged\connect checkForResize
|
|
textLabel.Changed\connect (prop) ->
|
|
if prop == "AbsoluteSize"
|
|
checkForResize!
|
|
|
|
|
|
checkForResize!
|
|
|
|
changeText = (newText) ->
|
|
text = newText
|
|
fullLabel.Text = text
|
|
checkForResize!
|
|
|
|
|
|
return textLabel, changeText
|
|
|
|
|
|
TransitionTutorialPages = (fromPage, toPage, transitionFrame, currentPageValue) ->
|
|
if fromPage
|
|
fromPage.Visible = false
|
|
if transitionFrame.Visible == false
|
|
transitionFrame.Size = fromPage.Size
|
|
transitionFrame.Position = fromPage.Position
|
|
|
|
else
|
|
if transitionFrame.Visible == false
|
|
transitionFrame.Size = UDim2.new 0, 50, 0, 50
|
|
transitionFrame.Position = UDim2.new 0.5, -25, 0.5, -25
|
|
|
|
|
|
transitionFrame.Visible = true
|
|
currentPageValue.Value = nil
|
|
|
|
local newSize, newPosition
|
|
if toPage
|
|
--Make it visible so it resizes
|
|
toPage.Visible = true
|
|
|
|
newSize = toPage.Size
|
|
newPosition = toPage.Position
|
|
|
|
toPage.Visible = false
|
|
else
|
|
newSize = UDim2.new 0, 50, 0, 50
|
|
newPosition = UDim2.new 0.5, -25, 0.5, -25
|
|
|
|
transitionFrame\TweenSizeAndPosition(
|
|
newSize,
|
|
newPosition,
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Quad,
|
|
0.3,
|
|
true,
|
|
(state) ->
|
|
if state == Enum.TweenStatus.Completed
|
|
transitionFrame.Visible = false
|
|
if toPage
|
|
toPage.Visible = true
|
|
currentPageValue.Value = toPage
|
|
|
|
|
|
)
|
|
|
|
|
|
t.CreateTutorial = (name, tutorialKey, createButtons) ->
|
|
frame = Instance.new "Frame"
|
|
frame.Name = "Tutorial-" .. name
|
|
frame.BackgroundTransparency = 1
|
|
frame.Size = UDim2.new 0.6, 0, 0.6, 0
|
|
frame.Position = UDim2.new 0.2, 0, 0.2, 0
|
|
|
|
transitionFrame = Instance.new "Frame"
|
|
transitionFrame.Name = "TransitionFrame"
|
|
transitionFrame.Style = Enum.FrameStyle.RobloxRound
|
|
transitionFrame.Size = UDim2.new 0.6, 0, 0.6, 0
|
|
transitionFrame.Position = UDim2.new 0.2, 0, 0.2, 0
|
|
transitionFrame.Visible = false
|
|
transitionFrame.Parent = frame
|
|
|
|
currentPageValue = Instance.new "ObjectValue"
|
|
currentPageValue.Name = "CurrentTutorialPage"
|
|
currentPageValue.Value = nil
|
|
currentPageValue.Parent = frame
|
|
|
|
boolValue = Instance.new "BoolValue"
|
|
boolValue.Name = "Buttons"
|
|
boolValue.Value = createButtons
|
|
boolValue.Parent = frame
|
|
|
|
pages = Instance.new "Frame"
|
|
pages.Name = "Pages"
|
|
pages.BackgroundTransparency = 1
|
|
pages.Size = UDim2.new 1, 0, 1, 0
|
|
pages.Parent = frame
|
|
|
|
getVisiblePageAndHideOthers = ->
|
|
local visiblePage
|
|
children = pages\GetChildren!
|
|
if children
|
|
for _, child in ipairs children
|
|
if child.Visible
|
|
if visiblePage
|
|
child.Visible = false
|
|
else
|
|
visiblePage = child
|
|
|
|
|
|
return visiblePage
|
|
|
|
|
|
showTutorial = (alwaysShow) ->
|
|
if alwaysShow or UserSettings!.GameSettings\GetTutorialState tutorialKey == false
|
|
print "Showing tutorial-", tutorialKey
|
|
currentTutorialPage = getVisiblePageAndHideOthers!
|
|
|
|
firstPage = pages\FindFirstChild "TutorialPage1"
|
|
if firstPage
|
|
TransitionTutorialPages currentTutorialPage, firstPage, transitionFrame, currentPageValue
|
|
else
|
|
error "Could not find TutorialPage1"
|
|
|
|
|
|
dismissTutorial = ->
|
|
currentTutorialPage = getVisiblePageAndHideOthers!
|
|
|
|
if currentTutorialPage
|
|
TransitionTutorialPages currentTutorialPage, nil, transitionFrame, currentPageValue
|
|
|
|
|
|
UserSettings!.GameSettings\SetTutorialState tutorialKey, true
|
|
|
|
|
|
gotoPage = (pageNum) ->
|
|
page = pages\FindFirstChild "TutorialPage" .. pageNum
|
|
currentTutorialPage = getVisiblePageAndHideOthers!
|
|
TransitionTutorialPages currentTutorialPage, page, transitionFrame, currentPageValue
|
|
|
|
|
|
return frame, showTutorial, dismissTutorial, gotoPage
|
|
|
|
|
|
CreateBasicTutorialPage = (name, handleResize, skipTutorial, giveDoneButton) ->
|
|
frame = Instance.new "Frame"
|
|
frame.Name = "TutorialPage"
|
|
frame.Style = Enum.FrameStyle.RobloxRound
|
|
frame.Size = UDim2.new 0.6, 0, 0.6, 0
|
|
frame.Position = UDim2.new 0.2, 0, 0.2, 0
|
|
frame.Visible = false
|
|
|
|
frameHeader = Instance.new "TextLabel"
|
|
frameHeader.Name = "Header"
|
|
frameHeader.Text = name
|
|
frameHeader.BackgroundTransparency = 1
|
|
frameHeader.FontSize = Enum.FontSize.Size24
|
|
frameHeader.Font = Enum.Font.ArialBold
|
|
frameHeader.TextColor3 = Color3.new 1, 1, 1
|
|
frameHeader.TextXAlignment = Enum.TextXAlignment.Center
|
|
frameHeader.TextWrap = true
|
|
frameHeader.Size = UDim2.new 1, -55, 0, 22
|
|
frameHeader.Position = UDim2.new 0, 0, 0, 0
|
|
frameHeader.Parent = frame
|
|
|
|
skipButton = Instance.new "ImageButton"
|
|
skipButton.Name = "SkipButton"
|
|
skipButton.AutoButtonColor = false
|
|
skipButton.BackgroundTransparency = 1
|
|
skipButton.Image = "rbxasset://textures/ui/closeButton.png"
|
|
skipButton.MouseButton1Click\connect ->
|
|
skipTutorial!
|
|
|
|
skipButton.MouseEnter\connect ->
|
|
skipButton.Image = "rbxasset://textures/ui/closeButton_dn.png"
|
|
|
|
skipButton.MouseLeave\connect ->
|
|
skipButton.Image = "rbxasset://textures/ui/closeButton.png"
|
|
|
|
skipButton.Size = UDim2.new 0, 25, 0, 25
|
|
skipButton.Position = UDim2.new 1, -25, 0, 0
|
|
skipButton.Parent = frame
|
|
|
|
if giveDoneButton
|
|
doneButton = Instance.new "TextButton"
|
|
doneButton.Name = "DoneButton"
|
|
doneButton.Style = Enum.ButtonStyle.RobloxButtonDefault
|
|
doneButton.Text = "Done"
|
|
doneButton.TextColor3 = Color3.new 1, 1, 1
|
|
doneButton.Font = Enum.Font.ArialBold
|
|
doneButton.FontSize = Enum.FontSize.Size18
|
|
doneButton.Size = UDim2.new 0, 100, 0, 50
|
|
doneButton.Position = UDim2.new 0.5, -50, 1, -50
|
|
|
|
if skipTutorial
|
|
doneButton.MouseButton1Click\connect ->
|
|
skipTutorial!
|
|
|
|
|
|
doneButton.Parent = frame
|
|
|
|
|
|
innerFrame = Instance.new "Frame"
|
|
innerFrame.Name = "ContentFrame"
|
|
innerFrame.BackgroundTransparency = 1
|
|
innerFrame.Position = UDim2.new 0, 0, 0, 25
|
|
innerFrame.Parent = frame
|
|
|
|
nextButton = Instance.new "TextButton"
|
|
nextButton.Name = "NextButton"
|
|
nextButton.Text = "Next"
|
|
nextButton.TextColor3 = Color3.new 1, 1, 1
|
|
nextButton.Font = Enum.Font.Arial
|
|
nextButton.FontSize = Enum.FontSize.Size18
|
|
nextButton.Style = Enum.ButtonStyle.RobloxButtonDefault
|
|
nextButton.Size = UDim2.new 0, 80, 0, 32
|
|
nextButton.Position = UDim2.new 0.5, 5, 1, -32
|
|
nextButton.Active = false
|
|
nextButton.Visible = false
|
|
nextButton.Parent = frame
|
|
|
|
prevButton = Instance.new "TextButton"
|
|
prevButton.Name = "PrevButton"
|
|
prevButton.Text = "Previous"
|
|
prevButton.TextColor3 = Color3.new 1, 1, 1
|
|
prevButton.Font = Enum.Font.Arial
|
|
prevButton.FontSize = Enum.FontSize.Size18
|
|
prevButton.Style = Enum.ButtonStyle.RobloxButton
|
|
prevButton.Size = UDim2.new 0, 80, 0, 32
|
|
prevButton.Position = UDim2.new 0.5, -85, 1, -32
|
|
prevButton.Active = false
|
|
prevButton.Visible = false
|
|
prevButton.Parent = frame
|
|
|
|
if giveDoneButton
|
|
innerFrame.Size = UDim2.new 1, 0, 1, -75
|
|
else
|
|
innerFrame.Size = UDim2.new 1, 0, 1, -22
|
|
|
|
|
|
local parentConnection
|
|
|
|
basicHandleResize = ->
|
|
if frame.Visible and frame.Parent
|
|
maxSize = math.min frame.Parent.AbsoluteSize.X, frame.Parent.AbsoluteSize.Y
|
|
handleResize 200, maxSize
|
|
|
|
|
|
frame.Changed\connect (prop) ->
|
|
if prop == "Parent"
|
|
if parentConnection ~= nil
|
|
parentConnection\disconnect!
|
|
parentConnection = nil
|
|
|
|
if frame.Parent and frame.Parent\IsA "GuiObject"
|
|
parentConnection = frame.Parent.Changed\connect (parentProp) ->
|
|
if parentProp == "AbsoluteSize"
|
|
wait!
|
|
basicHandleResize!
|
|
|
|
|
|
basicHandleResize!
|
|
|
|
|
|
if prop == "Visible"
|
|
basicHandleResize!
|
|
|
|
|
|
return frame, innerFrame
|
|
|
|
|
|
t.CreateTextTutorialPage = (name, text, skipTutorialFunc) ->
|
|
local frame
|
|
local contentFrame
|
|
|
|
textLabel = Instance.new "TextLabel"
|
|
textLabel.BackgroundTransparency = 1
|
|
textLabel.TextColor3 = Color3.new 1, 1, 1
|
|
textLabel.Text = text
|
|
textLabel.TextWrap = true
|
|
textLabel.TextXAlignment = Enum.TextXAlignment.Left
|
|
textLabel.TextYAlignment = Enum.TextYAlignment.Center
|
|
textLabel.Font = Enum.Font.Arial
|
|
textLabel.FontSize = Enum.FontSize.Size14
|
|
textLabel.Size = UDim2.new 1, 0, 1, 0
|
|
|
|
handleResize = (minSize, maxSize) ->
|
|
size = binaryShrink minSize, maxSize, (size) ->
|
|
frame.Size = UDim2.new 0, size, 0, size
|
|
textLabel.TextFits
|
|
|
|
frame.Size = UDim2.new 0, size, 0, size
|
|
frame.Position = UDim2.new 0.5, -size / 2, 0.5, -size / 2
|
|
|
|
|
|
frame, contentFrame = CreateBasicTutorialPage name, handleResize, skipTutorialFunc
|
|
textLabel.Parent = contentFrame
|
|
|
|
frame
|
|
|
|
|
|
t.CreateImageTutorialPage = (name, imageAsset, x, y, skipTutorialFunc, giveDoneButton) ->
|
|
local frame
|
|
local contentFrame
|
|
|
|
imageLabel = Instance.new "ImageLabel"
|
|
imageLabel.BackgroundTransparency = 1
|
|
imageLabel.Image = imageAsset
|
|
imageLabel.Size = UDim2.new 0, x, 0, y
|
|
imageLabel.Position = UDim2.new 0.5, -x / 2, 0.5, -y / 2
|
|
|
|
handleResize = (minSize, maxSize) ->
|
|
size = binaryShrink minSize, maxSize, (size) ->
|
|
size >= x and size >= y
|
|
|
|
if size >= x and size >= y
|
|
imageLabel.Size = UDim2.new 0, x, 0, y
|
|
imageLabel.Position = UDim2.new 0.5, -x / 2, 0.5, -y / 2
|
|
else
|
|
if x > y
|
|
--X is limiter, so
|
|
imageLabel.Size = UDim2.new 1, 0, y / x, 0
|
|
imageLabel.Position = UDim2.new 0, 0, 0.5 - (y / x) / 2, 0
|
|
else
|
|
--Y is limiter
|
|
imageLabel.Size = UDim2.new x / y, 0, 1, 0
|
|
imageLabel.Position = UDim2.new 0.5 - (x / y) / 2, 0, 0, 0
|
|
|
|
|
|
size += 50
|
|
frame.Size = UDim2.new 0, size, 0, size
|
|
frame.Position = UDim2.new 0.5, -size / 2, 0.5, -size / 2
|
|
|
|
|
|
frame, contentFrame = CreateBasicTutorialPage name, handleResize, skipTutorialFunc, giveDoneButton
|
|
imageLabel.Parent = contentFrame
|
|
|
|
frame
|
|
|
|
|
|
t.AddTutorialPage = (tutorial, tutorialPage) ->
|
|
transitionFrame = tutorial.TransitionFrame
|
|
currentPageValue = tutorial.CurrentTutorialPage
|
|
|
|
if not tutorial.Buttons.Value
|
|
tutorialPage.NextButton.Parent = nil
|
|
tutorialPage.PrevButton.Parent = nil
|
|
|
|
|
|
children = tutorial.Pages\GetChildren!
|
|
if children and #children > 0
|
|
tutorialPage.Name = "TutorialPage" .. (#children + 1)
|
|
previousPage = children[#children]
|
|
if not previousPage\IsA "GuiObject"
|
|
error "All elements under Pages must be GuiObjects"
|
|
|
|
|
|
if tutorial.Buttons.Value
|
|
if previousPage.NextButton.Active
|
|
error "NextButton already Active on previousPage, please only add pages with RbxGui.AddTutorialPage function"
|
|
|
|
previousPage.NextButton.MouseButton1Click\connect ->
|
|
TransitionTutorialPages previousPage, tutorialPage, transitionFrame, currentPageValue
|
|
|
|
previousPage.NextButton.Active = true
|
|
previousPage.NextButton.Visible = true
|
|
|
|
if tutorialPage.PrevButton.Active
|
|
error "PrevButton already Active on tutorialPage, please only add pages with RbxGui.AddTutorialPage function"
|
|
|
|
tutorialPage.PrevButton.MouseButton1Click\connect ->
|
|
TransitionTutorialPages tutorialPage, previousPage, transitionFrame, currentPageValue
|
|
|
|
tutorialPage.PrevButton.Active = true
|
|
tutorialPage.PrevButton.Visible = true
|
|
|
|
|
|
tutorialPage.Parent = tutorial.Pages
|
|
else
|
|
--First child
|
|
tutorialPage.Name = "TutorialPage1"
|
|
tutorialPage.Parent = tutorial.Pages
|
|
|
|
|
|
t.CreateSetPanel = (userIdsForSets, objectSelected, dialogClosed, size, position, showAdminCategories, useAssetVersionId) ->
|
|
if not userIdsForSets
|
|
error "CreateSetPanel: userIdsForSets (first arg) is nil, should be a table of number ids"
|
|
|
|
if type(userIdsForSets) ~= "table" and type(userIdsForSets) ~= "userdata"
|
|
error "CreateSetPanel: userIdsForSets (first arg) is of type #{type userIdsForSets}, should be of type table or userdata"
|
|
|
|
if not objectSelected
|
|
error "CreateSetPanel: objectSelected (second arg) is nil, should be a callback function!"
|
|
|
|
if type(objectSelected) ~= "function"
|
|
error "CreateSetPanel: objectSelected (second arg) is of type #{type objectSelected}, should be of type function!"
|
|
|
|
if dialogClosed and type(dialogClosed) ~= "function"
|
|
error "CreateSetPanel: dialogClosed (third arg) is of type #{type dialogClosed}, should be of type function!"
|
|
|
|
|
|
if showAdminCategories == nil -- by default, don't show beta sets
|
|
showAdminCategories = false
|
|
|
|
|
|
arrayPosition = 1
|
|
insertButtons = {}
|
|
insertButtonCons = {}
|
|
local contents
|
|
local setGui
|
|
|
|
-- used for water selections
|
|
waterForceDirection = "NegX"
|
|
waterForce = "None"
|
|
local waterGui, waterTypeChangedEvent
|
|
|
|
Data = {}
|
|
Data.CurrentCategory = nil
|
|
Data.Category = {}
|
|
SetCache = {}
|
|
|
|
local userCategoryButtons
|
|
|
|
buttonWidth = 64
|
|
buttonHeight = buttonWidth
|
|
|
|
local SmallThumbnailUrl
|
|
local LargeThumbnailUrl
|
|
BaseUrl = game\GetService"ContentProvider".BaseUrl\lower!
|
|
|
|
if useAssetVersionId
|
|
LargeThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&assetversionid="
|
|
SmallThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&assetversionid="
|
|
else
|
|
LargeThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&aid="
|
|
SmallThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&aid="
|
|
|
|
|
|
drillDownSetZIndex = (parent, index) ->
|
|
children = parent\GetChildren!
|
|
for i = 1, #children
|
|
if children[i]\IsA "GuiObject"
|
|
children[i].ZIndex = index
|
|
|
|
drillDownSetZIndex children[i], index
|
|
|
|
|
|
-- for terrain stamping
|
|
local currTerrainDropDownFrame
|
|
terrainShapes = { "Block", "Vertical Ramp", "Corner Wedge", "Inverse Corner Wedge", "Horizontal Ramp", "Auto-Wedge" }
|
|
terrainShapeMap = {}
|
|
for i = 1, #terrainShapes
|
|
terrainShapeMap[terrainShapes[i]] = i - 1
|
|
|
|
terrainShapeMap[terrainShapes[#terrainShapes]] = 6
|
|
|
|
createWaterGui = ->
|
|
waterForceDirections = { "NegX", "X", "NegY", "Y", "NegZ", "Z" }
|
|
waterForces = { "None", "Small", "Medium", "Strong", "Max" }
|
|
|
|
waterFrame = Instance.new "Frame"
|
|
waterFrame.Name = "WaterFrame"
|
|
waterFrame.Style = Enum.FrameStyle.RobloxSquare
|
|
waterFrame.Size = UDim2.new 0, 150, 0, 110
|
|
waterFrame.Visible = false
|
|
|
|
waterForceLabel = Instance.new "TextLabel"
|
|
waterForceLabel.Name = "WaterForceLabel"
|
|
waterForceLabel.BackgroundTransparency = 1
|
|
waterForceLabel.Size = UDim2.new 1, 0, 0, 12
|
|
waterForceLabel.Font = Enum.Font.ArialBold
|
|
waterForceLabel.FontSize = Enum.FontSize.Size12
|
|
waterForceLabel.TextColor3 = Color3.new 1, 1, 1
|
|
waterForceLabel.TextXAlignment = Enum.TextXAlignment.Left
|
|
waterForceLabel.Text = "Water Force"
|
|
waterForceLabel.Parent = waterFrame
|
|
|
|
waterForceDirLabel = waterForceLabel\Clone!
|
|
waterForceDirLabel.Name = "WaterForceDirectionLabel"
|
|
waterForceDirLabel.Text = "Water Force Direction"
|
|
waterForceDirLabel.Position = UDim2.new 0, 0, 0, 50
|
|
waterForceDirLabel.Parent = waterFrame
|
|
|
|
waterTypeChangedEvent = Instance.new "BindableEvent"
|
|
waterTypeChangedEvent.Name = "WaterTypeChangedEvent"
|
|
waterTypeChangedEvent.Parent = waterFrame
|
|
|
|
waterForceDirectionSelectedFunc = (newForceDirection) ->
|
|
waterForceDirection = newForceDirection
|
|
waterTypeChangedEvent\Fire { waterForce, waterForceDirection }
|
|
|
|
waterForceSelectedFunc = (newForce) ->
|
|
waterForce = newForce
|
|
waterTypeChangedEvent\Fire { waterForce, waterForceDirection }
|
|
|
|
|
|
waterForceDirectionDropDown, forceWaterDirectionSelection = t.CreateDropDownMenu waterForceDirections, waterForceDirectionSelectedFunc
|
|
waterForceDirectionDropDown.Size = UDim2.new 1, 0, 0, 25
|
|
waterForceDirectionDropDown.Position = UDim2.new 0, 0, 1, 3
|
|
forceWaterDirectionSelection "NegX"
|
|
waterForceDirectionDropDown.Parent = waterForceDirLabel
|
|
|
|
waterForceDropDown, forceWaterForceSelection = t.CreateDropDownMenu waterForces, waterForceSelectedFunc
|
|
forceWaterForceSelection "None"
|
|
waterForceDropDown.Size = UDim2.new 1, 0, 0, 25
|
|
waterForceDropDown.Position = UDim2.new 0, 0, 1, 3
|
|
waterForceDropDown.Parent = waterForceLabel
|
|
|
|
return waterFrame, waterTypeChangedEvent
|
|
|
|
|
|
-- Helper Function that contructs gui elements
|
|
createSetGui = ->
|
|
setGui = Instance.new "ScreenGui"
|
|
setGui.Name = "SetGui"
|
|
|
|
setPanel = Instance.new "Frame"
|
|
setPanel.Name = "SetPanel"
|
|
setPanel.Active = true
|
|
setPanel.BackgroundTransparency = 1
|
|
if position
|
|
setPanel.Position = position
|
|
else
|
|
setPanel.Position = UDim2.new 0.2, 29, 0.1, 24
|
|
|
|
if size
|
|
setPanel.Size = size
|
|
else
|
|
setPanel.Size = UDim2.new 0.6, -58, 0.64, 0
|
|
|
|
setPanel.Style = Enum.FrameStyle.RobloxRound
|
|
setPanel.ZIndex = 6
|
|
setPanel.Parent = setGui
|
|
|
|
-- Children of SetPanel
|
|
itemPreview = Instance.new "Frame"
|
|
itemPreview.Name = "ItemPreview"
|
|
itemPreview.BackgroundTransparency = 1
|
|
itemPreview.Position = UDim2.new 0.8, 5, 0.085, 0
|
|
itemPreview.Size = UDim2.new 0.21, 0, 0.9, 0
|
|
itemPreview.ZIndex = 6
|
|
itemPreview.Parent = setPanel
|
|
|
|
-- Children of ItemPreview
|
|
textPanel = Instance.new "Frame"
|
|
textPanel.Name = "TextPanel"
|
|
textPanel.BackgroundTransparency = 1
|
|
textPanel.Position = UDim2.new 0, 0, 0.45, 0
|
|
textPanel.Size = UDim2.new 1, 0, 0.55, 0
|
|
textPanel.ZIndex = 6
|
|
textPanel.Parent = itemPreview
|
|
|
|
-- Children of TextPanel
|
|
rolloverText = Instance.new "TextLabel"
|
|
rolloverText.Name = "RolloverText"
|
|
rolloverText.BackgroundTransparency = 1
|
|
rolloverText.Size = UDim2.new 1, 0, 0, 48
|
|
rolloverText.ZIndex = 6
|
|
rolloverText.Font = Enum.Font.ArialBold
|
|
rolloverText.FontSize = Enum.FontSize.Size24
|
|
rolloverText.Text = ""
|
|
rolloverText.TextColor3 = Color3.new 1, 1, 1
|
|
rolloverText.TextWrap = true
|
|
rolloverText.TextXAlignment = Enum.TextXAlignment.Left
|
|
rolloverText.TextYAlignment = Enum.TextYAlignment.Top
|
|
rolloverText.Parent = textPanel
|
|
|
|
largePreview = Instance.new "ImageLabel"
|
|
largePreview.Name = "LargePreview"
|
|
largePreview.BackgroundTransparency = 1
|
|
largePreview.Image = ""
|
|
largePreview.Size = UDim2.new 1, 0, 0, 170
|
|
largePreview.ZIndex = 6
|
|
largePreview.Parent = itemPreview
|
|
|
|
sets = Instance.new "Frame"
|
|
sets.Name = "Sets"
|
|
sets.BackgroundTransparency = 1
|
|
sets.Position = UDim2.new 0, 0, 0, 5
|
|
sets.Size = UDim2.new 0.23, 0, 1, -5
|
|
sets.ZIndex = 6
|
|
sets.Parent = setPanel
|
|
|
|
-- Children of Sets
|
|
line = Instance.new "Frame"
|
|
line.Name = "Line"
|
|
line.BackgroundColor3 = Color3.new 1, 1, 1
|
|
line.BackgroundTransparency = 0.7
|
|
line.BorderSizePixel = 0
|
|
line.Position = UDim2.new 1, -3, 0.06, 0
|
|
line.Size = UDim2.new 0, 3, 0.9, 0
|
|
line.ZIndex = 6
|
|
line.Parent = sets
|
|
|
|
setsLists, controlFrame = t.CreateTrueScrollingFrame!
|
|
setsLists.Size = UDim2.new 1, -6, 0.94, 0
|
|
setsLists.Position = UDim2.new 0, 0, 0.06, 0
|
|
setsLists.BackgroundTransparency = 1
|
|
setsLists.Name = "SetsLists"
|
|
setsLists.ZIndex = 6
|
|
setsLists.Parent = sets
|
|
drillDownSetZIndex controlFrame, 7
|
|
|
|
setsHeader = Instance.new "TextLabel"
|
|
setsHeader.Name = "SetsHeader"
|
|
setsHeader.BackgroundTransparency = 1
|
|
setsHeader.Size = UDim2.new 0, 47, 0, 24
|
|
setsHeader.ZIndex = 6
|
|
setsHeader.Font = Enum.Font.ArialBold
|
|
setsHeader.FontSize = Enum.FontSize.Size24
|
|
setsHeader.Text = "Sets"
|
|
setsHeader.TextColor3 = Color3.new 1, 1, 1
|
|
setsHeader.TextXAlignment = Enum.TextXAlignment.Left
|
|
setsHeader.TextYAlignment = Enum.TextYAlignment.Top
|
|
setsHeader.Parent = sets
|
|
|
|
cancelButton = Instance.new "TextButton"
|
|
cancelButton.Name = "CancelButton"
|
|
cancelButton.Position = UDim2.new 1, -32, 0, -2
|
|
cancelButton.Size = UDim2.new 0, 34, 0, 34
|
|
cancelButton.Style = Enum.ButtonStyle.RobloxButtonDefault
|
|
cancelButton.ZIndex = 6
|
|
cancelButton.Text = ""
|
|
cancelButton.Modal = true
|
|
cancelButton.Parent = setPanel
|
|
|
|
-- Children of Cancel Button
|
|
cancelImage = Instance.new "ImageLabel"
|
|
cancelImage.Name = "CancelImage"
|
|
cancelImage.BackgroundTransparency = 1
|
|
cancelImage.Image = "http://www.roblox.com/asset?id=54135717"
|
|
cancelImage.Position = UDim2.new 0, -2, 0, -2
|
|
cancelImage.Size = UDim2.new 0, 16, 0, 16
|
|
cancelImage.ZIndex = 6
|
|
cancelImage.Parent = cancelButton
|
|
|
|
return setGui
|
|
|
|
|
|
createSetButton = (text) ->
|
|
setButton = Instance.new "TextButton"
|
|
|
|
if text
|
|
setButton.Text = text
|
|
else
|
|
setButton.Text = ""
|
|
|
|
|
|
setButton.AutoButtonColor = false
|
|
setButton.BackgroundTransparency = 1
|
|
setButton.BackgroundColor3 = Color3.new 1, 1, 1
|
|
setButton.BorderSizePixel = 0
|
|
setButton.Size = UDim2.new 1, -5, 0, 18
|
|
setButton.ZIndex = 6
|
|
setButton.Visible = false
|
|
setButton.Font = Enum.Font.Arial
|
|
setButton.FontSize = Enum.FontSize.Size18
|
|
setButton.TextColor3 = Color3.new 1, 1, 1
|
|
setButton.TextXAlignment = Enum.TextXAlignment.Left
|
|
|
|
setButton
|
|
|
|
|
|
buildSetButton = (name, setId, _, _, _) ->
|
|
button = createSetButton name
|
|
button.Text = name
|
|
button.Name = "SetButton"
|
|
button.Visible = true
|
|
|
|
setValue = Instance.new "IntValue"
|
|
setValue.Name = "SetId"
|
|
setValue.Value = setId
|
|
setValue.Parent = button
|
|
|
|
setName = Instance.new "StringValue"
|
|
setName.Name = "SetName"
|
|
setName.Value = name
|
|
setName.Parent = button
|
|
|
|
button
|
|
|
|
|
|
processCategory = (sets) ->
|
|
setButtons = {}
|
|
numSkipped = 0
|
|
for i = 1, #sets
|
|
if not showAdminCategories and sets[i].Name == "Beta"
|
|
numSkipped += 1
|
|
else
|
|
setButtons[i - numSkipped] = buildSetButton sets[i].Name, sets[i].CategoryId, sets[i].ImageAssetId, i - numSkipped, #sets
|
|
|
|
|
|
setButtons
|
|
|
|
|
|
handleResize = ->
|
|
wait! -- neccessary to insure heartbeat happened
|
|
|
|
itemPreview = setGui.SetPanel.ItemPreview
|
|
|
|
itemPreview.LargePreview.Size = UDim2.new 1, 0, 0, itemPreview.AbsoluteSize.X
|
|
itemPreview.LargePreview.Position = UDim2.new 0.5, -itemPreview.LargePreview.AbsoluteSize.X / 2, 0, 0
|
|
itemPreview.TextPanel.Position = UDim2.new 0, 0, 0, itemPreview.LargePreview.AbsoluteSize.Y
|
|
itemPreview.TextPanel.Size = UDim2.new 1, 0, 0, itemPreview.AbsoluteSize.Y - itemPreview.LargePreview.AbsoluteSize.Y
|
|
|
|
|
|
makeInsertAssetButton = ->
|
|
insertAssetButtonExample = Instance.new "Frame"
|
|
insertAssetButtonExample.Name = "InsertAssetButtonExample"
|
|
insertAssetButtonExample.Position = UDim2.new 0, 128, 0, 64
|
|
insertAssetButtonExample.Size = UDim2.new 0, 64, 0, 64
|
|
insertAssetButtonExample.BackgroundTransparency = 1
|
|
insertAssetButtonExample.ZIndex = 6
|
|
insertAssetButtonExample.Visible = false
|
|
|
|
assetId = Instance.new "IntValue"
|
|
assetId.Name = "AssetId"
|
|
assetId.Value = 0
|
|
assetId.Parent = insertAssetButtonExample
|
|
|
|
assetName = Instance.new "StringValue"
|
|
assetName.Name = "AssetName"
|
|
assetName.Value = ""
|
|
assetName.Parent = insertAssetButtonExample
|
|
|
|
button = Instance.new "TextButton"
|
|
button.Name = "Button"
|
|
button.Text = ""
|
|
button.Style = Enum.ButtonStyle.RobloxButton
|
|
button.Position = UDim2.new 0.025, 0, 0.025, 0
|
|
button.Size = UDim2.new 0.95, 0, 0.95, 0
|
|
button.ZIndex = 6
|
|
button.Parent = insertAssetButtonExample
|
|
|
|
buttonImage = Instance.new "ImageLabel"
|
|
buttonImage.Name = "ButtonImage"
|
|
buttonImage.Image = ""
|
|
buttonImage.Position = UDim2.new 0, -7, 0, -7
|
|
buttonImage.Size = UDim2.new 1, 14, 1, 14
|
|
buttonImage.BackgroundTransparency = 1
|
|
buttonImage.ZIndex = 7
|
|
buttonImage.Parent = button
|
|
|
|
configIcon = buttonImage\clone!
|
|
configIcon.Name = "ConfigIcon"
|
|
configIcon.Visible = false
|
|
configIcon.Position = UDim2.new 1, -23, 1, -24
|
|
configIcon.Size = UDim2.new 0, 16, 0, 16
|
|
configIcon.Image = ""
|
|
configIcon.ZIndex = 6
|
|
configIcon.Parent = insertAssetButtonExample
|
|
|
|
return insertAssetButtonExample
|
|
|
|
|
|
showLargePreview = (insertButton) ->
|
|
if insertButton\FindFirstChild "AssetId"
|
|
delay 0, ->
|
|
game\GetService"ContentProvider"\Preload(
|
|
LargeThumbnailUrl .. "#{insertButton.AssetId.Value}"
|
|
)
|
|
setGui.SetPanel.ItemPreview.LargePreview.Image = LargeThumbnailUrl ..
|
|
"#{insertButton.AssetId.Value}"
|
|
|
|
|
|
if insertButton\FindFirstChild "AssetName"
|
|
setGui.SetPanel.ItemPreview.TextPanel.RolloverText.Text = insertButton.AssetName.Value
|
|
|
|
|
|
selectTerrainShape = (shape) ->
|
|
if currTerrainDropDownFrame
|
|
objectSelected(
|
|
"#{currTerrainDropDownFrame.AssetName.Value}",
|
|
tonumber(currTerrainDropDownFrame.AssetId.Value),
|
|
shape
|
|
)
|
|
|
|
|
|
createTerrainTypeButton = (name, parent) ->
|
|
dropDownTextButton = Instance.new "TextButton"
|
|
dropDownTextButton.Name = name .. "Button"
|
|
dropDownTextButton.Font = Enum.Font.ArialBold
|
|
dropDownTextButton.FontSize = Enum.FontSize.Size14
|
|
dropDownTextButton.BorderSizePixel = 0
|
|
dropDownTextButton.TextColor3 = Color3.new 1, 1, 1
|
|
dropDownTextButton.Text = name
|
|
dropDownTextButton.TextXAlignment = Enum.TextXAlignment.Left
|
|
dropDownTextButton.BackgroundTransparency = 1
|
|
dropDownTextButton.ZIndex = parent.ZIndex + 1
|
|
dropDownTextButton.Size = UDim2.new 0, parent.Size.X.Offset - 2, 0, 16
|
|
dropDownTextButton.Position = UDim2.new 0, 1, 0, 0
|
|
|
|
dropDownTextButton.MouseEnter\connect ->
|
|
dropDownTextButton.BackgroundTransparency = 0
|
|
dropDownTextButton.TextColor3 = Color3.new 0, 0, 0
|
|
|
|
|
|
dropDownTextButton.MouseLeave\connect ->
|
|
dropDownTextButton.BackgroundTransparency = 1
|
|
dropDownTextButton.TextColor3 = Color3.new 1, 1, 1
|
|
|
|
|
|
dropDownTextButton.MouseButton1Click\connect ->
|
|
dropDownTextButton.BackgroundTransparency = 1
|
|
dropDownTextButton.TextColor3 = Color3.new 1, 1, 1
|
|
if dropDownTextButton.Parent and dropDownTextButton.Parent\IsA "GuiObject"
|
|
dropDownTextButton.Parent.Visible = false
|
|
|
|
selectTerrainShape terrainShapeMap[dropDownTextButton.Text]
|
|
|
|
|
|
dropDownTextButton
|
|
|
|
|
|
createTerrainDropDownMenu = (zIndex) ->
|
|
dropDown = Instance.new "Frame"
|
|
dropDown.Name = "TerrainDropDown"
|
|
dropDown.BackgroundColor3 = Color3.new 0, 0, 0
|
|
dropDown.BorderColor3 = Color3.new 1, 0, 0
|
|
dropDown.Size = UDim2.new 0, 200, 0, 0
|
|
dropDown.Visible = false
|
|
dropDown.ZIndex = zIndex
|
|
dropDown.Parent = setGui
|
|
|
|
for i = 1, #terrainShapes
|
|
shapeButton = createTerrainTypeButton terrainShapes[i], dropDown
|
|
shapeButton.Position = UDim2.new 0, 1, 0, (i - 1) * shapeButton.Size.Y.Offset
|
|
shapeButton.Parent = dropDown
|
|
dropDown.Size = UDim2.new 0, 200, 0, dropDown.Size.Y.Offset + shapeButton.Size.Y.Offset
|
|
|
|
|
|
dropDown.MouseLeave\connect ->
|
|
dropDown.Visible = false
|
|
|
|
|
|
createDropDownMenuButton = (parent) ->
|
|
dropDownButton = Instance.new "ImageButton"
|
|
dropDownButton.Name = "DropDownButton"
|
|
dropDownButton.Image = "http://www.roblox.com/asset/?id=67581509"
|
|
dropDownButton.BackgroundTransparency = 1
|
|
dropDownButton.Size = UDim2.new 0, 16, 0, 16
|
|
dropDownButton.Position = UDim2.new 1, -24, 0, 6
|
|
dropDownButton.ZIndex = parent.ZIndex + 2
|
|
dropDownButton.Parent = parent
|
|
|
|
if not setGui\FindFirstChild "TerrainDropDown"
|
|
createTerrainDropDownMenu 8
|
|
|
|
|
|
dropDownButton.MouseButton1Click\connect ->
|
|
setGui.TerrainDropDown.Visible = true
|
|
setGui.TerrainDropDown.Position = UDim2.new 0, parent.AbsolutePosition.X, 0, parent.AbsolutePosition.Y
|
|
currTerrainDropDownFrame = parent
|
|
|
|
|
|
buildInsertButton = ->
|
|
insertButton = makeInsertAssetButton!
|
|
insertButton.Name = "InsertAssetButton"
|
|
insertButton.Visible = true
|
|
|
|
if Data.Category[Data.CurrentCategory].SetName == "High Scalability"
|
|
createDropDownMenuButton insertButton
|
|
|
|
|
|
local lastEnter
|
|
mouseEnterCon = insertButton.MouseEnter\connect ->
|
|
lastEnter = insertButton
|
|
delay 0.1, ->
|
|
if lastEnter == insertButton
|
|
showLargePreview insertButton
|
|
|
|
|
|
return insertButton, mouseEnterCon
|
|
|
|
|
|
realignButtonGrid = (columns) ->
|
|
x = 0
|
|
y = 0
|
|
for i = 1, #insertButtons
|
|
insertButtons[i].Position = UDim2.new 0, buttonWidth * x, 0, buttonHeight * y
|
|
x += 1
|
|
if x >= columns
|
|
x = 0
|
|
y += 1
|
|
|
|
|
|
setInsertButtonImageBehavior = (insertFrame, visible, name, assetId) ->
|
|
if visible
|
|
insertFrame.AssetName.Value = name
|
|
insertFrame.AssetId.Value = assetId
|
|
newImageUrl = SmallThumbnailUrl .. assetId
|
|
if newImageUrl ~= insertFrame.Button.ButtonImage.Image
|
|
delay 0, ->
|
|
game\GetService"ContentProvider"\Preload SmallThumbnailUrl .. assetId
|
|
insertFrame.Button.ButtonImage.Image = SmallThumbnailUrl .. assetId
|
|
|
|
|
|
table.insert(
|
|
insertButtonCons,
|
|
insertFrame.Button.MouseButton1Click\connect ->
|
|
-- special case for water, show water selection gui
|
|
isWaterSelected = (name == "Water") and
|
|
(Data.Category[Data.CurrentCategory].SetName == "High Scalability")
|
|
waterGui.Visible = isWaterSelected
|
|
if isWaterSelected
|
|
objectSelected name, tonumber assetId, nil
|
|
else
|
|
objectSelected name, tonumber assetId
|
|
|
|
|
|
)
|
|
insertFrame.Visible = true
|
|
else
|
|
insertFrame.Visible = false
|
|
|
|
|
|
loadSectionOfItems = (setGui, rows, columns) ->
|
|
pageSize = rows * columns
|
|
|
|
if arrayPosition > #contents
|
|
return
|
|
|
|
|
|
origArrayPos = arrayPosition
|
|
|
|
for _ = 1, pageSize + 1
|
|
if arrayPosition >= #contents + 1
|
|
break
|
|
|
|
|
|
local buttonCon
|
|
insertButtons[arrayPosition], buttonCon = buildInsertButton!
|
|
table.insert insertButtonCons, buttonCon
|
|
insertButtons[arrayPosition].Parent = setGui.SetPanel.ItemsFrame
|
|
arrayPosition += 1
|
|
|
|
realignButtonGrid columns
|
|
|
|
-- indexCopy = origArrayPos
|
|
for index = origArrayPos, arrayPosition
|
|
if insertButtons[index]
|
|
if contents[index]
|
|
-- we don't want water to have a drop down button
|
|
if contents[index].Name == "Water"
|
|
if Data.Category[Data.CurrentCategory].SetName == "High Scalability"
|
|
insertButtons[index]\FindFirstChild("DropDownButton", true)\Destroy!
|
|
|
|
|
|
local assetId
|
|
if useAssetVersionId
|
|
assetId = contents[index].AssetVersionId
|
|
else
|
|
assetId = contents[index].AssetId
|
|
|
|
setInsertButtonImageBehavior insertButtons[index], true, contents[index].Name, assetId
|
|
else
|
|
break
|
|
|
|
else
|
|
break
|
|
|
|
-- indexCopy = index
|
|
|
|
|
|
setSetIndex = ->
|
|
Data.Category[Data.CurrentCategory].Index = 0
|
|
|
|
rows = 7
|
|
columns = math.floor setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth
|
|
|
|
contents = Data.Category[Data.CurrentCategory].Contents
|
|
if contents
|
|
-- remove our buttons and their connections
|
|
for i = 1, #insertButtons
|
|
insertButtons[i]\remove!
|
|
|
|
for i = 1, #insertButtonCons
|
|
if insertButtonCons[i]
|
|
insertButtonCons[i]\disconnect!
|
|
|
|
|
|
insertButtonCons = {}
|
|
insertButtons = {}
|
|
|
|
arrayPosition = 1
|
|
loadSectionOfItems setGui, rows, columns
|
|
|
|
|
|
selectSet = (button, setName, setId, _) ->
|
|
if button and Data.Category[Data.CurrentCategory] ~= nil
|
|
if button ~= Data.Category[Data.CurrentCategory].Button
|
|
Data.Category[Data.CurrentCategory].Button = button
|
|
|
|
if SetCache[setId] == nil
|
|
SetCache[setId] = game\GetService"InsertService"\GetCollection setId
|
|
|
|
Data.Category[Data.CurrentCategory].Contents = SetCache[setId]
|
|
|
|
Data.Category[Data.CurrentCategory].SetName = setName
|
|
Data.Category[Data.CurrentCategory].SetId = setId
|
|
|
|
setSetIndex!
|
|
|
|
|
|
selectCategoryPage = (buttons, _) ->
|
|
if buttons ~= Data.CurrentCategory
|
|
if Data.CurrentCategory
|
|
for _, button in pairs Data.CurrentCategory
|
|
button.Visible = false
|
|
|
|
|
|
Data.CurrentCategory = buttons
|
|
if Data.Category[Data.CurrentCategory] == nil
|
|
Data.Category[Data.CurrentCategory] = {}
|
|
if #buttons > 0
|
|
selectSet buttons[1], buttons[1].SetName.Value, buttons[1].SetId.Value, 0
|
|
|
|
else
|
|
Data.Category[Data.CurrentCategory].Button = nil
|
|
selectSet(
|
|
Data.Category[Data.CurrentCategory].ButtonFrame,
|
|
Data.Category[Data.CurrentCategory].SetName,
|
|
Data.Category[Data.CurrentCategory].SetId,
|
|
Data.Category[Data.CurrentCategory].Index
|
|
)
|
|
|
|
|
|
selectCategory = (category) ->
|
|
selectCategoryPage category, 0
|
|
|
|
|
|
resetAllSetButtonSelection = ->
|
|
setButtons = setGui.SetPanel.Sets.SetsLists\GetChildren!
|
|
for i = 1, #setButtons
|
|
if setButtons[i]\IsA "TextButton"
|
|
setButtons[i].Selected = false
|
|
setButtons[i].BackgroundTransparency = 1
|
|
setButtons[i].TextColor3 = Color3.new 1, 1, 1
|
|
setButtons[i].BackgroundColor3 = Color3.new 1, 1, 1
|
|
|
|
|
|
populateSetsFrame = ->
|
|
currRow = 0
|
|
for i = 1, #userCategoryButtons
|
|
button = userCategoryButtons[i]
|
|
button.Visible = true
|
|
button.Position = UDim2.new 0, 5, 0, currRow * button.Size.Y.Offset
|
|
button.Parent = setGui.SetPanel.Sets.SetsLists
|
|
|
|
if i == 1 -- we will have this selected by default, so show it
|
|
button.Selected = true
|
|
button.BackgroundColor3 = Color3.new 0, 204 / 255, 0
|
|
button.TextColor3 = Color3.new 0, 0, 0
|
|
button.BackgroundTransparency = 0
|
|
|
|
|
|
button.MouseEnter\connect ->
|
|
if not button.Selected
|
|
button.BackgroundTransparency = 0
|
|
button.TextColor3 = Color3.new 0, 0, 0
|
|
|
|
|
|
button.MouseLeave\connect ->
|
|
if not button.Selected
|
|
button.BackgroundTransparency = 1
|
|
button.TextColor3 = Color3.new 1, 1, 1
|
|
|
|
|
|
button.MouseButton1Click\connect ->
|
|
resetAllSetButtonSelection!
|
|
button.Selected = not button.Selected
|
|
button.BackgroundColor3 = Color3.new 0, 204 / 255, 0
|
|
button.TextColor3 = Color3.new 0, 0, 0
|
|
button.BackgroundTransparency = 0
|
|
selectSet button, button.Text, userCategoryButtons[i].SetId.Value, 0
|
|
|
|
|
|
currRow += 1
|
|
|
|
|
|
buttons = setGui.SetPanel.Sets.SetsLists\GetChildren!
|
|
|
|
-- set first category as loaded for default
|
|
if buttons
|
|
for i = 1, #buttons
|
|
if buttons[i]\IsA "TextButton"
|
|
selectSet buttons[i], buttons[i].Text, userCategoryButtons[i].SetId.Value, 0
|
|
selectCategory userCategoryButtons
|
|
break
|
|
|
|
|
|
setGui = createSetGui!
|
|
waterGui, waterTypeChangedEvent = createWaterGui!
|
|
waterGui.Position = UDim2.new 0, 55, 0, 0
|
|
waterGui.Parent = setGui
|
|
setGui.Changed\connect (prop) -> -- this resizes the preview image to always be the right size
|
|
if prop == "AbsoluteSize"
|
|
handleResize!
|
|
setSetIndex!
|
|
|
|
|
|
scrollFrame, controlFrame = t.CreateTrueScrollingFrame!
|
|
scrollFrame.Size = UDim2.new 0.54, 0, 0.85, 0
|
|
scrollFrame.Position = UDim2.new 0.24, 0, 0.085, 0
|
|
scrollFrame.Name = "ItemsFrame"
|
|
scrollFrame.ZIndex = 6
|
|
scrollFrame.Parent = setGui.SetPanel
|
|
scrollFrame.BackgroundTransparency = 1
|
|
|
|
drillDownSetZIndex controlFrame, 7
|
|
|
|
controlFrame.Parent = setGui.SetPanel
|
|
controlFrame.Position = UDim2.new 0.76, 5, 0, 0
|
|
|
|
debounce = false
|
|
controlFrame.ScrollBottom.Changed\connect (_) ->
|
|
if controlFrame.ScrollBottom.Value == true
|
|
if debounce
|
|
return
|
|
|
|
debounce = true
|
|
loadSectionOfItems setGui, rows, columns
|
|
debounce = false
|
|
|
|
|
|
userData = {}
|
|
for id = 1, #userIdsForSets
|
|
newUserData = game\GetService"InsertService"\GetUserSets userIdsForSets[id]
|
|
if newUserData and #newUserData > 2
|
|
-- start at #3 to skip over My Decals and My Models for each account
|
|
for category = 3, #newUserData
|
|
if newUserData[category].Name == "High Scalability" -- we want high scalability parts to show first
|
|
table.insert userData, 1, newUserData[category]
|
|
else
|
|
table.insert userData, newUserData[category]
|
|
|
|
|
|
if userData
|
|
userCategoryButtons = processCategory userData
|
|
|
|
|
|
global rows = math.floor setGui.SetPanel.ItemsFrame.AbsoluteSize.Y / buttonHeight
|
|
global columns = math.floor setGui.SetPanel.ItemsFrame.AbsoluteSize.X / buttonWidth
|
|
|
|
populateSetsFrame!
|
|
|
|
--[[insertPanelCloseCon = ]]
|
|
setGui.SetPanel.CancelButton.MouseButton1Click\connect ->
|
|
setGui.SetPanel.Visible = false
|
|
if dialogClosed
|
|
dialogClosed!
|
|
|
|
|
|
setVisibilityFunction = (visible) ->
|
|
if visible
|
|
setGui.SetPanel.Visible = true
|
|
else
|
|
setGui.SetPanel.Visible = false
|
|
|
|
|
|
getVisibilityFunction = ->
|
|
if setGui
|
|
if setGui\FindFirstChild "SetPanel"
|
|
return setGui.SetPanel.Visible
|
|
|
|
|
|
return false
|
|
|
|
|
|
return setGui, setVisibilityFunction, getVisibilityFunction, waterTypeChangedEvent
|
|
|
|
|
|
t.CreateTerrainMaterialSelector = (size, position) ->
|
|
terrainMaterialSelectionChanged = Instance.new "BindableEvent"
|
|
terrainMaterialSelectionChanged.Name = "TerrainMaterialSelectionChanged"
|
|
|
|
local selectedButton
|
|
|
|
frame = Instance.new "Frame"
|
|
frame.Name = "TerrainMaterialSelector"
|
|
if size
|
|
frame.Size = size
|
|
else
|
|
frame.Size = UDim2.new 0, 245, 0, 230
|
|
|
|
if position
|
|
frame.Position = position
|
|
|
|
frame.BorderSizePixel = 0
|
|
frame.BackgroundColor3 = Color3.new 0, 0, 0
|
|
frame.Active = true
|
|
|
|
terrainMaterialSelectionChanged.Parent = frame
|
|
|
|
waterEnabled = true -- todo: turn this on when water is ready
|
|
|
|
materialToImageMap = {}
|
|
materialNames = {
|
|
"Grass",
|
|
"Sand",
|
|
"Brick",
|
|
"Granite",
|
|
"Asphalt",
|
|
"Iron",
|
|
"Aluminum",
|
|
"Gold",
|
|
"Plank",
|
|
"Log",
|
|
"Gravel",
|
|
"Cinder Block",
|
|
"Stone Wall",
|
|
"Concrete",
|
|
"Plastic (red)",
|
|
"Plastic (blue)",
|
|
}
|
|
if waterEnabled
|
|
table.insert materialNames, "Water"
|
|
|
|
currentMaterial = 1
|
|
|
|
getEnumFromName = (choice) ->
|
|
if choice == "Grass"
|
|
return 1
|
|
|
|
if choice == "Sand"
|
|
return 2
|
|
|
|
if choice == "Erase"
|
|
return 0
|
|
|
|
if choice == "Brick"
|
|
return 3
|
|
|
|
if choice == "Granite"
|
|
return 4
|
|
|
|
if choice == "Asphalt"
|
|
return 5
|
|
|
|
if choice == "Iron"
|
|
return 6
|
|
|
|
if choice == "Aluminum"
|
|
return 7
|
|
|
|
if choice == "Gold"
|
|
return 8
|
|
|
|
if choice == "Plank"
|
|
return 9
|
|
|
|
if choice == "Log"
|
|
return 10
|
|
|
|
if choice == "Gravel"
|
|
return 11
|
|
|
|
if choice == "Cinder Block"
|
|
return 12
|
|
|
|
if choice == "Stone Wall"
|
|
return 13
|
|
|
|
if choice == "Concrete"
|
|
return 14
|
|
|
|
if choice == "Plastic (red)"
|
|
return 15
|
|
|
|
if choice == "Plastic (blue)"
|
|
return 16
|
|
|
|
if choice == "Water"
|
|
return 17
|
|
|
|
|
|
getNameFromEnum = (choice) ->
|
|
if choice == Enum.CellMaterial.Grass or choice == 1
|
|
return "Grass"
|
|
elseif choice == Enum.CellMaterial.Sand or choice == 2
|
|
return "Sand"
|
|
elseif choice == Enum.CellMaterial.Empty or choice == 0
|
|
return "Erase"
|
|
elseif choice == Enum.CellMaterial.Brick or choice == 3
|
|
return "Brick"
|
|
elseif choice == Enum.CellMaterial.Granite or choice == 4
|
|
return "Granite"
|
|
elseif choice == Enum.CellMaterial.Asphalt or choice == 5
|
|
return "Asphalt"
|
|
elseif choice == Enum.CellMaterial.Iron or choice == 6
|
|
return "Iron"
|
|
elseif choice == Enum.CellMaterial.Aluminum or choice == 7
|
|
return "Aluminum"
|
|
elseif choice == Enum.CellMaterial.Gold or choice == 8
|
|
return "Gold"
|
|
elseif choice == Enum.CellMaterial.WoodPlank or choice == 9
|
|
return "Plank"
|
|
elseif choice == Enum.CellMaterial.WoodLog or choice == 10
|
|
return "Log"
|
|
elseif choice == Enum.CellMaterial.Gravel or choice == 11
|
|
return "Gravel"
|
|
elseif choice == Enum.CellMaterial.CinderBlock or choice == 12
|
|
return "Cinder Block"
|
|
elseif choice == Enum.CellMaterial.MossyStone or choice == 13
|
|
return "Stone Wall"
|
|
elseif choice == Enum.CellMaterial.Cement or choice == 14
|
|
return "Concrete"
|
|
elseif choice == Enum.CellMaterial.RedPlastic or choice == 15
|
|
return "Plastic (red)"
|
|
elseif choice == Enum.CellMaterial.BluePlastic or choice == 16
|
|
return "Plastic (blue)"
|
|
|
|
|
|
if waterEnabled
|
|
if choice == Enum.CellMaterial.Water or choice == 17
|
|
return "Water"
|
|
|
|
|
|
updateMaterialChoice = (choice) ->
|
|
currentMaterial = getEnumFromName choice
|
|
terrainMaterialSelectionChanged\Fire currentMaterial
|
|
|
|
|
|
-- we so need a better way to do this
|
|
for _, v in pairs materialNames
|
|
materialToImageMap[v] = {}
|
|
if v == "Grass"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=56563112"
|
|
elseif v == "Sand"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=62356652"
|
|
elseif v == "Brick"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=65961537"
|
|
elseif v == "Granite"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532153"
|
|
elseif v == "Asphalt"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532038"
|
|
elseif v == "Iron"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532093"
|
|
elseif v == "Aluminum"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531995"
|
|
elseif v == "Gold"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532118"
|
|
elseif v == "Plastic (red)"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531848"
|
|
elseif v == "Plastic (blue)"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531924"
|
|
elseif v == "Plank"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532015"
|
|
elseif v == "Log"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532051"
|
|
elseif v == "Gravel"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532206"
|
|
elseif v == "Cinder Block"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532103"
|
|
elseif v == "Stone Wall"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531804"
|
|
elseif v == "Concrete"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532059"
|
|
elseif v == "Water"
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=81407474"
|
|
else
|
|
materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=66887593" -- fill in the rest here!!
|
|
|
|
|
|
scrollFrame, scrollUp, scrollDown, recalculateScroll = t.CreateScrollingFrame nil, "grid"
|
|
scrollFrame.Size = UDim2.new 0.85, 0, 1, 0
|
|
scrollFrame.Position = UDim2.new 0, 0, 0, 0
|
|
scrollFrame.Parent = frame
|
|
|
|
scrollUp.Parent = frame
|
|
scrollUp.Visible = true
|
|
scrollUp.Position = UDim2.new 1, -19, 0, 0
|
|
|
|
scrollDown.Parent = frame
|
|
scrollDown.Visible = true
|
|
scrollDown.Position = UDim2.new 1, -19, 1, -17
|
|
|
|
goToNewMaterial = (buttonWrap, materialName) ->
|
|
updateMaterialChoice materialName
|
|
buttonWrap.BackgroundTransparency = 0
|
|
selectedButton.BackgroundTransparency = 1
|
|
selectedButton = buttonWrap
|
|
|
|
|
|
createMaterialButton = (name) ->
|
|
buttonWrap = Instance.new "TextButton"
|
|
buttonWrap.Text = ""
|
|
buttonWrap.Size = UDim2.new 0, 32, 0, 32
|
|
buttonWrap.BackgroundColor3 = Color3.new 1, 1, 1
|
|
buttonWrap.BorderSizePixel = 0
|
|
buttonWrap.BackgroundTransparency = 1
|
|
buttonWrap.AutoButtonColor = false
|
|
buttonWrap.Name = "#{name}"
|
|
|
|
imageButton = Instance.new "ImageButton"
|
|
imageButton.AutoButtonColor = false
|
|
imageButton.BackgroundTransparency = 1
|
|
imageButton.Size = UDim2.new 0, 30, 0, 30
|
|
imageButton.Position = UDim2.new 0, 1, 0, 1
|
|
imageButton.Name = "#{name}"
|
|
imageButton.Parent = buttonWrap
|
|
imageButton.Image = materialToImageMap[name].Regular
|
|
|
|
enumType = Instance.new "NumberValue"
|
|
enumType.Name = "EnumType"
|
|
enumType.Parent = buttonWrap
|
|
enumType.Value = 0
|
|
|
|
imageButton.MouseEnter\connect ->
|
|
buttonWrap.BackgroundTransparency = 0
|
|
|
|
imageButton.MouseLeave\connect ->
|
|
if selectedButton ~= buttonWrap
|
|
buttonWrap.BackgroundTransparency = 1
|
|
|
|
|
|
imageButton.MouseButton1Click\connect ->
|
|
if selectedButton ~= buttonWrap
|
|
goToNewMaterial buttonWrap, "#{name}"
|
|
|
|
|
|
return buttonWrap
|
|
|
|
|
|
for i = 1, #materialNames
|
|
imageButton = createMaterialButton materialNames[i]
|
|
|
|
if materialNames[i] == "Grass" -- always start with grass as the default
|
|
selectedButton = imageButton
|
|
imageButton.BackgroundTransparency = 0
|
|
|
|
|
|
imageButton.Parent = scrollFrame
|
|
|
|
|
|
forceTerrainMaterialSelection = (newMaterialType) ->
|
|
if not newMaterialType
|
|
return
|
|
|
|
if currentMaterial == newMaterialType
|
|
return
|
|
|
|
|
|
matName = getNameFromEnum newMaterialType
|
|
buttons = scrollFrame\GetChildren!
|
|
for i = 1, #buttons
|
|
if buttons[i].Name == "Plastic (blue)" and matName == "Plastic (blue)"
|
|
goToNewMaterial buttons[i], matName
|
|
return
|
|
|
|
if buttons[i].Name == "Plastic (red)" and matName == "Plastic (red)"
|
|
goToNewMaterial buttons[i], matName
|
|
return
|
|
|
|
if string.find buttons[i].Name, matName
|
|
goToNewMaterial buttons[i], matName
|
|
return
|
|
|
|
|
|
frame.Changed\connect (prop) ->
|
|
if prop == "AbsoluteSize"
|
|
recalculateScroll!
|
|
|
|
|
|
recalculateScroll!
|
|
frame, terrainMaterialSelectionChanged, forceTerrainMaterialSelection
|
|
|
|
|
|
t.CreateLoadingFrame = (name, size, position) ->
|
|
game\GetService"ContentProvider"\Preload "http://www.roblox.com/asset/?id=35238053"
|
|
|
|
loadingFrame = Instance.new "Frame"
|
|
loadingFrame.Name = "LoadingFrame"
|
|
loadingFrame.Style = Enum.FrameStyle.RobloxRound
|
|
|
|
if size
|
|
loadingFrame.Size = size
|
|
else
|
|
loadingFrame.Size = UDim2.new 0, 300, 0, 160
|
|
|
|
if position
|
|
loadingFrame.Position = position
|
|
else
|
|
loadingFrame.Position = UDim2.new 0.5, -150, 0.5, -80
|
|
|
|
|
|
loadingBar = Instance.new "Frame"
|
|
loadingBar.Name = "LoadingBar"
|
|
loadingBar.BackgroundColor3 = Color3.new 0, 0, 0
|
|
loadingBar.BorderColor3 = Color3.new 79 / 255, 79 / 255, 79 / 255
|
|
loadingBar.Position = UDim2.new 0, 0, 0, 41
|
|
loadingBar.Size = UDim2.new 1, 0, 0, 30
|
|
loadingBar.Parent = loadingFrame
|
|
|
|
loadingGreenBar = Instance.new "ImageLabel"
|
|
loadingGreenBar.Name = "LoadingGreenBar"
|
|
loadingGreenBar.Image = "http://www.roblox.com/asset/?id=35238053"
|
|
loadingGreenBar.Position = UDim2.new 0, 0, 0, 0
|
|
loadingGreenBar.Size = UDim2.new 0, 0, 1, 0
|
|
loadingGreenBar.Visible = false
|
|
loadingGreenBar.Parent = loadingBar
|
|
|
|
loadingPercent = Instance.new "TextLabel"
|
|
loadingPercent.Name = "LoadingPercent"
|
|
loadingPercent.BackgroundTransparency = 1
|
|
loadingPercent.Position = UDim2.new 0, 0, 1, 0
|
|
loadingPercent.Size = UDim2.new 1, 0, 0, 14
|
|
loadingPercent.Font = Enum.Font.Arial
|
|
loadingPercent.Text = "0%"
|
|
loadingPercent.FontSize = Enum.FontSize.Size14
|
|
loadingPercent.TextColor3 = Color3.new 1, 1, 1
|
|
loadingPercent.Parent = loadingBar
|
|
|
|
cancelButton = Instance.new "TextButton"
|
|
cancelButton.Name = "CancelButton"
|
|
cancelButton.Position = UDim2.new 0.5, -60, 1, -40
|
|
cancelButton.Size = UDim2.new 0, 120, 0, 40
|
|
cancelButton.Font = Enum.Font.Arial
|
|
cancelButton.FontSize = Enum.FontSize.Size18
|
|
cancelButton.TextColor3 = Color3.new 1, 1, 1
|
|
cancelButton.Text = "Cancel"
|
|
cancelButton.Style = Enum.ButtonStyle.RobloxButton
|
|
cancelButton.Parent = loadingFrame
|
|
|
|
loadingName = Instance.new "TextLabel"
|
|
loadingName.Name = "loadingName"
|
|
loadingName.BackgroundTransparency = 1
|
|
loadingName.Size = UDim2.new 1, 0, 0, 18
|
|
loadingName.Position = UDim2.new 0, 0, 0, 2
|
|
loadingName.Font = Enum.Font.Arial
|
|
loadingName.Text = name
|
|
loadingName.TextColor3 = Color3.new 1, 1, 1
|
|
loadingName.TextStrokeTransparency = 1
|
|
loadingName.FontSize = Enum.FontSize.Size18
|
|
loadingName.Parent = loadingFrame
|
|
|
|
cancelButtonClicked = Instance.new "BindableEvent"
|
|
cancelButtonClicked.Name = "CancelButtonClicked"
|
|
cancelButtonClicked.Parent = cancelButton
|
|
cancelButton.MouseButton1Click\connect ->
|
|
cancelButtonClicked\Fire!
|
|
|
|
|
|
updateLoadingGuiPercent = (percent, tweenAction, tweenLength) ->
|
|
if percent and type percent ~= "number"
|
|
error "updateLoadingGuiPercent expects number as argument, got #{type percent} instead"
|
|
|
|
|
|
local newSize
|
|
if percent < 0
|
|
newSize = UDim2.new 0, 0, 1, 0
|
|
elseif percent > 1
|
|
newSize = UDim2.new 1, 0, 1, 0
|
|
else
|
|
newSize = UDim2.new percent, 0, 1, 0
|
|
|
|
|
|
if tweenAction
|
|
if not tweenLength
|
|
error "updateLoadingGuiPercent is set to tween new percentage, but got no tween time length! Please pass this in as third argument"
|
|
|
|
|
|
if newSize.X.Scale > 0
|
|
loadingGreenBar.Visible = true
|
|
loadingGreenBar\TweenSize newSize, Enum.EasingDirection.Out, Enum.EasingStyle.Quad, tweenLength, true
|
|
else
|
|
loadingGreenBar\TweenSize(
|
|
newSize,
|
|
Enum.EasingDirection.Out,
|
|
Enum.EasingStyle.Quad,
|
|
tweenLength,
|
|
true,
|
|
->
|
|
if newSize.X.Scale < 0
|
|
loadingGreenBar.Visible = false
|
|
|
|
|
|
)
|
|
|
|
else
|
|
loadingGreenBar.Size = newSize
|
|
loadingGreenBar.Visible = (newSize.X.Scale > 0)
|
|
|
|
|
|
loadingGreenBar.Changed\connect (prop) ->
|
|
if prop == "Size"
|
|
loadingPercent.Text = "#{math.ceil loadingGreenBar.Size.X.Scale * 100}%"
|
|
|
|
|
|
loadingFrame, updateLoadingGuiPercent, cancelButtonClicked
|
|
|
|
|
|
t.CreatePluginFrame = (name, size, position, scrollable, parent) ->
|
|
createMenuButton = (size, position, text, fontsize, name, parent) ->
|
|
button = Instance.new "TextButton"
|
|
button.AutoButtonColor = false
|
|
button.Name = name
|
|
button.BackgroundTransparency = 1
|
|
button.Position = position
|
|
button.Size = size
|
|
button.Font = Enum.Font.ArialBold
|
|
button.FontSize = fontsize
|
|
button.Text = text
|
|
button.TextColor3 = Color3.new 1, 1, 1
|
|
button.BorderSizePixel = 0
|
|
button.BackgroundColor3 = Color3.new 20 / 255, 20 / 255, 20 / 255
|
|
|
|
button.MouseEnter\connect ->
|
|
if button.Selected
|
|
return
|
|
|
|
button.BackgroundTransparency = 0
|
|
|
|
button.MouseLeave\connect ->
|
|
if button.Selected
|
|
return
|
|
|
|
button.BackgroundTransparency = 1
|
|
|
|
|
|
button.Parent = parent
|
|
|
|
button
|
|
|
|
|
|
dragBar = Instance.new "Frame"
|
|
dragBar.Name = "#{name}" .. "DragBar"
|
|
dragBar.BackgroundColor3 = Color3.new 39 / 255, 39 / 255, 39 / 255
|
|
dragBar.BorderColor3 = Color3.new 0, 0, 0
|
|
if size
|
|
dragBar.Size = UDim2.new(size.X.Scale, size.X.Offset, 0, 20) + UDim2.new 0, 20, 0, 0
|
|
else
|
|
dragBar.Size = UDim2.new 0, 183, 0, 20
|
|
|
|
if position
|
|
dragBar.Position = position
|
|
|
|
dragBar.Active = true
|
|
dragBar.Draggable = true
|
|
--dragBar.Visible = false
|
|
dragBar.MouseEnter\connect ->
|
|
dragBar.BackgroundColor3 = Color3.new 49 / 255, 49 / 255, 49 / 255
|
|
|
|
dragBar.MouseLeave\connect ->
|
|
dragBar.BackgroundColor3 = Color3.new 39 / 255, 39 / 255, 39 / 255
|
|
|
|
dragBar.Parent = parent
|
|
|
|
-- plugin name label
|
|
pluginNameLabel = Instance.new "TextLabel"
|
|
pluginNameLabel.Name = "BarNameLabel"
|
|
pluginNameLabel.Text = " " .. "#{name}"
|
|
pluginNameLabel.TextColor3 = Color3.new 1, 1, 1
|
|
pluginNameLabel.TextStrokeTransparency = 0
|
|
pluginNameLabel.Size = UDim2.new 1, 0, 1, 0
|
|
pluginNameLabel.Font = Enum.Font.ArialBold
|
|
pluginNameLabel.FontSize = Enum.FontSize.Size18
|
|
pluginNameLabel.TextXAlignment = Enum.TextXAlignment.Left
|
|
pluginNameLabel.BackgroundTransparency = 1
|
|
pluginNameLabel.Parent = dragBar
|
|
|
|
-- close button
|
|
closeButton = createMenuButton(
|
|
UDim2.new(0, 15, 0, 17),
|
|
UDim2.new(1, -16, 0.5, -8),
|
|
"X",
|
|
Enum.FontSize.Size14,
|
|
"CloseButton",
|
|
dragBar
|
|
)
|
|
closeEvent = Instance.new "BindableEvent"
|
|
closeEvent.Name = "CloseEvent"
|
|
closeEvent.Parent = closeButton
|
|
closeButton.MouseButton1Click\connect ->
|
|
closeEvent\Fire!
|
|
closeButton.BackgroundTransparency = 1
|
|
|
|
|
|
-- help button
|
|
helpButton = createMenuButton(
|
|
UDim2.new(0, 15, 0, 17),
|
|
UDim2.new(1, -51, 0.5, -8),
|
|
"?",
|
|
Enum.FontSize.Size14,
|
|
"HelpButton",
|
|
dragBar
|
|
)
|
|
helpFrame = Instance.new "Frame"
|
|
helpFrame.Name = "HelpFrame"
|
|
helpFrame.BackgroundColor3 = Color3.new 0, 0, 0
|
|
helpFrame.Size = UDim2.new 0, 300, 0, 552
|
|
helpFrame.Position = UDim2.new 1, 5, 0, 0
|
|
helpFrame.Active = true
|
|
helpFrame.BorderSizePixel = 0
|
|
helpFrame.Visible = false
|
|
helpFrame.Parent = dragBar
|
|
|
|
helpButton.MouseButton1Click\connect ->
|
|
helpFrame.Visible = not helpFrame.Visible
|
|
if helpFrame.Visible
|
|
helpButton.Selected = true
|
|
helpButton.BackgroundTransparency = 0
|
|
screenGui = getScreenGuiAncestor helpFrame
|
|
if screenGui
|
|
if helpFrame.AbsolutePosition.X + helpFrame.AbsoluteSize.X > screenGui.AbsoluteSize.X --position on left hand side
|
|
helpFrame.Position = UDim2.new 0, -5 - helpFrame.AbsoluteSize.X, 0, 0
|
|
else -- position on right hand side
|
|
helpFrame.Position = UDim2.new 1, 5, 0, 0
|
|
|
|
else
|
|
helpFrame.Position = UDim2.new 1, 5, 0, 0
|
|
|
|
else
|
|
helpButton.Selected = false
|
|
helpButton.BackgroundTransparency = 1
|
|
|
|
|
|
minimizeButton = createMenuButton(
|
|
UDim2.new(0, 16, 0, 17),
|
|
UDim2.new(1, -34, 0.5, -8),
|
|
"-",
|
|
Enum.FontSize.Size14,
|
|
"MinimizeButton",
|
|
dragBar
|
|
)
|
|
minimizeButton.TextYAlignment = Enum.TextYAlignment.Top
|
|
|
|
minimizeFrame = Instance.new "Frame"
|
|
minimizeFrame.Name = "MinimizeFrame"
|
|
minimizeFrame.BackgroundColor3 = Color3.new 73 / 255, 73 / 255, 73 / 255
|
|
minimizeFrame.BorderColor3 = Color3.new 0, 0, 0
|
|
minimizeFrame.Position = UDim2.new 0, 0, 1, 0
|
|
if size
|
|
minimizeFrame.Size = UDim2.new(size.X.Scale, size.X.Offset, 0, 50) + UDim2.new 0, 20, 0, 0
|
|
else
|
|
minimizeFrame.Size = UDim2.new 0, 183, 0, 50
|
|
|
|
minimizeFrame.Visible = false
|
|
minimizeFrame.Parent = dragBar
|
|
|
|
minimizeBigButton = Instance.new "TextButton"
|
|
minimizeBigButton.Position = UDim2.new 0.5, -50, 0.5, -20
|
|
minimizeBigButton.Name = "MinimizeButton"
|
|
minimizeBigButton.Size = UDim2.new 0, 100, 0, 40
|
|
minimizeBigButton.Style = Enum.ButtonStyle.RobloxButton
|
|
minimizeBigButton.Font = Enum.Font.ArialBold
|
|
minimizeBigButton.FontSize = Enum.FontSize.Size18
|
|
minimizeBigButton.TextColor3 = Color3.new 1, 1, 1
|
|
minimizeBigButton.Text = "Show"
|
|
minimizeBigButton.Parent = minimizeFrame
|
|
|
|
separatingLine = Instance.new "Frame"
|
|
separatingLine.Name = "SeparatingLine"
|
|
separatingLine.BackgroundColor3 = Color3.new 115 / 255, 115 / 255, 115 / 255
|
|
separatingLine.BorderSizePixel = 0
|
|
separatingLine.Position = UDim2.new 1, -18, 0.5, -7
|
|
separatingLine.Size = UDim2.new 0, 1, 0, 14
|
|
separatingLine.Parent = dragBar
|
|
|
|
otherSeparatingLine = separatingLine\clone!
|
|
otherSeparatingLine.Position = UDim2.new 1, -35, 0.5, -7
|
|
otherSeparatingLine.Parent = dragBar
|
|
|
|
widgetContainer = Instance.new "Frame"
|
|
widgetContainer.Name = "WidgetContainer"
|
|
widgetContainer.BackgroundTransparency = 1
|
|
widgetContainer.Position = UDim2.new 0, 0, 1, 0
|
|
widgetContainer.BorderColor3 = Color3.new 0, 0, 0
|
|
if not scrollable
|
|
widgetContainer.BackgroundTransparency = 0
|
|
widgetContainer.BackgroundColor3 = Color3.new 72 / 255, 72 / 255, 72 / 255
|
|
|
|
widgetContainer.Parent = dragBar
|
|
|
|
if size
|
|
if scrollable
|
|
widgetContainer.Size = size
|
|
else
|
|
widgetContainer.Size = UDim2.new 0, dragBar.AbsoluteSize.X, size.Y.Scale, size.Y.Offset
|
|
|
|
else
|
|
if scrollable
|
|
widgetContainer.Size = UDim2.new 0, 163, 0, 400
|
|
else
|
|
widgetContainer.Size = UDim2.new 0, dragBar.AbsoluteSize.X, 0, 400
|
|
|
|
|
|
if position
|
|
widgetContainer.Position += UDim2.new 0, 0, 0, 20
|
|
|
|
|
|
local frame, control, verticalDragger
|
|
if scrollable
|
|
--frame for widgets
|
|
frame, control = t.CreateTrueScrollingFrame!
|
|
frame.Size = UDim2.new 1, 0, 1, 0
|
|
frame.BackgroundColor3 = Color3.new 72 / 255, 72 / 255, 72 / 255
|
|
frame.BorderColor3 = Color3.new 0, 0, 0
|
|
frame.Active = true
|
|
frame.Parent = widgetContainer
|
|
control.Parent = dragBar
|
|
control.BackgroundColor3 = Color3.new 72 / 255, 72 / 255, 72 / 255
|
|
control.BorderSizePixel = 0
|
|
control.BackgroundTransparency = 0
|
|
control.Position = UDim2.new 1, -21, 1, 1
|
|
if size
|
|
control.Size = UDim2.new 0, 21, size.Y.Scale, size.Y.Offset
|
|
else
|
|
control.Size = UDim2.new 0, 21, 0, 400
|
|
|
|
control\FindFirstChild("ScrollDownButton").Position = UDim2.new 0, 0, 1, -20
|
|
|
|
fakeLine = Instance.new "Frame"
|
|
fakeLine.Name = "FakeLine"
|
|
fakeLine.BorderSizePixel = 0
|
|
fakeLine.BackgroundColor3 = Color3.new 0, 0, 0
|
|
fakeLine.Size = UDim2.new 0, 1, 1, 1
|
|
fakeLine.Position = UDim2.new 1, 0, 0, 0
|
|
fakeLine.Parent = control
|
|
|
|
verticalDragger = Instance.new "TextButton"
|
|
verticalDragger.ZIndex = 2
|
|
verticalDragger.AutoButtonColor = false
|
|
verticalDragger.Name = "VerticalDragger"
|
|
verticalDragger.BackgroundColor3 = Color3.new 50 / 255, 50 / 255, 50 / 255
|
|
verticalDragger.BorderColor3 = Color3.new 0, 0, 0
|
|
verticalDragger.Size = UDim2.new 1, 20, 0, 20
|
|
verticalDragger.Position = UDim2.new 0, 0, 1, 0
|
|
verticalDragger.Active = true
|
|
verticalDragger.Text = ""
|
|
verticalDragger.Parent = widgetContainer
|
|
|
|
scrubFrame = Instance.new "Frame"
|
|
scrubFrame.Name = "ScrubFrame"
|
|
scrubFrame.BackgroundColor3 = Color3.new 1, 1, 1
|
|
scrubFrame.BorderSizePixel = 0
|
|
scrubFrame.Position = UDim2.new 0.5, -5, 0.5, 0
|
|
scrubFrame.Size = UDim2.new 0, 10, 0, 1
|
|
scrubFrame.ZIndex = 5
|
|
scrubFrame.Parent = verticalDragger
|
|
scrubTwo = scrubFrame\clone!
|
|
scrubTwo.Position = UDim2.new 0.5, -5, 0.5, -2
|
|
scrubTwo.Parent = verticalDragger
|
|
scrubThree = scrubFrame\clone!
|
|
scrubThree.Position = UDim2.new 0.5, -5, 0.5, 2
|
|
scrubThree.Parent = verticalDragger
|
|
|
|
areaSoak = Instance.new "TextButton"
|
|
areaSoak.Name = "AreaSoak"
|
|
areaSoak.Size = UDim2.new 1, 0, 1, 0
|
|
areaSoak.BackgroundTransparency = 1
|
|
areaSoak.BorderSizePixel = 0
|
|
areaSoak.Text = ""
|
|
areaSoak.ZIndex = 10
|
|
areaSoak.Visible = false
|
|
areaSoak.Active = true
|
|
areaSoak.Parent = getScreenGuiAncestor parent
|
|
|
|
draggingVertical = false
|
|
local startYPos
|
|
verticalDragger.MouseEnter\connect ->
|
|
verticalDragger.BackgroundColor3 = Color3.new 60 / 255, 60 / 255, 60 / 255
|
|
|
|
verticalDragger.MouseLeave\connect ->
|
|
verticalDragger.BackgroundColor3 = Color3.new 50 / 255, 50 / 255, 50 / 255
|
|
|
|
verticalDragger.MouseButton1Down\connect (_, y) ->
|
|
draggingVertical = true
|
|
areaSoak.Visible = true
|
|
startYPos = y
|
|
|
|
areaSoak.MouseButton1Up\connect ->
|
|
draggingVertical = false
|
|
areaSoak.Visible = false
|
|
|
|
areaSoak.MouseMoved\connect (_, y) ->
|
|
if not draggingVertical
|
|
return
|
|
|
|
|
|
yDelta = y - startYPos
|
|
if not control.ScrollDownButton.Visible and yDelta > 0
|
|
return
|
|
|
|
|
|
if (widgetContainer.Size.Y.Offset + yDelta) < 150
|
|
widgetContainer.Size = UDim2.new(
|
|
widgetContainer.Size.X.Scale,
|
|
widgetContainer.Size.X.Offset,
|
|
widgetContainer.Size.Y.Scale,
|
|
150
|
|
)
|
|
control.Size = UDim2.new 0, 21, 0, 150
|
|
return
|
|
|
|
|
|
startYPos = y
|
|
|
|
if widgetContainer.Size.Y.Offset + yDelta >= 0
|
|
widgetContainer.Size = UDim2.new(
|
|
widgetContainer.Size.X.Scale,
|
|
widgetContainer.Size.X.Offset,
|
|
widgetContainer.Size.Y.Scale,
|
|
widgetContainer.Size.Y.Offset + yDelta
|
|
)
|
|
control.Size = UDim2.new 0, 21, 0, control.Size.Y.Offset + yDelta
|
|
|
|
|
|
switchMinimize = ->
|
|
minimizeFrame.Visible = not minimizeFrame.Visible
|
|
if scrollable
|
|
frame.Visible = not frame.Visible
|
|
verticalDragger.Visible = not verticalDragger.Visible
|
|
control.Visible = not control.Visible
|
|
else
|
|
widgetContainer.Visible = not widgetContainer.Visible
|
|
|
|
|
|
if minimizeFrame.Visible
|
|
minimizeButton.Text = "+"
|
|
else
|
|
minimizeButton.Text = "-"
|
|
|
|
|
|
minimizeBigButton.MouseButton1Click\connect ->
|
|
switchMinimize!
|
|
|
|
|
|
minimizeButton.MouseButton1Click\connect ->
|
|
switchMinimize!
|
|
|
|
|
|
if scrollable
|
|
dragBar, frame, helpFrame, closeEvent
|
|
else
|
|
dragBar, widgetContainer, helpFrame, closeEvent
|
|
|
|
|
|
t.Help = (funcNameOrFunc) ->
|
|
--input argument can be a string or a function. Should return a description (of arguments and expected side effects)
|
|
if funcNameOrFunc == "CreatePropertyDropDownMenu" or funcNameOrFunc == t.CreatePropertyDropDownMenu
|
|
"Function CreatePropertyDropDownMenu. " ..
|
|
"Arguments: (instance, propertyName, enumType). " ..
|
|
"Side effect: returns a container with a drop-down-box that is linked to the 'property' field of 'instance' which is of type 'enumType'"
|
|
|
|
elseif funcNameOrFunc == "CreateDropDownMenu" or funcNameOrFunc == t.CreateDropDownMenu
|
|
"Function CreateDropDownMenu. " ..
|
|
"Arguments: (items, onItemSelected). " ..
|
|
"Side effect: Returns 2 results, a container to the gui object and a 'updateSelection' function for external updating. The container is a drop-down-box created around a list of items"
|
|
|
|
elseif funcNameOrFunc == "CreateMessageDialog" or funcNameOrFunc == t.CreateMessageDialog
|
|
"Function CreateMessageDialog. " ..
|
|
"Arguments: (title, message, buttons). " ..
|
|
"Side effect: Returns a gui object of a message box with 'title' and 'message' as passed in. 'buttons' input is an array of Tables contains a 'Text' and 'Function' field for the text/callback of each button"
|
|
|
|
elseif funcNameOrFunc == "CreateStyledMessageDialog" or funcNameOrFunc == t.CreateStyledMessageDialog
|
|
"Function CreateStyledMessageDialog. " ..
|
|
"Arguments: (title, message, style, buttons). " ..
|
|
"Side effect: Returns a gui object of a message box with 'title' and 'message' as passed in. 'buttons' input is an array of Tables contains a 'Text' and 'Function' field for the text/callback of each button, 'style' is a string, either Error, Notify or Confirm"
|
|
|
|
elseif funcNameOrFunc == "GetFontHeight" or funcNameOrFunc == t.GetFontHeight
|
|
"Function GetFontHeight. " ..
|
|
"Arguments: (font, fontSize). " ..
|
|
"Side effect: returns the size in pixels of the given font + fontSize"
|
|
|
|
elseif funcNameOrFunc == "CreateScrollingFrame" or funcNameOrFunc == t.CreateScrollingFrame
|
|
"Function CreateScrollingFrame. " ..
|
|
"Arguments: (orderList, style) " ..
|
|
"Side effect: returns 4 objects, (scrollFrame, scrollUpButton, scrollDownButton, recalculateFunction). 'scrollFrame' can be filled with GuiObjects. It will lay them out and allow scrollUpButton/scrollDownButton to interact with them. Orderlist is optional (and specifies the order to layout the children. Without orderlist, it uses the children order. style is also optional, and allows for a 'grid' styling if style is passed 'grid' as a string. recalculateFunction can be called when a relayout is needed (when orderList changes)"
|
|
|
|
elseif funcNameOrFunc == "CreateTrueScrollingFrame" or funcNameOrFunc == t.CreateTrueScrollingFrame
|
|
"Function CreateTrueScrollingFrame. " ..
|
|
"Arguments: (nil) " ..
|
|
"Side effect: returns 2 objects, (scrollFrame, controlFrame). 'scrollFrame' can be filled with GuiObjects, and they will be clipped if not inside the frame's bounds. controlFrame has children scrollup and scrolldown, as well as a slider. controlFrame can be parented to any guiobject and it will readjust itself to fit."
|
|
|
|
elseif funcNameOrFunc == "AutoTruncateTextObject" or funcNameOrFunc == t.AutoTruncateTextObject
|
|
"Function AutoTruncateTextObject. " ..
|
|
"Arguments: (textLabel) " ..
|
|
"Side effect: returns 2 objects, (textLabel, changeText). The 'textLabel' input is modified to automatically truncate text (with ellipsis), if it gets too small to fit. 'changeText' is a function that can be used to change the text, it takes 1 string as an argument"
|
|
|
|
elseif funcNameOrFunc == "CreateSlider" or funcNameOrFunc == t.CreateSlider
|
|
"Function CreateSlider. " ..
|
|
"Arguments: (steps, width, position) " ..
|
|
"Side effect: returns 2 objects, (sliderGui, sliderPosition). The 'steps' argument specifies how many different positions the slider can hold along the bar. 'width' specifies in pixels how wide the bar should be (modifiable afterwards if desired). 'position' argument should be a UDim2 for slider positioning. 'sliderPosition' is an IntValue whose current .Value specifies the specific step the slider is currently on."
|
|
|
|
elseif funcNameOrFunc == "CreateLoadingFrame" or funcNameOrFunc == t.CreateLoadingFrame
|
|
"Function CreateLoadingFrame. " ..
|
|
"Arguments: (name, size, position) " ..
|
|
"Side effect: Creates a gui that can be manipulated to show progress for a particular action. Name appears above the loading bar, and size and position are udim2 values (both size and position are optional arguments). Returns 3 arguments, the first being the gui created. The second being updateLoadingGuiPercent, which is a bindable function. This function takes one argument (two optionally), which should be a number between 0 and 1, representing the percentage the loading gui should be at. The second argument to this function is a boolean value that if set to true will tween the current percentage value to the new percentage value, therefore our third argument is how long this tween should take. Our third returned argument is a BindableEvent, that when fired means that someone clicked the cancel button on the dialog."
|
|
|
|
elseif funcNameOrFunc == "CreateTerrainMaterialSelector" or funcNameOrFunc == t.CreateTerrainMaterialSelector
|
|
"Function CreateTerrainMaterialSelector. " ..
|
|
"Arguments: (size, position) " ..
|
|
"Side effect: Size and position are UDim2 values that specifies the selector's size and position. Both size and position are optional arguments. This method returns 3 objects (terrainSelectorGui, terrainSelected, forceTerrainSelection). terrainSelectorGui is just the gui object that we generate with this function, parent it as you like. TerrainSelected is a BindableEvent that is fired whenever a new terrain type is selected in the gui. ForceTerrainSelection is a function that takes an argument of Enum.CellMaterial and will force the gui to show that material as currently selected."
|
|
|
|
t
|