summaryrefslogtreecommitdiffstats
path: root/src/ui/bodies_window.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/bodies_window.rs')
-rw-r--r--src/ui/bodies_window.rs114
1 files changed, 39 insertions, 75 deletions
diff --git a/src/ui/bodies_window.rs b/src/ui/bodies_window.rs
index 21a2060..7e24948 100644
--- a/src/ui/bodies_window.rs
+++ b/src/ui/bodies_window.rs
@@ -1,6 +1,3 @@
-use egui::Sense;
-
-use crate::eguictx::EguiCtx;
use crate::ntree::{NTree, NTreeNode};
use crate::solar_system::body::{BodyId, OrbitalBody};
use crate::solar_system::{SolarSystem, SystemId};
@@ -11,8 +8,6 @@ use crate::timeman::TimeMan;
pub struct BodiesWindowState
{
pub open: bool,
- last_system: Option<SystemId>,
- system_heirarchy: NTree<SystemId>,
selected_body: Option<BodyId>
}
@@ -24,64 +19,19 @@ pub struct BodiesWindowAction
impl BodiesWindowState
{
- fn build_system_heirarchy_rec(
- bodies: &[OrbitalBody],
- node: &mut NTreeNode<BodyId>)
- {
- for body in bodies {
- let orbit = body.get_orbit();
- match orbit {
- Some(orbit) => {
- if orbit.parent() != *node.value() {
- continue;
- }
- },
- None => {
- continue;
- }
- }
- let mut subnode = NTreeNode::new(body.id());
- BodiesWindowState::build_system_heirarchy_rec(bodies, &mut subnode);
- node.insert_node(subnode);
- }
- }
-
- fn rebuild_system_heirarchy(
+ pub fn paint(
&mut self,
- star_system: &SolarSystem)
- {
- let mut root_node = NTreeNode::<BodyId>::new(0);
-
- let bodies = star_system.bodies();
- BodiesWindowState::build_system_heirarchy_rec(bodies, &mut root_node);
- self.system_heirarchy.set_root(root_node);
- }
-
- pub fn render(
- &mut self,
- current_system: &SolarSystem,
- eguictx: &EguiCtx)
+ ui: &mut egui::Ui,
+ current_system: &SolarSystem)
-> BodiesWindowAction
{
- match self.last_system {
- Some(last_system) => {
- if last_system != current_system.id() {
- self.rebuild_system_heirarchy(current_system);
- }
- },
- None => {
- self.rebuild_system_heirarchy(current_system);
- }
- }
- self.last_system = Some(current_system.id());
-
let mut action = BodiesWindowAction::default();
let mut bodies_window_open = self.open;
egui::Window::new("Bodies")
.open(&mut &mut bodies_window_open)
.resizable(true)
- .show(eguictx.context(), |ui| {
+ .show(ui.ctx(), |ui| {
ui.horizontal(|ui| {
self.paint_bodies_list(current_system, ui);
@@ -142,8 +92,8 @@ impl BodiesWindowState
.min_scrolled_height(200.0)
.show(ui, |ui| {
ui.vertical(|ui| {
- let root = self.system_heirarchy.root();
- let new_sel = self.paint_bodies_node_rec(star_system, root.as_ref().unwrap(), ui);
+ let root = star_system.heirarchy();
+ let new_sel = self.paint_bodies_node_rec(star_system, root, ui);
if new_sel.is_some() {
self.selected_body = new_sel;
}
@@ -176,26 +126,40 @@ impl BodiesWindowState
});
ui.vertical(|ui| {
- ui.vertical_centered(|ui| {
- ui.label("Physical Properties");
- });
- ui.label(format!("Mass: {:.4E} kg", selected_body.mass()));
- ui.label(format!("Radius: {} km", selected_body.radius()));
-
- if let Some(orbit) = selected_body.get_orbit() {
- ui.vertical_centered(|ui| {
- ui.label("Orbital Properties");
+ ui.style_mut().interaction.selectable_labels = false;
+ egui_extras::TableBuilder::new(ui)
+ .column(egui_extras::Column::auto())
+ .column(egui_extras::Column::remainder())
+ .body(|mut body| {
+ body.row(16.0, |mut row| {
+ row.col(|col| { col.label("Mass"); });
+ row.col(|col| { col.label(format!("{:.4E}", selected_body.mass())); });
});
- ui.label(format!("Orbiting {}",
- star_system.body(orbit.parent()).name()
- ));
- ui.label(format!("Period: {}",
- TimeMan::format_duration(orbit.period(selected_body))
- ));
- ui.label(format!("Semi-major Axis: {:.4E} km",
- orbit.sma()
- ));
- }
+ body.row(16.0, |mut row| {
+ row.col(|col| { col.label("Radius"); });
+ row.col(|col| { col.label(format!("{:.4E}", selected_body.radius())); });
+ });
+
+ if let Some(orbit) = selected_body.get_orbit() {
+ let parent = star_system.body(orbit.parent());
+ body.row(16.0, |mut row| {
+ row.col(|col| { col.label("Orbiting"); });
+ row.col(|col| { col.label(parent.name()); });
+ });
+ body.row(16.0, |mut row| {
+ row.col(|col| { col.label("Period"); });
+ row.col(|col| {
+ col.label(format!("{}",
+ TimeMan::format_duration(orbit.period(selected_body))
+ ));
+ });
+ });
+ body.row(16.0, |mut row| {
+ row.col(|col| { col.label("Semi-major Axis"); });
+ row.col(|col| { col.label(format!("{:.4E} km", orbit.sma())); });
+ });
+ }
+ });
});
});