Skip to main content

agg_gui/
lib.rs

1//! # agg-gui
2//!
3//! A Rust GUI framework built on [AGG](https://github.com/larsbrubaker/agg-rust)
4//! (Anti-Grain Geometry).
5//!
6//! ## Architecture
7//!
8//! ```text
9//! Application / Widgets
10//!   │
11//! GfxCtx (Cairo-style stateful 2D drawing API)
12//!   │
13//! AGG (rasterization) + Clipper2 (boolean geometry)
14//!   │
15//! Framebuffer (RGBA8, bottom-up Y-up row order)
16//!   │
17//! Platform (WGL native / WebGL WASM)
18//! ```
19//!
20//! ## Coordinate system
21//!
22//! The entire framework uses **first-quadrant (Y-up)** coordinates throughout.
23//! Origin is the bottom-left corner of the window. Positive Y goes upward.
24//! This is a non-negotiable architectural invariant — see the dev plan for
25//! the rationale.
26//!
27//! ## Module guide
28//!
29//! - [`widget`] / [`widgets`] — the [`App`] event/layout/paint driver and the
30//!   widget set (buttons, text editing, windows, flex layout, menus, …).
31//! - [`draw_ctx`] — the [`DrawCtx`] drawing trait every widget paints
32//!   through; [`gfx_ctx`] is the software AGG implementation.
33//! - [`theme`] — dark / light / system visuals read via `ctx.visuals()`.
34//! - [`overlay_insets`] + [`widgets::ReserveInset`] + [`card`] — safe-area
35//!   overlay placement: reserved screen edges (the on-screen keyboard
36//!   reserves itself), and anchored info cards that measure, word-wrap,
37//!   flip, and clamp so floating content never hides under sibling chrome.
38//! - [`input_profile`] / [`ux_scale`] — touch-device detection and the
39//!   mobile UX zoom; [`widgets::on_screen_keyboard`] is the in-canvas
40//!   keyboard with keyboard-avoidance handled by [`App::layout`].
41//! - `winit_adapter` (feature `winit-adapter`) and, on WASM,
42//!   `web_adapter` (`install_keyboard_listeners` = typing + clipboard
43//!   for any browser shell) — platform glue. The repo's `demo-wgpu` crate
44//!   adds turn-key `native_shell` / `web_shell` runners on top.
45
46pub mod animation;
47pub mod app_state;
48pub mod card;
49pub mod clipboard;
50pub mod color;
51pub mod confetti;
52pub mod cursor;
53pub mod device_scale;
54pub mod draw_cell;
55pub mod draw_ctx;
56pub mod event;
57pub mod focus;
58pub mod font_settings;
59pub mod framebuffer;
60pub mod geometry;
61pub mod gfx_ctx;
62pub mod gl_renderer;
63pub mod input_profile;
64pub mod layout_props;
65pub mod lcd_coverage;
66pub mod lcd_gfx_ctx;
67pub mod overlay_insets;
68pub mod paints;
69pub mod persistence;
70pub mod pixel_bounds;
71pub mod platform;
72pub mod screenshot;
73pub mod snap;
74pub mod svg;
75pub mod text;
76pub mod theme;
77pub mod timestep;
78pub mod touch_state;
79pub mod undo;
80pub mod ux_scale;
81#[cfg(target_arch = "wasm32")]
82pub mod wasm_clipboard;
83pub mod widget;
84pub mod widgets;
85
86/// Adapter helpers bridging `winit` types (keyboard, mouse, modifiers,
87/// cursor) to this crate's input/cursor types.  Enabled with the
88/// `winit-adapter` feature so consumers that don't use winit don't pull
89/// the dep.
90#[cfg(feature = "winit-adapter")]
91pub mod winit_adapter;
92
93/// Adapter helpers for web/JS targets — DOM KeyboardEvent key-string →
94/// [`Key`] parser and CSS cursor-name for [`CursorIcon`].  Compiled only
95/// for `wasm32` targets.
96#[cfg(target_arch = "wasm32")]
97pub mod web_adapter;
98
99// Re-export the most commonly used types at the crate root.
100pub use app_state::{OsWindowHandle, OsWindowState};
101pub use color::Color;
102pub use cursor::{current_cursor_icon, reset_cursor_icon, set_cursor_icon, CursorIcon};
103pub use device_scale::{device_scale, set_device_scale};
104pub use draw_cell::{DrawCell, DrawRefCell, DrawRefMut};
105pub use draw_ctx::{DrawCtx, FillRule, GlPaint};
106pub use event::{Event, EventResult, Key, Modifiers, MouseButton};
107pub use font_settings::current_typography_epoch;
108pub use framebuffer::Framebuffer;
109pub use geometry::{Point, Rect, Size};
110pub use gfx_ctx::GfxCtx;
111pub use layout_props::{resolve_fit_or_stretch, HAnchor, Insets, VAnchor, WidgetBase};
112pub use platform::{current_platform, platform_from_name, set_platform, Platform};
113pub use screenshot::ScreenshotHandle;
114pub use snap::{
115    compute_snap, next_snap_id, ResizeEdge as SnapResizeEdge, SnapGuide, SnapId, SnapMode,
116    SnapOverlay, SnapResult, Snappable, DEFAULT_THRESHOLD as SNAP_DEFAULT_THRESHOLD,
117};
118pub use svg::{
119    compare_svg_rgba, parse_svg, render_svg, render_svg_at_size, render_svg_at_size_with_options,
120    render_svg_at_size_with_resources, render_svg_to_framebuffer,
121    render_svg_to_framebuffer_at_size, render_svg_to_framebuffer_at_size_with_options,
122    render_svg_to_framebuffer_at_size_with_resources, render_svg_to_framebuffer_with_options,
123    render_svg_to_lcd_buffer, render_svg_to_lcd_buffer_at_size,
124    render_svg_to_lcd_buffer_at_size_with_options, render_svg_to_lcd_buffer_at_size_with_resources,
125    render_svg_to_lcd_buffer_with_options, render_svg_tree, render_svg_tree_at_size,
126    render_svg_tree_region_at_size, render_svg_tree_region_to_framebuffer_at_size,
127    render_svg_tree_to_framebuffer, render_svg_tree_to_framebuffer_at_size,
128    render_svg_tree_to_lcd_buffer, render_svg_tree_to_lcd_buffer_at_size, render_svg_with_options,
129    set_default_svg_parse_options, svg_fontdb_from_font_data, SvgCompareResult,
130    SvgCompareThresholds, SvgParseOptions, SvgRenderError, SvgTree, DEFAULT_ALPHA_TOLERANCE,
131    DEFAULT_MISMATCH_RATIO, DEFAULT_OPAQUE_RGB_TOLERANCE, DEFAULT_TRANSLUCENT_RGB_TOLERANCE,
132    DEFAULT_VISUAL_RGB_TOLERANCE,
133};
134pub use text::{measure_text_metrics, Font, TextMetrics};
135pub use theme::{
136    current_visuals, current_visuals_epoch, set_visuals, AccentColor, ThemePreference, Visuals,
137};
138pub use timestep::{FixedTimestep, StepBatch, FIXED_DT, MAX_STEPS_PER_DRAW, SIMULATION_HZ};
139pub use touch_state::{current_multi_touch, MultiTouchInfo, TouchDeviceId, TouchId, TouchPhase};
140pub use undo::{DoUndoActions, Settings as UndoerSettings, UndoBuffer, Undoer, UndoRedoCommand};
141#[cfg(feature = "reflect")]
142pub use widget::{apply_inspector_edit, reflect_fields, InspectorEdit};
143pub use widget::{
144    apply_widget_base_edit, collect_inspector_nodes, current_mouse_world, current_viewport,
145    find_widget_by_id, find_widget_by_id_mut, find_widget_by_type, App, BackbufferKind,
146    BackbufferSpec, BackbufferState, InspectorNode, InspectorOverlay, Widget, WidgetBaseEdit,
147    WidgetBaseField,
148};
149pub use widgets::{
150    color_wheel_picker_dialog, color_wheel_picker_dialog_with_on_close, current_scroll_style,
151    current_scroll_visibility, paint_sparkline,
152    set_scroll_style, set_scroll_visibility, shared_frame_history, shared_run_mode, Button,
153    CellInfo, Checkbox, ClickAwayAction, CloseReason, CollapsingHeader, ColorPicker,
154    ColorWheelPicker, ComboBox, Conditional,
155    Align, Align2, Container, DragValue, FlexColumn, FlexRow, FrameHistory, HandleShape,
156    DEFAULT_COLUMN_GAP, DEFAULT_ROW_GAP,
157    HeaderInfo, Hyperlink, ImageView, InspectorPanel, InspectorSavedState, Label, LabelAlign,
158    MarkdownView, MenuBar, MenuBarStrip, MenuEntry, MenuItem, MenuResponse, MenuSelection,
159    MenuShortcut, ModalSheet, NodeIcon, Padding, PerformanceView, Popup, PopupClickOutcome,
160    PopupCloseBehavior, PopupMenu, ProgressBar, QrView, RadioGroup, Rebuilder, RectAlign,
161    Resize, RichCommand, RichDoc, RichEditHandle, RichTextEdit, RichTextToolbar, RichTextView,
162    RunMode, RunModeDesc,
163    RunModeRow, Scene, SharedResolver, single_font_resolver,
164    SceneTransform, ScrollBarColor, ScrollBarKind,
165    ScrollBarStyle, ScrollBarVisibility, ScrollView, Separator, SharedFrameHistory, ShortcutKey,
166    SizedBox, Slider, SliderClamping, SliderOrientation, Spacer, Splitter, Stack, TabView, Table,
167    TableBuilder, TableColumn, TableRows, TextArea, TextEditState, TextField, TextHAlign,
168    TextVAlign, ToggleSwitch, Tooltip, TopMenu, TreeView, Window,
169};
170
171// Re-export AGG types so callers don't need to import agg-rust directly.
172pub use agg_rust::comp_op::CompOp;
173pub use agg_rust::math_stroke::{LineCap, LineJoin};
174pub use agg_rust::trans_affine::TransAffine;
175
176#[cfg(test)]
177mod tests;