From ba383261b03dc5aebef6d38a3abce3dc9deafafa Mon Sep 17 00:00:00 2001 From: Insality Date: Fri, 9 Sep 2022 20:45:08 +0300 Subject: [PATCH] Update layout component, add layout fit example --- docs_md/changelog.md | 3 +- druid/extended/layout.lua | 198 ++- example/assets/images/kenney.atlas | 4 + example/assets/images/logo.png | Bin 0 -> 25918 bytes example/example.gui_script | 3 + example/examples/general/layout/layout.gui | 10 +- .../examples/general/layout/layout.gui_script | 2 +- .../layout/layout_fit/layout_fit.collection | 37 + .../examples/layout/layout_fit/layout_fit.gui | 1247 +++++++++++++++++ .../layout/layout_fit/layout_fit.gui_script | 44 + 10 files changed, 1472 insertions(+), 76 deletions(-) create mode 100644 example/assets/images/logo.png create mode 100644 example/examples/layout/layout_fit/layout_fit.collection create mode 100644 example/examples/layout/layout_fit/layout_fit.gui create mode 100644 example/examples/layout/layout_fit/layout_fit.gui_script diff --git a/docs_md/changelog.md b/docs_md/changelog.md index 5893be1..d14ca49 100644 --- a/docs_md/changelog.md +++ b/docs_md/changelog.md @@ -413,7 +413,7 @@ Also now you can change the input priority of components temporary. For example - **#133** [Hotkey] Add new extended component: Hotkey - It's allow you set hotkeys to call callbacks - - You should pass one action key and several modificator keys (left shift, ctrl etc) + - You should pass one action key and several modificator keys (left shift, right ctrl etc) - List of modificator keys setup via component style (you can change it) - You can add several hotkeys on one callback via `hotkey:add_hotkey` with additional params - **#98** [Layout] Add new extended component: Layout @@ -440,3 +440,4 @@ Also now you can change the input priority of components temporary. For example - **#185** [System] Add `on_window_resized` component interest. It will called on game window size changes - **#189** [System] Add optional flag to `component:set_input_priority` to mark it as temporary. It will reset to default input priority after the `component:reset_input_priority` - **#204** [System] Fix: wrong code example link, if open example from direct URL +- **#202** [System] Enabled stencil check to true by default. To disable this, use druid.no_stencil_check in game.project settings diff --git a/druid/extended/layout.lua b/druid/extended/layout.lua index 2a4a24f..f2cfd75 100644 --- a/druid/extended/layout.lua +++ b/druid/extended/layout.lua @@ -5,6 +5,15 @@ -- @within BaseComponent -- @alias druid.layout +--- Layout node +-- @tfield node node + +--- Current layout mode +-- @tfield string mode + +---On window resize callback(self, new_size) +-- @tfield DruidEvent on_size_changed @{DruidEvent} + --- @@ -17,111 +26,162 @@ local Event = require("druid.event") local Layout = component.create("layout") -function Layout:init(node, mode, on_size_changed_callback) - self.node = self:get_node(node) +--- Component init function +-- @tparam Layout self @{Layout} +-- @tparam node node Gui node +-- @tparam string node The layout mode (from const.LAYOUT_MODE) +-- @tparam[opt] function on_size_changed_callback The callback on window resize +function Layout.init(self, node, mode, on_size_changed_callback) + self.node = self:get_node(node) - self._min_size = nil - self._max_size = nil - self._inited = false + self._min_size = nil + self._max_size = nil + self._inited = false - self.gui_size = vmath.vector3(gui.get_width(), gui.get_height(), 0) - self.mode = mode or const.LAYOUT_MODE.FIT + self._fit_node = nil - self.on_size_changed = Event(on_size_changed_callback) + self.mode = mode or const.LAYOUT_MODE.FIT + + self.on_size_changed = Event(on_size_changed_callback) end -function Layout:on_late_init() - self._inited = true - self.origin_size = self.origin_size or gui.get_size(self.node) - self.fit_size = self.fit_size or vmath.vector3(self.origin_size) - self.pivot = helper.get_pivot_offset(gui.get_pivot(self.node)) - self.origin_position = gui.get_position(self.node) - self.position = vmath.vector3(self.origin_position) - gui.set_size_mode(self.node, gui.SIZE_MODE_MANUAL) - gui.set_adjust_mode(self.node, gui.ADJUST_FIT) - self:on_window_resized() +function Layout.on_late_init(self) + self._inited = true + self.origin_size = self.origin_size or gui.get_size(self.node) + self.fit_size = self.fit_size or vmath.vector3(self.origin_size) + self.pivot = helper.get_pivot_offset(gui.get_pivot(self.node)) + self.origin_position = gui.get_position(self.node) + self.position = vmath.vector3(self.origin_position) + gui.set_size_mode(self.node, gui.SIZE_MODE_MANUAL) + gui.set_adjust_mode(self.node, gui.ADJUST_FIT) + self:on_window_resized() end -function Layout:on_window_resized() - if not self._inited then - return - end +function Layout.on_window_resized(self) + if not self._inited then + return + end local x_koef, y_koef = helper.get_screen_aspect_koef() - local new_size = vmath.vector3(self.origin_size) - if self.mode == const.LAYOUT_MODE.STRETCH_X or self.mode == const.LAYOUT_MODE.STRETCH then - new_size.x = new_size.x * x_koef - end - if self.mode == const.LAYOUT_MODE.STRETCH_Y or self.mode == const.LAYOUT_MODE.STRETCH then - new_size.y = new_size.y * y_koef - end + if self._fit_node then + self.fit_size = gui.get_size(self._fit_node) + self.fit_size.x = self.fit_size.x / x_koef + self.fit_size.y = self.fit_size.y / y_koef + end - -- Fit to the stretched container (node size or other defined) - if self.mode == const.LAYOUT_MODE.ZOOM_MIN then - new_size = new_size * math.min(x_koef, y_koef) - end - if self.mode == const.LAYOUT_MODE.ZOOM_MAX then - new_size = new_size * math.max(x_koef, y_koef) - end + x_koef = self.fit_size.x / self.origin_size.x * x_koef + y_koef = self.fit_size.y / self.origin_size.y * y_koef - if self._min_size then - new_size.x = math.max(new_size.x, self._min_size.x) - new_size.y = math.max(new_size.y, self._min_size.y) - end - if self._max_size then - new_size.x = math.min(new_size.x, self._max_size.x) - new_size.y = math.min(new_size.y, self._max_size.y) - end - gui.set_size(self.node, new_size) + local new_size = vmath.vector3(self.origin_size) + + if self.mode == const.LAYOUT_MODE.STRETCH_X or self.mode == const.LAYOUT_MODE.STRETCH then + new_size.x = new_size.x * x_koef + end + if self.mode == const.LAYOUT_MODE.STRETCH_Y or self.mode == const.LAYOUT_MODE.STRETCH then + new_size.y = new_size.y * y_koef + end + + -- Fit to the stretched container (node size or other defined) + if self.mode == const.LAYOUT_MODE.ZOOM_MIN then + new_size = new_size * math.min(x_koef, y_koef) + end + if self.mode == const.LAYOUT_MODE.ZOOM_MAX then + new_size = new_size * math.max(x_koef, y_koef) + end + + if self._min_size then + new_size.x = math.max(new_size.x, self._min_size.x) + new_size.y = math.max(new_size.y, self._min_size.y) + end + if self._max_size then + new_size.x = math.min(new_size.x, self._max_size.x) + new_size.y = math.min(new_size.y, self._max_size.y) + end + gui.set_size(self.node, new_size) self.position.x = self.origin_position.x + self.origin_position.x * (x_koef - 1) self.position.y = self.origin_position.y + self.origin_position.y * (y_koef - 1) - gui.set_position(self.node, self.position) + gui.set_position(self.node, self.position) - self.on_size_changed:trigger(self:get_context(), new_size) + self.on_size_changed:trigger(self:get_context(), new_size) end -function Layout:set_min_size(min_size) - self._min_size = min_size - return self +--- Set minimal size of layout node +-- @tparam Layout self @{Layout} +-- @tparam vector3 min_size +-- @treturn Layout @{Layout} +function Layout.set_min_size(self, min_size) + self._min_size = min_size + return self end -function Layout:set_max_size(max_size) - self._max_size = max_size - return self +--- Set maximum size of layout node +-- @tparam Layout self @{Layout} +-- @tparam vector3 min_size +-- @treturn Layout @{Layout} +function Layout.set_max_size(self, max_size) + self._max_size = max_size + return self end -function Layout:set_origin_position(new_origin_position) - self.origin_position = new_origin_position or self.origin_position - return self +--- Set new origin position of layout node. You should apply this on node movement +-- @tparam Layout self @{Layout} +-- @tparam vector3 new_origin_position +-- @treturn Layout @{Layout} +function Layout.set_origin_position(self, new_origin_position) + self.origin_position = new_origin_position or self.origin_position + self:on_window_resized() + return self end -function Layout:set_origin_size(new_origin_size) - self.origin_size = new_origin_size or self.origin_size - self:on_window_resized() - return self +--- Set new origin size of layout node. You should apply this on node manual size change +-- @tparam Layout self @{Layout} +-- @tparam vector3 new_origin_size +-- @treturn Layout @{Layout} +function Layout.set_origin_size(self, new_origin_size) + self.origin_size = new_origin_size or self.origin_size + self:on_window_resized() + return self end -function Layout:fit_into_size(target_size) - self.fit_size = target_size - self:on_window_resized() - return self +--- Set size for layout node to fit inside it +-- @tparam Layout self @{Layout} +-- @tparam vector3 target_size +-- @treturn Layout @{Layout} +function Layout.fit_into_size(self, target_size) + self.fit_size = target_size + self:on_window_resized() + return self end -function Layout:fit_into_window() - return self:fit_into_size(vmath.vector3( - gui.get_width(), - gui.get_height(), - 0)) +--- Set node for layout node to fit inside it. Pass nil to reset +-- @tparam Layout self @{Layout} +-- @tparam[opt] Node node +-- @treturn Layout @{Layout} +function Layout.fit_into_node(self, node) + self._fit_node = node + self:on_window_resized() + return self +end + + +--- Set current size for layout node to fit inside it +-- @tparam Layout self @{Layout} +-- @treturn Layout @{Layout} +function Layout.fit_into_window(self) + return self:fit_into_size(vmath.vector3( + gui.get_width(), + gui.get_height(), + 0)) end diff --git a/example/assets/images/kenney.atlas b/example/assets/images/kenney.atlas index 31a9f7b..ead7b5a 100644 --- a/example/assets/images/kenney.atlas +++ b/example/assets/images/kenney.atlas @@ -62,6 +62,10 @@ images { image: "/example/assets/images/buttons/button_blue.png" sprite_trim_mode: SPRITE_TRIM_MODE_OFF } +images { + image: "/example/assets/images/logo.png" + sprite_trim_mode: SPRITE_TRIM_MODE_OFF +} margin: 0 extrude_borders: 2 inner_padding: 0 diff --git a/example/assets/images/logo.png b/example/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7a56d26e89423b887d35d220c3b5c0d189f15a7c GIT binary patch literal 25918 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