mirror of
https://github.com/emilk/egui.git
synced 2026-09-03 23:30:04 -04:00
impl<F> Widget for F where F: FnOnce(&mut Ui) -> Response
This enables functions that return `impl Widget`, so that you can create a widget by just returning a lambda from a function. For instance: `ui.add(toggle(bool))` (instead of `toggle(ui, bool)`)
This commit is contained in:
@@ -506,10 +506,10 @@ impl Spacing {
|
||||
tooltip_width,
|
||||
} = self;
|
||||
|
||||
ui_slider_vec2(ui, item_spacing, 0.0..=10.0, "item_spacing");
|
||||
ui_slider_vec2(ui, window_padding, 0.0..=10.0, "window_padding");
|
||||
ui_slider_vec2(ui, button_padding, 0.0..=10.0, "button_padding");
|
||||
ui_slider_vec2(ui, interact_size, 0.0..=60.0, "interact_size")
|
||||
ui.add(slider_vec2(item_spacing, 0.0..=10.0, "item_spacing"));
|
||||
ui.add(slider_vec2(window_padding, 0.0..=10.0, "window_padding"));
|
||||
ui.add(slider_vec2(button_padding, 0.0..=10.0, "button_padding"));
|
||||
ui.add(slider_vec2(interact_size, 0.0..=60.0, "interact_size"))
|
||||
.on_hover_text("Minimum size of an interactive widget");
|
||||
ui.add(Slider::f32(indent, 0.0..=100.0).text("indent"));
|
||||
ui.add(Slider::f32(slider_width, 0.0..=1000.0).text("slider_width"));
|
||||
@@ -694,38 +694,20 @@ impl Visuals {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: improve and standardize ui_slider_vec2
|
||||
fn ui_slider_vec2(
|
||||
ui: &mut Ui,
|
||||
value: &mut Vec2,
|
||||
// TODO: improve and standardize `slider_vec2`
|
||||
fn slider_vec2<'a>(
|
||||
value: &'a mut Vec2,
|
||||
range: std::ops::RangeInclusive<f32>,
|
||||
text: &str,
|
||||
) -> Response {
|
||||
ui.horizontal(|ui| {
|
||||
/*
|
||||
let fsw = full slider_width
|
||||
let ssw = small slider_width
|
||||
let space = item_spacing.x
|
||||
let value = interact_size.x;
|
||||
|
||||
fsw + space + value = ssw + space + value + space + ssw + space + value
|
||||
fsw + space + value = 2 * ssw + 3 * space + 2 * value
|
||||
fsw + space - value = 2 * ssw + 3 * space
|
||||
fsw - 2 * space - value = 2 * ssw
|
||||
ssw = fsw / 2 - space - value / 2
|
||||
*/
|
||||
// let spacing = &ui.spacing();
|
||||
// let space = spacing.item_spacing.x;
|
||||
// let value_w = spacing.interact_size.x;
|
||||
// let full_slider_width = spacing.slider_width;
|
||||
// let small_slider_width = full_slider_width / 2.0 - space - value_w / 2.0;
|
||||
// ui.spacing_mut().slider_width = small_slider_width;
|
||||
|
||||
ui.add(Slider::f32(&mut value.x, range.clone()).text("w"));
|
||||
ui.add(Slider::f32(&mut value.y, range.clone()).text("h"));
|
||||
ui.label(text);
|
||||
})
|
||||
.response
|
||||
text: &'a str,
|
||||
) -> impl Widget + 'a {
|
||||
move |ui: &mut crate::Ui| {
|
||||
ui.horizontal(|ui| {
|
||||
ui.add(Slider::f32(&mut value.x, range.clone()).text("w"));
|
||||
ui.add(Slider::f32(&mut value.y, range.clone()).text("h"));
|
||||
ui.label(text);
|
||||
})
|
||||
.response
|
||||
}
|
||||
}
|
||||
|
||||
fn ui_color(ui: &mut Ui, srgba: &mut Color32, text: &str) {
|
||||
|
||||
@@ -35,6 +35,31 @@ pub trait Widget {
|
||||
fn ui(self, ui: &mut Ui) -> Response;
|
||||
}
|
||||
|
||||
/// This enables functions that return `impl Widget`, so that you can
|
||||
/// create a widget by just returning a lambda from a function.
|
||||
///
|
||||
/// For instance: `ui.add(slider_vec2(&mut vec2));` with:
|
||||
///
|
||||
/// ```
|
||||
/// pub fn slider_vec2(value: &mut egui::Vec2) -> impl egui::Widget + '_ {
|
||||
/// move |ui: &mut egui::Ui| {
|
||||
/// ui.horizontal(|ui| {
|
||||
/// ui.add(egui::Slider::f32(&mut value.x, 0.0..=1.0).text("x"));
|
||||
/// ui.add(egui::Slider::f32(&mut value.y, 0.0..=1.0).text("y"));
|
||||
/// })
|
||||
/// .response
|
||||
/// }
|
||||
/// }
|
||||
/// ```
|
||||
impl<F> Widget for F
|
||||
where
|
||||
F: FnOnce(&mut Ui) -> Response,
|
||||
{
|
||||
fn ui(self, ui: &mut Ui) -> Response {
|
||||
self(ui)
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
/// Show a button to reset a value to its default.
|
||||
|
||||
Reference in New Issue
Block a user