egui/egui_demo_lib/src/apps/demo/widget_gallery.rs
Emil Ernerfeldt 247026149c
Multiple mouse button support (#135)
Add support for primary, secondary and middle mouse buttons. Also improve ability to click things in low FPS situations.

This introduces a lot of breaking changes:

    Backends/integrations now pass mouse events via the even stream.
    Response has an interface of mostly methods instead of public members.
    input.mouse is now input.pointer and has new interface.


* Rename 'mouse' to 'pointer' everywhere (pointer = mouse or touch)

* Make Response::clicked and Response::double_clicked into methods

* Remove Response::active and add dragged() and interact_pointer_pos()

* Support multiple mouse buttons

* Make PointerState interface all methods

* Make most members of Response private
2021-01-25 18:50:19 +01:00

153 lines
4.4 KiB
Rust

#[derive(Debug, PartialEq)]
#[cfg_attr(feature = "persistence", derive(serde::Deserialize, serde::Serialize))]
enum Enum {
First,
Second,
Third,
}
#[cfg_attr(feature = "persistence", derive(serde::Deserialize, serde::Serialize))]
pub struct WidgetGallery {
boolean: bool,
radio: Enum,
scalar: f32,
string: String,
color: egui::Color32,
}
impl Default for WidgetGallery {
fn default() -> Self {
Self {
boolean: false,
radio: Enum::First,
scalar: 42.0,
string: "Hello World!".to_owned(),
color: egui::Color32::LIGHT_BLUE.linear_multiply(0.5),
}
}
}
impl super::Demo for WidgetGallery {
fn name(&self) -> &str {
"🗄 Widget Gallery"
}
fn show(&mut self, ctx: &egui::CtxRef, open: &mut bool) {
egui::Window::new(self.name())
.open(open)
.resizable(false)
.show(ctx, |ui| {
use super::View;
self.ui(ui);
});
}
}
impl super::View for WidgetGallery {
fn ui(&mut self, ui: &mut egui::Ui) {
let Self {
boolean,
radio,
scalar,
string,
color,
} = self;
let grid = egui::Grid::new("my_grid")
.striped(true)
.spacing([40.0, 4.0]);
grid.show(ui, |ui| {
ui.label("Label:");
ui.label("Welcome to the widget gallery!");
ui.end_row();
ui.label("Hyperlink:");
ui.add(egui::Hyperlink::new("https://github.com/emilk/egui").text(" egui home page"));
ui.end_row();
ui.label("Text Input:");
ui.text_edit_singleline(string);
ui.end_row();
ui.label("Checkbox:");
ui.checkbox(boolean, "Checkbox");
ui.end_row();
ui.label("Radio buttons:");
ui.horizontal(|ui| {
ui.radio_value(radio, Enum::First, "First");
ui.radio_value(radio, Enum::Second, "Second");
ui.radio_value(radio, Enum::Third, "Third");
});
ui.end_row();
ui.label("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();
ui.label("ComboBox:");
egui::combo_box_with_label(ui, "Take your pick", format!("{:?}", radio), |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();
ui.label("Slider:");
ui.add(egui::Slider::f32(scalar, 0.0..=100.0).text("value"));
ui.end_row();
ui.label("DragValue:");
ui.add(egui::DragValue::f32(scalar).speed(1.0));
ui.end_row();
ui.label("Color picker:");
ui.color_edit_button_srgba(color);
ui.end_row();
ui.label("Image:");
ui.image(egui::TextureId::Egui, [24.0, 16.0])
.on_hover_text("The font texture");
ui.end_row();
ui.label("Button:");
if ui.button("Toggle boolean").clicked() {
*boolean = !*boolean;
}
ui.end_row();
ui.label("ImageButton:");
if ui
.add(egui::ImageButton::new(egui::TextureId::Egui, [24.0, 16.0]))
.clicked()
{
*boolean = !*boolean;
}
ui.end_row();
ui.label("Separator:");
ui.separator();
ui.end_row();
ui.label("CollapsingHeader:");
ui.collapsing("Click to see what is hidden!", |ui| {
ui.horizontal_wrapped_for_text(egui::TextStyle::Body, |ui| {
ui.label(
"Not much, as it turns out - but here is a gold star for you for checking:",
);
ui.colored_label(egui::Color32::GOLD, "");
});
});
ui.end_row();
});
ui.separator();
ui.vertical_centered(|ui| {
ui.add(crate::__egui_github_link_file!());
});
}
}