mirror of
https://github.com/Insality/druid
synced 2025-06-27 18:37:45 +02:00
186 lines
5.1 KiB
Markdown
186 lines
5.1 KiB
Markdown
# Druid Input Component
|
|
|
|
## Description
|
|
|
|
The Input component provides a way to handle text input in your UI. It allows users to enter and edit text, with support for various input features like text selection, cursor positioning, and input validation.
|
|
|
|
## Features
|
|
|
|
- Text input handling with cursor support
|
|
- Text selection capabilities
|
|
- Input validation and filtering
|
|
- Maximum length restriction
|
|
- Password mode with character masking
|
|
- Events for text changes and interactions
|
|
- Support for multiline input
|
|
- Customizable visual feedback
|
|
|
|
## Basic Usage
|
|
|
|
```lua
|
|
-- Create a basic text input
|
|
local input = self.druid:new_input("input_node", "input_text_node")
|
|
|
|
-- Set initial text
|
|
input:set_text("Initial text")
|
|
```
|
|
|
|
### Parameters
|
|
|
|
- **node**: The node or node_id of the input background
|
|
- **text_node**: The node or node_id of the text component
|
|
- **keyboard_type**: (optional) The type of keyboard to show on mobile devices
|
|
|
|
## Methods
|
|
|
|
```lua
|
|
-- Set input text
|
|
input:set_text("New text")
|
|
|
|
-- Get current text
|
|
local text = input:get_text()
|
|
|
|
-- Clear input
|
|
input:clear()
|
|
|
|
-- Set maximum text length
|
|
input:set_max_length(50)
|
|
|
|
-- Set input validation pattern
|
|
input:set_allowed_characters("[%w%s]") -- Only alphanumeric and spaces
|
|
|
|
-- Enable/disable password mode
|
|
input:set_password(true) -- Enable password mode
|
|
input:set_password(false) -- Disable password mode
|
|
|
|
-- Set password character
|
|
input:set_password_char("*")
|
|
|
|
-- Set placeholder text (shown when input is empty)
|
|
input:set_placeholder("Enter text here...")
|
|
|
|
-- Set placeholder color
|
|
input:set_placeholder_color(vmath.vector4(0.5, 0.5, 0.5, 1))
|
|
|
|
-- Enable/disable multiline input
|
|
input:set_multiline(true)
|
|
input:set_multiline(false)
|
|
|
|
-- Enable/disable the input
|
|
input:set_enabled(true)
|
|
input:set_enabled(false)
|
|
|
|
-- Check if input is enabled
|
|
local is_enabled = input:is_enabled()
|
|
|
|
-- Set input focus
|
|
input:set_focus()
|
|
|
|
-- Remove input focus
|
|
input:remove_focus()
|
|
|
|
-- Check if input has focus
|
|
local has_focus = input:is_focused()
|
|
|
|
-- Select all text
|
|
input:select_all()
|
|
|
|
-- Set cursor position
|
|
input:set_cursor_position(5)
|
|
```
|
|
|
|
## Events
|
|
|
|
```lua
|
|
-- Subscribe to text change event
|
|
input.on_input_text:subscribe(function(self, text)
|
|
print("Text changed to: " .. text)
|
|
end)
|
|
|
|
-- Subscribe to focus events
|
|
input.on_focus:subscribe(function(self)
|
|
print("Input gained focus")
|
|
end)
|
|
|
|
input.on_focus_lost:subscribe(function(self)
|
|
print("Input lost focus")
|
|
end)
|
|
|
|
-- Subscribe to input submit event (Enter key)
|
|
input.on_submit:subscribe(function(self)
|
|
print("Input submitted with text: " .. self:get_text())
|
|
end)
|
|
|
|
-- Subscribe to input canceled event (Escape key)
|
|
input.on_cancel:subscribe(function(self)
|
|
print("Input canceled")
|
|
end)
|
|
```
|
|
|
|
## Examples
|
|
|
|
```lua
|
|
-- Create a username input with validation
|
|
local username_input = self.druid:new_input("username_bg", "username_text")
|
|
username_input:set_placeholder("Username")
|
|
username_input:set_allowed_characters("[%w_]") -- Only alphanumeric and underscore
|
|
username_input:set_max_length(20)
|
|
|
|
-- Create a password input
|
|
local password_input = self.druid:new_input("password_bg", "password_text")
|
|
password_input:set_placeholder("Password")
|
|
password_input:set_password(true)
|
|
password_input:set_password_char("•")
|
|
|
|
-- Create a multiline text area
|
|
local text_area = self.druid:new_input("textarea_bg", "textarea_text")
|
|
text_area:set_multiline(true)
|
|
text_area:set_placeholder("Enter your message here...")
|
|
|
|
-- Create a numeric input for age
|
|
local age_input = self.druid:new_input("age_bg", "age_text")
|
|
age_input:set_allowed_characters("%d") -- Only digits
|
|
age_input:set_max_length(3)
|
|
age_input:set_keyboard_type(gui.KEYBOARD_TYPE_NUMBER_PAD)
|
|
|
|
-- Create a form with multiple inputs and validation
|
|
local email_input = self.druid:new_input("email_bg", "email_text")
|
|
email_input:set_placeholder("Email")
|
|
|
|
local function validate_form()
|
|
local email = email_input:get_text()
|
|
local password = password_input:get_text()
|
|
|
|
-- Simple email validation
|
|
if not email:match("^[%w%.]+@[%w%.]+%.%w+$") then
|
|
print("Invalid email format")
|
|
return false
|
|
end
|
|
|
|
if #password < 8 then
|
|
print("Password must be at least 8 characters")
|
|
return false
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
local submit_button = self.druid:new_button("submit_button", function()
|
|
if validate_form() then
|
|
print("Form submitted successfully")
|
|
end
|
|
end)
|
|
```
|
|
|
|
## Notes
|
|
|
|
- The Input component requires proper key triggers setup in your `input.binding` file
|
|
- On mobile platforms, the component will show the appropriate keyboard based on the keyboard_type parameter
|
|
- The component handles text selection, cursor positioning, and clipboard operations
|
|
- You can customize the visual appearance of the input, including text color, selection color, and cursor
|
|
- Input validation can be used to restrict what characters users can enter
|
|
- The placeholder text is shown when the input is empty and doesn't have focus
|
|
- For multiline input, the component supports line breaks and scrolling
|
|
- The component provides events for all major input interactions, allowing you to create responsive forms
|
|
- Password mode masks the entered text with the specified character for security
|