diff --git a/api/components/extended/container_api.md b/api/components/extended/container_api.md
index 5c5a58f..9eb0c66 100644
--- a/api/components/extended/container_api.md
+++ b/api/components/extended/container_api.md
@@ -38,6 +38,7 @@ Create container component with druid: `container = druid:new_container(node, mo
- [clear_draggable_corners](#clear_draggable_corners)
- [fit_into_node](#fit_into_node)
- [set_min_size](#set_min_size)
+- [set_max_size](#set_max_size)
## Fields
@@ -54,6 +55,8 @@ Create container component with druid: `container = druid:new_container(node, mo
- [fit_size](#fit_size)
- [min_size_x](#min_size_x)
- [min_size_y](#min_size_y)
+- [max_size_x](#max_size_x)
+- [max_size_y](#max_size_y)
- [on_size_changed](#on_size_changed)
- [node_fill_x](#node_fill_x)
- [node_fill_y](#node_fill_y)
@@ -303,6 +306,21 @@ Set the minimum size of the container
- **Returns:**
- `self` *(druid.container)*: Current container instance
+### set_max_size
+
+---
+```lua
+container:set_max_size([max_size_x], [max_size_y])
+```
+
+Set the maximum size of the container
+
+- **Parameters:**
+ - `[max_size_x]` *(number|nil)*: The maximum size x
+ - `[max_size_y]` *(number|nil)*: The maximum size y
+
+- **Returns:**
+ - `self` *(druid.container)*: Current container instance
## Fields
@@ -344,6 +362,12 @@ Set the minimum size of the container
- **min_size_y** (_number_): The minimum size y
+
+- **max_size_x** (_number_): The maximum size x
+
+
+- **max_size_y** (_number_): The maximum size y
+
- **on_size_changed** (_event_): fun(self: druid.container, size: vector3) The event triggered when the size changes
diff --git a/api/quick_api_reference.md b/api/quick_api_reference.md
index b882261..cf63e2d 100644
--- a/api/quick_api_reference.md
+++ b/api/quick_api_reference.md
@@ -177,6 +177,7 @@ container:refresh_origins()
container:refresh_scale()
container:remove_container_by_node([node])
container:set_min_size([min_size_x], [min_size_y])
+container:set_max_size([max_size_x], [max_size_y])
container:set_parent_container([parent_container])
container:set_pivot(pivot)
container:set_position(pos_x, pos_y)
diff --git a/druid/extended/container.lua b/druid/extended/container.lua
old mode 100644
new mode 100755
index 9e320b7..6769990
--- a/druid/extended/container.lua
+++ b/druid/extended/container.lua
@@ -58,6 +58,8 @@ local CORNER_PIVOTS = {
---@field fit_size vector3 The fit size
---@field min_size_x number|nil The minimum size x
---@field min_size_y number|nil The minimum size y
+---@field max_size_x number|nil The maximum size x
+---@field max_size_y number|nil The maximum size y
---@field on_size_changed event fun(self: druid.container, size: vector3) The event triggered when the size changes
---@field _parent_container druid.container The parent container
---@field _containers table The containers
@@ -75,6 +77,8 @@ function M:init(node, mode, callback)
self.min_size_x = 0
self.min_size_y = 0
+ self.max_size_x = nil
+ self.max_size_y = nil
self._containers = {}
self._draggable_corners = {}
self.node_offset = vmath.vector4(0)
@@ -166,7 +170,13 @@ function M:set_size(width, height, anchor_pivot)
if self.min_size_y then
height = max(height, self.min_size_y)
end
-
+ if self.max_size_x then
+ width = min(width, self.max_size_x)
+ end
+ if self.max_size_y then
+ height = min(height, self.max_size_y)
+ end
+
if (width and width ~= self.size.x) or (height and height ~= self.size.y) then
self.center_offset.x = -width * self.pivot_offset.x
self.center_offset.y = -height * self.pivot_offset.y
@@ -522,6 +532,12 @@ function M:_on_corner_drag(x, y, corner_offset)
if self.min_size_y and size.y + y < self.min_size_y then
y = self.min_size_y - size.y
end
+ if self.max_size_x and size.x + x > self.max_size_x then
+ x = self.max_size_x - size.x
+ end
+ if self.max_size_y and size.y + y > self.max_size_y then
+ y = self.max_size_y - size.y
+ end
if corner_offset.x < 0 then
self.node_offset.x = self.node_offset.x - x
@@ -570,4 +586,17 @@ function M:set_min_size(min_size_x, min_size_y)
end
+---Set the maximum size of the container
+---@param max_size_x number|nil The maximum size x
+---@param max_size_y number|nil The maximum size y
+---@return druid.container self Current container instance
+function M:set_max_size(max_size_x, max_size_y)
+ self.max_size_x = max_size_x or self.max_size_x
+ self.max_size_y = max_size_y or self.max_size_y
+ self:refresh()
+
+ return self
+end
+
+
return M
diff --git a/test/tests/test_container.lua b/test/tests/test_container.lua
old mode 100644
new mode 100755
index e255df3..3c66f5c
--- a/test/tests/test_container.lua
+++ b/test/tests/test_container.lua
@@ -41,6 +41,8 @@ return function()
assert(container.mode == const.LAYOUT_MODE.FIT)
assert(container.min_size_x == 0)
assert(container.min_size_y == 0)
+ assert(container.max_size_x == nil)
+ assert(container.max_size_y == nil)
assert(container._containers ~= nil)
assert(#container._containers == 0)
@@ -137,6 +139,34 @@ return function()
gui.delete_node(container_node)
end)
+ it("Should set max size", function()
+ local container_node = gui.new_box_node(vmath.vector3(50, 50, 0), vmath.vector3(100, 100, 0))
+ local container = druid:new_container(container_node)
+
+ assert(container.max_size_x == nil)
+ assert(container.max_size_y == nil)
+
+ container:set_max_size(150, 200)
+
+ assert(container.max_size_x == 150)
+ assert(container.max_size_y == 200)
+
+ -- Should respect max size when setting larger size
+ container:set_size(300, 300)
+ local size = container:get_size()
+ assert(size.x == 150)
+ assert(size.y == 200)
+
+ -- Should allow smaller size
+ container:set_size(100, 100)
+ size = container:get_size()
+ assert(size.x == 100)
+ assert(size.y == 100)
+
+ druid:remove(container)
+ gui.delete_node(container_node)
+ end)
+
it("Should fire on_size_changed event", function()
local container_node = gui.new_box_node(vmath.vector3(50, 50, 0), vmath.vector3(100, 100, 0))
local container = druid:new_container(container_node)