Skip to content

core.ui.button

This module provides a clickable button component for the terminal UI.

TIP

To use this module, you need to import it first: import("core.ui.button")

NOTE

The UI module is primarily used for xmake's internal xmake f --menu menu-based visual configuration. It provides basic UI components that can also be used by users to implement their own terminal UIs.

The button module extends label and provides a clickable button with:

  • Selectable and focusable support
  • Mouse click handling
  • Enter key activation
  • Visual feedback (reverse video when selected and focused)

button:new

  • Create a new button instance

Function Prototype

API

lua
button:new(name: <string>, bounds: <rect>, text: <string>, on_action?: <function>)

Parameter Description

ParameterDescription
nameRequired. Button name string
boundsRequired. Button bounds rectangle
textRequired. Button text to display
on_actionOptional. Function to call when button is activated

Return Value

TypeDescription
buttonReturns a button instance

Usage

Create a button with action handler:

lua
import("core.ui.button")
import("core.ui.rect")

local btn = button:new("ok", rect{10, 5, 20, 1}, "Ok", function (v)
    print("Button clicked!")
    v:parent():quit()
end)

button:text

  • Get the button text

Function Prototype

API

lua
button:text()

Parameter Description

No parameters

Return Value

TypeDescription
stringReturns the button text

Usage

Get the button text:

lua
local text = btn:text()
print(text)  -- Output: Ok

button:text_set

  • Set the button text

Function Prototype

API

lua
button:text_set(text: <string>)

Parameter Description

ParameterDescription
textRequired. Button text to display

Return Value

TypeDescription
buttonReturns the button instance (for method chaining)

Usage

Set or update the button text:

lua
btn:text_set("Cancel")
btn:text_set("< OK >")  -- Can use brackets for visual styling

button:textattr

  • Get the text attribute

Function Prototype

API

lua
button:textattr()

Parameter Description

No parameters

Return Value

TypeDescription
stringReturns the text attribute string

Usage

Get the current text attribute:

lua
local attr = btn:textattr()

button:textattr_set

  • Set the text attribute (color, style)

Function Prototype

API

lua
button:textattr_set(attr: <string>)

Parameter Description

ParameterDescription
attrRequired. Text attribute string (e.g., "red bold")

Return Value

TypeDescription
buttonReturns the button instance (for method chaining)

Usage

Set button text color and style:

lua
btn:textattr_set("green")           -- Green text
btn:textattr_set("yellow bold")     -- Yellow bold text
btn:textattr_set("cyan onblack")    -- Cyan text on black background

button:action_set

  • Set the button action handler

Function Prototype

API

lua
button:action_set(action_type: <string>, handler: <function>)

Parameter Description

ParameterDescription
action_typeRequired. Action type (e.g., action.ac_on_enter)
handlerRequired. Function to call when action is triggered

Return Value

TypeDescription
buttonReturns the button instance (for method chaining)

Usage

Set custom action handler:

lua
import("core.ui.action")

btn:action_set(action.ac_on_enter, function (v)
    print("Button activated!")
end)

button:on_event

  • Handle keyboard events

Function Prototype

API

lua
button:on_event(e: <event>)

Parameter Description

ParameterDescription
eRequired. Event object

Return Value

TypeDescription
booleanReturns true if Enter key was handled, nil otherwise

Usage

This is automatically called when the button receives keyboard events. When selected and Enter is pressed, it triggers the button's action.

button:on_draw

  • Draw the button view

Function Prototype

API

lua
button:on_draw(transparent: <boolean>)

Parameter Description

ParameterDescription
transparentOptional. Draw with transparency

Return Value

No return value

Usage

This is automatically called when the button needs to be drawn. The button is displayed with reverse video (inverted colors) when selected and focused. Here's a complete example:

lua
import("core.ui.button")
import("core.ui.rect")
import("core.ui.application")
import("core.ui.window")
import("core.ui.action")

local demo = application()

function demo:init()
    application.init(self, "demo")
    self:background_set("blue")
    
    -- Create window
    local win = window:new("main", rect{1, 1, self:width() - 1, self:height() - 1}, "Button Demo")
    
    -- Create buttons
    local ok_btn = button:new("ok", rect{5, 5, 15, 1}, "< OK >", function (v)
        print("OK button clicked!")
    end)
    
    local cancel_btn = button:new("cancel", rect{25, 5, 20, 1}, "< Cancel >", function (v)
        print("Cancel button clicked!")
        self:quit()
    end)
    
    local apply_btn = button:new("apply", rect{50, 5, 18, 1}, "< Apply >", function (v)
        print("Apply button clicked!")
    end)
    
    -- Set different text attributes
    ok_btn:textattr_set("green")
    cancel_btn:textattr_set("red")
    apply_btn:textattr_set("cyan")
    
    -- Add buttons to window panel
    local panel = win:panel()
    panel:insert(ok_btn)
    panel:insert(cancel_btn)
    panel:insert(apply_btn)
    
    -- Select first button
    panel:select(ok_btn)
    
    self:insert(win)
    self._win = win
end

function demo:on_resize()
    self._win:bounds_set(rect{1, 1, self:width() - 1, self:height() - 1})
    application.on_resize(self)
end

function main(...)
    demo:run(...)
end