feat: initial porting to egui
Former-commit-id: 9d3753be324466c78bf14fcc14e89fc414812f4a
This commit is contained in:
parent
fcb42d42de
commit
a0c00a810a
117
\
Normal file
117
\
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
use bevy::{
|
||||||
|
core_pipeline::{
|
||||||
|
tonemapping::Tonemapping,
|
||||||
|
},
|
||||||
|
window::*,
|
||||||
|
prelude::*,
|
||||||
|
};
|
||||||
|
|
||||||
|
use bevy_egui::{egui, EguiContexts, EguiPlugin};
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use lazy_static::lazy_static;
|
||||||
|
|
||||||
|
mod helpers;
|
||||||
|
use crate::helpers::*;
|
||||||
|
|
||||||
|
const VERSION: &str = env!("CARGO_PKG_VERSION");
|
||||||
|
const PKGNAME: &str = env!("CARGO_PKG_NAME");
|
||||||
|
|
||||||
|
// Create a map of the Hypernova colorscheme
|
||||||
|
lazy_static!{
|
||||||
|
static ref HYPERNOVA: HashMap<&'static str, (u8, u8, u8)> = vec![
|
||||||
|
("BLACK", (13, 13, 15)),
|
||||||
|
("DARK_GRAY", (21, 21, 23)),
|
||||||
|
("GRAY", (39, 39, 43)),
|
||||||
|
("LIGHT_GRAY", (69, 68, 73)),
|
||||||
|
("SUBTEXT", (217, 208, 215)),
|
||||||
|
("WHITE", (236, 229, 234)),
|
||||||
|
("RED", (240, 105, 105)),
|
||||||
|
("MAGENTA", (232, 135, 187)),
|
||||||
|
("PURPLE", (162, 146, 232)),
|
||||||
|
("BLUE", (120, 175, 196)),
|
||||||
|
("CYAN", (126, 230, 174)),
|
||||||
|
("GREEN", (145, 214, 92)),
|
||||||
|
("YELLOW", (217, 213, 100)),
|
||||||
|
].iter().copied().collect();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
App::new()
|
||||||
|
.add_plugins(
|
||||||
|
(
|
||||||
|
DefaultPlugins.set(WindowPlugin {
|
||||||
|
primary_window: Some(Window {
|
||||||
|
title: format!("{} {}", titlecase(PKGNAME), VERSION).into(),
|
||||||
|
mode: WindowMode::Fullscreen,
|
||||||
|
..default()
|
||||||
|
}),
|
||||||
|
..default()
|
||||||
|
}),
|
||||||
|
EguiPlugin
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.add_systems(Startup,
|
||||||
|
(setup, setup_ui))
|
||||||
|
.add_systems(Update, render_ui)
|
||||||
|
.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bevy engine setup
|
||||||
|
fn setup(mut commands: Commands) {
|
||||||
|
commands.spawn(
|
||||||
|
Camera2dBundle {
|
||||||
|
camera: Camera {
|
||||||
|
hdr: true,
|
||||||
|
..default()
|
||||||
|
},
|
||||||
|
tonemapping: Tonemapping::TonyMcMapface,
|
||||||
|
..default()
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// On startup: setup some UI components
|
||||||
|
fn setup_ui(
|
||||||
|
mut contexts: EguiContexts,
|
||||||
|
) {
|
||||||
|
// Set Victor Mono as the default custom font
|
||||||
|
let mut fonts = egui::FontDefinitions::default();
|
||||||
|
fonts.font_data.insert("victor_mono".to_owned(),
|
||||||
|
egui::FontData::from_static(include_bytes!("../assets/fonts/VictorMono-Regular.otf")));
|
||||||
|
fonts.families.get_mut(&egui::FontFamily::Proportional).unwrap()
|
||||||
|
.insert(0, "victor_mono".to_owned());
|
||||||
|
contexts.ctx_mut().set_fonts(fonts);
|
||||||
|
|
||||||
|
|
||||||
|
let mut username_text: String = "Username".to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
// On update: render the UI
|
||||||
|
fn render_ui(
|
||||||
|
mut contexts: EguiContexts,
|
||||||
|
mut windows: Query<&mut Window>,
|
||||||
|
) {
|
||||||
|
let window = windows.single_mut();
|
||||||
|
let window_width = window.resolution.width();
|
||||||
|
let window_height = window.resolution.height();
|
||||||
|
|
||||||
|
egui::Window::new("Login")
|
||||||
|
.anchor(egui::Align2::CENTER_CENTER, egui::Vec2::new(0., 0.))
|
||||||
|
.resizable(false)
|
||||||
|
.title_bar(false)
|
||||||
|
.show(contexts.ctx_mut(), |ui| {
|
||||||
|
ui.set_width(window_width / 2.5);
|
||||||
|
ui.set_height(window_height / 3.);
|
||||||
|
|
||||||
|
ui.with_layout(egui::Layout::top_down(egui::Align::Center), |ui| {
|
||||||
|
let purple = HYPERNOVA.get("PURPLE").unwrap();
|
||||||
|
let purple = egui::Color32::from_rgb(purple.0, purple.1, purple.2);
|
||||||
|
|
||||||
|
ui.heading(egui::RichText::new("Login").size(30.).color(purple));
|
||||||
|
|
||||||
|
let username = egui::TextEdit::singleline(&mut username_text);
|
||||||
|
let output = username.show(ui);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
|
@ -1,5 +1,3 @@
|
||||||
use crate::helpers;
|
|
||||||
|
|
||||||
pub fn titlecase(s: &str) -> String {
|
pub fn titlecase(s: &str) -> String {
|
||||||
let mut c = s.chars();
|
let mut c = s.chars();
|
||||||
match c.next() {
|
match c.next() {
|
||||||
|
|
173
src/main.rs
173
src/main.rs
|
@ -1,13 +1,9 @@
|
||||||
use bevy::{
|
use bevy::{core_pipeline::tonemapping::Tonemapping, prelude::*, window::*};
|
||||||
core_pipeline::{
|
|
||||||
tonemapping::Tonemapping,
|
use bevy_egui::{egui, EguiContexts, EguiPlugin};
|
||||||
},
|
|
||||||
window::*,
|
|
||||||
prelude::*,
|
|
||||||
winit::WinitSettings,
|
|
||||||
};
|
|
||||||
use std::collections::HashMap;
|
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
mod helpers;
|
mod helpers;
|
||||||
use crate::helpers::*;
|
use crate::helpers::*;
|
||||||
|
@ -17,28 +13,29 @@ const PKGNAME: &str = env!("CARGO_PKG_NAME");
|
||||||
|
|
||||||
// Create a map of the Hypernova colorscheme
|
// Create a map of the Hypernova colorscheme
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
static ref HYPERNOVA: HashMap<&'static str, Color> = vec![
|
static ref HYPERNOVA: HashMap<&'static str, (u8, u8, u8)> = vec![
|
||||||
("BLACK", Color::hex("0d0d0f").unwrap()),
|
("BLACK", (13, 13, 15)),
|
||||||
("DARK_GRAY", Color::hex("151517").unwrap()),
|
("DARK_GRAY", (21, 21, 23)),
|
||||||
("GRAY", Color::hex("27272b").unwrap()),
|
("GRAY", (39, 39, 43)),
|
||||||
("LIGHT_GRAY", Color::hex("454449").unwrap()),
|
("LIGHT_GRAY", (69, 68, 73)),
|
||||||
("SUBTEXT", Color::hex("d9d0d7").unwrap()),
|
("SUBTEXT", (217, 208, 215)),
|
||||||
("WHITE", Color::hex("ece5ea").unwrap()),
|
("WHITE", (236, 229, 234)),
|
||||||
("RED", Color::hex("f06969").unwrap()),
|
("RED", (240, 105, 105)),
|
||||||
("MAGENTA", Color::hex("e887bb").unwrap()),
|
("MAGENTA", (232, 135, 187)),
|
||||||
("PURPLE", Color::hex("a292e8").unwrap()),
|
("PURPLE", (162, 146, 232)),
|
||||||
("BLUE", Color::hex("78b9c4").unwrap()),
|
("BLUE", (120, 175, 196)),
|
||||||
("CYAN", Color::hex("7ee6ae").unwrap()),
|
("CYAN", (126, 230, 174)),
|
||||||
("GREEN", Color::hex("91d65c").unwrap()),
|
("GREEN", (145, 214, 92)),
|
||||||
("YELLOW", Color::hex("d9d564").unwrap()),
|
("YELLOW", (217, 213, 100)),
|
||||||
].iter().copied().collect();
|
]
|
||||||
|
.iter()
|
||||||
|
.copied()
|
||||||
|
.collect();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
// Only run the app when there is user input, significantly reducing CPU/GPU usage
|
.add_plugins((
|
||||||
.insert_resource(WinitSettings::desktop_app())
|
|
||||||
.add_plugins(
|
|
||||||
DefaultPlugins.set(WindowPlugin {
|
DefaultPlugins.set(WindowPlugin {
|
||||||
primary_window: Some(Window {
|
primary_window: Some(Window {
|
||||||
title: format!("{} {}", titlecase(PKGNAME), VERSION).into(),
|
title: format!("{} {}", titlecase(PKGNAME), VERSION).into(),
|
||||||
|
@ -46,99 +43,61 @@ fn main() {
|
||||||
..default()
|
..default()
|
||||||
}),
|
}),
|
||||||
..default()
|
..default()
|
||||||
})
|
}),
|
||||||
)
|
EguiPlugin,
|
||||||
.add_systems(
|
))
|
||||||
Startup,
|
.add_systems(Startup, (setup, setup_ui))
|
||||||
(setup, setup_ui)
|
.add_systems(Update, render_ui)
|
||||||
)
|
|
||||||
.run();
|
.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Bevy engine setup
|
||||||
fn setup(mut commands: Commands) {
|
fn setup(mut commands: Commands) {
|
||||||
commands.spawn(
|
commands.spawn(Camera2dBundle {
|
||||||
Camera2dBundle {
|
|
||||||
camera: Camera {
|
camera: Camera {
|
||||||
hdr: true,
|
hdr: true,
|
||||||
..default()
|
..default()
|
||||||
},
|
},
|
||||||
tonemapping: Tonemapping::TonyMcMapface,
|
tonemapping: Tonemapping::TonyMcMapface,
|
||||||
..default()
|
..default()
|
||||||
}
|
});
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup_ui(
|
// On startup: setup some UI components
|
||||||
server: Res<AssetServer>,
|
fn setup_ui(mut contexts: EguiContexts) {
|
||||||
mut commands: Commands
|
// Set Victor Mono as the default custom font
|
||||||
) {
|
let mut fonts = egui::FontDefinitions::default();
|
||||||
let bold_font: Handle<Font> = server.load("fonts/VictorMono-Bold.otf");
|
fonts.font_data.insert(
|
||||||
let regular_font: Handle<Font> = server.load("fonts/VictorMono-Regular.otf");
|
"victor_mono".to_owned(),
|
||||||
|
egui::FontData::from_static(include_bytes!("../assets/fonts/VictorMono-Regular.otf")),
|
||||||
let title_style = TextStyle {
|
|
||||||
font: bold_font.clone(),
|
|
||||||
font_size: 70.,
|
|
||||||
color: HYPERNOVA.get("WHITE").copied().unwrap(),
|
|
||||||
};
|
|
||||||
let login_style = TextStyle {
|
|
||||||
font: bold_font.clone(),
|
|
||||||
font_size: 30.,
|
|
||||||
color: HYPERNOVA.get("PURPLE").copied().unwrap(),
|
|
||||||
};
|
|
||||||
|
|
||||||
commands
|
|
||||||
.spawn(NodeBundle {
|
|
||||||
style: Style {
|
|
||||||
width: Val::Percent(100.),
|
|
||||||
height: Val::Percent(100.0),
|
|
||||||
flex_direction: FlexDirection::Column,
|
|
||||||
align_items: AlignItems::Center,
|
|
||||||
..default()
|
|
||||||
},
|
|
||||||
background_color: BackgroundColor(HYPERNOVA.get("DARK_GRAY").copied().unwrap()),
|
|
||||||
..default()
|
|
||||||
})
|
|
||||||
.with_children(|parent| {
|
|
||||||
parent
|
|
||||||
.spawn(TextBundle::from_section("Ambition", title_style.clone())
|
|
||||||
.with_text_alignment(TextAlignment::Center)
|
|
||||||
.with_style(Style {
|
|
||||||
position_type: PositionType::Absolute,
|
|
||||||
margin: UiRect {
|
|
||||||
top: Val::Vh(10.),
|
|
||||||
..default()
|
|
||||||
},
|
|
||||||
..default()
|
|
||||||
})
|
|
||||||
);
|
);
|
||||||
parent
|
fonts
|
||||||
.spawn(NodeBundle {
|
.families
|
||||||
style: Style {
|
.get_mut(&egui::FontFamily::Proportional)
|
||||||
flex_direction: FlexDirection::Column,
|
.unwrap()
|
||||||
align_items: AlignItems::Center,
|
.insert(0, "victor_mono".to_owned());
|
||||||
width: Val::Percent(50.),
|
contexts.ctx_mut().set_fonts(fonts);
|
||||||
height: Val::Percent(40.),
|
}
|
||||||
margin: UiRect {
|
|
||||||
top: Val::Vh(30.),
|
// On update: render the UI
|
||||||
..default()
|
fn render_ui(mut contexts: EguiContexts, mut windows: Query<&mut Window>) {
|
||||||
},
|
let window = windows.single_mut();
|
||||||
padding: UiRect {
|
let window_width = window.resolution.width();
|
||||||
top: Val::Percent(2.),
|
let window_height = window.resolution.height();
|
||||||
..default()
|
|
||||||
},
|
egui::Window::new("Login")
|
||||||
..default()
|
.anchor(egui::Align2::CENTER_CENTER, egui::Vec2::new(0., 0.))
|
||||||
},
|
.resizable(false)
|
||||||
background_color: BackgroundColor(HYPERNOVA.get("GRAY").copied().unwrap()),
|
.title_bar(false)
|
||||||
..default()
|
.show(contexts.ctx_mut(), |ui| {
|
||||||
})
|
ui.set_width(window_width / 2.5);
|
||||||
.with_children(|parent| {
|
ui.set_height(window_height / 3.);
|
||||||
parent
|
|
||||||
.spawn(TextBundle::from_section("Login", login_style.clone())
|
ui.with_layout(egui::Layout::top_down(egui::Align::Center), |ui| {
|
||||||
.with_text_alignment(TextAlignment::Center)
|
let purple = HYPERNOVA.get("PURPLE").unwrap();
|
||||||
.with_style(Style {
|
let purple = egui::Color32::from_rgb(purple.0, purple.1, purple.2);
|
||||||
position_type: PositionType::Absolute,
|
|
||||||
..default()
|
ui.heading(egui::RichText::new("Login").size(30.).color(purple));
|
||||||
}));
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue