Improve example app

This commit is contained in:
Emil Ernerfeldt 2020-05-10 19:04:10 +02:00
parent 34b4c985a2
commit f1c57cb950
7 changed files with 194 additions and 64 deletions

View file

@ -445,25 +445,35 @@ impl Context {
}
impl Context {
pub fn ui(&self, ui: &mut Ui) {
pub fn settings_ui(&self, ui: &mut Ui) {
use crate::containers::*;
ui.collapsing("Style", |ui| {
self.mesher_options.lock().ui(ui);
self.style_ui(ui);
});
CollapsingHeader::new("Style")
// .default_open()
.show(ui, |ui| {
self.mesher_options.lock().ui(ui);
self.style_ui(ui);
});
ui.collapsing("Fonts", |ui| {
let old_font_definitions = self.fonts().definitions();
let mut new_font_definitions = old_font_definitions.clone();
font_definitions_ui(&mut new_font_definitions, ui);
self.fonts().texture().ui(ui);
if *old_font_definitions != new_font_definitions {
let fonts =
Fonts::from_definitions(new_font_definitions, self.input().pixels_per_point);
self.set_fonts(fonts);
}
});
CollapsingHeader::new("Fonts")
// .default_open()
.show(ui, |ui| {
let old_font_definitions = self.fonts().definitions();
let mut new_font_definitions = old_font_definitions.clone();
font_definitions_ui(&mut new_font_definitions, ui);
self.fonts().texture().ui(ui);
if *old_font_definitions != new_font_definitions {
let fonts = Fonts::from_definitions(
new_font_definitions,
self.input().pixels_per_point,
);
self.set_fonts(fonts);
}
});
}
pub fn inspection_ui(&self, ui: &mut Ui) {
use crate::containers::*;
ui.collapsing("Input", |ui| {
CollapsingHeader::new("Raw Input")
@ -481,16 +491,69 @@ impl Context {
ui.input().screen_size.y,
ui.input().pixels_per_point,
));
if let Some(mouse_pos) = ui.input().mouse_pos {
ui.add(label!("mouse_pos: {:.2} x {:.2}", mouse_pos.x, mouse_pos.y,));
} else {
ui.add_label("mouse_pos: None");
}
ui.add(label!("Painting:").text_style(TextStyle::Heading));
self.paint_stats.lock().ui(ui);
});
}
pub fn memory_ui(&self, ui: &mut crate::Ui) {
use crate::widgets::*;
if ui
.add(Button::new("Reset all"))
.tooltip_text("Reset all Emigui state")
.clicked
{
*self.memory() = Default::default();
}
ui.horizontal(|ui| {
ui.add(label!(
"{} areas (window positions)",
self.memory().areas.count()
));
if ui.add(Button::new("Reset")).clicked {
self.memory().areas = Default::default();
}
});
ui.horizontal(|ui| {
ui.add(label!(
"{} collapsing headers",
self.memory().collapsing_headers.len()
));
if ui.add(Button::new("Reset")).clicked {
self.memory().collapsing_headers = Default::default();
}
});
ui.horizontal(|ui| {
ui.add(label!("{} menu bars", self.memory().menu_bar.len()));
if ui.add(Button::new("Reset")).clicked {
self.memory().menu_bar = Default::default();
}
});
ui.horizontal(|ui| {
ui.add(label!("{} scroll areas", self.memory().scroll_areas.len()));
if ui.add(Button::new("Reset")).clicked {
self.memory().scroll_areas = Default::default();
}
});
ui.horizontal(|ui| {
ui.add(label!("{} resize areas", self.memory().resize.len()));
if ui.add(Button::new("Reset")).clicked {
self.memory().resize = Default::default();
}
});
ui.add(
label!("NOTE: the position of this window cannot be reset from within itself.")
.auto_shrink(),
);
}
}
fn font_definitions_ui(font_definitions: &mut FontDefinitions, ui: &mut Ui) {

View file

@ -1,8 +1,94 @@
// #![allow(dead_code, unused_variables)] // should be commented out
use std::sync::Arc;
use serde_derive::{Deserialize, Serialize};
use crate::{color::*, containers::*, widgets::*, *};
// ----------------------------------------------------------------------------
#[derive(Default, Deserialize, Serialize)]
pub struct ExampleApp {
example_window: ExampleWindow,
open_windows: OpenWindows,
}
impl ExampleApp {
pub fn ui(&mut self, ctx: &Arc<Context>) {
// TODO: Make it even simpler to show a window
Window::new("Examples")
.default_pos(pos2(32.0, 100.0))
.default_size(vec2(430.0, 600.0))
.show(ctx, |ui| {
show_menu_bar(ui, &mut self.open_windows);
self.example_window.ui(ui);
});
Window::new("Settings")
.open(&mut self.open_windows.settings)
.default_pos(pos2(500.0, 100.0))
.default_size(vec2(350.0, 200.0))
.show(ctx, |ui| {
ctx.settings_ui(ui);
});
Window::new("Inspection")
.open(&mut self.open_windows.inspection)
.default_pos(pos2(500.0, 400.0))
.default_size(vec2(400.0, 300.0))
.show(ctx, |ui| {
ctx.inspection_ui(ui);
});
Window::new("Memory")
.open(&mut self.open_windows.memory)
.default_pos(pos2(700.0, 350.0))
.auto_sized()
.show(ctx, |ui| {
ctx.memory_ui(ui);
});
}
}
#[derive(Deserialize, Serialize)]
struct OpenWindows {
settings: bool,
inspection: bool,
memory: bool,
}
impl Default for OpenWindows {
fn default() -> Self {
Self {
settings: false,
inspection: true,
memory: false,
}
}
}
fn show_menu_bar(ui: &mut Ui, windows: &mut OpenWindows) {
menu::bar(ui, |ui| {
menu::menu(ui, "File", |ui| {
ui.add(Button::new("Do nothing"));
ui.add(Button::new("Carry on"));
ui.add(Button::new("Don't Quit"));
});
menu::menu(ui, "Windows", |ui| {
ui.add(Checkbox::new(&mut windows.settings, "Settings"));
ui.add(Checkbox::new(&mut windows.inspection, "Inspection"));
ui.add(Checkbox::new(&mut windows.memory, "Memory"));
});
menu::menu(ui, "About", |ui| {
ui.add(label!("This is Emigui, but you already knew that!"));
});
});
}
// ----------------------------------------------------------------------------
/// Showcase some ui code
#[derive(Deserialize, Serialize)]
pub struct ExampleWindow {
checked: bool,
count: usize,
@ -27,7 +113,7 @@ impl Default for ExampleWindow {
checked: true,
radio: 0,
count: 0,
text_inputs: Default::default(),
text_inputs: ["Hello".to_string(), "World".to_string(), "".to_string()],
size: vec2(100.0, 50.0),
corner_radius: 5.0,
@ -201,7 +287,9 @@ impl ExampleWindow {
}
}
#[derive(Default)]
// ----------------------------------------------------------------------------
#[derive(Default, Deserialize, Serialize)]
struct Painting {
lines: Vec<Vec<Vec2>>,
}
@ -256,6 +344,8 @@ impl Painting {
}
}
// ----------------------------------------------------------------------------
const LOREM_IPSUM: &str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque. Aliquam faucibus, elit ut dictum aliquet, felis nisl adipiscing sapien, sed malesuada diam lacus eget erat. Cras mollis scelerisque nunc. Nullam arcu. Aliquam consequat. Curabitur augue lorem, dapibus quis, laoreet et, pretium ac, nisi. Aenean magna nisl, mollis quis, molestie eu, feugiat in, orci. In hac habitasse platea dictumst.";

View file

@ -193,7 +193,7 @@ impl Div<f32> for Vec2 {
impl std::fmt::Debug for Vec2 {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "[{} {}]", self.x, self.y)
write!(f, "[{:.1} {:.1}]", self.x, self.y)
}
}
@ -312,7 +312,7 @@ impl Sub<Vec2> for Pos2 {
impl std::fmt::Debug for Pos2 {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "[{} {}]", self.x, self.y)
write!(f, "[{:.1} {:.1}]", self.x, self.y)
}
}

View file

@ -1,4 +1,5 @@
#![deny(warnings)]
#![warn(clippy::all)]
#![allow(clippy::single_match)]
mod painter;

View file

@ -1,4 +1,5 @@
#![deny(warnings)]
#![warn(clippy::all)]
pub mod webgl;

View file

@ -1,8 +1,10 @@
#![deny(warnings)]
#![warn(clippy::all)]
use std::time::{Duration, Instant};
use {
emigui::{containers::*, example_app::ExampleWindow, widgets::*, *},
emigui::{example_app::ExampleApp, widgets::*, *},
glium::glutin,
};
@ -12,6 +14,7 @@ fn main() {
let context = glutin::ContextBuilder::new();
let display = glium::Display::new(window, context, &events_loop).unwrap();
// TODO: persist position/size
display
.gl_window()
.set_inner_size(glutin::dpi::LogicalSize {
@ -39,7 +42,7 @@ fn main() {
let mut running = true;
let mut frame_start = Instant::now();
let mut frame_times = emigui::MovementTracker::new(1000, 1.0);
let mut example_app = ExampleWindow::default();
let mut example_app = ExampleApp::default();
let mut clipboard = emigui_glium::init_clipboard();
let memory_path = "emigui.json";
@ -49,8 +52,8 @@ fn main() {
{
// Keep smooth frame rate. TODO: proper vsync
let frame_duration = frame_start.elapsed();
if frame_duration < Duration::from_millis(16) {
std::thread::sleep(Duration::from_millis(16) - frame_duration);
if frame_duration < Duration::from_millis(33) {
std::thread::sleep(Duration::from_millis(33) - frame_duration);
}
frame_start = Instant::now();
}
@ -91,23 +94,7 @@ fn main() {
.text_style(TextStyle::Monospace),
);
// TODO: Make it even simpler to show a window
Window::new("Examples")
.default_pos(pos2(50.0, 100.0))
.default_size(vec2(300.0, 600.0))
// .mutate(|w| w.resize = w.resize.auto_expand_width(true))
// .resize(|r| r.auto_expand_width(true))
.show(ui.ctx(), |ui| {
example_app.ui(ui);
});
Window::new("Emigui settings")
.default_pos(pos2(450.0, 100.0))
.default_size(vec2(450.0, 500.0))
.show(ui.ctx(), |ui| {
ctx.ui(ui);
});
example_app.ui(&ctx);
let (output, paint_batches) = ctx.end_frame();

View file

@ -1,10 +1,12 @@
#![deny(warnings)]
#![warn(clippy::all)]
use std::sync::Arc;
use {
emigui::{
color::srgba, containers::*, example_app::ExampleWindow, label, widgets::Separator, Align,
RawInput, TextStyle, *,
color::srgba, example_app::ExampleApp, label, widgets::Separator, Align, RawInput,
TextStyle, *,
},
emigui_wasm::now_sec,
};
@ -13,7 +15,7 @@ use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub struct State {
example_app: ExampleWindow,
example_app: ExampleApp,
ctx: Arc<Context>,
webgl_painter: emigui_wasm::webgl::Painter,
@ -75,21 +77,7 @@ impl State {
.text_style(TextStyle::Monospace),
);
// TODO: Make it even simpler to show a window
Window::new("Examples")
.default_pos(pos2(32.0, 300.0))
.default_size(vec2(300.0, 400.0))
.show(ui.ctx(), |ui| {
self.example_app.ui(ui);
});
Window::new("Emigui settings")
.default_pos(pos2(400.0, 300.0))
.default_size(vec2(400.0, 400.0))
.show(ui.ctx(), |ui| {
self.ctx.ui(ui);
});
self.example_app.ui(&self.ctx);
let bg_color = srgba(0, 0, 0, 0); // Use background css color.
let (output, batches) = self.ctx.end_frame();