Slint Kit Documentation

Buttons and actions

Pressable for Slint

KitPressable · Slint Kit 0.3.1

Action primitive that coordinates pointer, keyboard and focus for custom buttons.

Action primitive that coordinates pointer, keyboard and focus for custom buttons.
Native app built from the example below.

Try the component

Download the complete project, extract it and run cargo run --locked in its folder. Rust 1.92+; Slint Kit 0.3.0 from crates.io. You can also copy the four files below.

Click Add to collection: Rust handles the command and updates the action count.

ui/app.slint

export { KitFormValidation, HtmlInputKind, NumberInputFormat, KitInputConstraints, KitValidationResult, KitValidityState } from "@kit/kit.slint";
// SPDX-License-Identifier: GPL-3.0-or-later
import { KitPressable, KitTheme, KitThemes } from "@kit/kit.slint";

export enum DemoAction { add-to-collection }

export component App inherits Window {
    title: "KitPressable example";
    preferred-width: 360px;
    preferred-height: 160px;
    max-width: 100000px;
    max-height: 100000px;
    background: root.theme.canvas;
    in-out property <KitTheme> theme: KitThemes.light;
    in property <string> status: "Choose an action.";
    callback action-requested(DemoAction);
    VerticalLayout {
        padding: 24px; spacing: 16px; alignment: start;
        Text { text: "Pressable"; color: root.theme.text-primary; font-size: 20px * root.theme.text-scale; font-weight: 600; }
        KitPressable { theme: root.theme; preferred-width: content.preferred-width + 32px; min-width: self.preferred-width; accessible-name: "Add to collection"; activated => { root.action-requested(DemoAction.add-to-collection); } content := Text { text: "Add to collection"; color: root.theme.text-primary; font-size: 14px * root.theme.text-scale; horizontal-alignment: center; vertical-alignment: center; } }
        Text { text: root.status; color: root.theme.text-secondary; wrap: word-wrap; }
    }
}

src/main.rs

// SPDX-License-Identifier: GPL-3.0-or-later
use slint::ComponentHandle;
use std::cell::Cell;
slint::include_modules!();

fn main() -> Result<(), slint::PlatformError> {
    let app = App::new()?;
    slint_kit::init_form_validation!(self, app);
    let count = Cell::new(0_u32);
    let weak = app.as_weak();
    app.on_action_requested(move |action| {
        if let Some(app) = weak.upgrade() {
            let next = count.get().checked_add(1).expect("action count capacity");
            count.set(next);
            let label = match action {
                DemoAction::AddToCollection => "Add to collection",
            };
            app.set_status(format!("{label} handled by Rust ({next})").into());
        }
    });
    app.run()
}

Cargo.toml and build.rs

Cargo.toml

[package]
name = "slint-kit-pressable-example"
version = "0.1.0"
edition = "2024"
rust-version = "1.92"
license = "GPL-3.0-or-later"
publish = false

[dependencies]
slint-kit = "=0.3.0"
slint = { version = "=1.18.1", default-features = false, features = ["std", "compat-1-18", "backend-winit", "renderer-skia", "accessibility"] }

[build-dependencies]
slint-kit-build = "=0.3.0"

[workspace]

build.rs

fn main() {
    slint_kit_build::compile("ui/app.slint").expect("compile component example");
}

Files: Cargo.toml · build.rs · ui/app.slint · src/main.rs

Place non-interactive content inside, supply an accessible-name, and size preferred-width from that content. Choose ControlWidth.fill when the action should fill its row.

activated reports an accepted action; disabled and busy prevent activation. Enter activates on press, Space on release, and cancel-press() cancels an armed interaction.

Visual composition

The file below produces the screenshot. For controller-driven components, it shows the displayed state without supplying the Rust wiring. Create a project.

Show the screenshot source
Action primitive that coordinates pointer, keyboard and focus for custom buttons.
Native screenshot of the same example, rendered with Skia.
// SPDX-License-Identifier: GPL-3.0-or-later
import { KitPressable, KitTheme, KitThemes } from "@kit/kit.slint";

export component Example inherits Window {
    title: "KitPressable example";
    preferred-width: 360px;
    preferred-height: 160px;
    max-width: 100000px;
    max-height: 100000px;
    background: root.theme.canvas;
    in-out property <KitTheme> theme: KitThemes.light;
    in-out property <string> status;
    VerticalLayout {
        padding: 24px; spacing: 16px; alignment: start;
        Text { text: "Pressable"; color: root.theme.text-primary; font-size: 20px * root.theme.text-scale; font-weight: 600; }
        KitPressable { theme: root.theme; accessible-name: "Add to collection"; activated => { root.status = "Added to collection"; } Text { text: "Add to collection"; color: root.theme.text-primary; horizontal-alignment: center; vertical-alignment: center; } }
        if root.status != "": Text { text: root.status; color: root.theme.text-secondary; font-size: 12px * root.theme.text-scale; wrap: word-wrap; }
    }
}

Download this example

Public API

Inherits Rectangle.

Properties

Name Type Direction
theme KitTheme in
intent ButtonIntent in
control-size ControlSize in
control-width ControlWidth in
recipe ButtonRecipe in
accessible-name string in
disabled bool in
busy bool in
tab-stop bool in
hovered bool out
pressed bool out
has-focus bool out
focus-visible bool out

Types and variants

Type Declaration
enum ButtonIntent primary, secondary, quiet, destructive
enum ControlSize compact, medium, comfortable
enum ControlWidth intrinsic, fill

Callbacks

Functions

See also