diff --git a/druid/base/button.lua b/druid/base/button.lua index abe994f..6edc540 100644 --- a/druid/base/button.lua +++ b/druid/base/button.lua @@ -38,6 +38,19 @@ local component = require("druid.component") local M = component.create("button", { const.ON_INPUT }) +local function is_input_match(self, action_id) + if action_id == const.ACTION_TOUCH then + return true + end + + if self.key_trigger and action_id == self.key_trigger then + return true + end + + return false +end + + local function on_button_hover(self, hover_state) if not self.style.on_hover then return @@ -57,6 +70,11 @@ end local function on_button_repeated_click(self) + if not self.is_repeated_started then + self.click_in_row = 0 + self.is_repeated_started = true + end + if self.style.on_click then self.style.on_click(self, self.anim_node) end @@ -143,6 +161,7 @@ function M.init(self, node, callback, params, anim_node, event) self.last_pressed_time = 0 self.last_released_time = 0 self.click_in_row = 0 + self.key_trigger = nil -- Event stubs self.on_click = Event(callback) @@ -153,17 +172,23 @@ end function M.on_input(self, action_id, action) - if action_id ~= const.ACTION_TOUCH then + if not is_input_match(self, action_id) then return false end + local is_key_trigger = (action_id == self.key_trigger) + if not helper.is_enabled(self.node) then return false end - local is_pick = gui.pick_node(self.node, action.x, action.y) - if self.click_zone then - is_pick = is_pick and gui.pick_node(self.click_zone, action.x, action.y) + local is_pick = true + + if not is_key_trigger then + is_pick = gui.pick_node(self.node, action.x, action.y) + if self.click_zone then + is_pick = is_pick and gui.pick_node(self.click_zone, action.x, action.y) + end end if not is_pick then @@ -172,6 +197,10 @@ function M.on_input(self, action_id, action) return false end + if is_key_trigger then + self.hover:set_hover(not action.released) + end + if action.pressed then -- Can interact if start touch on the button self.can_action = true @@ -183,7 +212,6 @@ function M.on_input(self, action_id, action) -- While hold button, repeat rate pick from input.repeat_interval if action.repeated then if not self.disabled and self.on_repeated_click:is_exist() and self.can_action then - self.is_repeated_started = true on_button_repeated_click(self) return true end @@ -234,14 +262,18 @@ end --- Set key-code to trigger this button +-- @function button:set_key_trigger +-- @tparam hash key The action_id of the key function M.set_key_trigger(self, key) - + self.key_trigger = hash(key) end --- Get key-code to trigger this button +-- @function button:get_key_trigger +-- @treturn hash The action_id of the key function M.get_key_trigger(self) - + return self.key_trigger end diff --git a/druid/base/hover.lua b/druid/base/hover.lua index 5f04feb..bf93a7b 100644 --- a/druid/base/hover.lua +++ b/druid/base/hover.lua @@ -24,7 +24,7 @@ function M.init(self, node, on_hover_callback) end -local function set_hover(self, state) +function M.set_hover(self, state) if self._is_hovered ~= state then self._is_hovered = state self.on_hover:trigger(self:get_context(), state) @@ -44,20 +44,20 @@ function M.on_input(self, action_id, action) local is_pick = gui.pick_node(self.node, action.x, action.y) if not is_pick then - set_hover(self, false) + M.set_hover(self, false) return false end if action.released then - set_hover(self, false) + M.set_hover(self, false) else - set_hover(self, true) + M.set_hover(self, true) end end function M.on_input_interrupt(self) - set_hover(self, false) + M.set_hover(self, false) end diff --git a/example/kenney/gui/main/main.gui b/example/kenney/gui/main/main.gui index 1ba3e11..be9af76 100644 --- a/example/kenney/gui/main/main.gui +++ b/example/kenney/gui/main/main.gui @@ -4835,6 +4835,166 @@ nodes { text_leading: 1.0 text_tracking: 0.0 } +nodes { + position { + x: -200.0 + y: -220.0 + z: 0.0 + w: 1.0 + } + rotation { + x: 0.0 + y: 0.0 + z: 0.0 + w: 1.0 + } + scale { + x: 1.0 + y: 1.0 + z: 1.0 + w: 1.0 + } + size { + x: 200.0 + y: 100.0 + z: 0.0 + w: 1.0 + } + color { + x: 1.0 + y: 1.0 + z: 1.0 + w: 1.0 + } + type: TYPE_TEMPLATE + id: "button_key_trigger" + parent: "button_page" + layer: "" + inherit_alpha: true + alpha: 1.0 + template: "/example/kenney/templates/button.gui" + template_node_child: false +} +nodes { + position { + x: 0.0 + y: 0.0 + z: 0.0 + w: 1.0 + } + rotation { + x: 0.0 + y: 0.0 + z: 0.0 + w: 1.0 + } + scale { + x: 1.0 + y: 1.0 + z: 1.0 + w: 1.0 + } + size { + x: 130.0 + y: 60.0 + z: 0.0 + w: 1.0 + } + color { + x: 1.0 + y: 1.0 + z: 1.0 + w: 1.0 + } + type: TYPE_BOX + blend_mode: BLEND_MODE_ALPHA + texture: "kenney/button_blue" + id: "button_key_trigger/button" + xanchor: XANCHOR_NONE + yanchor: YANCHOR_NONE + pivot: PIVOT_CENTER + adjust_mode: ADJUST_MODE_FIT + parent: "button_key_trigger" + layer: "" + inherit_alpha: true + slice9 { + x: 15.0 + y: 15.0 + z: 15.0 + w: 15.0 + } + clipping_mode: CLIPPING_MODE_NONE + clipping_visible: true + clipping_inverted: false + alpha: 1.0 + template_node_child: true + size_mode: SIZE_MODE_MANUAL +} +nodes { + position { + x: 0.0 + y: 7.0 + z: 0.0 + w: 1.0 + } + rotation { + x: 0.0 + y: 0.0 + z: 0.0 + w: 1.0 + } + scale { + x: 0.5 + y: 0.7 + z: 1.0 + w: 1.0 + } + size { + x: 200.0 + y: 100.0 + z: 0.0 + w: 1.0 + } + color { + x: 1.0 + y: 1.0 + z: 1.0 + w: 1.0 + } + type: TYPE_TEXT + blend_mode: BLEND_MODE_ALPHA + text: "Press Space" + font: "game" + id: "button_key_trigger/text" + xanchor: XANCHOR_NONE + yanchor: YANCHOR_NONE + pivot: PIVOT_CENTER + outline { + x: 1.0 + y: 1.0 + z: 1.0 + w: 1.0 + } + shadow { + x: 0.101960786 + y: 0.2 + z: 0.6 + w: 1.0 + } + adjust_mode: ADJUST_MODE_FIT + line_break: false + parent: "button_key_trigger/button" + layer: "" + inherit_alpha: true + alpha: 1.0 + outline_alpha: 0.0 + shadow_alpha: 0.78 + overridden_fields: 3 + overridden_fields: 8 + template_node_child: true + text_leading: 1.0 + text_tracking: 0.0 +} nodes { position { x: 1800.0 diff --git a/example/kenney/page/button.lua b/example/kenney/page/button.lua index cdfad37..3ff56ff 100644 --- a/example/kenney/page/button.lua +++ b/example/kenney/page/button.lua @@ -29,13 +29,17 @@ local function setup_buttons(self) custom_style.HOVER_IMAGE = "button_yellow" custom_style.DEFAULT_IMAGE = "button_blue" - self.druid:new_button("button_long_tap/button", usual_callback) .on_long_click:subscribe(long_tap_callback) self.druid:new_button("button_repeated_tap/button", usual_callback) .on_repeated_click:subscribe(repeated_callback) self.druid:new_button("button_double_tap/button", usual_callback) .on_double_click:subscribe(double_tap_callback) + + local button_space = self.druid:new_button("button_key_trigger/button", usual_callback) + button_space:set_key_trigger("key_space") + button_space.on_long_click:subscribe(long_tap_callback) + button_space.on_double_click:subscribe(double_tap_callback) end diff --git a/game.project b/game.project index c918863..6e20bc6 100644 --- a/game.project +++ b/game.project @@ -17,3 +17,6 @@ include_dirs = druid [graphics] texture_profiles = /example/res/custom.texture_profiles +[input] +gamepads = /builtins/input/default.gamepadsc + diff --git a/input/game.input_binding b/input/game.input_binding index 4d43ca9..8700888 100644 --- a/input/game.input_binding +++ b/input/game.input_binding @@ -6,6 +6,10 @@ key_trigger { input: KEY_BACK action: "back" } +key_trigger { + input: KEY_SPACE + action: "key_space" +} mouse_trigger { input: MOUSE_BUTTON_1 action: "touch"