Donnez une mémoire et une loupe à votre application
Une application de bureau agréable mémorise les choix utiles et propose une manière claire d'observer le travail du runtime retenu.
Vous repartirez avec un exemple de stockage compilé, une configuration DevTools vérifiée et une liste précise des limites actuelles.
01
Quatre maisons pour quatre types de données
AppStorage résout les chemins XDG conventionnels ou une racine explicite. La résolution valide les chemins, mais ne crée aucun dossier ni fichier.
Configuration
Les préférences qui décrivent le comportement souhaité par l'utilisateur.
État
Les données de session restaurables, comme les instantanés des fenêtres principales.
Données
Le contenu durable appartenant à l'application.
Cache
Les données jetables que l'application peut reconstruire.
La résolution est en lecture seule
AppStorage::for_app utilise les surcharges propres à l'application, les dossiers XDG, les chemins HOME conventionnels, puis des replis temporaires. AppStorage::single_dir place les quatre catégories sous une seule racine.
Enregistrer une préférence et restaurer la fenêtre
L'exemple écrit explicitement un document de préférences, puis donne AppStorage à l'application pour que l'hôte gère les instantanés de fenêtre.
[package]
name = "app-storage"
version = "0.1.0"
edition = "2021"
rust-version = "1.88"
publish = false
[dependencies]
ailloli_ui = "=0.1.0-beta.2"
serde_json = "1"use ailloli_ui::prelude::*;
use serde_json::json;
fn main() -> ailloli_ui::Result<()> {
let storage = AppStorage::for_app("friendly-notes").resolve()?;
let mut preferences = storage.read_preferences()?.unwrap_or_default();
preferences
.values
.entry("accent".to_owned())
.or_insert_with(|| json!("orange"));
storage.write_preferences(&preferences)?;
App::new()
.storage(storage)
.window(
Window::new("main")
.title("Friendly notes")
.size(800.0, 600.0)
.content(|| Text::new("Your window can remember its size.")),
)
.run()
}02
Persistance automatique et explicite
La couche pratique automatise volontairement le seul cycle de vie des fenêtres. Votre application décide toujours du bon moment pour écrire les préférences.
Instantanés de fenêtre
App::storage lit windows.json au démarrage, restaure une dimension intérieure enregistrée et écrit de nouveaux instantanés après une sortie propre de la boucle d'événements.
Préférences
read_preferences et write_preferences sont explicites. Les valeurs JSON inconnues sont conservées dans un document versionné.
Remplacement dans le même dossier
L'écriture passe par un fichier temporaire déterministe placé près de la destination, synchronise ses octets, puis le renomme. Plusieurs écritures simultanées vers la même cible ne sont pas coordonnées, et la synchronisation du dossier parent reste au mieux possible.
Vue de compatibilité facultative
La vue de liens symboliques dans le dossier personnel est désactivée par défaut, ne remplace jamais une collision et peut laisser des entrées antérieures si une création suivante échoue.
Un détail subtil
Le modèle d'instantané persistant conserve la taille, la position, l'état maximisé et le plein écran. En beta.2, le chemin simplifié proposé par App restaure uniquement la dimension intérieure enregistrée.
03
Activez l'inspecteur volontairement
La feature devtools relie les instantanés du noyau, l'interface de l'inspecteur, l'instrumentation du runtime et l'intégration winit facultative.
Feature Cargo
Activez ailloli_ui/devtools pour l'inspecteur de l'arbre retenu. Cette capacité ne fait pas partie des features par défaut.
Ctrl + Shift + I
Afficher ou masquer la superposition locale de l'inspecteur.
Ctrl + Shift + C
Activer la sélection d'éléments, puis cliquer sur un élément retenu pour le sélectionner.
Échap
Quitter d'abord le mode de sélection, puis masquer la superposition.
Modes de présentation
Le modèle public prend en charge Hidden, Overlay, DockRight et DockBottom. L'hôte interprète le mode choisi.
Ce que voit l'instantané
Les nœuds, clés, limites, détails de mise en page, sélection, survol, identité de frame et avertissements dérivés comme les clés dupliquées ou l'absence de layout.
Limite du filtre intégré
Le modèle de panneau de bas niveau possède un filtre textuel, mais l'intégration winit de beta.2 ne conserve pas encore SetFilter. Ne comptez pas sur ce filtre dans la superposition intégrée.
Configuration des features
La même fixture vérifie l'inspecteur ordinaire et la variante enrichie pour le terminal.
[package]
name = "devtools-features"
version = "0.1.0"
edition = "2021"
rust-version = "1.88"
publish = false
[features]
default = ["devtools"]
devtools = ["ailloli_ui/devtools"]
devtools-terminal = ["ailloli_ui/devtools_terminal"]
[dependencies]
ailloli_ui = "=0.1.0-beta.2"use ailloli_ui::App;
fn main() {
let address = "127.0.0.1:9229"
.parse()
.expect("the loopback address is valid");
let _app = App::new().devtools_remote_addr(address);
#[cfg(feature = "devtools-terminal")]
let _terminal_snapshot_size = std::mem::size_of::<ailloli_ui::TerminalDebugSnapshot>();
}L'exemple de stockage et les deux variantes de feature DevTools compilent avec Rust 1.88.
04
Un pont loopback, pas un serveur public
App::devtools_remote_addr et AILLOLI_UI_DEVTOOLS_REMOTE peuvent démarrer un pont JSONL détaché pour les instantanés et un petit ensemble de commandes.
Loopback uniquement
Les adresses qui ne sont pas loopback sont refusées. Gardez le pont sur la même machine.
Clients et lignes bornés
Le serveur accepte au maximum huit clients simultanés et déconnecte un client dont la ligne JSONL dépasse 64 Kio.
Surface de commande réduite
Les clients distants peuvent sélectionner, survoler, changer le mode de présentation ou envoyer un ping. Ils ne disposent pas d'une exécution applicative arbitraire.
Les données de débogage restent des données
Le pont ne fournit ni authentification ni chiffrement. L'adresse loopback constitue sa frontière de sécurité : activez-le uniquement pendant une session locale de débogage et considérez les instantanés comme des données sensibles.
05
L'inspection du terminal demande un second choix
devtools_terminal ajoute des instantanés de terminal bornés et des identités de cellule stables. Cette feature étend devtools et reste séparée de la propriété des processus PTY.
À vous de jouer
Exercice : inspectez un vrai widget
Reprenez la petite application du chapitre 10 afin que l'inspecteur dispose d'un véritable arbre retenu à explorer.
- 1Dans cette application, activez la feature devtools, lancez-la, puis ouvrez la surcouche avec Ctrl+Shift+I.
- 2Activez le sélecteur avec Ctrl+Shift+C, puis choisissez un bouton de votre application.
Commencez par la surcouche locale. Le pont loopback distant n'est pas nécessaire pour cet exercice.
L'inspecteur montre le bouton sélectionné et ses limites, sans client distant en cours d'exécution.