From e990a70135673f9eba334e77d6c2c4cdf9ffab6f Mon Sep 17 00:00:00 2001 From: ckdavid <31847443+ckdavid@users.noreply.github.com> Date: Mon, 17 Sep 2018 17:23:59 +0100 Subject: [PATCH 1/2] Add AbsoluteContentSize to UI layouts --- lib/instances/UIGridStyleLayout.lua | 30 +++++++++++++ lib/instances/UIGridStyleLayout_spec.lua | 30 +++++++++++++ lib/instances/UIListLayout.lua | 31 +++++++++++++ lib/instances/UIListLayout_spec.lua | 55 ++++++++++++++++++++++++ 4 files changed, 146 insertions(+) diff --git a/lib/instances/UIGridStyleLayout.lua b/lib/instances/UIGridStyleLayout.lua index 741dc80..2ed4b85 100644 --- a/lib/instances/UIGridStyleLayout.lua +++ b/lib/instances/UIGridStyleLayout.lua @@ -3,10 +3,40 @@ local FillDirection = import("../Enum/FillDirection") local HorizontalAlignment = import("../Enum/HorizontalAlignment") local InstanceProperty = import("../InstanceProperty") local SortOrder = import("../Enum/SortOrder") +local Vector2 = import("../types/Vector2") local VerticalAlignment = import("../Enum/VerticalAlignment") local UIGridStyleLayout = BaseInstance:extend("UIGridStyleLayout") +UIGridStyleLayout.properties.AbsoluteContentSize = InstanceProperty.readOnly({ + get = function(self) + local x = 0 + local y = 0 + if self:FindFirstAncestorWhichIsA("ScreenGui") then + -- Sum the size of the children in the fill direction and get + -- the maximum size of the children in the other direction. + for _, child in pairs(self.Parent:GetChildren()) do + if child:IsA("GuiObject") then + if self.FillDirection == FillDirection.Horizontal then + x = x + child.AbsoluteSize.X + local childHeight = child.AbsoluteSize.Y + if childHeight > y then + y = childHeight + end + else + y = y + child.AbsoluteSize.Y + local childWidth = child.AbsoluteSize.X + if childWidth > x then + x = childWidth + end + end + end + end + end + return Vector2.new(x, y) + end, +}) + UIGridStyleLayout.properties.FillDirection = InstanceProperty.enum(FillDirection, { getDefault = function() return FillDirection.Horizontal diff --git a/lib/instances/UIGridStyleLayout_spec.lua b/lib/instances/UIGridStyleLayout_spec.lua index f6b48d5..136539c 100644 --- a/lib/instances/UIGridStyleLayout_spec.lua +++ b/lib/instances/UIGridStyleLayout_spec.lua @@ -1,11 +1,17 @@ local FillDirection = import("../Enum/FillDirection") local HorizontalAlignment = import("../Enum/HorizontalAlignment") +local Instance = import("../Instance") local SortOrder = import("../Enum/SortOrder") local typeof = import("../functions/typeof") +local UDim2 = import("../types/UDim2") local VerticalAlignment = import("../Enum/VerticalAlignment") local UIGridStyleLayout = import("./UIGridStyleLayout") +local function extractVector2(vector2) + return { vector2.X, vector2.Y } +end + describe("instances.UIGridStyleLayout", function() it("should instantiate", function() local instance = UIGridStyleLayout:new() @@ -16,6 +22,7 @@ describe("instances.UIGridStyleLayout", function() it("should have properties defined", function() local instance = UIGridStyleLayout:new() + assert.equals(typeof(instance.AbsoluteContentSize), "Vector2") assert.equals(typeof(instance.FillDirection), "EnumItem") assert.equals(instance.FillDirection.EnumType, FillDirection) assert.equals(typeof(instance.HorizontalAlignment), "EnumItem") @@ -25,4 +32,27 @@ describe("instances.UIGridStyleLayout", function() assert.equals(typeof(instance.VerticalAlignment), "EnumItem") assert.equal(instance.VerticalAlignment.EnumType, VerticalAlignment) end) + + describe("AbsoluteContentSize", function() + it("should change based on the sizes of the layout's siblings", function() + local screenGui = Instance.new("ScreenGui") + + local instance = UIGridStyleLayout:new() + instance.Parent = screenGui + + local frame1 = Instance.new("Frame") + frame1.Size = UDim2.new(0, 300, 0, 400) + frame1.Parent = screenGui + + local frame2 = Instance.new("Frame") + frame2.Size = UDim2.new(0, 200, 0, 500) + frame2.Parent = screenGui + + local frame3 = Instance.new("Frame") + frame3.Size = UDim2.new(0, 100, 0, 100) + frame3.Parent = screenGui + + assert.same({ 600, 500 }, extractVector2(instance.AbsoluteContentSize)) + end) + end) end) \ No newline at end of file diff --git a/lib/instances/UIListLayout.lua b/lib/instances/UIListLayout.lua index 1561ca8..777e7ff 100644 --- a/lib/instances/UIListLayout.lua +++ b/lib/instances/UIListLayout.lua @@ -1,6 +1,8 @@ local UIGridStyleLayout = import("./UIGridStyleLayout") +local FillDirection = import("../Enum/FillDirection") local InstanceProperty = import("../InstanceProperty") local UDim = import("../types/UDim") +local Vector2 = import("../types/Vector2") local UIListLayout = UIGridStyleLayout:extend("UIListLayout", { creatable = true, @@ -12,4 +14,33 @@ UIListLayout.properties.Padding = InstanceProperty.typed("UDim", { end, }) +UIListLayout.properties.AbsoluteContentSize = InstanceProperty.readOnly({ + get = function(self) + local size = UIGridStyleLayout.properties.AbsoluteContentSize.get(self) + if self.Padding ~= UDim.new(0, 0) and self:FindFirstAncestorWhichIsA("ScreenGui") then + local siblingCount = 0 + for _, child in pairs(self.Parent:GetChildren()) do + if child:IsA("GuiObject") then + siblingCount = siblingCount + 1 + end + end + if siblingCount > 0 then + local function getPadding(parentSizeInFillDirection) + return (siblingCount - 1) * (parentSizeInFillDirection * self.Padding.Scale + self.Padding.Offset) + end + local parentSize = self.Parent.AbsoluteSize + local x = size.X + local y = size.Y + if self.FillDirection == FillDirection.Horizontal then + x = x + getPadding(parentSize.X) + else + y = y + getPadding(parentSize.Y) + end + size = Vector2.new(x, y) + end + end + return size + end, +}) + return UIListLayout \ No newline at end of file diff --git a/lib/instances/UIListLayout_spec.lua b/lib/instances/UIListLayout_spec.lua index ddee74d..7a3c31b 100644 --- a/lib/instances/UIListLayout_spec.lua +++ b/lib/instances/UIListLayout_spec.lua @@ -1,5 +1,12 @@ +local FillDirection = import("../Enum/FillDirection") local Instance = import("../Instance") local typeof = import("../functions/typeof") +local UDim = import("../types/UDim") +local UDim2 = import("../types/UDim2") + +local function extractVector2(vector2) + return { vector2.X, vector2.Y } +end describe("instances.UIListLayout", function() it("should instantiate", function() @@ -19,4 +26,52 @@ describe("instances.UIListLayout", function() assert.equals(typeof(instance.Padding), "UDim") end) + + describe("AbsoluteContentSize", function() + it("should include padding vertically", function() + local screenGui = Instance.new("ScreenGui") + + local instance = Instance.new("UIListLayout") + instance.Padding = UDim.new(0, 10) + instance.FillDirection = FillDirection.Vertical + instance.Parent = screenGui + + local frame1 = Instance.new("Frame") + frame1.Size = UDim2.new(0, 300, 0, 400) + frame1.Parent = screenGui + + local frame2 = Instance.new("Frame") + frame2.Size = UDim2.new(0, 200, 0, 500) + frame2.Parent = screenGui + + local frame3 = Instance.new("Frame") + frame3.Size = UDim2.new(0, 100, 0, 100) + frame3.Parent = screenGui + + assert.same({ 300, 1020 }, extractVector2(instance.AbsoluteContentSize)) + end) + + it("should include padding horizonally", function() + local screenGui = Instance.new("ScreenGui") + + local instance = Instance.new("UIListLayout") + instance.Padding = UDim.new(0, 10) + instance.FillDirection = FillDirection.Horizontal + instance.Parent = screenGui + + local frame1 = Instance.new("Frame") + frame1.Size = UDim2.new(0, 300, 0, 400) + frame1.Parent = screenGui + + local frame2 = Instance.new("Frame") + frame2.Size = UDim2.new(0, 200, 0, 500) + frame2.Parent = screenGui + + local frame3 = Instance.new("Frame") + frame3.Size = UDim2.new(0, 100, 0, 100) + frame3.Parent = screenGui + + assert.same({ 620, 500 }, extractVector2(instance.AbsoluteContentSize)) + end) + end) end) \ No newline at end of file From db34cdfb21437e776d1a95ec968a5500db9fc654 Mon Sep 17 00:00:00 2001 From: ckdavid <31847443+ckdavid@users.noreply.github.com> Date: Wed, 10 Oct 2018 11:10:51 +0100 Subject: [PATCH 2/2] Fix conflicts with upstream --- lib/instances/UIGridStyleLayout.lua | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lib/instances/UIGridStyleLayout.lua b/lib/instances/UIGridStyleLayout.lua index c2618c3..2ed4b85 100644 --- a/lib/instances/UIGridStyleLayout.lua +++ b/lib/instances/UIGridStyleLayout.lua @@ -5,7 +5,6 @@ local InstanceProperty = import("../InstanceProperty") local SortOrder = import("../Enum/SortOrder") local Vector2 = import("../types/Vector2") local VerticalAlignment = import("../Enum/VerticalAlignment") -local Vector2 = import("../types/Vector2") local UIGridStyleLayout = BaseInstance:extend("UIGridStyleLayout") @@ -62,10 +61,4 @@ UIGridStyleLayout.properties.VerticalAlignment = InstanceProperty.enum(VerticalA end, }) -UIGridStyleLayout.properties.AbsoluteContentSize = InstanceProperty.readOnly({ - get = function(self) - return Vector2.new(0, 0) - end, -}) - return UIGridStyleLayout \ No newline at end of file