cyborg/editor/src/ui.rs

171 lines
5.1 KiB
Rust

use cyborg::camera::Flycam;
pub struct UserInterface {
developer_mode: bool,
show_profiler: bool,
quit: bool,
show_about: bool,
log_contents: String,
}
impl UserInterface {
pub fn new() -> Self {
Self {
developer_mode: true,
show_profiler: false,
quit: false,
show_about: false,
log_contents: "Hello logging!\n".to_string(),
}
}
pub fn should_quit(&self) -> bool {
self.quit
}
pub fn run(&mut self, ctx: &egui::Context, viewport: &mut ViewportWidget) {
egui::TopBottomPanel::top("menu_bar").show(ctx, |ui| {
egui::menu::bar(ui, |ui| {
ui.menu_button("File", |ui| {
if self.developer_mode {
if ui.button("fuck").clicked() {
println!("fuck");
}
}
if ui.button("Save").clicked() {
println!("Saving!");
ui.close_menu();
}
if ui.button("Save as...").clicked() {
println!("Saving as!");
ui.close_menu();
}
if ui.button("Open...").clicked() {
println!("Opening!");
ui.close_menu();
}
if ui.button("Quit").clicked() {
println!("Quitting!");
ui.close_menu();
self.quit = true;
}
});
ui.menu_button("Edit", |ui| {
if ui.button("Undo").clicked() {
println!("Undoing!");
}
if ui.button("Redo").clicked() {
println!("Redoing!");
}
});
ui.menu_button("View", |ui| {
ui.checkbox(&mut self.developer_mode, "Developer mode");
if ui.checkbox(&mut self.show_profiler, "Profiler").changed() {
puffin_egui::puffin::set_scopes_on(self.show_profiler);
}
});
ui.menu_button("Help", |ui| {
if ui.button("About").clicked() {
self.show_about = true;
ui.close_menu();
}
});
})
});
egui::Window::new("example_window").show(ctx, |ui| {
ui.heading("Hello world!");
});
if self.show_profiler {
self.show_profiler = puffin_egui::profiler_window(ctx);
}
if self.show_about {
egui::Window::new("About")
.open(&mut self.show_about)
.resizable(false)
.collapsible(false)
.show(ctx, |ui| {
ui.vertical_centered(|ui| {
ui.heading("Cyborg Editor");
});
});
}
egui::TopBottomPanel::bottom("info_panel")
.resizable(true)
.show(ctx, |ui| {
ui.heading("Log Output");
egui::containers::ScrollArea::vertical()
.auto_shrink([false, false])
.max_width(f32::INFINITY)
.max_height(f32::INFINITY)
.show(ui, |ui| {
let text_edit = egui::TextEdit::multiline(&mut self.log_contents)
.desired_width(f32::INFINITY)
.frame(false);
ui.add(text_edit);
});
});
egui::CentralPanel::default().show(ctx, |ui| {
ui.add(viewport);
ui.heading("Viewport");
});
}
}
pub struct ViewportWidget {
pub texture: egui::TextureId,
pub flycam: Flycam,
}
impl ViewportWidget {
pub fn new(texture: egui::TextureId) -> Self {
Self {
texture,
flycam: Flycam::new(0.002, 10.0, 0.25),
}
}
}
impl egui::Widget for &mut ViewportWidget {
fn ui(self, ui: &mut egui::Ui) -> egui::Response {
ui.style_mut().spacing.window_margin = egui::style::Margin::same(0.0);
let rect = ui.max_rect();
let id = egui::Id::new("viewport_widget");
let sense = egui::Sense::click_and_drag();
let response = ui.interact(rect, id, sense);
use egui::{pos2, Color32, Mesh, Rect, Shape};
let mut mesh = Mesh::with_texture(self.texture);
let uv = Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0));
let tint = Color32::WHITE;
mesh.add_rect_with_uv(rect, uv, tint);
ui.painter().add(Shape::mesh(mesh));
if response.dragged() {
println!("dragging");
let delta = response.drag_delta();
self.flycam.process_mouse(delta.x as f64, delta.y as f64);
}
println!("{:#?}", self.flycam);
self.flycam.update();
response
}
}