Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switched display values to menu buttons #1

Merged
merged 3 commits into from Jan 24, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions Cargo.toml
Expand Up @@ -6,3 +6,5 @@ edition = "2021"
[dependencies]
bevy = "0.6"
bevy_egui = "0.10"
strum = "0.17.1"
strum_macros = "0.17.1"
51 changes: 29 additions & 22 deletions src/bottom_panel.rs
@@ -1,47 +1,54 @@
use bevy::{
diagnostic::{Diagnostics, FrameTimeDiagnosticsPlugin},
prelude::*,
diagnostic::{
Diagnostics,
FrameTimeDiagnosticsPlugin
}
};

use bevy_egui::*;

use crate::top_panel::ToolbarSettings;

pub(crate) struct BottomPanel;

impl Plugin for BottomPanel {
fn build(
&self,
app: &mut App
) {
fn build(&self, app: &mut App) {
app.add_system(bottom_panel);
}
}

pub(self) fn bottom_panel(
egui: Res<EguiContext>,
msaa: Res<Msaa>,
diag: Res<Diagnostics>,
mut windows: ResMut<Windows>
mut windows: ResMut<Windows>,
mut settings: ResMut<ToolbarSettings>,
) {
let prime = windows
.get_primary_mut()
.unwrap();

egui::TopBottomPanel::bottom("Window state")
.show(egui.ctx(), |ui| {
ui.horizontal(|ui| {
ui.label(format!("Title: {}", prime.title()));
ui.label(format!("Vsync: {}", prime.vsync()));
let prime = windows.get_primary_mut().unwrap();

egui::TopBottomPanel::bottom("Window state").show(egui.ctx(), |ui| {
ui.horizontal(|ui| {
if settings.setting_toggles.title {
ui.label("Title:");
ui.spacing_mut().text_edit_width = 160.;
ui.text_edit_singleline(&mut settings.title);

if prime.title().ne(&settings.title) {
prime.set_title(settings.title.clone());
}
}

if settings.setting_toggles.fps {
if let Some(fps) = diag.get(FrameTimeDiagnosticsPlugin::FPS) {
if let Some(average) = fps.average() {
ui.label(format!("FPS: {:.2}", average));
}
}
ui.label(format!("Msaa: {:?}x", msaa.samples));
ui.label(format!("Mode: {:?}", prime.mode()));
ui.label(format!("Size: {}", prime.width()) + "x" + &format!("{}", prime.height()) + "px");
}
if settings.setting_toggles.ft {
if let Some(fps) = diag.get(FrameTimeDiagnosticsPlugin::FRAME_TIME) {
if let Some(average) = fps.average() {
ui.label(format!("Frame Time: {:.2}ms", average * 1000.));
}
}
}
});
});
}
18 changes: 6 additions & 12 deletions src/lib.rs
@@ -1,27 +1,21 @@
mod top_panel;
mod bottom_panel;
mod top_panel;

use bevy::{
app::*,
diagnostic::*
};
use bevy::{app::*, diagnostic::*};

use bevy_egui::*;

use crate::top_panel::*;
use crate::bottom_panel::*;
use crate::top_panel::*;

pub struct ToolbarPlugins;

impl PluginGroup for ToolbarPlugins {
fn build(
&mut self,
group: &mut PluginGroupBuilder
) {
group
fn build(&mut self, group: &mut PluginGroupBuilder) {
group
.add(TopPanel)
.add(BottomPanel)
.add(EguiPlugin)
.add(FrameTimeDiagnosticsPlugin);
}
}
}
229 changes: 183 additions & 46 deletions src/top_panel.rs
@@ -1,64 +1,201 @@
use bevy::{
prelude::*,
window::WindowMode
};
use bevy::{prelude::*, window::WindowMode};

use bevy_egui::*;
use strum::IntoEnumIterator;
use strum_macros::EnumIter;

pub(crate) struct TopPanel;

impl Plugin for TopPanel {
fn build(
&self,
app: &mut App
) {
fn build(&self, app: &mut App) {
app.init_resource::<ToolbarSettings>();
app.add_startup_system(get_startup_resolution);
app.add_system(top_panel);
}
}

pub struct ToolbarSettings {
current_window_size: WindowSize,
window_sizes: Vec<WindowSize>,
pub setting_toggles: SettingToggles,
pub title: String,
}

pub struct SettingToggles {
msaa: bool,
resolution: bool,
window_mode: bool,
vsync: bool,
pub title: bool,
pub fps: bool,
pub ft: bool,
}

pub struct WindowSize {
width: f32,
height: f32,
}

impl std::fmt::Display for WindowSize {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}x{}", self.width, self.height)
}
}

impl Default for ToolbarSettings {
fn default() -> Self {
Self {
title: "bevy".to_string(),
setting_toggles: SettingToggles {
msaa: true,
resolution: true,
window_mode: true,
vsync: true,
title: true,
fps: true,
ft: true,
},
current_window_size: WindowSize {
width: 800.,
height: 800.,
},
window_sizes: vec![
WindowSize {
width: 640.,
height: 480.,
},
WindowSize {
width: 800.,
height: 800.,
},
WindowSize {
width: 1024.,
height: 768.,
},
WindowSize {
width: 1280.,
height: 720.,
},
WindowSize {
width: 1920.,
height: 1080.,
},
WindowSize {
width: 2560.,
height: 1440.,
},
WindowSize {
width: 3840.,
height: 2160.,
},
],
}
}
}

//WebGPU currently only exposes 1(Off) and 4x Samples:
//Updates can be tracked here: https://github.com/gfx-rs/wgpu/issues/1832
#[derive(Debug, EnumIter)]
enum MsaaSetting {
Off = 1,
#[cfg(any())]
X2 = 2,
X4 = 4,
#[cfg(any())]
X8 = 8,
#[cfg(any())]
X16 = 16,
}

fn get_startup_resolution(mut windows: ResMut<Windows>, mut settings: ResMut<ToolbarSettings>) {
let prime = windows.get_primary_mut().unwrap();
settings.current_window_size.width = prime.requested_width();
settings.current_window_size.height = prime.requested_height();
}

pub(self) fn top_panel(
egui: Res<EguiContext>,
mut msaa: ResMut<Msaa>,
mut windows: ResMut<Windows>
mut windows: ResMut<Windows>,
mut settings: ResMut<ToolbarSettings>,
) {
let prime = windows
.get_primary_mut()
.unwrap();

egui::TopBottomPanel::top("Window")
.show(egui.ctx(), |ui| {
ui.horizontal(|ui| {
ui.menu_button("Window", |ui| {
ui.menu_button("Mode", |ui| {
if ui.button("windowed").clicked() {
prime.set_mode(WindowMode::Windowed);
} else if ui.button("fullscreen").clicked() {
prime.set_mode(WindowMode::Fullscreen);
} else if ui.button("borderless").clicked() {
prime.set_mode(WindowMode::BorderlessFullscreen);
}
});
ui.menu_button("Settings", |ui| {
ui.menu_button("Vsync", |ui| {
if ui.button("on").clicked() {
prime.set_vsync(true);
} else if ui.button("off").clicked() {
prime.set_vsync(false);
let prime = windows.get_primary_mut().unwrap();

egui::TopBottomPanel::top("Window").show(egui.ctx(), |ui| {
ui.horizontal(|ui| {
ui.menu_button("Settings", |ui| {
let _res = ui.checkbox(&mut settings.setting_toggles.window_mode, "Window Mode");
let _res = ui.checkbox(&mut settings.setting_toggles.resolution, "Resolution");
let _res = ui.checkbox(&mut settings.setting_toggles.vsync, "VSync");
let _res = ui.checkbox(&mut settings.setting_toggles.msaa, "Msaa");
let _res = ui.checkbox(&mut settings.setting_toggles.title, "Title");
let _res = ui.checkbox(&mut settings.setting_toggles.fps, "Fps");
let _res = ui.checkbox(&mut settings.setting_toggles.ft, "Frame Time");
});

if settings.setting_toggles.window_mode {
ui.menu_button(format!("Mode: {:?}", prime.mode()), |ui| {
if ui.button("Toggle Decorations").clicked() {
prime.set_decorations(!prime.decorations());
} else if ui.button("Windowed").clicked() {
prime.set_mode(WindowMode::Windowed);
} else if ui.button("Fullscreen").clicked() {
prime.set_mode(WindowMode::Fullscreen);
} else if ui.button("Borderless").clicked() {
prime.set_mode(WindowMode::BorderlessFullscreen);
}
});
}

if settings.setting_toggles.resolution {
ui.menu_button(
format!(
"Size: {width}x{height}px",
width = prime.width(),
height = prime.height(),
),
|ui| {
for window_size in settings.window_sizes.iter() {
if ui.button(format!("{}", window_size)).clicked() {
prime.set_resolution(window_size.width, window_size.height);
}
});
ui.menu_button("MSAA", |ui|{
if ui.button("2x").clicked() {
msaa.samples = 2;
} else if ui.button("4x").clicked() {
msaa.samples = 4;
} else if ui.button("8x").clicked() {
msaa.samples = 8;
} else if ui.button("16x").clicked() {
msaa.samples = 16;
}
},
);
}

if settings.setting_toggles.vsync {
ui.menu_button(
format!("VSync: {}", if prime.vsync() { "On" } else { "Off" }),
|ui| {
if ui.button("Off").clicked() {
prime.set_vsync(false);
} else if ui.button("On").clicked() {
prime.set_vsync(true);
}
},
);
}

if settings.setting_toggles.msaa {
ui.menu_button(
format!(
"Msaa: {}",
if msaa.samples.eq(&1) {
"Off".to_string()
} else {
msaa.samples.to_string() + "x"
}
),
|ui| {
for mssa_setting in MsaaSetting::iter() {
if ui.button(format!("{:?}", mssa_setting)).clicked() {
msaa.samples = mssa_setting as u32;
}
});
});
});
});
}
},
);
}
});
});
}