Add druid events in components

This commit is contained in:
Insality
2020-02-24 09:34:16 +03:00
parent a81d49de9d
commit ac2bbc29d3
15 changed files with 1019 additions and 32 deletions

View File

@@ -1,6 +1,7 @@
--- Component to handle back key (android, backspace)
-- @module druid.back_handler
local Event = require("druid.event")
local const = require("druid.const")
local component = require("druid.component")
@@ -15,6 +16,8 @@ local M = component.create("back_handler", { const.ON_INPUT })
function M.init(self, callback, params)
self.callback = callback
self.params = params
self.on_back = Event(callback)
end
@@ -24,7 +27,7 @@ end
-- @tparam table action on_input action
function M.on_input(self, action_id, action)
if action_id == const.ACTION_BACK and action[const.RELEASED] then
self.callback(self:get_context(), self.params)
self.on_back:trigger(self:get_context(), self.params)
return true
end

View File

@@ -1,6 +1,7 @@
--- Component to block input on specify zone (node)
-- @module druid.blocker
local Event = require("druid.event")
local const = require("druid.const")
local helper = require("druid.helper")
local component = require("druid.component")
@@ -10,6 +11,9 @@ local M = component.create("blocker", { const.ON_INPUT_HIGH })
function M.init(self, node)
self.node = self:get_node(node)
self.on_click = Event()
self.on_enable_change = Event()
end
@@ -30,4 +34,14 @@ function M.on_input(self, action_id, action)
end
function M.set_enabled(self, state)
end
function M.is_enabled(self, state)
end
return M

View File

@@ -75,8 +75,6 @@ end
-- @tparam[opt] node anim_node Button anim node (node, if not provided)
-- @tparam[opt] string event Button react event, const.ACTION_TOUCH by default
function M.init(self, node, callback, params, anim_node, event)
assert(callback, "Button should have callback. To block input on zone use blocker component")
self.druid = self:get_druid()
self.style = self:get_style()
self.node = self:get_node(node)
@@ -90,15 +88,10 @@ function M.init(self, node, callback, params, anim_node, event)
self.click_zone = nil
-- Event stubs
self.on_click = Event()
self.on_click = Event(callback)
self.on_repeated_click = Event()
self.on_long_click = Event()
self.on_double_click = Event()
if callback then
self.on_click:subscribe(callback)
end
end

View File

@@ -1,6 +1,7 @@
--- Druid checkbox component
-- @module druid.checkbox
local Event = require("druid.event")
local component = require("druid.component")
local M = component.create("checkbox")
@@ -17,7 +18,7 @@ function M.set_state(self, state, is_silence)
end
if not is_silence and self.callback then
self.callback(self:get_context(), state)
self.on_change_state:trigger(self:get_context(), state)
end
end
@@ -41,6 +42,8 @@ function M.init(self, node, callback, click_node)
self.button = self.druid:new_button(self.click_node or self.node, on_click)
M.set_state(self, false, true)
self.on_change_state = Event(callback)
end

View File

@@ -1,18 +1,12 @@
--- Checkboux group module
-- @module druid.checkbox_group
local Event = require("druid.event")
local component = require("druid.component")
local M = component.create("checkbox_group")
local function on_checkbox_click(self, index)
if self.callback then
self.callback(self:get_context(), index)
end
end
function M.set_state(self, indexes)
for i = 1, #indexes do
if self.checkboxes[i] then
@@ -36,12 +30,13 @@ end
function M.init(self, nodes, callback, click_nodes)
self.druid = self:get_druid()
self.checkboxes = {}
self.callback = callback
self.on_checkbox_click = Event(callback)
for i = 1, #nodes do
local click_node = click_nodes and click_nodes[i] or nil
local checkbox = self.druid:new_checkbox(nodes[i], function()
on_checkbox_click(self, i)
self.on_checkbox_click:trigger(self:get_context(), i)
end, click_node)
table.insert(self.checkboxes, checkbox)

View File

@@ -2,6 +2,7 @@
-- Grid can anchor your elements, get content size and other
-- @module druid.grid
local Event = require("druid.event")
local component = require("druid.component")
local M = component.create("grid")
@@ -17,6 +18,11 @@ function M.init(self, parent, element, in_row)
self.node_size = gui.get_size(self:get_node(element))
self.border = vmath.vector4(0)
self.border_offset = vmath.vector3(0)
self.on_add_item = Event()
self.on_remove_item = Event()
self.on_clear = Event()
self.on_update_positions = Event()
end
@@ -59,6 +65,8 @@ local function update_pos(self)
local node = self.nodes[i]
gui.set_position(node, get_pos(self, i))
end
self.on_update_positions:trigger(self:get_context())
end
@@ -82,6 +90,8 @@ function M.add(self, item, index)
local pos = get_pos(self, index)
check_border(self, pos)
update_pos(self)
self.on_add_item:trigger(self:get_context(), item, index)
end

View File

@@ -20,10 +20,8 @@ function M.init(self, node, context, on_hover_callback)
self._is_hovered = false
self.context = context
self.on_hover = Event()
if on_hover_callback then
self.on_hover:subscribe(on_hover_callback)
end
self.on_hover = Event(on_hover_callback)
end

View File

@@ -1,6 +1,7 @@
--- Druid slider component
-- @module druid.slider
local Event = require("druid.event")
local helper = require("druid.helper")
local const = require("druid.const")
local component = require("druid.component")
@@ -9,9 +10,7 @@ local M = component.create("slider", { const.ON_INPUT_HIGH })
local function on_change_value(self)
if self.callback then
self.callback(self:get_context(), self.value)
end
self.on_change_value:trigger(self:get_context(), self.value)
end
@@ -26,7 +25,8 @@ function M.init(self, node, end_pos, callback)
self.dist = self.end_pos - self.start_pos
self.is_drag = false
self.value = 0
self.callback = callback
self.on_change_value = Event(callback)
assert(self.dist.x == 0 or self.dist.y == 0, "Slider for now can be only vertical or horizontal")
end

View File

@@ -2,6 +2,7 @@
-- Good working with localization system
-- @module druid.text
local Event = require("druid.event")
local const = require("druid.const")
local component = require("druid.component")
@@ -25,6 +26,10 @@ function M.init(self, node, value, no_adjust)
self.is_no_adjust = no_adjust
self.last_color = gui.get_color(self.node)
self.on_set_text = Event()
self.on_update_text_scale = Event()
self.on_set_pivot = Event()
self:set_to(value or 0)
return self
end
@@ -47,6 +52,8 @@ local function update_text_area_size(self)
local new_scale = vmath.vector3(scale_modifier, scale_modifier, cur_scale.z)
gui.set_scale(self.node, new_scale)
self.scale = new_scale
self.on_update_text_scale:trigger(self:get_context(), new_scale)
end
@@ -58,6 +65,8 @@ function M.set_to(self, set_to)
self.last_value = set_to
gui.set_text(self.node, set_to)
self.on_set_text:trigger(self:get_context(), set_to)
if not self.is_no_adjust then
update_text_area_size(self)
end
@@ -114,6 +123,8 @@ function M.set_pivot(self, pivot)
self.pos = self.pos + pos_offset
gui.set_position(self.node, self.pos)
self.on_set_pivot:trigger(self:get_context(), pivot)
end

View File

@@ -1,6 +1,7 @@
--- Component to handle GUI timers
-- @module druid.timer
local Event = require("druid.event")
local const = require("druid.const")
local formats = require("druid.helper.formats")
local helper = require("druid.helper")
@@ -13,16 +14,19 @@ function M.init(self, node, seconds_from, seconds_to, callback)
self.node = self:get_node(node)
seconds_from = math.max(seconds_from, 0)
seconds_to = math.max(seconds_to or 0, 0)
callback = callback or const.EMPTY_FUNCTION
self.on_tick = Event()
self.on_set_enabled = Event()
self.on_timer_end = Event(callback)
self:set_to(seconds_from)
self:set_interval(seconds_from, seconds_to)
self.callback = callback
if seconds_to - seconds_from == 0 then
self:set_state(false)
self.callback(self:get_context(), self)
self.on_timer_end:trigger(self:get_context(), self)
end
return self
end
@@ -43,6 +47,8 @@ end
-- @tparam boolean is_on Timer enable state
function M.set_state(self, is_on)
self.is_on = is_on
self.on_set_enabled:trigger(self:get_context(), is_on)
end
@@ -73,9 +79,12 @@ function M.update(self, dt)
self.temp = self.temp - dist
self.value = helper.step(self.value, self.target, 1)
M.set_to(self, self.value)
self.on_tick:trigger(self:get_context(), self.value)
if self.value == self.target then
self:set_state(false)
self.callback(self:get_context(), self)
self.on_timer_end:trigger(self:get_context(), self)
end
end
end