diff --git a/egui/src/introspection.rs b/egui/src/introspection.rs index 50eff597..6c1a7449 100644 --- a/egui/src/introspection.rs +++ b/egui/src/introspection.rs @@ -65,8 +65,6 @@ impl paint::FontDefinitions { .text(format!("{:?}", text_style)), ); } - if ui.button("Reset fonts").clicked { - *self = Default::default(); - } + crate::reset_button(ui, self); } } diff --git a/egui/src/style.rs b/egui/src/style.rs index 88310952..f88647ee 100644 --- a/egui/src/style.rs +++ b/egui/src/style.rs @@ -345,9 +345,7 @@ use crate::{widgets::*, Ui}; impl Style { pub fn ui(&mut self, ui: &mut crate::Ui) { - if ui.button("Reset").clicked { - *self = Default::default(); - } + crate::reset_button(ui, self); let Self { body_text_style, @@ -371,9 +369,7 @@ impl Style { impl Spacing { pub fn ui(&mut self, ui: &mut crate::Ui) { - if ui.button("Reset").clicked { - *self = Default::default(); - } + crate::reset_button(ui, self); let Self { item_spacing, @@ -404,15 +400,12 @@ impl Spacing { impl Interaction { pub fn ui(&mut self, ui: &mut crate::Ui) { - if ui.button("Reset").clicked { - *self = Default::default(); - } + crate::reset_button(ui, self); let Self { resize_grab_radius_side, resize_grab_radius_corner, } = self; - ui.add(Slider::f32(resize_grab_radius_side, 0.0..=20.0).text("resize_grab_radius_side")); ui.add( Slider::f32(resize_grab_radius_corner, 0.0..=20.0).text("resize_grab_radius_corner"), @@ -422,9 +415,7 @@ impl Interaction { impl Widgets { pub fn ui(&mut self, ui: &mut crate::Ui) { - if ui.button("Reset").clicked { - *self = Default::default(); - } + crate::reset_button(ui, self); let Self { active, @@ -471,9 +462,7 @@ impl WidgetVisuals { impl Visuals { pub fn ui(&mut self, ui: &mut crate::Ui) { - if ui.button("Reset").clicked { - *self = Default::default(); - } + crate::reset_button(ui, self); let Self { override_text_color: _, diff --git a/egui/src/widgets/mod.rs b/egui/src/widgets/mod.rs index 90f1dc7a..f0c134e1 100644 --- a/egui/src/widgets/mod.rs +++ b/egui/src/widgets/mod.rs @@ -739,3 +739,14 @@ impl Widget for Separator { response } } + +// ---------------------------------------------------------------------------- + +/// Show a button to reset a value to its default. +/// The button is only enabled if the value does not already have its original value. +pub fn reset_button(ui: &mut Ui, value: &mut T) { + let def = T::default(); + if ui.add(Button::new("Reset").enabled(*value != def)).clicked { + *value = def; + } +} diff --git a/egui_demo_lib/src/apps/demo/demo_window.rs b/egui_demo_lib/src/apps/demo/demo_window.rs index 8ea63040..7fe5db68 100644 --- a/egui_demo_lib/src/apps/demo/demo_window.rs +++ b/egui_demo_lib/src/apps/demo/demo_window.rs @@ -106,7 +106,7 @@ impl DemoWindow { // ---------------------------------------------------------------------------- -#[derive(serde::Deserialize, serde::Serialize)] +#[derive(PartialEq, serde::Deserialize, serde::Serialize)] #[serde(default)] struct ColorWidgets { srgba_unmul: [u8; 4], @@ -129,9 +129,7 @@ impl Default for ColorWidgets { impl ColorWidgets { fn ui(&mut self, ui: &mut Ui) { - if ui.button("Reset").clicked { - *self = Default::default(); - } + egui::reset_button(ui, self); ui.label("Egui lets you edit colors stored as either sRGBA or linear RGBA and with or without premultiplied alpha"); diff --git a/egui_demo_lib/src/apps/demo/sliders.rs b/egui_demo_lib/src/apps/demo/sliders.rs index 3cb5eec8..5088fadc 100644 --- a/egui_demo_lib/src/apps/demo/sliders.rs +++ b/egui_demo_lib/src/apps/demo/sliders.rs @@ -2,7 +2,7 @@ use egui::*; use std::f64::INFINITY; /// Showcase sliders -#[derive(serde::Deserialize, serde::Serialize)] +#[derive(PartialEq, serde::Deserialize, serde::Serialize)] #[serde(default)] pub struct Sliders { pub min: f64, @@ -108,8 +108,6 @@ impl Sliders { ui.checkbox(smart_aim, "Smart Aim"); ui.label("Smart Aim will guide you towards round values when you drag the slider so you you are more likely to hit 250 than 247.23"); - if ui.button("Reset slider demo").clicked { - *self = Default::default(); - } + egui::reset_button(ui, self); } } diff --git a/egui_demo_lib/src/apps/fractal_clock.rs b/egui_demo_lib/src/apps/fractal_clock.rs index dbbdb10a..17e8931c 100644 --- a/egui_demo_lib/src/apps/fractal_clock.rs +++ b/egui_demo_lib/src/apps/fractal_clock.rs @@ -1,7 +1,7 @@ use egui::{containers::*, widgets::*, *}; use std::f32::consts::TAU; -#[derive(serde::Deserialize, serde::Serialize)] +#[derive(PartialEq, serde::Deserialize, serde::Serialize)] #[serde(default)] pub struct FractalClock { paused: bool, @@ -87,9 +87,8 @@ impl FractalClock { ui.add(Slider::f32(&mut self.length_factor, 0.0..=1.0).text("length factor")); ui.add(Slider::f32(&mut self.luminance_factor, 0.0..=1.0).text("luminance factor")); ui.add(Slider::f32(&mut self.width_factor, 0.0..=1.0).text("width factor")); - if ui.button("Reset").clicked { - *self = Default::default(); - } + + egui::reset_button(ui, self); ui.add( Hyperlink::new("http://www.dqd.com/~mayoff/programs/FractalClock/")