2021-01-11 19:58:36 +00:00
|
|
|
#[derive(Debug, PartialEq)]
|
2021-09-29 06:45:13 +00:00
|
|
|
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
|
2021-01-11 19:58:36 +00:00
|
|
|
enum Enum {
|
|
|
|
First,
|
|
|
|
Second,
|
|
|
|
Third,
|
|
|
|
}
|
|
|
|
|
2021-06-12 20:10:40 +00:00
|
|
|
/// Shows off one example of each major type of widget.
|
2021-09-29 06:45:13 +00:00
|
|
|
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
|
2021-01-11 19:58:36 +00:00
|
|
|
pub struct WidgetGallery {
|
2021-02-07 09:55:45 +00:00
|
|
|
enabled: bool,
|
2021-06-07 20:12:49 +00:00
|
|
|
visible: bool,
|
2021-01-11 19:58:36 +00:00
|
|
|
boolean: bool,
|
|
|
|
radio: Enum,
|
|
|
|
scalar: f32,
|
|
|
|
string: String,
|
|
|
|
color: egui::Color32,
|
2021-07-01 20:50:41 +00:00
|
|
|
animate_progress_bar: bool,
|
2022-04-03 16:14:40 +00:00
|
|
|
|
2022-04-28 09:23:34 +00:00
|
|
|
#[cfg(feature = "chrono")]
|
2022-04-03 16:14:40 +00:00
|
|
|
#[cfg_attr(feature = "serde", serde(skip))]
|
|
|
|
date: Option<chrono::Date<chrono::Utc>>,
|
|
|
|
|
2022-01-15 12:59:52 +00:00
|
|
|
#[cfg_attr(feature = "serde", serde(skip))]
|
|
|
|
texture: Option<egui::TextureHandle>,
|
2021-01-11 19:58:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for WidgetGallery {
|
|
|
|
fn default() -> Self {
|
|
|
|
Self {
|
2021-02-07 09:55:45 +00:00
|
|
|
enabled: true,
|
2021-06-07 20:12:49 +00:00
|
|
|
visible: true,
|
2021-01-11 19:58:36 +00:00
|
|
|
boolean: false,
|
|
|
|
radio: Enum::First,
|
|
|
|
scalar: 42.0,
|
2021-02-03 20:05:50 +00:00
|
|
|
string: Default::default(),
|
2021-01-19 23:30:07 +00:00
|
|
|
color: egui::Color32::LIGHT_BLUE.linear_multiply(0.5),
|
2021-07-01 20:50:41 +00:00
|
|
|
animate_progress_bar: false,
|
2022-04-28 09:23:34 +00:00
|
|
|
#[cfg(feature = "chrono")]
|
2022-04-03 16:14:40 +00:00
|
|
|
date: None,
|
2022-01-15 12:59:52 +00:00
|
|
|
texture: None,
|
2021-01-11 19:58:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl super::Demo for WidgetGallery {
|
2021-02-20 08:18:23 +00:00
|
|
|
fn name(&self) -> &'static str {
|
2021-01-11 19:58:36 +00:00
|
|
|
"🗄 Widget Gallery"
|
|
|
|
}
|
|
|
|
|
2022-01-10 22:13:10 +00:00
|
|
|
fn show(&mut self, ctx: &egui::Context, open: &mut bool) {
|
2021-01-14 22:25:51 +00:00
|
|
|
egui::Window::new(self.name())
|
|
|
|
.open(open)
|
2021-07-02 07:55:57 +00:00
|
|
|
.resizable(true)
|
2022-04-30 10:58:29 +00:00
|
|
|
.default_width(280.0)
|
2021-01-14 22:25:51 +00:00
|
|
|
.show(ctx, |ui| {
|
2021-10-07 19:39:04 +00:00
|
|
|
use super::View as _;
|
2021-01-14 22:25:51 +00:00
|
|
|
self.ui(ui);
|
|
|
|
});
|
2021-01-11 19:58:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl super::View for WidgetGallery {
|
|
|
|
fn ui(&mut self, ui: &mut egui::Ui) {
|
2021-10-17 20:17:50 +00:00
|
|
|
ui.add_enabled_ui(self.enabled, |ui| {
|
2021-06-07 20:12:49 +00:00
|
|
|
ui.set_visible(self.visible);
|
|
|
|
|
|
|
|
egui::Grid::new("my_grid")
|
2021-07-02 07:55:57 +00:00
|
|
|
.num_columns(2)
|
2021-06-07 20:12:49 +00:00
|
|
|
.spacing([40.0, 4.0])
|
2021-07-02 07:55:57 +00:00
|
|
|
.striped(true)
|
2021-06-07 20:12:49 +00:00
|
|
|
.show(ui, |ui| {
|
|
|
|
self.gallery_grid_contents(ui);
|
|
|
|
});
|
|
|
|
});
|
2021-02-20 11:07:15 +00:00
|
|
|
|
|
|
|
ui.separator();
|
|
|
|
|
2021-06-07 20:12:49 +00:00
|
|
|
ui.horizontal(|ui| {
|
|
|
|
ui.checkbox(&mut self.visible, "Visible")
|
|
|
|
.on_hover_text("Uncheck to hide all the widgets.");
|
|
|
|
if self.visible {
|
|
|
|
ui.checkbox(&mut self.enabled, "Interactive")
|
|
|
|
.on_hover_text("Uncheck to inspect how the widgets look when disabled.");
|
|
|
|
}
|
2021-02-20 11:07:15 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
ui.separator();
|
|
|
|
|
|
|
|
ui.vertical_centered(|ui| {
|
|
|
|
let tooltip_text = "The full egui documentation.\nYou can also click the different widgets names in the left column.";
|
|
|
|
ui.hyperlink("https://docs.rs/egui/").on_hover_text(tooltip_text);
|
2022-04-25 20:01:32 +00:00
|
|
|
ui.add(crate::egui_github_link_file!(
|
2021-02-20 11:07:15 +00:00
|
|
|
"Source code of the widget gallery"
|
|
|
|
));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl WidgetGallery {
|
|
|
|
fn gallery_grid_contents(&mut self, ui: &mut egui::Ui) {
|
2021-01-11 19:58:36 +00:00
|
|
|
let Self {
|
2021-06-07 20:12:49 +00:00
|
|
|
enabled: _,
|
|
|
|
visible: _,
|
2021-01-11 19:58:36 +00:00
|
|
|
boolean,
|
|
|
|
radio,
|
|
|
|
scalar,
|
|
|
|
string,
|
|
|
|
color,
|
2021-07-01 20:50:41 +00:00
|
|
|
animate_progress_bar,
|
2022-04-28 09:23:34 +00:00
|
|
|
#[cfg(feature = "chrono")]
|
2022-03-31 19:13:25 +00:00
|
|
|
date,
|
2022-01-15 12:59:52 +00:00
|
|
|
texture,
|
2021-01-11 19:58:36 +00:00
|
|
|
} = self;
|
|
|
|
|
2022-01-15 12:59:52 +00:00
|
|
|
let texture: &egui::TextureHandle = texture.get_or_insert_with(|| {
|
2022-05-22 14:56:51 +00:00
|
|
|
ui.ctx().load_texture(
|
|
|
|
"example",
|
|
|
|
egui::ColorImage::example(),
|
|
|
|
egui::epaint::textures::TextureFilter::Linear,
|
|
|
|
)
|
2022-01-15 12:59:52 +00:00
|
|
|
});
|
|
|
|
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.add(doc_link_label("Label", "label,heading"));
|
|
|
|
ui.label("Welcome to the widget gallery!");
|
|
|
|
ui.end_row();
|
2021-02-07 12:48:55 +00:00
|
|
|
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.add(doc_link_label("Hyperlink", "Hyperlink"));
|
2021-02-20 15:07:42 +00:00
|
|
|
use egui::special_emojis::GITHUB;
|
|
|
|
ui.hyperlink_to(
|
2022-04-30 15:50:39 +00:00
|
|
|
format!("{} egui on GitHub", GITHUB),
|
2021-02-20 15:07:42 +00:00
|
|
|
"https://github.com/emilk/egui",
|
|
|
|
);
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.end_row();
|
2021-01-11 19:58:36 +00:00
|
|
|
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.add(doc_link_label("TextEdit", "TextEdit,text_edit"));
|
|
|
|
ui.add(egui::TextEdit::singleline(string).hint_text("Write something here"));
|
|
|
|
ui.end_row();
|
2021-01-11 20:07:17 +00:00
|
|
|
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.add(doc_link_label("Button", "button"));
|
|
|
|
if ui.button("Click me!").clicked() {
|
|
|
|
*boolean = !*boolean;
|
|
|
|
}
|
|
|
|
ui.end_row();
|
|
|
|
|
2022-04-16 20:55:15 +00:00
|
|
|
ui.add(doc_link_label("Link", "link"));
|
|
|
|
if ui.link("Click me!").clicked() {
|
|
|
|
*boolean = !*boolean;
|
|
|
|
}
|
|
|
|
ui.end_row();
|
|
|
|
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.add(doc_link_label("Checkbox", "checkbox"));
|
|
|
|
ui.checkbox(boolean, "Checkbox");
|
|
|
|
ui.end_row();
|
|
|
|
|
|
|
|
ui.add(doc_link_label("RadioButton", "radio"));
|
|
|
|
ui.horizontal(|ui| {
|
|
|
|
ui.radio_value(radio, Enum::First, "First");
|
|
|
|
ui.radio_value(radio, Enum::Second, "Second");
|
|
|
|
ui.radio_value(radio, Enum::Third, "Third");
|
2021-01-11 19:58:36 +00:00
|
|
|
});
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.end_row();
|
2021-01-11 19:58:36 +00:00
|
|
|
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.add(doc_link_label(
|
2021-03-07 18:51:07 +00:00
|
|
|
"SelectableLabel",
|
2021-02-20 11:07:15 +00:00
|
|
|
"selectable_value,SelectableLabel",
|
|
|
|
));
|
|
|
|
ui.horizontal(|ui| {
|
|
|
|
ui.selectable_value(radio, Enum::First, "First");
|
|
|
|
ui.selectable_value(radio, Enum::Second, "Second");
|
|
|
|
ui.selectable_value(radio, Enum::Third, "Third");
|
|
|
|
});
|
|
|
|
ui.end_row();
|
|
|
|
|
2021-08-23 19:28:06 +00:00
|
|
|
ui.add(doc_link_label("ComboBox", "ComboBox"));
|
2021-03-27 09:35:40 +00:00
|
|
|
|
|
|
|
egui::ComboBox::from_label("Take your pick")
|
|
|
|
.selected_text(format!("{:?}", radio))
|
|
|
|
.show_ui(ui, |ui| {
|
|
|
|
ui.selectable_value(radio, Enum::First, "First");
|
|
|
|
ui.selectable_value(radio, Enum::Second, "Second");
|
|
|
|
ui.selectable_value(radio, Enum::Third, "Third");
|
|
|
|
});
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.end_row();
|
|
|
|
|
|
|
|
ui.add(doc_link_label("Slider", "Slider"));
|
2021-03-27 15:07:18 +00:00
|
|
|
ui.add(egui::Slider::new(scalar, 0.0..=360.0).suffix("°"));
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.end_row();
|
|
|
|
|
2021-08-23 19:28:06 +00:00
|
|
|
ui.add(doc_link_label("DragValue", "DragValue"));
|
|
|
|
ui.add(egui::DragValue::new(scalar).speed(1.0));
|
|
|
|
ui.end_row();
|
|
|
|
|
2021-07-01 20:50:41 +00:00
|
|
|
ui.add(doc_link_label("ProgressBar", "ProgressBar"));
|
|
|
|
let progress = *scalar / 360.0;
|
|
|
|
let progress_bar = egui::ProgressBar::new(progress)
|
|
|
|
.show_percentage()
|
|
|
|
.animate(*animate_progress_bar);
|
|
|
|
*animate_progress_bar = ui
|
|
|
|
.add(progress_bar)
|
|
|
|
.on_hover_text("The progress bar can be animated!")
|
|
|
|
.hovered();
|
|
|
|
ui.end_row();
|
|
|
|
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.add(doc_link_label("Color picker", "color_edit"));
|
|
|
|
ui.color_edit_button_srgba(color);
|
|
|
|
ui.end_row();
|
|
|
|
|
2022-01-15 12:59:52 +00:00
|
|
|
let img_size = 16.0 * texture.size_vec2() / texture.size_vec2().y;
|
|
|
|
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.add(doc_link_label("Image", "Image"));
|
2022-01-15 12:59:52 +00:00
|
|
|
ui.image(texture, img_size);
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.end_row();
|
|
|
|
|
|
|
|
ui.add(doc_link_label("ImageButton", "ImageButton"));
|
2022-01-15 12:59:52 +00:00
|
|
|
if ui.add(egui::ImageButton::new(texture, img_size)).clicked() {
|
2021-02-20 11:07:15 +00:00
|
|
|
*boolean = !*boolean;
|
|
|
|
}
|
|
|
|
ui.end_row();
|
|
|
|
|
2022-04-28 09:23:34 +00:00
|
|
|
#[cfg(feature = "chrono")]
|
2022-03-31 19:13:25 +00:00
|
|
|
{
|
2022-04-03 16:14:40 +00:00
|
|
|
let date = date.get_or_insert_with(|| chrono::offset::Utc::now().date());
|
2022-03-31 19:13:25 +00:00
|
|
|
ui.add(doc_link_label("DatePickerButton", "DatePickerButton"));
|
|
|
|
ui.add(egui_extras::DatePickerButton::new(date));
|
|
|
|
ui.end_row();
|
|
|
|
}
|
|
|
|
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.add(doc_link_label("Separator", "separator"));
|
2021-01-14 22:25:51 +00:00
|
|
|
ui.separator();
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.end_row();
|
|
|
|
|
|
|
|
ui.add(doc_link_label("CollapsingHeader", "collapsing"));
|
|
|
|
ui.collapsing("Click to see what is hidden!", |ui| {
|
2021-03-21 13:46:32 +00:00
|
|
|
ui.horizontal_wrapped(|ui| {
|
2022-01-17 13:54:43 +00:00
|
|
|
ui.spacing_mut().item_spacing.x = 0.0;
|
|
|
|
ui.label("It's a ");
|
|
|
|
ui.add(doc_link_label("Spinner", "spinner"));
|
|
|
|
ui.add_space(4.0);
|
|
|
|
ui.add(egui::Spinner::new());
|
2021-02-20 11:07:15 +00:00
|
|
|
});
|
2021-01-11 22:50:50 +00:00
|
|
|
});
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.end_row();
|
|
|
|
|
|
|
|
ui.add(doc_link_label("Plot", "plot"));
|
2021-11-13 10:56:22 +00:00
|
|
|
example_plot(ui);
|
2021-02-20 11:07:15 +00:00
|
|
|
ui.end_row();
|
|
|
|
|
|
|
|
ui.hyperlink_to(
|
|
|
|
"Custom widget:",
|
|
|
|
super::toggle_switch::url_to_file_source_code(),
|
|
|
|
);
|
|
|
|
ui.add(super::toggle_switch::toggle(boolean)).on_hover_text(
|
|
|
|
"It's easy to create your own widgets!\n\
|
|
|
|
This toggle switch is just 15 lines of code.",
|
|
|
|
);
|
|
|
|
ui.end_row();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-13 10:56:22 +00:00
|
|
|
fn example_plot(ui: &mut egui::Ui) -> egui::Response {
|
2021-10-26 17:55:42 +00:00
|
|
|
use egui::plot::{Line, Value, Values};
|
2021-04-01 21:07:58 +00:00
|
|
|
let n = 128;
|
2021-05-27 16:40:20 +00:00
|
|
|
let line = Line::new(Values::from_values_iter((0..=n).map(|i| {
|
2021-02-20 11:07:15 +00:00
|
|
|
use std::f64::consts::TAU;
|
2021-10-26 17:55:42 +00:00
|
|
|
let x = egui::remap(i as f64, 0.0..=n as f64, -TAU..=TAU);
|
2021-05-27 16:40:20 +00:00
|
|
|
Value::new(x, x.sin())
|
|
|
|
})));
|
2021-10-26 17:55:42 +00:00
|
|
|
egui::plot::Plot::new("example_plot")
|
2021-02-20 11:07:15 +00:00
|
|
|
.height(32.0)
|
|
|
|
.data_aspect(1.0)
|
2021-11-13 10:56:22 +00:00
|
|
|
.show(ui, |plot_ui| plot_ui.line(line))
|
2021-11-27 22:59:32 +00:00
|
|
|
.response
|
2021-02-20 11:07:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn doc_link_label<'a>(title: &'a str, search_term: &'a str) -> impl egui::Widget + 'a {
|
|
|
|
let label = format!("{}:", title);
|
|
|
|
let url = format!("https://docs.rs/egui?search={}", search_term);
|
|
|
|
move |ui: &mut egui::Ui| {
|
|
|
|
ui.hyperlink_to(label, url).on_hover_ui(|ui| {
|
|
|
|
ui.horizontal_wrapped(|ui| {
|
|
|
|
ui.label("Search egui docs for");
|
|
|
|
ui.code(search_term);
|
|
|
|
});
|
|
|
|
})
|
2021-01-11 19:58:36 +00:00
|
|
|
}
|
|
|
|
}
|