bevy_ui_builders/
lib.rs

1//! # Bevy UI Builders
2//!
3//! Declarative UI builders for Bevy.
4//!
5//! ## Example
6//!
7//! ```ignore
8//! use bevy_ui_builders::*;
9//!
10//! ButtonBuilder::new("Click Me")
11//!     .style(ButtonStyle::Primary)
12//!     .build(commands);
13//! ```
14
15#![warn(missing_docs)]
16
17// Re-export Bevy UI prelude for convenience
18pub use bevy::prelude::*;
19use bevy_plugin_builder::define_plugin;
20
21// Core modules
22mod styles;
23mod systems;
24mod utils;
25pub mod relationships;
26pub mod validation;
27
28// Individual builder imports
29#[cfg(feature = "button")]
30pub mod button;
31#[cfg(feature = "slider")]
32pub mod slider;
33#[cfg(feature = "form")]
34pub mod form;
35#[cfg(feature = "dialog")]
36pub mod dialog;
37#[cfg(feature = "text_input")]
38pub mod text_input;
39#[cfg(feature = "progress")]
40pub mod progress;
41#[cfg(feature = "label")]
42pub mod label;
43#[cfg(feature = "panel")]
44pub mod panel;
45#[cfg(feature = "separator")]
46pub mod separator;
47#[cfg(feature = "checkbox")]
48pub mod checkbox;
49#[cfg(feature = "number_input")]
50pub mod number_input;
51#[cfg(feature = "dropdown")]
52pub mod dropdown;
53
54// ScrollView module (always available - core functionality)
55pub mod scroll_view;
56
57// Future modules (not implemented yet)
58// #[cfg(feature = "tooltip")]
59// pub mod tooltip;
60
61// Public exports
62pub use styles::{ButtonStyle, ButtonSize, colors, dimensions};
63pub use systems::cleanup::{despawn_entities, despawn_ui_entities};
64pub use systems::hover::HoverPlugin;
65pub use scroll_view::{ScrollViewBuilder, ScrollView, ScrollConfig, ScrollDirection, ScrollViewPlugin, scroll_view};
66pub use relationships::{
67    BelongsToDialog, DialogElements,
68    SliderPart, SliderParts,
69    BelongsToForm, FormFields,
70    InButtonGroup, ButtonGroupMembers,
71    PanelContent, PanelContents,
72    TextInputPart, TextInputParts,
73    ProgressBarPart, ProgressBarParts,
74    BelongsToDropdown, DropdownElements,
75    UIRelationshipsPlugin,
76};
77pub use validation::{Validated, ValidationState, ValidationPlugin};
78
79// Builder exports based on features
80#[cfg(feature = "button")]
81pub use button::{
82    ButtonBuilder, StyledButton,
83    primary_button, secondary_button, success_button, danger_button, ghost_button,
84};
85
86#[cfg(feature = "slider")]
87pub use slider::{SliderBuilder, SliderBuilderWithMarker, Slider, SliderHandle, SliderTrack, ValueFormat};
88
89#[cfg(feature = "form")]
90pub use form::{FormBuilder, FieldType, ValidationRule};
91
92#[cfg(feature = "dialog")]
93pub use dialog::{
94    DialogBuilder, DialogButtonEvent, DialogType, DialogOverlay, DialogButtonMarker,
95    // Standard button markers for dialog buttons
96    ConfirmButton, CancelButton, SaveButton, DiscardButton,
97    OkButton, YesButton, NoButton,
98    // Dialog type markers
99    ExitConfirmationDialog, UnsavedChangesDialog, ResolutionDialog,
100    ErrorDialog, InfoDialog, WarningDialog, SuccessDialog
101};
102
103#[cfg(feature = "text_input")]
104pub use text_input::{TextInputBuilder, InputFilter, InputTransform, FocusGroupId, text_input};
105
106#[cfg(feature = "progress")]
107pub use progress::{ProgressBarBuilder, ProgressBar, ProgressBarStyle, progress};
108
109#[cfg(feature = "label")]
110pub use label::{LabelBuilder, Label, LabelStyle, label};
111
112#[cfg(feature = "panel")]
113pub use panel::{PanelBuilder, Panel, PanelStyle, panel};
114
115#[cfg(feature = "separator")]
116pub use separator::{SeparatorBuilder, Separator, SeparatorStyle, Orientation, separator};
117
118#[cfg(feature = "checkbox")]
119pub use checkbox::{CheckboxBuilder, Checkbox, CheckboxState, CheckboxStyle};
120
121#[cfg(feature = "number_input")]
122pub use number_input::{NumberInputBuilder, NumberInput, NumberInputConfig};
123
124#[cfg(feature = "dropdown")]
125pub use dropdown::{DropdownBuilder, Dropdown, DropdownState, DropdownData};
126
127/// Prelude module for convenient imports
128pub mod prelude {
129    #[doc(hidden)]
130    pub use crate::{
131        despawn_ui_entities, despawn_entities,
132    };
133
134    // Validation
135    pub use crate::{Validated, ValidationState, ValidationRule};
136
137    #[cfg(feature = "button")]
138    pub use crate::{ButtonBuilder, ButtonStyle, ButtonSize};
139
140    #[cfg(feature = "slider")]
141    pub use crate::{SliderBuilder, ValueFormat};
142
143    #[cfg(feature = "form")]
144    pub use crate::{FormBuilder, FieldType};
145
146    #[cfg(feature = "dialog")]
147    pub use crate::{
148        DialogBuilder, DialogType, DialogButtonMarker,
149        // Standard button markers
150        ConfirmButton, CancelButton, SaveButton, DiscardButton,
151        OkButton, YesButton, NoButton,
152    };
153
154    #[cfg(feature = "text_input")]
155    pub use crate::{TextInputBuilder, InputFilter};
156
157    #[cfg(feature = "progress")]
158    pub use crate::{ProgressBarBuilder, ProgressBarStyle};
159
160    #[cfg(feature = "label")]
161    pub use crate::{LabelBuilder, LabelStyle};
162
163    #[cfg(feature = "panel")]
164    pub use crate::{PanelBuilder, PanelStyle};
165
166    #[cfg(feature = "separator")]
167    pub use crate::{SeparatorBuilder, Orientation};
168
169    #[cfg(feature = "checkbox")]
170    pub use crate::{CheckboxBuilder, CheckboxState, CheckboxStyle};
171
172    #[cfg(feature = "number_input")]
173    pub use crate::{NumberInputBuilder};
174
175    #[cfg(feature = "dropdown")]
176    pub use crate::{DropdownBuilder, DropdownState};
177}
178
179define_plugin!(UiBuilderPlugin {
180    plugins: [HoverPlugin, UIRelationshipsPlugin, ScrollViewPlugin, ValidationPlugin],
181    custom_init: |app: &mut App| {
182        // Bevy 0.17 requires picking plugins for Interaction component updates
183        // Only add if not already present (DefaultPlugins includes them)
184        if !app.is_plugin_added::<bevy::picking::input::PointerInputPlugin>() {
185            app.add_plugins(bevy::picking::DefaultPickingPlugins);
186        }
187        #[cfg(feature = "button")]
188        app.add_plugins(button::ButtonPlugin);
189
190        #[cfg(feature = "slider")]
191        app.add_plugins(slider::SliderPlugin);
192
193        #[cfg(feature = "dialog")]
194        app.add_plugins(dialog::DialogPlugin);
195
196        #[cfg(feature = "text_input")]
197        app.add_plugins(text_input::TextInputPlugin);
198
199        #[cfg(feature = "progress")]
200        app.add_plugins(progress::ProgressBarPlugin);
201
202        #[cfg(feature = "checkbox")]
203        app.add_plugins(checkbox::CheckboxPlugin);
204
205        #[cfg(feature = "dropdown")]
206        app.add_plugins(dropdown::DropdownPlugin);
207    }
208});