kael 0.1.1

GPU-accelerated native UI framework for Rust — build desktop apps with Metal, DirectX, and Vulkan rendering
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
#![doc = include_str!("../README.md")]
#![deny(missing_docs)]
#![allow(clippy::type_complexity)]
#![allow(clippy::collapsible_else_if)]
#![allow(clippy::redundant_clone)]
#![allow(clippy::unnecessary_cast)]
#![allow(clippy::mut_from_ref)]
#![allow(unused_mut)]

extern crate self as kael;

#[macro_use]
mod action;
pub mod accessibility;
/// Explicit animation primitives and keyframe builders.
pub mod animation;
mod app;
pub mod app_runtime;
/// Background job orchestration with worker-pool integration.
pub mod background_jobs;
/// Gesture recognizers and higher-level pointer interaction types.
pub mod gesture;
/// Pre-built panel implementations for common dock areas.
pub mod panels;
/// Workspace and panel layout management with JSON persistence.
pub mod workspace;

mod arena;
mod asset_cache;
mod assets;
mod auto_updater;
pub mod benchmark;
mod bounds_tree;
mod cache;
mod color;
/// The default colors used by GPUI.
pub mod colors;
/// Command registry for registering named commands invokable from menus,
/// keybindings, and a command palette.
pub mod command_registry;
mod crash_reporter;
/// Developer tools for observability, diagnostics, and runtime inspection.
pub mod dev_tools;
mod element;
mod elements;
mod executor;
pub mod extension_host;
pub mod extension_rpc;
mod file_watcher;
mod geometry;
mod global;
mod icons;
mod input;
mod inspector;
mod interactive;
pub mod ipc_transport;
mod key_dispatch;
mod keymap;
mod lottie;
pub mod media_capture;
#[cfg(feature = "media")]
pub mod media_playback;
mod path_builder;
mod pixel_snap;
mod platform;
/// Platform capability detection and feature-level support reporting.
pub mod platform_caps;
pub mod plugin;
pub mod prelude;
mod print;
pub mod process_model;
/// Runtime worker support.
pub mod runtime;
mod scene;
/// Scene graph primitives for canvas and creative applications.
pub mod scene_graph;
mod scroll_elasticity;
pub mod security;
mod session_store;
#[allow(dead_code)]
mod shadow_cache;
mod shared_string;
mod shared_uri;
/// Split-pane and tab model for IDE-style workspace layouts.
pub mod split_pane;
/// Status bar for displaying contextual information in large applications.
pub mod status_bar;
mod style;
mod styled;
mod subscription;
pub mod supervisor;
mod svg_renderer;
mod tab_stop;
mod taffy;
#[cfg(any(test, feature = "test-support"))]
pub mod test;
/// Text and document editing engine for IDEs, notes apps, and chat composers.
pub mod text_engine;
mod text_system;
/// Application themes with JSON or TOML loading and file hot-reload support.
pub mod theme;
mod tracer;
mod util;
mod view;
/// Virtualized data models for lists, tables, and trees.
pub mod virtual_data;
mod webview;
mod window;
/// Worker API for runtime tasks.
pub mod worker_api;

#[cfg(doc)]
pub mod _ownership_and_data_flow;

/// Do not touch, here be dragons for use by kael_macros and such.
#[doc(hidden)]
pub mod private {
    pub use anyhow;
    pub use inventory;
    pub use schemars;
    pub use serde;
    pub use serde_json;
}

mod seal {
    /// A mechanism for restricting implementations of a trait to only those in GPUI.
    /// See: <https://predr.ag/blog/definitive-guide-to-sealed-traits-in-rust/>
    pub trait Sealed {}
}

pub use accessibility::*;
pub use action::*;
pub use anyhow::Result;
pub use app::*;
pub use app_runtime::*;
pub(crate) use arena::*;
pub use asset_cache::*;
pub use assets::*;
pub use auto_updater::*;
pub use background_jobs::*;
pub use benchmark::*;
pub use color::*;
pub use command_registry::{CommandDescriptor, CommandPalette, PaletteCommandId};
pub use crash_reporter::*;
pub use ctor::ctor;
pub use dev_tools::*;
pub use element::*;
pub use elements::*;
pub use executor::*;
pub use extension_host::*;
pub use extension_rpc::*;
pub use file_watcher::*;
pub use geometry::*;
pub use gesture::*;
pub use global::*;
pub use http_client;
pub use input::*;
pub use inspector::*;
pub use interactive::*;
pub use ipc_transport::*;
pub use kael_macros::{AppContext, IntoElement, Render, VisualContext, register_action, test};
use key_dispatch::*;
pub use keymap::*;
pub use lottie::*;
pub use media_capture::*;
#[cfg(feature = "media")]
pub use media_playback::*;
pub use panels::*;
pub use path_builder::*;
pub use pixel_snap::PixelSnapPolicy;
pub use platform::*;
pub use platform_caps::*;
pub use plugin::*;
pub use print::*;
pub use process_model::*;
pub use refineable::*;
pub use runtime::*;
pub use scene::*;
pub use scene_graph::*;
pub use security::*;
pub use session_store::*;
pub use shared_string::*;
pub use shared_uri::*;
pub use smol::Timer;
pub use split_pane::*;
pub use status_bar::*;
pub use style::*;
pub use styled::*;
pub use subscription::*;
pub use supervisor::*;
use svg_renderer::*;
pub(crate) use tab_stop::*;
pub use taffy::{AvailableSpace, LayoutId};
#[cfg(any(test, feature = "test-support"))]
pub use test::*;
pub use text_engine::*;
pub use text_system::*;
pub use theme::*;
pub use tracer::*;
#[cfg(any(test, feature = "test-support"))]
pub use util::smol_timeout;
pub use util::{FutureExt, Timeout, arc_cow::ArcCow};
pub use view::*;
pub use virtual_data::*;
pub use webview::*;
pub use window::*;
pub use worker_api::*;
pub use workspace::*;

use std::{any::Any, borrow::BorrowMut, future::Future};
use taffy::TaffyLayoutEngine;

/// The context trait, allows the different contexts in GPUI to be used
/// interchangeably for certain operations.
pub trait AppContext {
    /// The result type for this context, used for async contexts that
    /// can't hold a direct reference to the application context.
    type Result<T>;

    /// Create a new entity in the app context.
    #[expect(
        clippy::wrong_self_convention,
        reason = "`App::new` is an ubiquitous function for creating entities"
    )]
    fn new<T: 'static>(
        &mut self,
        build_entity: impl FnOnce(&mut Context<T>) -> T,
    ) -> Self::Result<Entity<T>>;

    /// Reserve a slot for a entity to be inserted later.
    /// The returned [Reservation] allows you to obtain the [EntityId] for the future entity.
    fn reserve_entity<T: 'static>(&mut self) -> Self::Result<Reservation<T>>;

    /// Insert a new entity in the app context based on a [Reservation] previously obtained from [`reserve_entity`].
    ///
    /// [`reserve_entity`]: Self::reserve_entity
    fn insert_entity<T: 'static>(
        &mut self,
        reservation: Reservation<T>,
        build_entity: impl FnOnce(&mut Context<T>) -> T,
    ) -> Self::Result<Entity<T>>;

    /// Update a entity in the app context.
    fn update_entity<T, R>(
        &mut self,
        handle: &Entity<T>,
        update: impl FnOnce(&mut T, &mut Context<T>) -> R,
    ) -> Self::Result<R>
    where
        T: 'static;

    /// Update a entity in the app context.
    fn as_mut<'a, T>(&'a mut self, handle: &Entity<T>) -> Self::Result<GpuiBorrow<'a, T>>
    where
        T: 'static;

    /// Read a entity from the app context.
    fn read_entity<T, R>(
        &self,
        handle: &Entity<T>,
        read: impl FnOnce(&T, &App) -> R,
    ) -> Self::Result<R>
    where
        T: 'static;

    /// Update a window for the given handle.
    fn update_window<T, F>(&mut self, window: AnyWindowHandle, f: F) -> Result<T>
    where
        F: FnOnce(AnyView, &mut Window, &mut App) -> T;

    /// Read a window off of the application context.
    fn read_window<T, R>(
        &self,
        window: &WindowHandle<T>,
        read: impl FnOnce(Entity<T>, &App) -> R,
    ) -> Result<R>
    where
        T: 'static;

    /// Spawn a future on a background thread
    fn background_spawn<R>(&self, future: impl Future<Output = R> + Send + 'static) -> Task<R>
    where
        R: Send + 'static;

    /// Read a global from this app context
    fn read_global<G, R>(&self, callback: impl FnOnce(&G, &App) -> R) -> Self::Result<R>
    where
        G: Global;
}

/// Returned by [Context::reserve_entity] to later be passed to [Context::insert_entity].
/// Allows you to obtain the [EntityId] for a entity before it is created.
pub struct Reservation<T>(pub(crate) Slot<T>);

impl<T: 'static> Reservation<T> {
    /// Returns the [EntityId] that will be associated with the entity once it is inserted.
    pub fn entity_id(&self) -> EntityId {
        self.0.entity_id()
    }
}

/// This trait is used for the different visual contexts in GPUI that
/// require a window to be present.
pub trait VisualContext: AppContext {
    /// Returns the handle of the window associated with this context.
    fn window_handle(&self) -> AnyWindowHandle;

    /// Invalidates retained subtree cache state for elements with the given id in this context's window.
    fn invalidate_cache(&mut self, element_id: impl Into<ElementId>) -> Result<()> {
        let window = self.window_handle();
        let element_id = element_id.into();
        self.update_window(window, move |_, window, _| {
            window.invalidate_cache(element_id);
        })
    }

    /// Update a view with the given callback
    fn update_window_entity<T: 'static, R>(
        &mut self,
        entity: &Entity<T>,
        update: impl FnOnce(&mut T, &mut Window, &mut Context<T>) -> R,
    ) -> Self::Result<R>;

    /// Create a new entity, with access to `Window`.
    fn new_window_entity<T: 'static>(
        &mut self,
        build_entity: impl FnOnce(&mut Window, &mut Context<T>) -> T,
    ) -> Self::Result<Entity<T>>;

    /// Replace the root view of a window with a new view.
    fn replace_root_view<V>(
        &mut self,
        build_view: impl FnOnce(&mut Window, &mut Context<V>) -> V,
    ) -> Self::Result<Entity<V>>
    where
        V: 'static + Render;

    /// Focus a entity in the window, if it implements the [`Focusable`] trait.
    fn focus<V>(&mut self, entity: &Entity<V>) -> Self::Result<()>
    where
        V: Focusable;
}

/// A trait for tying together the types of a GPUI entity and the events it can
/// emit.
pub trait EventEmitter<E: Any>: 'static {}

/// A helper trait for auto-implementing certain methods on contexts that
/// can be used interchangeably.
pub trait BorrowAppContext {
    /// Set a global value on the context.
    fn set_global<T: Global>(&mut self, global: T);
    /// Updates the global state of the given type.
    fn update_global<G, R>(&mut self, f: impl FnOnce(&mut G, &mut Self) -> R) -> R
    where
        G: Global;
    /// Updates the global state of the given type, creating a default if it didn't exist before.
    fn update_default_global<G, R>(&mut self, f: impl FnOnce(&mut G, &mut Self) -> R) -> R
    where
        G: Global + Default;
}

impl<C> BorrowAppContext for C
where
    C: BorrowMut<App>,
{
    fn set_global<G: Global>(&mut self, global: G) {
        self.borrow_mut().set_global(global)
    }

    #[track_caller]
    fn update_global<G, R>(&mut self, f: impl FnOnce(&mut G, &mut Self) -> R) -> R
    where
        G: Global,
    {
        let mut global = self.borrow_mut().lease_global::<G>();
        let result = f(&mut global, self);
        self.borrow_mut().end_global_lease(global);
        result
    }

    fn update_default_global<G, R>(&mut self, f: impl FnOnce(&mut G, &mut Self) -> R) -> R
    where
        G: Global + Default,
    {
        self.borrow_mut().default_global::<G>();
        self.update_global(f)
    }
}

/// A flatten equivalent for anyhow `Result`s.
pub trait Flatten<T> {
    /// Convert this type into a simple `Result<T>`.
    fn flatten(self) -> Result<T>;
}

impl<T> Flatten<T> for Result<Result<T>> {
    fn flatten(self) -> Result<T> {
        self?
    }
}

impl<T> Flatten<T> for Result<T> {
    fn flatten(self) -> Result<T> {
        self
    }
}

/// Information about the GPU GPUI is running on.
#[derive(Default, Debug, serde::Serialize, serde::Deserialize, Clone)]
pub struct GpuSpecs {
    /// Whether the GPU is really a fake (like `llvmpipe`) running on the CPU.
    pub is_software_emulated: bool,
    /// The name of the device, as reported by Vulkan.
    pub device_name: String,
    /// The name of the driver, as reported by Vulkan.
    pub driver_name: String,
    /// Further information about the driver, as reported by Vulkan.
    pub driver_info: String,
}