From 04c39f1ce2305b2d6dc852b83d2f16bbac0a2504 Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 8 Sep 2020 23:40:05 +0300 Subject: [PATCH] Add on layout change initial support --- druid/base/checkbox.lua | 12 +++++++----- druid/base/grid.lua | 9 +++++++-- druid/base/progress.lua | 7 ++++++- druid/base/scroll.lua | 7 ++++++- druid/base/slider.lua | 7 ++++++- druid/base/text.lua | 7 ++++++- druid/const.lua | 3 ++- example/gui/main/main.gui | 6 ++++++ 8 files changed, 46 insertions(+), 12 deletions(-) diff --git a/druid/base/checkbox.lua b/druid/base/checkbox.lua index 28307a6..7129ab8 100644 --- a/druid/base/checkbox.lua +++ b/druid/base/checkbox.lua @@ -11,10 +11,11 @@ -- @tfield[opt=node] node click_node Button trigger node -- @tfield druid.button button Button component from click_node +local const = require("druid.const") local Event = require("druid.event") local component = require("druid.component") -local M = component.create("checkbox") +local M = component.create("checkbox", { const.ON_LAYOUT_CHANGE }) local function on_click(self) @@ -53,15 +54,16 @@ function M.init(self, node, callback, click_node) end +function M.on_layout_change(self) + self:set_state(self.state, true) +end + + --- Set checkbox state -- @function checkbox:set_state -- @tparam bool state Checkbox state -- @tparam bool is_silent Don't trigger on_change_state if true function M.set_state(self, state, is_silent) - if self.state == state then - return - end - self.state = state self.style.on_change_state(self, self.node, state) diff --git a/druid/base/grid.lua b/druid/base/grid.lua index c295a4a..c509f9d 100644 --- a/druid/base/grid.lua +++ b/druid/base/grid.lua @@ -19,11 +19,12 @@ -- @tfield vector4 border The size of item content -- @tfield vector3 border_offer The border offset for correct anchor calculations +local const = require("druid.const") local Event = require("druid.event") local helper = require("druid.helper") local component = require("druid.component") -local M = component.create("grid") +local M = component.create("grid", { const.ON_LAYOUT_CHANGE }) --- Component init function @@ -87,7 +88,7 @@ local function get_pos(self, index) end -local function update_pos(self) +local function update_pos(self, is_instant) for i = 1, #self.nodes do local node = self.nodes[i] gui.set_position(node, get_pos(self, i)) @@ -97,6 +98,10 @@ local function update_pos(self) end +function M.on_layout_change(self) + update_pos(self, true) +end + --- Set grid items offset, the distance between items -- @function grid:set_offset diff --git a/druid/base/progress.lua b/druid/base/progress.lua index b1f3687..e9df28f 100644 --- a/druid/base/progress.lua +++ b/druid/base/progress.lua @@ -20,7 +20,7 @@ local const = require("druid.const") local helper = require("druid.helper") local component = require("druid.component") -local M = component.create("progress", { const.ON_UPDATE }) +local M = component.create("progress", { const.ON_UPDATE, const.ON_LAYOUT_CHANGE }) local function check_steps(self, from, to, exactly) @@ -106,6 +106,11 @@ function M.init(self, node, key, init_value) end +function M.on_layout_change(self) + self:set_to(self.last_value) +end + + function M.update(self, dt) if self.target then local prev_value = self.last_value diff --git a/druid/base/scroll.lua b/druid/base/scroll.lua index 35ed50e..3da85f3 100644 --- a/druid/base/scroll.lua +++ b/druid/base/scroll.lua @@ -32,7 +32,7 @@ local const = require("druid.const") local helper = require("druid.helper") local component = require("druid.component") -local M = component.create("scroll", { const.ON_UPDATE }) +local M = component.create("scroll", { const.ON_UPDATE, const.ON_LAYOUT_CHANGE }) local function inverse_lerp(min, max, current) @@ -376,6 +376,11 @@ function M.init(self, view_node, content_node) end +function M.on_layout_change(self) + gui.set_position(self.content_node, self.position) +end + + function M.update(self, dt) if self.drag.is_drag then update_hand_scroll(self, dt) diff --git a/druid/base/slider.lua b/druid/base/slider.lua index e995e42..616e4e4 100644 --- a/druid/base/slider.lua +++ b/druid/base/slider.lua @@ -22,7 +22,7 @@ local helper = require("druid.helper") local const = require("druid.const") local component = require("druid.component") -local M = component.create("slider", { const.ON_INPUT_HIGH }) +local M = component.create("slider", { const.ON_INPUT_HIGH, const.ON_LAYOUT_CHANGE }) local function on_change_value(self) @@ -59,6 +59,11 @@ function M.init(self, node, end_pos, callback) end +function M.on_layout_change(self) + self:set(self.value, true) +end + + function M.on_input(self, action_id, action) if action_id ~= const.ACTION_TOUCH then return false diff --git a/druid/base/text.lua b/druid/base/text.lua index a6c7f2e..923c77f 100644 --- a/druid/base/text.lua +++ b/druid/base/text.lua @@ -24,7 +24,7 @@ local Event = require("druid.event") local const = require("druid.const") local component = require("druid.component") -local M = component.create("text") +local M = component.create("text", { const.ON_LAYOUT_CHANGE }) local function update_text_size(self) @@ -107,6 +107,11 @@ function M.init(self, node, value, no_adjust) end +function M.on_layout_change(self) + self:set_to(self.last_value) +end + + --- Calculate text width with font with respect to trailing space -- @function text:get_text_width -- @tparam[opt] string text diff --git a/druid/const.lua b/druid/const.lua index 83ed071..cad9f8a 100644 --- a/druid/const.lua +++ b/druid/const.lua @@ -33,7 +33,7 @@ M.ON_MESSAGE = hash("on_message") M.ON_INPUT_HIGH = hash("on_input_high") M.ON_FOCUS_LOST = hash("on_focus_lost") M.ON_FOCUS_GAINED = hash("on_focus_gained") -M.ON_LAYOUT_CHANGE = hash("on_layout_change") +M.ON_LAYOUT_CHANGE = hash("layout_changed") M.ON_LANGUAGE_CHANGE = hash("on_language_change") @@ -63,6 +63,7 @@ M.PIVOTS = { } +-- Value is method name of component M.SPECIFIC_UI_MESSAGES = { [M.ON_FOCUS_LOST] = "on_focus_lost", [M.ON_FOCUS_GAINED] = "on_focus_gained", diff --git a/example/gui/main/main.gui b/example/gui/main/main.gui index ba77057..d5a321f 100644 --- a/example/gui/main/main.gui +++ b/example/gui/main/main.gui @@ -10961,5 +10961,11 @@ layers { name: "text_top" } material: "/builtins/materials/gui.material" +layouts { + name: "Landscape" +} +layouts { + name: "Portrait" +} adjust_reference: ADJUST_REFERENCE_PARENT max_nodes: 512