From 27e0397e6b4e79e131c474522b28796a5bb2644a Mon Sep 17 00:00:00 2001 From: Insality Date: Thu, 26 Sep 2019 00:03:53 +0300 Subject: [PATCH 1/7] cherry-pick simple-checkbox component --- druid/base/checkbox.lua | 44 +++++++++++++++++++++++++++++++++++++++++ druid/druid.lua | 1 + 2 files changed, 45 insertions(+) create mode 100644 druid/base/checkbox.lua diff --git a/druid/base/checkbox.lua b/druid/base/checkbox.lua new file mode 100644 index 0000000..cf149ff --- /dev/null +++ b/druid/base/checkbox.lua @@ -0,0 +1,44 @@ +--- Druid checkbox component +-- @module base.checkbox + +local helper = require("druid.helper") + +local M = {} + + +local function state_animate(node, state) + local target = state and 1 or 0 + gui.animate(node, "color.w", target, gui.EASING_OUTSINE, 0.1) +end + + +function M.set_state(self, state, is_silence) + if self.state == state then + return + end + + self.state = state + state_animate(self.node, state) + + if not is_silence and self.callback then + self.callback(self.parent.parent, state) + end +end + + +-- TODO: pass self as first parameter +local function on_click(context, self) + M.set_state(self, not self.state) +end + + +function M.init(self, node, callback, click_node) + self.node = helper.get_node(node) + self.click_node = helper.get_node(click_node) + self.callback = callback + self.button = self.parent:new_button(self.click_node or self.node, on_click, self) + M.set_state(self, false, true) +end + + +return M diff --git a/druid/druid.lua b/druid/druid.lua index ad3618c..93c0100 100644 --- a/druid/druid.lua +++ b/druid/druid.lua @@ -15,6 +15,7 @@ M.comps = { progress = require("druid.base.progress"), grid = require("druid.base.grid"), scroll = require("druid.base.scroll"), + checkbox = require("druid.base.checkbox"), progress_rich = require("druid.rich.progress_rich"), } From 2d3ef5f6c3690b40b4c8bfb96b9765db8ccabe26 Mon Sep 17 00:00:00 2001 From: Insality Date: Thu, 26 Sep 2019 00:46:42 +0300 Subject: [PATCH 2/7] cherry-pick checkbox_group component --- druid/base/checkbox.lua | 6 +++++ druid/base/checkbox_group.lua | 47 +++++++++++++++++++++++++++++++++++ druid/druid.lua | 1 + 3 files changed, 54 insertions(+) create mode 100644 druid/base/checkbox_group.lua diff --git a/druid/base/checkbox.lua b/druid/base/checkbox.lua index cf149ff..0b3dbb2 100644 --- a/druid/base/checkbox.lua +++ b/druid/base/checkbox.lua @@ -26,6 +26,11 @@ function M.set_state(self, state, is_silence) end +function M.get_state(self) + return self.state +end + + -- TODO: pass self as first parameter local function on_click(context, self) M.set_state(self, not self.state) @@ -36,6 +41,7 @@ function M.init(self, node, callback, click_node) self.node = helper.get_node(node) self.click_node = helper.get_node(click_node) self.callback = callback + self.button = self.parent:new_button(self.click_node or self.node, on_click, self) M.set_state(self, false, true) end diff --git a/druid/base/checkbox_group.lua b/druid/base/checkbox_group.lua new file mode 100644 index 0000000..459527e --- /dev/null +++ b/druid/base/checkbox_group.lua @@ -0,0 +1,47 @@ +local M = {} + + +local function on_checkbox_click(self, index) + if self.is_radio_mode then + for i = 1, #self.checkboxes do + self.checkboxes[i]:set_state(i == index, true) + end + end +end + + +function M.set_state(self, indexes) + for i = 1, #indexes do + if self.checkbox[indexes[i]] then + self.checkbox[indexes[i]]:set_state(true, true) + end + end +end + + +function M.get_state(self) + local result = {} + + for i = 1, #self.checkboxes do + table.insert(result, self.checkboxes[i]:get_state()) + end + + return result +end + + +function M.init(self, nodes, callback, is_radio_mode, anim_nodes) + self.is_radio_mode = is_radio_mode + self.checkboxes = {} + + for i = 1, #nodes do + local anim_node = anim_nodes and anim_nodes[i] or nil + local checkbox = self.parent:new_checkbox(nodes[i], function() + on_checkbox_click(self, i) + end, anim_node) + table.insert(self.checkboxes, checkbox) + end +end + + +return M diff --git a/druid/druid.lua b/druid/druid.lua index 93c0100..dad7c05 100644 --- a/druid/druid.lua +++ b/druid/druid.lua @@ -16,6 +16,7 @@ M.comps = { grid = require("druid.base.grid"), scroll = require("druid.base.scroll"), checkbox = require("druid.base.checkbox"), + checkbox_group = require("druid.base.checkbox_group"), progress_rich = require("druid.rich.progress_rich"), } From 05dd08b14916d15dbc03967bf5b20084f9c49f99 Mon Sep 17 00:00:00 2001 From: Insality Date: Thu, 26 Sep 2019 08:45:58 +0300 Subject: [PATCH 3/7] cherry-pick update checkbox_group --- druid/base/checkbox_group.lua | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/druid/base/checkbox_group.lua b/druid/base/checkbox_group.lua index 459527e..5510a5f 100644 --- a/druid/base/checkbox_group.lua +++ b/druid/base/checkbox_group.lua @@ -1,11 +1,12 @@ +--- Checkboux group module +-- @module base.checkbox_group + local M = {} local function on_checkbox_click(self, index) - if self.is_radio_mode then - for i = 1, #self.checkboxes do - self.checkboxes[i]:set_state(i == index, true) - end + if self.callback then + self.callback(self.parent.parent, index) end end @@ -30,15 +31,16 @@ function M.get_state(self) end -function M.init(self, nodes, callback, is_radio_mode, anim_nodes) - self.is_radio_mode = is_radio_mode +function M.init(self, nodes, callback, click_nodes) self.checkboxes = {} + self.callback = callback for i = 1, #nodes do - local anim_node = anim_nodes and anim_nodes[i] or nil + local click_node = click_nodes and click_nodes[i] or nil local checkbox = self.parent:new_checkbox(nodes[i], function() on_checkbox_click(self, i) - end, anim_node) + end, click_node) + table.insert(self.checkboxes, checkbox) end end From 3fe8c1157aeead95bb67979ac05b3fa61e3cde9c Mon Sep 17 00:00:00 2001 From: Insality Date: Thu, 26 Sep 2019 08:46:12 +0300 Subject: [PATCH 4/7] #20 radio_group component (based on checkbox) --- druid/base/radio_group.lua | 52 ++++++++++++++++++++++++++++++++++++++ druid/druid.lua | 2 ++ 2 files changed, 54 insertions(+) create mode 100644 druid/base/radio_group.lua diff --git a/druid/base/radio_group.lua b/druid/base/radio_group.lua new file mode 100644 index 0000000..25e74b6 --- /dev/null +++ b/druid/base/radio_group.lua @@ -0,0 +1,52 @@ +--- Radio group module +-- @module base.checkbox_group + +local M = {} + + +local function on_checkbox_click(self, index) + for i = 1, #self.checkboxes do + self.checkboxes[i]:set_state(i == index, true) + end + + if self.callback then + self.callback(self.parent.parent, index) + end +end + + +function M.set_state(self, index) + on_checkbox_click(self, index) +end + + +function M.get_state(self) + local result = -1 + + for i = 1, #self.checkboxes do + if self.checkboxes[i]:get_state() then + result = i + break + end + end + + return result +end + + +function M.init(self, nodes, callback, click_nodes) + self.checkboxes = {} + self.callback = callback + + for i = 1, #nodes do + local click_node = click_nodes and click_nodes[i] or nil + local checkbox = self.parent:new_checkbox(nodes[i], function() + on_checkbox_click(self, i) + end, click_node) + + table.insert(self.checkboxes, checkbox) + end +end + + +return M diff --git a/druid/druid.lua b/druid/druid.lua index ad3618c..24795d3 100644 --- a/druid/druid.lua +++ b/druid/druid.lua @@ -15,6 +15,8 @@ M.comps = { progress = require("druid.base.progress"), grid = require("druid.base.grid"), scroll = require("druid.base.scroll"), + checkbox = require("druid.base.checkbox"), + radio_group = require("druid.base.radio_group"), progress_rich = require("druid.rich.progress_rich"), } From 12049adf27177ab173c0acc902ed5f6a9d8feda3 Mon Sep 17 00:00:00 2001 From: Insality Date: Thu, 26 Sep 2019 08:53:47 +0300 Subject: [PATCH 5/7] #24 cherry-pick, add simple blocker component --- druid/base/blocker.lua | 33 +++++++++++++++++++++++++++++++++ druid/druid.lua | 1 + 2 files changed, 34 insertions(+) create mode 100644 druid/base/blocker.lua diff --git a/druid/base/blocker.lua b/druid/base/blocker.lua new file mode 100644 index 0000000..14f3fc2 --- /dev/null +++ b/druid/base/blocker.lua @@ -0,0 +1,33 @@ +--- Component to block input on specify zone (node) +-- @module base.blocker + +local const = require("druid.const") +local helper = require("druid.helper") + + +local M = {} +M.interest = { + const.ON_SWIPE +} + + +function M.init(self, node) + self.node = helper.get_node(node) + self.event = const.ACTION_TOUCH +end + + +function M.on_input(self, action_id, action) + if not helper.is_enabled(self.node) then + return false + end + + if gui.pick_node(self.node, action.x, action.y) then + return true + end + + return false +end + + +return M diff --git a/druid/druid.lua b/druid/druid.lua index ad3618c..1b3b50c 100644 --- a/druid/druid.lua +++ b/druid/druid.lua @@ -9,6 +9,7 @@ local _fct_metatable = {} M.comps = { button = require("druid.base.button"), + blocker = require("druid.base.blocker"), android_back = require("druid.base.android_back"), text = require("druid.base.text"), timer = require("druid.base.timer"), From dc3d311236ef5197b531c4ed366bb38106e75fa2 Mon Sep 17 00:00:00 2001 From: Insality Date: Thu, 26 Sep 2019 00:27:27 +0300 Subject: [PATCH 6/7] #25 cherry-pick slider component --- druid/base/slider.lua | 82 +++++++++++++++++++++++++++++++++++++++++++ druid/druid.lua | 1 + 2 files changed, 83 insertions(+) create mode 100644 druid/base/slider.lua diff --git a/druid/base/slider.lua b/druid/base/slider.lua new file mode 100644 index 0000000..0caa56f --- /dev/null +++ b/druid/base/slider.lua @@ -0,0 +1,82 @@ +--- Druid slider component +-- @module base.slider + +local helper = require("druid.helper") +local const = require("druid.const") + +local M = {} +M.interest = { + const.ON_SWIPE +} + + +local function on_change_value(self) + if self.callback then + self.callback(self.parent.parent, self.value) + end +end + + +function M.init(self, node, end_pos, callback) + self.node = helper.get_node(node) + + self.start_pos = gui.get_position(self.node) + self.pos = gui.get_position(self.node) + self.target_pos = self.pos + self.end_pos = end_pos + + self.dist = self.end_pos - self.start_pos + self.is_drag = false + self.value = 0 + self.callback = callback + + assert(self.dist.x == 0 or self.dist.y == 0, "Slider for now can be only vertical or horizontal") +end + + +function M.on_input(self, action_id, action) + if action_id ~= const.ACTION_TOUCH then + return false + end + + if gui.pick_node(self.node, action.x, action.y) then + if action.pressed then + self.pos = gui.get_position(self.node) + self.is_drag = true + end + end + + if self.is_drag and not action.pressed then + -- move + self.pos.x = self.pos.x + action.dx + self.pos.y = self.pos.y + action.dy + + local prev_x = self.target_pos.x + local prev_y = self.target_pos.y + + self.target_pos.x = helper.clamp(self.pos.x, self.start_pos.x, self.end_pos.x) + self.target_pos.y = helper.clamp(self.pos.y, self.start_pos.y, self.end_pos.y) + + gui.set_position(self.node, self.target_pos) + + if prev_x ~= self.target_pos.x or prev_y ~= self.target_pos.y then + + if self.dist.x > 0 then + self.value = (self.target_pos.x - self.start_pos.x) / self.dist.x + end + + if self.dist.y > 0 then + self.value = (self.target_pos.y - self.start_pos.y) / self.dist.y + end + + on_change_value(self) + end + end + + if action.released then + self.is_drag = false + end +end + + +return M diff --git a/druid/druid.lua b/druid/druid.lua index ad3618c..c8a744a 100644 --- a/druid/druid.lua +++ b/druid/druid.lua @@ -15,6 +15,7 @@ M.comps = { progress = require("druid.base.progress"), grid = require("druid.base.grid"), scroll = require("druid.base.scroll"), + slider = require("druid.base.slider"), progress_rich = require("druid.rich.progress_rich"), } From 2abfe8b0d4bb86a33935fdcd280d4ff7f102b137 Mon Sep 17 00:00:00 2001 From: Insality Date: Thu, 26 Sep 2019 00:52:29 +0300 Subject: [PATCH 7/7] #25 cherry-pick, update slider component --- druid/base/slider.lua | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/druid/base/slider.lua b/druid/base/slider.lua index 0caa56f..ff2881f 100644 --- a/druid/base/slider.lua +++ b/druid/base/slider.lua @@ -76,6 +76,17 @@ function M.on_input(self, action_id, action) if action.released then self.is_drag = false end + + return self.is_drag +end + + +function M.set(self, value) + value = helper.clamp(value, 0, 1) + + gui.set_position(self.node, self.start_pos + self.dist * value) + self.value = value + on_change_value(self) end