Improve example app
This commit is contained in:
parent
34b4c985a2
commit
f1c57cb950
7 changed files with 194 additions and 64 deletions
|
@ -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) {
|
||||
|
|
|
@ -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.";
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#![deny(warnings)]
|
||||
#![warn(clippy::all)]
|
||||
#![allow(clippy::single_match)]
|
||||
mod painter;
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#![deny(warnings)]
|
||||
#![warn(clippy::all)]
|
||||
|
||||
pub mod webgl;
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue