mirror of
https://github.com/Insality/druid
synced 2025-09-27 18:12:21 +02:00
#81 Add simple input control via messages
This commit is contained in:
@@ -24,6 +24,9 @@
|
||||
---Trigger node
|
||||
-- @tfield node node
|
||||
|
||||
---The hash of trigger node
|
||||
-- @tfield node_id hash
|
||||
|
||||
---Animation node
|
||||
-- @tfield[opt=node] node anim_node
|
||||
|
||||
@@ -52,7 +55,7 @@ local const = require("druid.const")
|
||||
local helper = require("druid.helper")
|
||||
local component = require("druid.component")
|
||||
|
||||
local Button = component.create("button", { component.ON_INPUT })
|
||||
local Button = component.create("button", { component.ON_INPUT, component.ON_MESSAGE_INPUT })
|
||||
|
||||
|
||||
local function is_input_match(self, action_id)
|
||||
@@ -95,6 +98,7 @@ local function on_button_repeated_click(self)
|
||||
self.style.on_click(self, self.anim_node)
|
||||
|
||||
self.click_in_row = self.click_in_row + 1
|
||||
|
||||
self.on_repeated_click:trigger(self:get_context(), self.params, self, self.click_in_row)
|
||||
end
|
||||
|
||||
@@ -190,6 +194,7 @@ end
|
||||
function Button.init(self, node, callback, params, anim_node)
|
||||
self.druid = self:get_druid()
|
||||
self.node = self:get_node(node)
|
||||
self.node_id = gui.get_id(self.node)
|
||||
|
||||
self.anim_node = anim_node and self:get_node(anim_node) or self.node
|
||||
self.start_scale = gui.get_scale(self.anim_node)
|
||||
@@ -288,6 +293,31 @@ function Button.on_input_interrupt(self)
|
||||
end
|
||||
|
||||
|
||||
function Button.on_message_input(self, node_id, message)
|
||||
if node_id ~= self.node_id or self.disabled or not helper.is_enabled(self.node) then
|
||||
return false
|
||||
end
|
||||
|
||||
if message.action == const.MESSAGE_INPUT.BUTTON_CLICK then
|
||||
on_button_click(self)
|
||||
end
|
||||
|
||||
if message.action == const.MESSAGE_INPUT.BUTTON_LONG_CLICK then
|
||||
on_button_long_click(self)
|
||||
end
|
||||
|
||||
if message.action == const.MESSAGE_INPUT.BUTTON_DOUBLE_CLICK then
|
||||
on_button_double_click(self)
|
||||
end
|
||||
|
||||
if message.action == const.MESSAGE_INPUT.BUTTON_REPEATED_CLICK then
|
||||
on_button_repeated_click(self)
|
||||
self.is_repeated_started = false
|
||||
self.last_pressed_time = socket.gettime()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--- Set enabled button component state
|
||||
-- @tparam Button self
|
||||
-- @tparam bool state Enabled state
|
||||
|
@@ -19,6 +19,7 @@ BaseComponent.ON_MESSAGE = const.ON_MESSAGE
|
||||
BaseComponent.ON_FOCUS_LOST = const.ON_FOCUS_LOST
|
||||
BaseComponent.ON_FOCUS_GAINED = const.ON_FOCUS_GAINED
|
||||
BaseComponent.ON_LAYOUT_CHANGE = const.ON_LAYOUT_CHANGE
|
||||
BaseComponent.ON_MESSAGE_INPUT = const.ON_MESSAGE_INPUT
|
||||
BaseComponent.ON_LANGUAGE_CHANGE = const.ON_LANGUAGE_CHANGE
|
||||
|
||||
|
||||
@@ -30,6 +31,7 @@ BaseComponent.ALL_INTERESTS = {
|
||||
BaseComponent.ON_FOCUS_LOST,
|
||||
BaseComponent.ON_FOCUS_GAINED,
|
||||
BaseComponent.ON_LAYOUT_CHANGE,
|
||||
BaseComponent.ON_MESSAGE_INPUT,
|
||||
BaseComponent.ON_LANGUAGE_CHANGE,
|
||||
}
|
||||
|
||||
@@ -39,6 +41,7 @@ BaseComponent.SPECIFIC_UI_MESSAGES = {
|
||||
[BaseComponent.ON_FOCUS_LOST] = "on_focus_lost",
|
||||
[BaseComponent.ON_FOCUS_GAINED] = "on_focus_gained",
|
||||
[BaseComponent.ON_LAYOUT_CHANGE] = "on_layout_change",
|
||||
[BaseComponent.ON_MESSAGE_INPUT] = "on_message_input",
|
||||
[BaseComponent.ON_LANGUAGE_CHANGE] = "on_language_change",
|
||||
}
|
||||
|
||||
|
@@ -34,6 +34,7 @@ M.ON_MESSAGE = hash("on_message")
|
||||
M.ON_FOCUS_LOST = hash("on_focus_lost")
|
||||
M.ON_FOCUS_GAINED = hash("on_focus_gained")
|
||||
M.ON_LAYOUT_CHANGE = hash("layout_changed")
|
||||
M.ON_MESSAGE_INPUT = hash("on_message_input")
|
||||
M.ON_LANGUAGE_CHANGE = hash("on_language_change")
|
||||
|
||||
|
||||
@@ -42,6 +43,14 @@ M.PRIORITY_INPUT_HIGH = 20
|
||||
M.PRIORITY_INPUT_MAX = 100
|
||||
|
||||
|
||||
M.MESSAGE_INPUT = {
|
||||
BUTTON_CLICK = "button_click",
|
||||
BUTTON_LONG_CLICK = "button_long_click",
|
||||
BUTTON_DOUBLE_CLICK = "button_double_click",
|
||||
BUTTON_REPEATED_CLICK = "button_repeated_click",
|
||||
}
|
||||
|
||||
|
||||
M.PIVOTS = {
|
||||
[gui.PIVOT_CENTER] = vmath.vector3(0),
|
||||
[gui.PIVOT_N] = vmath.vector3(0, 0.5, 0),
|
||||
|
@@ -352,9 +352,21 @@ end
|
||||
-- @tparam table message Message from on_message
|
||||
-- @tparam hash sender Sender from on_message
|
||||
function DruidInstance.on_message(self, message_id, message, sender)
|
||||
-- TODO: refactor for more juicy code
|
||||
local specific_ui_message = base_component.SPECIFIC_UI_MESSAGES[message_id]
|
||||
local on_message_input_message = base_component.SPECIFIC_UI_MESSAGES[base_component.ON_MESSAGE_INPUT]
|
||||
|
||||
if specific_ui_message then
|
||||
if specific_ui_message == on_message_input_message then
|
||||
local components = self.components[message_id]
|
||||
if components then
|
||||
for i = 1, #components do
|
||||
local component = components[i]
|
||||
if can_use_input_component(self, component) then
|
||||
component[specific_ui_message](component, hash(message.node_id), message)
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif specific_ui_message then
|
||||
local components = self.components[message_id]
|
||||
if components then
|
||||
for i = 1, #components do
|
||||
|
Reference in New Issue
Block a user