From 97dbcae54541309bbc64e16df4fbd140c12756a7 Mon Sep 17 00:00:00 2001
From: Rtch90 <ritchie.cunningham@protonmail.com>
Date: Mon, 15 Jan 2018 23:23:28 +0000
Subject: [PATCH] [Partial Fix] Mostly fixed system info view to show triple
 and quadruple systems.

---
 src/generic_system_view.cpp | 13 +++++-
 src/star_system.cpp         |  4 ++
 src/star_system.h           |  3 ++
 src/system_info_view.cpp    | 88 +++++++++++++------------------------
 src/system_info_view.h      |  1 +
 5 files changed, 51 insertions(+), 58 deletions(-)

diff --git a/src/generic_system_view.cpp b/src/generic_system_view.cpp
index 5bd6fa9..d32f8d4 100644
--- a/src/generic_system_view.cpp
+++ b/src/generic_system_view.cpp
@@ -37,9 +37,20 @@ void GenericSystemView::Draw3D(void) {
     char buf[256];
     snprintf(buf, sizeof(buf), "Dist. %.2f light years.", dist);
 
+    std::string desc;
+    if(s->GetNumStars() == 4) {
+      desc= "Quadruple system. ";
+    } else if(s->GetNumStars() == 3) {
+      desc = "Triple system. ";
+    } else if(s->GetNumStars() == 2) {
+      desc = "Binary system. ";
+    } else {
+      desc = s->rootBody->GetAstroDescription();
+    }
+
     m_systemName->SetText(s->rootBody->name);
     m_distance->SetText(buf);
-    m_starType->SetText(s->rootBody->GetAstroDescription());
+    m_starType->SetText(desc);
     m_shortDesc->SetText("Short description of system");
 
     onSelectedSystemChanged.emit(s);
diff --git a/src/star_system.cpp b/src/star_system.cpp
index 99c2df8..da47b9e 100644
--- a/src/star_system.cpp
+++ b/src/star_system.cpp
@@ -460,6 +460,7 @@ StarSystem::StarSystem(int sector_x, int sector_y, int system_idx) {
     primary->name = s.m_systems[system_idx].name;
     MakeStarOfType(primary, type, rand);
     rootBody = primary;
+    m_numStars = 1;
   } else {
     SBody* centGrav = new SBody;
     centGrav->type = TYPE_GRAVPOINT;
@@ -486,6 +487,7 @@ StarSystem::StarSystem(int sector_x, int sector_y, int system_idx) {
     centGrav->mass = star[0]->mass + star[1]->mass;
     centGrav->children.push_back(star[0]);
     centGrav->children.push_back(star[1]);
+    m_numStars = 2;
 
     if((star[0]->orbMax < fixed(100, 1)) &&
         (!rand.Int32(3))) {
@@ -497,6 +499,7 @@ StarSystem::StarSystem(int sector_x, int sector_y, int system_idx) {
         star[2]->orbMax = 0;
         MakeRandomStarLighterThan(star[2], star[0]->mass, rand);
         centGrav2 = star[2];
+        m_numStars = 3;
       } else {
         centGrav2 = new SBody;
         centGrav2->type = TYPE_GRAVPOINT;
@@ -518,6 +521,7 @@ StarSystem::StarSystem(int sector_x, int sector_y, int system_idx) {
         centGrav2->mass = star[2]->mass + star[3]->mass;
         centGrav2->children.push_back(star[2]);
         centGrav2->children.push_back(star[3]);
+        m_numStars = 4;
       }
       SBody* superCentGrav = new SBody;
       superCentGrav->type = TYPE_GRAVPOINT;
diff --git a/src/star_system.h b/src/star_system.h
index 5700fa8..b4164ef 100644
--- a/src/star_system.h
+++ b/src/star_system.h
@@ -26,6 +26,8 @@ public:
     *sec_x = m_secx; *sec_y = m_secy, *sys_idx = m_sysIdx;
   }
 
+  int GetNumStars(void) const { return m_numStars; }
+
   static float starColors[][3];
 
   struct Orbit {
@@ -133,6 +135,7 @@ private:
   void GenerateFromCustom(const CustomSBody*);
 
   int m_secx, m_secy, m_sysIdx;
+  int m_numStars;
 
   MTRand rand;
 };
diff --git a/src/system_info_view.cpp b/src/system_info_view.cpp
index 2f494c7..4fd8640 100644
--- a/src/system_info_view.cpp
+++ b/src/system_info_view.cpp
@@ -55,69 +55,43 @@ void SystemInfoView::OnBodySelected(StarSystem::SBody* b) {
   m_infoText->SetText(desc);
 }
 
+void SystemInfoView::PutBodies(StarSystem::SBody* body, int dir, float pos[2], int& majorBodies) {
+  float size[2];
+  float myPos[2];
+  myPos[0] = pos[0];
+  myPos[1] = pos[1];
+  if(body->type != StarSystem::TYPE_GRAVPOINT) {
+    Gui::ImageButton* ib = new Gui::ImageButton(body->GetIcon());
+    ib->GetSize(size);
+    size[1] = -size[1];
+    pos[dir] += size[dir];
+    myPos[dir] += size[dir];
+    ib->onClick.connect(sigc::bind(sigc::mem_fun(this, &SystemInfoView::OnBodySelected), body));
+    Add(ib, pos[0], pos[1]+0.5*size[1]);
+    majorBodies++;
+    dir = !dir;
+    myPos[dir] += 0.5*size[dir];
+  } else {
+    pos[!dir] += 320;
+  }
+
+  for(std::vector<StarSystem::SBody*>::iterator i = body->children.begin();
+      i != body->children.end(); ++i) {
+    PutBodies(*i, dir, myPos, majorBodies);
+  }
+}
+
 void SystemInfoView::SystemChanged(StarSystem* s) {
   DeleteAllChildren();
   float csize[2];
   int majorBodies = 0;
   GetSize(csize);
+  
+  float pos[2];
+  pos[0] = 50;
+  pos[1] = csize[1]+40;
 
-  float xpos = 0;
-  float size[2];
-  float ycent;
-  std::vector<StarSystem::SBody*>::iterator i = s->rootBody->children.begin();
-
-  if(s->rootBody->type == StarSystem::TYPE_GRAVPOINT) {
-    /* Binary system. */
-    Gui::ImageButton* ib = new Gui::ImageButton((*i)->GetIcon());
-    ib->GetSize(size);
-    ib->onClick.connect(sigc::bind(sigc::mem_fun(this, &SystemInfoView::OnBodySelected), *i));
-    Add(ib, 0, csize[1] - size[1]);
-    float yoffset = size[1];
-    float xoffset = size[0];
-    ++i; majorBodies++;
-
-    ib = new Gui::ImageButton((*i)->GetIcon());
-    ib->GetSize(size);
-    ib->onClick.connect(sigc::bind(sigc::mem_fun(this, &SystemInfoView::OnBodySelected), *i));
-    Add(ib, 0, csize[1] - size[1] - yoffset);
-    ++i; majorBodies++;
-
-    xpos += xoffset;
-    ycent = csize[1] - yoffset*0.5;
-  } else {
-    Gui::ImageButton* ib = new Gui::ImageButton(s->rootBody->GetIcon());
-    ib->GetSize(size);
-    ib->onClick.connect(sigc::bind(sigc::mem_fun(this, &SystemInfoView::OnBodySelected), s->rootBody));
-    Add(ib, 0, csize[1] - size[1]);
-    xpos += size[0];
-    ycent = csize[1] - size[1]*0.5;
-    majorBodies++;
-  }
-
-  for(; i != s->rootBody->children.end(); ++i) {
-    if((*i)->type == StarSystem::TYPE_GRAVPOINT) {
-
-    } else {
-      Gui::ImageButton* ib = new Gui::ImageButton((*i)->GetIcon());
-      ib->GetSize(size);
-      ib->onClick.connect(sigc::bind(sigc::mem_fun(this, &SystemInfoView::OnBodySelected), *i));
-      Add(ib, xpos, ycent - 0.5*size[1]);
-      majorBodies++;
-    }
-
-    float moon_ypos = ycent - size[1] - 5;
-    if((*i)->children.size())
-      for(std::vector<StarSystem::SBody*>::iterator moon = (*i)->children.begin();
-          moon != (*i)->children.end(); ++moon) {
-        float msize[2];
-        Gui::ImageButton* ib = new Gui::ImageButton((*moon)->GetIcon());
-        ib->GetSize(msize);
-        ib->onClick.connect(sigc::bind(sigc::mem_fun(this, &SystemInfoView::OnBodySelected), *moon));
-        Add(ib, xpos + 0.5*size[0] - 0.5*msize[0], moon_ypos);
-        moon_ypos -= msize[1];
-      }
-      xpos += size[0];
-  }
+  PutBodies(s->rootBody, 1, pos, majorBodies);
 
   char buf[512];
   snprintf(buf, sizeof(buf), "Stable system with %d major bodies", majorBodies);
diff --git a/src/system_info_view.h b/src/system_info_view.h
index 141c96e..b4fc771 100644
--- a/src/system_info_view.h
+++ b/src/system_info_view.h
@@ -13,6 +13,7 @@ public:
 private:
   void SystemChanged(StarSystem* s);
   void OnBodySelected(StarSystem::SBody* b);
+  void PutBodies(StarSystem::SBody* body, int dir, float pos[2], int& majorBodies);
   StarSystem::SBody* m_bodySelected;
   Gui::Label* m_infoText;
 };