Slint Kit Documentation

Fichiers

Sélecteur de dossier pour Slint

KitDirectoryPicker · Slint Kit 0.3.0

Actions Parcourir et Effacer pour un dossier sélectionné.

Actions Parcourir et Effacer pour un dossier sélectionné.
Application native de l’exemple ci-dessous.

Les dialogues de fichiers et le dépôt depuis le système nécessitent l’application native ci-dessous.

Essayer le composant

Télécharger le projet complet, le décompresser et lancer cargo run --locked dans son dossier. Rust 1.92+ ; Slint Kit 0.3.0 depuis crates.io. Vous pouvez aussi copier les quatre fichiers ci-dessous.

Choisissez un vrai dossier de manière asynchrone puis effacez la sélection. Rust conserve DirectoryHandle et traite l’annulation ou une plateforme non prise en charge.

ui/app.slint

export { KitFormValidation, HtmlInputKind, NumberInputFormat, KitInputConstraints, KitValidationResult, KitValidityState } from "@kit/kit.slint";
import {KitDirectoryPicker,KitThemes,HostRequestPresentation} from "@kit/kit.slint";
export {HostRequestPresentation}
export component App inherits Window{
 title:"Directory picker";preferred-width:540px;preferred-height:320px;max-width:100000px;max-height:100000px;background:KitThemes.light.canvas;
 in property <string> selected;in property <string> error;in property <HostRequestPresentation> request-state;callback browse();callback clear();
 VerticalLayout{padding:24px;spacing:16px;alignment:start;control:=KitDirectoryPicker{label:"Project folder";selected-name:root.selected;error:root.error;request-state:root.request-state;browse-requested=>{root.browse();}clear-requested=>{root.clear();}}}
}

src/main.rs

use slint::ComponentHandle;
use slint_kit::{
    DirectoryHandle, DirectoryRequest, HostCapability, HostError, HostRequestController,
    SelectionOutcome,
};
use std::{cell::RefCell, rc::Rc};
mod ui {
    slint::include_modules!();
}
fn fail(app: &ui::App, error: HostError) {
    app.set_request_state(if error == HostError::Unsupported {
        ui::HostRequestPresentation::Unsupported
    } else {
        ui::HostRequestPresentation::Failed
    });
    app.set_error(format!("{error:?}").into());
}
fn main() -> Result<(), slint::PlatformError> {
    let app = ui::App::new()?;
    slint_kit::init_form_validation!(ui, app);
    let selected = Rc::new(RefCell::new(None::<DirectoryHandle>));
    let requests = Rc::new(RefCell::new(
        HostRequestController::<DirectoryHandle>::default(),
    ));
    if slint_kit::native::capabilities().directories == HostCapability::Unsupported {
        app.set_request_state(ui::HostRequestPresentation::Unsupported);
    }
    let weak = app.as_weak();
    let shared = requests.clone();
    let folder = selected.clone();
    app.on_browse(move || {
        let Some(app) = weak.upgrade() else {
            return;
        };
        let ticket = shared.borrow_mut().begin();
        app.set_request_state(ui::HostRequestPresentation::Pending);
        app.set_error("".into());
        let weak_async = weak.clone();
        let shared_async = shared.clone();
        let folder = folder.clone();
        if slint::spawn_local(async move {
            let outcome = slint_kit::native::pick_directory(DirectoryRequest {
                title: Some("Choose a project folder".into()),
            })
            .await;
            let Some(app) = weak_async.upgrade() else {
                return;
            };
            let mut request = shared_async.borrow_mut();
            if !request.finish(ticket, outcome) {
                return;
            }
            match request.take_result().unwrap() {
                SelectionOutcome::Selected(value) => {
                    app.set_selected(value.display_name.as_str().into());
                    *folder.borrow_mut() = Some(value);
                    app.set_request_state(ui::HostRequestPresentation::Idle);
                }
                SelectionOutcome::Cancelled => {
                    app.set_request_state(ui::HostRequestPresentation::Cancelled)
                }
                SelectionOutcome::Failed(error) => fail(&app, error),
            }
        })
        .is_err()
        {
            shared.borrow_mut().cancel();
            fail(&app, HostError::Unavailable);
        }
    });
    let weak = app.as_weak();
    app.on_clear(move || {
        if let Some(app) = weak.upgrade() {
            requests.borrow_mut().cancel();
            *selected.borrow_mut() = None;
            app.set_selected("".into());
            app.set_error("".into());
            app.set_request_state(ui::HostRequestPresentation::Idle);
        }
    });
    app.run()
}

Cargo.toml et build.rs

Cargo.toml

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

[dependencies]
slint-kit = { version = "=0.3.0", features = ["native"] }
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");
}

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

Activez la fonctionnalité native du kit et attendez native::pick_directory. Conservez DirectoryHandle en Rust et publiez son nom.

L’annulation conserve le dossier accepté. Effacer retire la sélection ; les plateformes non prises en charge affichent un état explicite.

Choisir entre une option intégrée et une composition personnalisée

Options partagées

Composition visuelle

Le fichier ci-dessous produit la capture. Pour les composants pilotés par un contrôleur, il montre l’état affiché sans fournir le branchement Rust. Créer un projet.

Afficher le fichier de la capture
Actions Parcourir et Effacer pour un dossier sélectionné.
Capture native du même exemple, moteur Skia.
// Public label overrides localize this fixture; toolkit/host defaults keep their language.
// SPDX-License-Identifier: GPL-3.0-or-later
import { KitDirectoryPicker, KitTheme, KitThemes } from "@kit/kit.slint";

export component Example inherits Window {
    title: "KitDirectoryPicker — exemple";
    preferred-width: 520px;
    preferred-height: 260px;
    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: "Sélecteur de dossier"; color: root.theme.text-primary; font-size: 20px * root.theme.text-scale; font-weight: 600; }
        KitDirectoryPicker { theme: root.theme; label: "Dossier d’exportation"; selected-name: "Documents/Project exports"; browse-requested => { root.status = "Demande de dossier à l’hôte"; } }
        if root.status != "": Text { text: root.status; color: root.theme.text-secondary; font-size: 12px * root.theme.text-scale; wrap: word-wrap; }
    }
}

Télécharger cet exemple

API publique

Hérite de Rectangle.

Propriétés

Nom Type Sens
required bool in
required-message string in
custom-validity string in-out
validity KitValidityState out
will-validate bool out
validation-message string out
theme KitTheme in
control-size ControlSize in
access FieldAccess in
request-state HostRequestPresentation in
label string in
selected-name string in
error string in

Types et variantes

Type Déclaration
enum ControlSize compact, medium, comfortable
enum FieldAccess editable, read-only, disabled
enum HostRequestPresentation idle, pending, cancelled, failed, unsupported
struct KitValidityState valid: bool, value-missing: bool, type-mismatch: bool, pattern-mismatch: bool, too-long: bool, too-short: bool, range-underflow: bool, range-overflow: bool, step-mismatch: bool, bad-input: bool, custom-error: bool,

Signaux

Fonctions

Voir aussi