+BodyPanel::BodyPanel(app::Assets &assets)
+: assets(assets)
+, body(nullptr)
+, name(new Label(assets.fonts.large))
+, mass(new Label(assets.fonts.medium))
+, radius(new Label(assets.fonts.medium))
+, soi(new Label(assets.fonts.medium))
+, operiod(new Label(assets.fonts.medium))
+, rperiod(new Label(assets.fonts.medium))
+, atm(new Label(assets.fonts.medium))
+, sma(new Label(assets.fonts.medium))
+, ecc(new Label(assets.fonts.medium))
+, inc(new Label(assets.fonts.medium))
+, asc(new Label(assets.fonts.medium))
+, arg(new Label(assets.fonts.medium))
+, mna(new Label(assets.fonts.medium))
+, panel() {
+ Label *mass_label = new Label(assets.fonts.medium);
+ mass_label->Text("Mass");
+ Label *radius_label = new Label(assets.fonts.medium);
+ radius_label->Text("Radius");
+ Label *soi_label = new Label(assets.fonts.medium);
+ soi_label->Text("SOI");
+ Label *operiod_label = new Label(assets.fonts.medium);
+ operiod_label->Text("Orb. period");
+ Label *rperiod_label = new Label(assets.fonts.medium);
+ rperiod_label->Text("Rot. period");
+ Label *atm_label = new Label(assets.fonts.medium);
+ atm_label->Text("Atmosphere");
+ Label *sma_label = new Label(assets.fonts.medium);
+ sma_label->Text("SMA");
+ Label *ecc_label = new Label(assets.fonts.medium);
+ ecc_label->Text("Eccentricity");
+ Label *inc_label = new Label(assets.fonts.medium);
+ inc_label->Text("Inclination");
+ Label *asc_label = new Label(assets.fonts.medium);
+ asc_label->Text("Asc. node");
+ Label *arg_label = new Label(assets.fonts.medium);
+ arg_label->Text("Arg. Periapsis");
+ Label *mna_label = new Label(assets.fonts.medium);
+ mna_label->Text("Mean anomaly");
+ Panel *label_panel = new Panel;
+ label_panel
+ ->Direction(Panel::VERTICAL)
+ ->Add(mass_label)
+ ->Add(radius_label)
+ ->Add(soi_label)
+ ->Add(operiod_label)
+ ->Add(rperiod_label)
+ ->Add(atm_label)
+ ->Add(sma_label)
+ ->Add(ecc_label)
+ ->Add(inc_label)
+ ->Add(asc_label)
+ ->Add(arg_label)
+ ->Add(mna_label);
+ Panel *value_panel = new Panel;
+ value_panel
+ ->Direction(Panel::VERTICAL)
+ ->Add(mass)
+ ->Add(radius)
+ ->Add(soi)
+ ->Add(operiod)
+ ->Add(rperiod)
+ ->Add(atm)
+ ->Add(sma)
+ ->Add(ecc)
+ ->Add(inc)
+ ->Add(asc)
+ ->Add(arg)
+ ->Add(mna);
+ Panel *info_panel = new Panel;
+ info_panel
+ ->Direction(Panel::HORIZONTAL)
+ ->Spacing(10.0f)
+ ->Add(label_panel)
+ ->Add(value_panel);
+
+ panel
+ .Add(name)
+ ->Add(info_panel)
+ ->Padding(glm::vec2(10.0f))
+ ->Spacing(10.0f)
+ ->Direction(Panel::VERTICAL)
+ ->Background(glm::vec4(1.0f, 1.0f, 1.0f, 0.7f));
+}
+
+BodyPanel::~BodyPanel() {
+}
+
+void BodyPanel::Show(world::Body &b) {
+ body = &b;
+ name->Text(b.Name());
+ mass->Text(MassString(b.Mass()));
+ radius->Text(LengthString(b.Radius()));
+ soi->Text(LengthString(b.SphereOfInfluence()));
+ operiod->Text(TimeString(b.OrbitalPeriod()));
+ rperiod->Text(TimeString(b.RotationalPeriod()));
+ atm->Text(b.HasAtmosphere() ? assets.data.resources[b.Atmosphere()].label : std::string("none"));
+ sma->Text(LengthString(b.GetOrbit().SemiMajorAxis()));
+ ecc->Text(DecimalString(b.GetOrbit().Eccentricity(), 3));
+ inc->Text(AngleString(b.GetOrbit().Inclination()));
+ asc->Text(AngleString(b.GetOrbit().LongitudeAscending()));
+ arg->Text(AngleString(b.GetOrbit().ArgumentPeriapsis()));
+ mna->Text(AngleString(b.GetOrbit().MeanAnomaly()));
+}
+
+void BodyPanel::Hide() noexcept {
+ body = nullptr;
+}
+
+void BodyPanel::Draw(graphics::Viewport &viewport) noexcept {
+ if (!Shown()) return;
+
+ const glm::vec2 margin(20.0f);
+ panel.Position(glm::vec2(viewport.Width() - margin.x - panel.Size().x, margin.y));
+ panel.Layout();
+ panel.Draw(assets, viewport);
+}
+
+