Skip to content

Commit efc3867

Browse files
authored
Merge pull request #309 from astrochili/container-max-size
Added `max_size_x` and `max_size_y` to `container`
2 parents a2b2737 + df516a0 commit efc3867

File tree

4 files changed

+85
-1
lines changed

4 files changed

+85
-1
lines changed

api/components/extended/container_api.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ Create container component with druid: `container = druid:new_container(node, mo
3838
- [clear_draggable_corners](#clear_draggable_corners)
3939
- [fit_into_node](#fit_into_node)
4040
- [set_min_size](#set_min_size)
41+
- [set_max_size](#set_max_size)
4142

4243
## Fields
4344

@@ -54,6 +55,8 @@ Create container component with druid: `container = druid:new_container(node, mo
5455
- [fit_size](#fit_size)
5556
- [min_size_x](#min_size_x)
5657
- [min_size_y](#min_size_y)
58+
- [max_size_x](#max_size_x)
59+
- [max_size_y](#max_size_y)
5760
- [on_size_changed](#on_size_changed)
5861
- [node_fill_x](#node_fill_x)
5962
- [node_fill_y](#node_fill_y)
@@ -303,6 +306,21 @@ Set the minimum size of the container
303306
- **Returns:**
304307
- `self` *(druid.container)*: Current container instance
305308

309+
### set_max_size
310+
311+
---
312+
```lua
313+
container:set_max_size([max_size_x], [max_size_y])
314+
```
315+
316+
Set the maximum size of the container
317+
318+
- **Parameters:**
319+
- `[max_size_x]` *(number|nil)*: The maximum size x
320+
- `[max_size_y]` *(number|nil)*: The maximum size y
321+
322+
- **Returns:**
323+
- `self` *(druid.container)*: Current container instance
306324

307325
## Fields
308326
<a name="node"></a>
@@ -344,6 +362,12 @@ Set the minimum size of the container
344362
<a name="min_size_y"></a>
345363
- **min_size_y** (_number_): The minimum size y
346364

365+
<a name="max_size_x"></a>
366+
- **max_size_x** (_number_): The maximum size x
367+
368+
<a name="max_size_y"></a>
369+
- **max_size_y** (_number_): The maximum size y
370+
347371
<a name="on_size_changed"></a>
348372
- **on_size_changed** (_event_): fun(self: druid.container, size: vector3) The event triggered when the size changes
349373

api/quick_api_reference.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ container:refresh_origins()
177177
container:refresh_scale()
178178
container:remove_container_by_node([node])
179179
container:set_min_size([min_size_x], [min_size_y])
180+
container:set_max_size([max_size_x], [max_size_y])
180181
container:set_parent_container([parent_container])
181182
container:set_pivot(pivot)
182183
container:set_position(pos_x, pos_y)

druid/extended/container.lua

100644100755
Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ local CORNER_PIVOTS = {
5858
---@field fit_size vector3 The fit size
5959
---@field min_size_x number|nil The minimum size x
6060
---@field min_size_y number|nil The minimum size y
61+
---@field max_size_x number|nil The maximum size x
62+
---@field max_size_y number|nil The maximum size y
6163
---@field on_size_changed event fun(self: druid.container, size: vector3) The event triggered when the size changes
6264
---@field _parent_container druid.container The parent container
6365
---@field _containers table The containers
@@ -75,6 +77,8 @@ function M:init(node, mode, callback)
7577

7678
self.min_size_x = 0
7779
self.min_size_y = 0
80+
self.max_size_x = nil
81+
self.max_size_y = nil
7882
self._containers = {}
7983
self._draggable_corners = {}
8084
self.node_offset = vmath.vector4(0)
@@ -166,7 +170,13 @@ function M:set_size(width, height, anchor_pivot)
166170
if self.min_size_y then
167171
height = max(height, self.min_size_y)
168172
end
169-
173+
if self.max_size_x then
174+
width = min(width, self.max_size_x)
175+
end
176+
if self.max_size_y then
177+
height = min(height, self.max_size_y)
178+
end
179+
170180
if (width and width ~= self.size.x) or (height and height ~= self.size.y) then
171181
self.center_offset.x = -width * self.pivot_offset.x
172182
self.center_offset.y = -height * self.pivot_offset.y
@@ -522,6 +532,12 @@ function M:_on_corner_drag(x, y, corner_offset)
522532
if self.min_size_y and size.y + y < self.min_size_y then
523533
y = self.min_size_y - size.y
524534
end
535+
if self.max_size_x and size.x + x > self.max_size_x then
536+
x = self.max_size_x - size.x
537+
end
538+
if self.max_size_y and size.y + y > self.max_size_y then
539+
y = self.max_size_y - size.y
540+
end
525541

526542
if corner_offset.x < 0 then
527543
self.node_offset.x = self.node_offset.x - x
@@ -570,4 +586,17 @@ function M:set_min_size(min_size_x, min_size_y)
570586
end
571587

572588

589+
---Set the maximum size of the container
590+
---@param max_size_x number|nil The maximum size x
591+
---@param max_size_y number|nil The maximum size y
592+
---@return druid.container self Current container instance
593+
function M:set_max_size(max_size_x, max_size_y)
594+
self.max_size_x = max_size_x or self.max_size_x
595+
self.max_size_y = max_size_y or self.max_size_y
596+
self:refresh()
597+
598+
return self
599+
end
600+
601+
573602
return M

test/tests/test_container.lua

100644100755
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ return function()
4141
assert(container.mode == const.LAYOUT_MODE.FIT)
4242
assert(container.min_size_x == 0)
4343
assert(container.min_size_y == 0)
44+
assert(container.max_size_x == nil)
45+
assert(container.max_size_y == nil)
4446
assert(container._containers ~= nil)
4547
assert(#container._containers == 0)
4648

@@ -137,6 +139,34 @@ return function()
137139
gui.delete_node(container_node)
138140
end)
139141

142+
it("Should set max size", function()
143+
local container_node = gui.new_box_node(vmath.vector3(50, 50, 0), vmath.vector3(100, 100, 0))
144+
local container = druid:new_container(container_node)
145+
146+
assert(container.max_size_x == nil)
147+
assert(container.max_size_y == nil)
148+
149+
container:set_max_size(150, 200)
150+
151+
assert(container.max_size_x == 150)
152+
assert(container.max_size_y == 200)
153+
154+
-- Should respect max size when setting larger size
155+
container:set_size(300, 300)
156+
local size = container:get_size()
157+
assert(size.x == 150)
158+
assert(size.y == 200)
159+
160+
-- Should allow smaller size
161+
container:set_size(100, 100)
162+
size = container:get_size()
163+
assert(size.x == 100)
164+
assert(size.y == 100)
165+
166+
druid:remove(container)
167+
gui.delete_node(container_node)
168+
end)
169+
140170
it("Should fire on_size_changed event", function()
141171
local container_node = gui.new_box_node(vmath.vector3(50, 50, 0), vmath.vector3(100, 100, 0))
142172
local container = druid:new_container(container_node)

0 commit comments

Comments
 (0)