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)