// draw scannode (may be null), // curmats may be null public void DrawSystem(StarScan.SystemNode scannode, MaterialCommoditiesList curmats, HistoryList hl, string opttext = null, string[] filter = null) { HideInfo(); imagebox.ClearImageList(); // does not clear the image, render will do that if (scannode != null) { Point leftmiddle = new Point(leftmargin, topmargin + StarSize.Height * nodeheightratio / 2 / noderatiodivider); // half down (h/2 * ratio) if (opttext != null) { ExtPictureBox.ImageElement lab = new ExtPictureBox.ImageElement(); lab.TextAutosize(new Point(leftmargin, 0), new Size(500, 30), opttext, largerfont, EDDTheme.Instance.LabelColor, this.BackColor); imagebox.Add(lab); leftmiddle.Y += lab.Image.Height + 8; } DisplayAreaUsed = leftmiddle; List <ExtPictureBox.ImageElement> starcontrols = new List <ExtPictureBox.ImageElement>(); bool displaybelts = filter == null || (filter.Contains("belt") || filter.Contains("All")); Point maxitemspos = new Point(0, 0); foreach (StarScan.ScanNode starnode in scannode.starnodes.Values) // always has scan nodes { if (filter != null && starnode.IsBodyInFilter(filter, true) == false) // if filter active, but no body or children in filter { // System.Diagnostics.Debug.WriteLine("SDUC Rejected " + starnode.fullname); continue; } // Draw star Point maxstarpos = DrawNode(starcontrols, starnode, curmats, hl, (starnode.type == StarScan.ScanNodeType.barycentre) ? Icons.Controls.Scan_Bodies_Barycentre : JournalScan.GetStarImageNotScanned(), leftmiddle, false, out int unusedstarcentre, StarSize, DrawLevel.TopLevelStar); // the last part nerfs the label down to the right position maxitemspos = new Point(Math.Max(maxitemspos.X, maxstarpos.X), Math.Max(maxitemspos.Y, maxstarpos.Y)); if (starnode.children != null) { leftmiddle = new Point(maxitemspos.X + starfirstplanetspacerx, leftmiddle.Y); Point firstcolumn = leftmiddle; Queue <StarScan.ScanNode> belts; if (starnode.ScanData != null && (!starnode.ScanData.IsEDSMBody || CheckEDSM)) // have scandata on star, and its not edsm or allowed edsm { belts = new Queue <StarScan.ScanNode>(starnode.children.Values.Where(s => s.type == StarScan.ScanNodeType.belt)); // find belts in children of star } else { belts = new Queue <StarScan.ScanNode>(); // empty array } StarScan.ScanNode lastbelt = belts.Count != 0 ? belts.Dequeue() : null; double habzonestartls = starnode.ScanData?.HabitableZoneInner ?? 0; double habzoneendls = starnode.ScanData?.HabitableZoneOuter ?? 0; // process body and stars only List <StarScan.ScanNode> planetsinorder = starnode.children.Values.Where(s => s.type == StarScan.ScanNodeType.body || s.type == StarScan.ScanNodeType.star).ToList(); var planetcentres = new Dictionary <StarScan.ScanNode, Point>(); for (int pn = 0; pn < planetsinorder.Count; pn++) { StarScan.ScanNode planetnode = planetsinorder[pn]; if (filter != null && planetnode.IsBodyInFilter(filter, true) == false) // if filter active, but no body or children in filter { //System.Diagnostics.Debug.WriteLine("SDUC Rejected " + planetnode.fullname); continue; } //System.Diagnostics.Debug.WriteLine("Draw " + planetnode.ownname + ":" + planetnode.type); // if belt is before this, display belts here while (displaybelts && lastbelt != null && planetnode.ScanData != null && (lastbelt.BeltData == null || planetnode.ScanData.IsOrbitingBaryCentre || lastbelt.BeltData.OuterRad < planetnode.ScanData.nSemiMajorAxis)) { // if too far across, go back to star if (leftmiddle.X + planetsize.Width > panelStars.Width - panelStars.ScrollBarWidth) // if too far across.. { leftmiddle = new Point(firstcolumn.X, maxitemspos.Y + planetspacery + planetsize.Height / 2); // move to left at maxy+space+h/2 } string appendlabel = ""; if (lastbelt.BeltData != null) { appendlabel = appendlabel.AppendPrePad($"{lastbelt.BeltData.OuterRad / JournalScan.oneLS_m:N1}ls", Environment.NewLine); } appendlabel = appendlabel.AppendPrePad("" + lastbelt.ScanData?.BodyID, Environment.NewLine); Point maxbeltpos = DrawNode(starcontrols, lastbelt, curmats, hl, Icons.Controls.Scan_Bodies_Belt, leftmiddle, false, out int unusedbeltcentre, beltsize, DrawLevel.PlanetLevel, appendlabeltext: appendlabel); leftmiddle = new Point(maxbeltpos.X + planetspacerx, leftmiddle.Y); lastbelt = belts.Count != 0 ? belts.Dequeue() : null; maxitemspos = new Point(Math.Max(maxitemspos.X, maxbeltpos.X), Math.Max(maxitemspos.Y, maxbeltpos.Y)); } //System.Diagnostics.Debug.WriteLine("Planet Node " + planetnode.ownname + " has scans " + nonedsmscans); if (planetnode.DoesNodeHaveNonEDSMScansBelow() || CheckEDSM) { List <ExtPictureBox.ImageElement> pc = new List <ExtPictureBox.ImageElement>(); bool habzone = false; if (ShowHabZone && planetnode.ScanData != null && !planetnode.ScanData.IsOrbitingBaryCentre && planetnode.ScanData.nSemiMajorAxis.HasValue) { double dist = planetnode.ScanData.nSemiMajorAxis.Value / JournalScan.oneLS_m; // m , converted to LS habzone = dist >= habzonestartls && dist <= habzoneendls; } Point maxplanetpos = CreatePlanetTree(pc, planetnode, curmats, hl, leftmiddle, filter, habzone, out int centreplanet); Point pcnt = new Point(centreplanet, leftmiddle.Y); if (maxplanetpos.X > panelStars.Width - panelStars.ScrollBarWidth) // uh oh too wide.. { int xoff = firstcolumn.X - leftmiddle.X; // shift to firstcolumn.x, maxitemspos.Y+planetspacer int yoff = (maxitemspos.Y + planetspacery) - (leftmiddle.Y - planetsize.Height / 2); RepositionTree(pc, xoff, yoff); // shift co-ords of all you've drawn - this will include any bary points drawn in moons pcnt.X += xoff; pcnt.Y += yoff; // need to account for planet centre maxplanetpos = new Point(maxplanetpos.X + xoff, maxplanetpos.Y + yoff); // remove the shift from maxpos leftmiddle = new Point(maxplanetpos.X + planetspacerx, leftmiddle.Y + yoff); // and set the curpos to maxpos.x + spacer, remove the shift from curpos.y } else { leftmiddle = new Point(maxplanetpos.X + planetspacerx, leftmiddle.Y); // shift current pos right, plus a spacer } maxitemspos = new Point(Math.Max(maxitemspos.X, maxplanetpos.X), Math.Max(maxitemspos.Y, maxplanetpos.Y)); starcontrols.AddRange(pc.ToArray()); planetcentres[planetnode] = pcnt; } } // do any futher belts after all planets while (displaybelts && lastbelt != null) { if (leftmiddle.X + planetsize.Width > panelStars.Width - panelStars.ScrollBarWidth) // if too far across.. { leftmiddle = new Point(firstcolumn.X, maxitemspos.Y + planetspacery + planetsize.Height / 2); // move to left at maxy+space+h/2 } string appendlabel = ""; if (lastbelt.BeltData != null) { appendlabel = appendlabel.AppendPrePad($"{lastbelt.BeltData.OuterRad / JournalScan.oneLS_m:N1}ls", Environment.NewLine); } appendlabel = appendlabel.AppendPrePad("" + lastbelt.ScanData?.BodyID, Environment.NewLine); Point maxbeltpos = DrawNode(starcontrols, lastbelt, curmats, hl, Icons.Controls.Scan_Bodies_Belt, leftmiddle, false, out int unusedbelt2centre, beltsize, DrawLevel.PlanetLevel, appendlabeltext: appendlabel); leftmiddle = new Point(maxbeltpos.X + planetspacerx, leftmiddle.Y); lastbelt = belts.Count != 0 ? belts.Dequeue() : null; maxitemspos = new Point(Math.Max(maxitemspos.X, maxbeltpos.X), Math.Max(maxitemspos.Y, maxbeltpos.Y)); } maxitemspos = leftmiddle = new Point(leftmargin, maxitemspos.Y + starplanetgroupspacery + StarSize.Height / 2); // move back to left margin and move down to next position of star, allowing gap // make a tree of the planets with their barycentres from the Parents information var barynodes = StarScan.ScanNode.PopulateBarycentres(planetsinorder); // children always made, barynode tree StarScan.ScanNode.DumpTree(barynodes, "TOP", 0); List <ExtPictureBox.ImageElement> pcb = new List <ExtPictureBox.ImageElement>(); foreach (var k in barynodes.children) // for all barynodes.. display { DisplayBarynode(k.Value, 0, planetcentres, planetsinorder, pcb, planetsize.Height / 2); // done after the reposition so true positions set up. } starcontrols.InsertRange(0, pcb); // insert at start so drawn under } else { // no planets, so just move across and plot another one leftmiddle = new Point(maxitemspos.X + starfirstplanetspacerx, leftmiddle.Y); if (leftmiddle.X + StarSize.Width > panelStars.Width - panelStars.ScrollBarWidth) // if too far across.. { maxitemspos = leftmiddle = new Point(leftmargin, maxitemspos.Y + starplanetgroupspacery + StarSize.Height / 2); // move to left at maxy+space+h/2 } } DisplayAreaUsed = new Point(Math.Max(DisplayAreaUsed.X, maxitemspos.X), Math.Max(DisplayAreaUsed.Y, maxitemspos.Y)); } imagebox.AddRange(starcontrols); } imagebox.Render(); // replaces image.. }
void DrawSystem() // draw last_sn, last_he { HideInfo(); imagebox.ClearImageList(); // does not clear the image, render will do that if (last_he == null) { SetControlText("No System"); imagebox.Render(); return; } StarScan.SystemNode last_sn = discoveryform.history.starscan.FindSystem(last_he.System, checkBoxEDSM.Checked); SetControlText((last_sn == null) ? "No Scan" : last_sn.system.name); if (last_sn != null) // { Point curpos = new Point(leftmargin, topmargin); last_maxdisplayarea = curpos; List <PictureBoxHotspot.ImageElement> starcontrols = new List <PictureBoxHotspot.ImageElement>(); //for( int i = 0; i < 1000; i +=100) CreateStarPlanet(starcontrols, EDDiscovery.Properties.Resources.ImageStarDiscWhite, new Point(i, 0), new Size(24, 24), i.ToString(), ""); foreach (StarScan.ScanNode starnode in last_sn.starnodes.Values) // always has scan nodes { int offset = 0; Point maxstarpos = DrawNode(starcontrols, starnode, (starnode.type == StarScan.ScanNodeType.barycentre) ? EDDiscovery.Properties.Resources.Barycentre : JournalScan.GetStarImageNotScanned(), curpos, starsize, ref offset, false, (planetsize.Height * 6 / 4 - starsize.Height) / 2); // the last part nerfs the label down to the right position Point maxitemspos = maxstarpos; curpos = new Point(maxitemspos.X + itemsepar.Width, curpos.Y); // move to the right curpos.Y += starsize.Height / 2 - planetsize.Height * 3 / 4; // slide down for planet vs star difference in size Point firstcolumn = curpos; if (starnode.children != null) { foreach (StarScan.ScanNode planetnode in starnode.children.Values) { bool nonedsmscans = planetnode.DoesNodeHaveNonEDSMScansBelow(); // is there any scans here, either at this node or below? //System.Diagnostics.Debug.WriteLine("Planet Node " + planetnode.ownname + " has scans " + nonedsmscans); if (nonedsmscans || checkBoxEDSM.Checked) { List <PictureBoxHotspot.ImageElement> pc = new List <PictureBoxHotspot.ImageElement>(); Point maxpos = CreatePlanetTree(pc, planetnode, curpos); //System.Diagnostics.Debug.WriteLine("Planet " + planetnode.ownname + " " + curpos + " " + maxpos + " max " + (panelStars.Width - panelStars.ScrollBarWidth)); if (maxpos.X > panelStars.Width - panelStars.ScrollBarWidth) // uh oh too wide.. { int xoffset = firstcolumn.X - curpos.X; int yoffset = maxitemspos.Y - curpos.Y; RepositionTree(pc, xoffset, yoffset); // shift co-ords of all you've drawn maxpos = new Point(maxpos.X + xoffset, maxpos.Y + yoffset); curpos = new Point(maxpos.X, curpos.Y + yoffset); } else { curpos = new Point(maxpos.X, curpos.Y); } maxitemspos = new Point(Math.Max(maxitemspos.X, maxpos.X), Math.Max(maxitemspos.Y, maxpos.Y)); starcontrols.AddRange(pc.ToArray()); } } } last_maxdisplayarea = new Point(Math.Max(last_maxdisplayarea.X, maxitemspos.X), Math.Max(last_maxdisplayarea.Y, maxitemspos.Y)); curpos = new Point(leftmargin, maxitemspos.Y + itemsepar.Height); } imagebox.AddRange(starcontrols); } imagebox.Render(); // replaces image.. }
// draw scannode (may be null), // curmats may be null public void DrawSystem(StarScan.SystemNode scannode, MaterialCommoditiesList curmats, HistoryList hl, string opttext = null, string[] filter = null) { HideInfo(); imagebox.ClearImageList(); // does not clear the image, render will do that if (scannode != null) { Point curpos = new Point(leftmargin, topmargin); if (opttext != null) { ExtPictureBox.ImageElement lab = new ExtPictureBox.ImageElement(); lab.TextAutosize(curpos, new Size(500, 30), opttext, largerfont, EDDTheme.Instance.LabelColor, this.BackColor); imagebox.Add(lab); curpos.Y += lab.img.Height + 8; } DisplayAreaUsed = curpos; List <ExtPictureBox.ImageElement> starcontrols = new List <ExtPictureBox.ImageElement>(); bool displaybelts = filter == null || (filter.Contains("belt") || filter.Contains("All")); //for( int i = 0; i < 1000; i +=100) CreateStarPlanet(starcontrols, EDDiscovery.Properties.Resources.ImageStarDiscWhite, new Point(i, 0), new Size(24, 24), i.ToString(), ""); //foreach( var sn in scannode.Bodies ) //{ // System.Diagnostics.Debug.Write("Node " + sn.type + " " + sn.fullname); // if ( sn.ScanData != null ) // { // System.Diagnostics.Debug.Write(" " + sn.ScanData.IsStar + " P:" + sn.ScanData.PlanetTypeID + " S:" + sn.ScanData.StarTypeID + " EDSM:" + sn.ScanData.IsEDSMBody); // } // System.Diagnostics.Debug.WriteLine(""); //} foreach (StarScan.ScanNode starnode in scannode.starnodes.Values) // always has scan nodes { if (filter != null && starnode.IsBodyInFilter(filter, true) == false) // if filter active, but no body or children in filter { System.Diagnostics.Debug.WriteLine("SDUC Rejected " + starnode.fullname); continue; } // Draw star int offset = 0; Point maxstarpos = DrawNode(starcontrols, starnode, curmats, hl, (starnode.type == StarScan.ScanNodeType.barycentre) ? Icons.Controls.Scan_Bodies_Barycentre : JournalScan.GetStarImageNotScanned(), curpos, StarSize, ref offset, false, (planetsize.Height * 6 / 4 - StarSize.Height) / 2, true); // the last part nerfs the label down to the right position Point maxitemspos = maxstarpos; curpos = new Point(maxitemspos.X + starfirstplanetspacerx, curpos.Y); // move to the right curpos.Y += StarSize.Height / 2 - planetsize.Height * 3 / 4; // slide down for planet vs star difference in size Point firstcolumn = curpos; if (starnode.children != null) { Queue <StarScan.ScanNode> belts = null; if (starnode.ScanData != null && (!starnode.ScanData.IsEDSMBody || CheckEDSM)) { belts = new Queue <StarScan.ScanNode>(starnode.children.Values.Where(s => s.type == StarScan.ScanNodeType.belt)); } else { belts = new Queue <StarScan.ScanNode>(); } StarScan.ScanNode lastbelt = belts.Count != 0 ? belts.Dequeue() : null; // process body and stars only foreach (StarScan.ScanNode planetnode in starnode.children.Values.Where(s => s.type == StarScan.ScanNodeType.body || s.type == StarScan.ScanNodeType.star)) { if (filter != null && planetnode.IsBodyInFilter(filter, true) == false) // if filter active, but no body or children in filter { System.Diagnostics.Debug.WriteLine("SDUC Rejected " + planetnode.fullname); continue; } //System.Diagnostics.Debug.WriteLine("Draw " + planetnode.ownname + ":" + planetnode.type); // if belt is before this, display belts here while (displaybelts && lastbelt != null && planetnode.ScanData != null && (lastbelt.BeltData == null || lastbelt.BeltData.OuterRad < planetnode.ScanData.nSemiMajorAxis)) { //System.Diagnostics.Debug.WriteLine("Draw a belt " + lastbelt.ownname); // if too far across, go back to star if (curpos.X + planetsize.Width > panelStars.Width - panelStars.ScrollBarWidth) { curpos = new Point(firstcolumn.X, maxitemspos.Y + planetsize.Height + planetspacery); } Point used = DrawNode(starcontrols, lastbelt, curmats, hl, Icons.Controls.Scan_Bodies_Belt, new Point(curpos.X + (planetsize.Width - beltsize.Width) / 2, curpos.Y), beltsize, ref offset, false); curpos = new Point(used.X, curpos.Y); lastbelt = belts.Count != 0 ? belts.Dequeue() : null; } bool nonedsmscans = planetnode.DoesNodeHaveNonEDSMScansBelow(); // is there any scans here, either at this node or below? //System.Diagnostics.Debug.WriteLine("Planet Node " + planetnode.ownname + " has scans " + nonedsmscans); if (nonedsmscans || CheckEDSM) { List <ExtPictureBox.ImageElement> pc = new List <ExtPictureBox.ImageElement>(); Point maxpos = CreatePlanetTree(pc, planetnode, curmats, hl, curpos, filter); //System.Diagnostics.Debug.WriteLine("Planet " + planetnode.ownname + " " + curpos + " " + maxpos + " max " + (panelStars.Width - panelStars.ScrollBarWidth)); if (maxpos.X > panelStars.Width - panelStars.ScrollBarWidth) // uh oh too wide.. { int xoffset = firstcolumn.X - curpos.X; // shift to firstcolumn.x, maxitemspos.Y+planetspacer int yoffset = (maxitemspos.Y + planetspacery) - curpos.Y; RepositionTree(pc, xoffset, yoffset); // shift co-ords of all you've drawn maxpos = new Point(maxpos.X + xoffset, maxpos.Y + yoffset); // remove the shift from maxpos curpos = new Point(maxpos.X + planetspacerx, curpos.Y + yoffset); // and set the curpos to maxpos.x + spacer, remove the shift from curpos.y } else { curpos = new Point(maxpos.X + planetspacerx, curpos.Y); // shift current pos right, plus a spacer } maxitemspos = new Point(Math.Max(maxitemspos.X, maxpos.X), Math.Max(maxitemspos.Y, maxpos.Y)); starcontrols.AddRange(pc.ToArray()); } } // do any futher belts after all planets while (displaybelts && lastbelt != null) { if (curpos.X + planetsize.Width > panelStars.Width - panelStars.ScrollBarWidth) { curpos = new Point(firstcolumn.X, maxitemspos.Y + planetsize.Height); } Point used = DrawNode(starcontrols, lastbelt, curmats, hl, Icons.Controls.Scan_Bodies_Belt, new Point(curpos.X + (planetsize.Width - beltsize.Width) / 2, curpos.Y), beltsize, ref offset, false); curpos = new Point(used.X, curpos.Y); lastbelt = belts.Count != 0 ? belts.Dequeue() : null; } } DisplayAreaUsed = new Point(Math.Max(DisplayAreaUsed.X, maxitemspos.X), Math.Max(DisplayAreaUsed.Y, maxitemspos.Y)); curpos = new Point(leftmargin, maxitemspos.Y + starplanetgroupspacery); // move back to left margin and move down to next position of star, allowing gap } imagebox.AddRange(starcontrols); } imagebox.Render(); // replaces image.. }
void DrawSystem(StarScan.SystemNode sn) { imagebox.Clear(); HideInfo(); last_sn = sn; // remember in case we need to draw SetControlText((sn == null) ? "No Scan" : sn.system.name); if (sn == null) { return; } Point curpos = new Point(leftmargin, topmargin); last_maxdisplayarea = curpos; List <PictureBoxHotspot.ImageElement> starcontrols = new List <PictureBoxHotspot.ImageElement>(); //for( int i = 0; i < 1000; i +=100) CreateStarPlanet(starcontrols, EDDiscovery.Properties.Resources.ImageStarDiscWhite, new Point(i, 0), new Size(24, 24), i.ToString(), ""); foreach (StarScan.ScanNode starnode in sn.starnodes.Values) // always has scan nodes { int offset = 0; Point maxstarpos = DrawNode(starcontrols, starnode, (starnode.type == StarScan.ScanNodeType.barycentre) ? EDDiscovery.Properties.Resources.Barycentre : JournalScan.GetStarImageNotScanned(), curpos, starsize, ref offset, false); Point maxitemspos = maxstarpos; curpos = new Point(maxitemspos.X + itemsepar.Width, curpos.Y); // move to the right curpos.Y += starsize.Height / 2 - planetsize.Height * 3 / 4; // slide down for planet vs star difference in size Point firstcolumn = curpos; if (starnode.children != null) { foreach (StarScan.ScanNode planetnode in starnode.children.Values) { List <PictureBoxHotspot.ImageElement> pc = new List <PictureBoxHotspot.ImageElement>(); Point maxpos = CreatePlanetTree(pc, planetnode, curpos); //System.Diagnostics.Debug.WriteLine("Planet " + planetnode.ownname + " " + curpos + " " + maxpos + " max " + (panelStars.Width - panelStars.ScrollBarWidth)); if (maxpos.X > panelStars.Width - panelStars.ScrollBarWidth) // uh oh too wide.. { int xoffset = firstcolumn.X - curpos.X; int yoffset = maxitemspos.Y - curpos.Y; RepositionTree(pc, xoffset, yoffset); // shift co-ords of all you've drawn maxpos = new Point(maxpos.X + xoffset, maxpos.Y + yoffset); curpos = new Point(maxpos.X, curpos.Y + yoffset); } else { curpos = new Point(maxpos.X, curpos.Y); } maxitemspos = new Point(Math.Max(maxitemspos.X, maxpos.X), Math.Max(maxitemspos.Y, maxpos.Y)); starcontrols.AddRange(pc.ToArray()); } } last_maxdisplayarea = new Point(Math.Max(last_maxdisplayarea.X, maxitemspos.X), Math.Max(last_maxdisplayarea.Y, maxitemspos.Y)); curpos = new Point(leftmargin, maxitemspos.Y + itemsepar.Height); } imagebox.AddRange(starcontrols); imagebox.Render(); //System.Diagnostics.Debug.WriteLine("Display area " + last_maxdisplayarea); }
public StarScan.SystemNode DrawSystem(ISystem showing_system, MaterialCommoditiesList curmats, HistoryList hl) // draw showing_system (may be null), showing_matcomds (may be null) { HideInfo(); imagebox.ClearImageList(); // does not clear the image, render will do that if (showing_system == null) { imagebox.Render(); return(null); } StarScan.SystemNode last_sn = hl.starscan.FindSystem(showing_system, CheckEDSM, byname: true); if (last_sn != null) // { Point curpos = new Point(leftmargin, topmargin); DisplayAreaUsed = curpos; List <PictureBoxHotspot.ImageElement> starcontrols = new List <PictureBoxHotspot.ImageElement>(); //for( int i = 0; i < 1000; i +=100) CreateStarPlanet(starcontrols, EDDiscovery.Properties.Resources.ImageStarDiscWhite, new Point(i, 0), new Size(24, 24), i.ToString(), ""); foreach (StarScan.ScanNode starnode in last_sn.starnodes.Values) // always has scan nodes { //System.Diagnostics.Debug.WriteLine("Draw " + starnode.type); int offset = 0; Point maxstarpos = DrawNode(starcontrols, starnode, curmats, hl, (starnode.type == StarScan.ScanNodeType.barycentre) ? Icons.Controls.Scan_Bodies_Barycentre : JournalScan.GetStarImageNotScanned(), curpos, StarSize, ref offset, false, (planetsize.Height * 6 / 4 - StarSize.Height) / 2, true); // the last part nerfs the label down to the right position Point maxitemspos = maxstarpos; curpos = new Point(maxitemspos.X + itemsepar.Width, curpos.Y); // move to the right curpos.Y += StarSize.Height / 2 - planetsize.Height * 3 / 4; // slide down for planet vs star difference in size Point firstcolumn = curpos; if (starnode.children != null) { Queue <StarScan.ScanNode> belts = null; if (starnode.ScanData != null && (!starnode.ScanData.IsEDSMBody || CheckEDSM)) { belts = new Queue <StarScan.ScanNode>(starnode.children.Values.Where(s => s.type == StarScan.ScanNodeType.belt)); } else { belts = new Queue <StarScan.ScanNode>(); } StarScan.ScanNode lastbelt = belts.Count != 0 ? belts.Dequeue() : null; foreach (StarScan.ScanNode planetnode in starnode.children.Values.Where(s => s.type == StarScan.ScanNodeType.body || s.type == StarScan.ScanNodeType.star)) { // System.Diagnostics.Debug.WriteLine("Draw " + planetnode.type); while (lastbelt != null && planetnode.ScanData != null && (lastbelt.BeltData == null || lastbelt.BeltData.OuterRad < planetnode.ScanData.nSemiMajorAxis)) { if (curpos.X + planetsize.Width > panelStars.Width - panelStars.ScrollBarWidth) { curpos = new Point(firstcolumn.X, maxitemspos.Y + planetsize.Height); } DrawNode(starcontrols, lastbelt, curmats, hl, Icons.Controls.Scan_Bodies_Belt, new Point(curpos.X + (planetsize.Width - beltsize.Width) / 2, curpos.Y), beltsize, ref offset, false); curpos = new Point(curpos.X + planetsize.Width, curpos.Y); lastbelt = belts.Count != 0 ? belts.Dequeue() : null; } bool nonedsmscans = planetnode.DoesNodeHaveNonEDSMScansBelow(); // is there any scans here, either at this node or below? //System.Diagnostics.Debug.WriteLine("Planet Node " + planetnode.ownname + " has scans " + nonedsmscans); if (nonedsmscans || CheckEDSM) { List <PictureBoxHotspot.ImageElement> pc = new List <PictureBoxHotspot.ImageElement>(); Point maxpos = CreatePlanetTree(pc, planetnode, curmats, hl, curpos); //System.Diagnostics.Debug.WriteLine("Planet " + planetnode.ownname + " " + curpos + " " + maxpos + " max " + (panelStars.Width - panelStars.ScrollBarWidth)); if (maxpos.X > panelStars.Width - panelStars.ScrollBarWidth) // uh oh too wide.. { int xoffset = firstcolumn.X - curpos.X; int yoffset = maxitemspos.Y - curpos.Y; RepositionTree(pc, xoffset, yoffset); // shift co-ords of all you've drawn maxpos = new Point(maxpos.X + xoffset, maxpos.Y + yoffset); curpos = new Point(maxpos.X, curpos.Y + yoffset); } else { curpos = new Point(maxpos.X, curpos.Y); } maxitemspos = new Point(Math.Max(maxitemspos.X, maxpos.X), Math.Max(maxitemspos.Y, maxpos.Y)); starcontrols.AddRange(pc.ToArray()); } } while (lastbelt != null) { if (curpos.X + planetsize.Width > panelStars.Width - panelStars.ScrollBarWidth) { curpos = new Point(firstcolumn.X, maxitemspos.Y + planetsize.Height); } DrawNode(starcontrols, lastbelt, curmats, hl, Icons.Controls.Scan_Bodies_Belt, new Point(curpos.X + (planetsize.Width - beltsize.Width) / 2, curpos.Y), beltsize, ref offset, false); curpos = new Point(curpos.X + planetsize.Width, curpos.Y); lastbelt = belts.Count != 0 ? belts.Dequeue() : null; } } DisplayAreaUsed = new Point(Math.Max(DisplayAreaUsed.X, maxitemspos.X), Math.Max(DisplayAreaUsed.Y, maxitemspos.Y)); curpos = new Point(leftmargin, maxitemspos.Y + itemsepar.Height); } imagebox.AddRange(starcontrols); } imagebox.Render(); // replaces image.. return(last_sn); }