core.ui.scrollbar 
This module provides a scrollbar component for the terminal UI system.
TIP
To use this module, you need to import it first: import("core.ui.scrollbar")
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 scrollbar module extends view and provides horizontal and vertical scrollbar functionality.
scrollbar:new 
- Create a new scrollbar instance
Function Prototype 
API
scrollbar:new(name: <string>, bounds: <rect>, vertical?: <boolean>)Parameter Description 
| Parameter | Description | 
|---|---|
| name | Required. Scrollbar name string | 
| bounds | Required. Scrollbar bounds rectangle | 
| vertical | Optional. Whether it's a vertical scrollbar, defaults to true | 
Return Value 
| Type | Description | 
|---|---|
| scrollbar | Returns a scrollbar instance | 
Usage 
Create vertical and horizontal scrollbars:
import("core.ui.scrollbar")
import("core.ui.rect")
local vscrollbar = scrollbar:new("vbar", rect{50, 1, 1, 20}, true)  -- Vertical scrollbar
local hscrollbar = scrollbar:new("hbar", rect{1, 20, 50, 1}, false) -- Horizontal scrollbarscrollbar:progress 
- Get current scroll progress
Function Prototype 
API
scrollbar:progress()Parameter Description 
No parameters
Return Value 
| Type | Description | 
|---|---|
| number | Returns progress value, range 0.0 to 1.0 | 
Usage 
Get current scroll progress:
local progress = scrollbar:progress()
print("Scroll progress:", progress)scrollbar:progress_set 
- Set scroll progress
Function Prototype 
API
scrollbar:progress_set(progress: <number>)Parameter Description 
| Parameter | Description | 
|---|---|
| progress | Required. Progress value, range 0.0 to 1.0 | 
Return Value 
| Type | Description | 
|---|---|
| scrollbar | Returns the scrollbar instance (for chaining) | 
Usage 
Set scroll progress:
scrollbar:progress_set(0.5)  -- Set to middle position
scrollbar:progress_set(0)    -- Set to top
scrollbar:progress_set(1)    -- Set to bottomscrollbar:stepwidth 
- Get step width
Function Prototype 
API
scrollbar:stepwidth()Parameter Description 
No parameters
Return Value 
| Type | Description | 
|---|---|
| number | Returns step width, range 0.0 to 1.0 | 
Usage 
Get step width:
local stepwidth = scrollbar:stepwidth()scrollbar:stepwidth_set 
- Set step width
Function Prototype 
API
scrollbar:stepwidth_set(stepwidth: <number>)Parameter Description 
| Parameter | Description | 
|---|---|
| stepwidth | Required. Step width, range 0.0 to 1.0 | 
Return Value 
| Type | Description | 
|---|---|
| scrollbar | Returns the scrollbar instance (for chaining) | 
Usage 
Set step width:
scrollbar:stepwidth_set(0.1)  -- Scroll 10% each timescrollbar:vertical 
- Check if it's a vertical scrollbar
Function Prototype 
API
scrollbar:vertical()Parameter Description 
No parameters
Return Value 
| Type | Description | 
|---|---|
| boolean | Returns trueif vertical, otherwise returnsfalse | 
Usage 
Check scrollbar direction:
if scrollbar:vertical() then
    print("This is a vertical scrollbar")
else
    print("This is a horizontal scrollbar")
endscrollbar:vertical_set 
- Set scrollbar direction
Function Prototype 
API
scrollbar:vertical_set(vertical: <boolean>)Parameter Description 
| Parameter | Description | 
|---|---|
| vertical | Required. Set direction, truefor vertical,falsefor horizontal | 
Return Value 
| Type | Description | 
|---|---|
| scrollbar | Returns the scrollbar instance (for chaining) | 
Usage 
Set scrollbar direction:
scrollbar:vertical_set(true)   -- Set to vertical
scrollbar:vertical_set(false)  -- Set to horizontalscrollbar:char 
- Get scrollbar character
Function Prototype 
API
scrollbar:char()Parameter Description 
No parameters
Return Value 
| Type | Description | 
|---|---|
| string | Returns the character displayed in the scrollbar | 
Usage 
Get scrollbar character:
local char = scrollbar:char()scrollbar:char_set 
- Set scrollbar character
Function Prototype 
API
scrollbar:char_set(char: <string>)Parameter Description 
| Parameter | Description | 
|---|---|
| char | Required. Character displayed in the scrollbar | 
Return Value 
| Type | Description | 
|---|---|
| scrollbar | Returns the scrollbar instance (for chaining) | 
Usage 
Set scrollbar character:
scrollbar:char_set('#')      -- Use # character
scrollbar:char_set('\u2588') -- Use block characterscrollbar:charattr 
- Get scrollbar character attribute
Function Prototype 
API
scrollbar:charattr()Parameter Description 
No parameters
Return Value 
| Type | Description | 
|---|---|
| string | Returns character attribute string | 
Usage 
Get character attribute:
local attr = scrollbar:charattr()scrollbar:charattr_set 
- Set scrollbar character attribute
Function Prototype 
API
scrollbar:charattr_set(attr: <string>)Parameter Description 
| Parameter | Description | 
|---|---|
| attr | Required. Character attribute string | 
Return Value 
| Type | Description | 
|---|---|
| scrollbar | Returns the scrollbar instance (for chaining) | 
Usage 
Set character attribute:
scrollbar:charattr_set("yellow on blue bold")  -- Yellow bold text on blue backgroundscrollbar:scroll 
- Scroll the scrollbar
Function Prototype 
API
scrollbar:scroll(steps?: <number>)Parameter Description 
| Parameter | Description | 
|---|---|
| steps | Optional. Number of steps, positive for down/right, negative for up/left, defaults to 1 | 
Return Value 
No return value
Usage 
Scroll the scrollbar:
scrollbar:scroll(1)   -- Scroll down/right one step
scrollbar:scroll(-1)  -- Scroll up/left one step
scrollbar:scroll(5)   -- Scroll 5 stepsscrollbar:on_event 
- Handle keyboard events
Function Prototype 
API
scrollbar:on_event(e: <event>)Parameter Description 
| Parameter | Description | 
|---|---|
| e | Required. Event object | 
Return Value 
| Type | Description | 
|---|---|
| boolean | Returns trueif the event was handled, otherwise returnsfalse | 
Usage 
The scrollbar automatically handles the following keyboard events:
- Vertical scrollbar: Up(scroll up),Down(scroll down)
- Horizontal scrollbar: Left(scroll left),Right(scroll right)
Here is a complete scrollbar usage example:
import("core.ui.scrollbar")
import("core.ui.rect")
import("core.ui.label")
import("core.ui.window")
import("core.ui.application")
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}, "Scrollbar Demo")
    
    -- Create scrollbar
    local scrollbar = scrollbar:new("scroll", rect{self:width() - 2, 1, 1, self:height() - 2}, true)
    scrollbar:char_set('#')
    scrollbar:charattr_set("yellow on blue")
    scrollbar:stepwidth_set(0.1)
    
    -- Create label to display current progress
    local label = label:new("progress", rect{1, 1, 30, 1}, "Progress: 0%")
    
    -- Set scroll event
    scrollbar:action_set(action.ac_on_scrolled, function (v, progress)
        local text = string.format("Progress: %.1f%%", progress * 100)
        label:text_set(text)
    end)
    
    -- Add components to window panel
    local panel = win:panel()
    panel:insert(label)
    panel:insert(scrollbar)
    
    self:insert(win)
    self._win = win
    self._scrollbar = scrollbar
end
function demo:on_resize()
    self._win:bounds_set(rect{1, 1, self:width() - 1, self:height() - 1})
    self._scrollbar:bounds_set(rect{self:width() - 2, 1, 1, self:height() - 2})
    application.on_resize(self)
end
function main(...)
    demo:run(...)
end