private void DisplayTradeSelection(MaterialCommodityMicroResourceType highlight = null) // last_he and current_mcl can be null { int sel = extComboBoxTraderType.SelectedIndex; var mcl = new List <Tuple <MaterialCommodityMicroResourceType.MaterialGroupType, MaterialCommodityMicroResourceType[]> >(); // list of groups vs data Dictionary <MaterialCommodityMicroResourceType.MaterialGroupType, string> mattxgroupnames = new Dictionary <MaterialCommodityMicroResourceType.MaterialGroupType, string>(); // translated names of groups foreach (var t in Enum.GetValues(typeof(MaterialCommodityMicroResourceType.MaterialGroupType))) // relies on MCD being in order { var matgroup = (MaterialCommodityMicroResourceType.MaterialGroupType)t; bool ok = (sel == 0 && matgroup >= MaterialCommodityMicroResourceType.MaterialGroupType.RawCategory1 && matgroup <= MaterialCommodityMicroResourceType.MaterialGroupType.RawCategory7); ok |= (sel == 1 && matgroup >= MaterialCommodityMicroResourceType.MaterialGroupType.EncodedEmissionData && matgroup <= MaterialCommodityMicroResourceType.MaterialGroupType.EncodedFirmware); ok |= (sel == 2 && matgroup >= MaterialCommodityMicroResourceType.MaterialGroupType.ManufacturedChemical); if (ok) { var list = MaterialCommodityMicroResourceType.Get(x => x.MaterialGroup == matgroup); mcl.Add(new Tuple <MaterialCommodityMicroResourceType.MaterialGroupType, MaterialCommodityMicroResourceType[]>(matgroup, list)); mattxgroupnames[matgroup] = list[0].TranslatedMaterialGroup; } } var curmcl = last_mcl != null?discoveryform.history.MaterialCommoditiesMicroResources.Get(last_mcl.Value) : null; // get mcl at last_mcl position. May be null if we don't have any list Font titlefont = EDDTheme.Instance.GetFont; Font badgefont = EDDTheme.Instance.GetScaledFont(16f / 12f, max: 21); const int hbadgemargin = 20; const int vbadgemargin = 12; extPictureTrades.ClearImageList(); int vpos = 0; int maxhpos = 0; foreach (var t in mcl) // for each type of material/commd { int hpos = 0; int nextvpos = vpos; int lvl = 1; extPictureTrades.AddOwnerDraw((g, ie) => { int tlen; using (Brush b = new SolidBrush(orange)) { string s = mattxgroupnames[t.Item1]; s = s.Substring(s.IndexOf(" ") + 1); tlen = (int)(g.MeasureString(s, titlefont).Width + 2); g.DrawString(s, titlefont, b, new Point(ie.Location.Left, ie.Location.Top)); } using (Pen p = new Pen(orange)) { g.DrawLine(p, new Point(tlen, ie.Location.Top + titlefont.Height / 2), new Point(maxhpos, ie.Location.Top + titlefont.Height / 2)); } }, new Rectangle(0, vpos, 2000, 24), t.Item1.ToString()); vpos += titlefont.Height + 6; string backname = "encodedbackground"; if (t.Item1.ToString().Contains("Manu")) { backname = "manubackground"; } else if (t.Item1.ToString().Contains("Raw")) { backname = "rawbackground"; } Bitmap background = BaseUtils.Icons.IconSet.GetIcon("Controls.MaterialTrader." + backname) as Bitmap; foreach (var mat in t.Item2) { int offer = 0, receive = 0; string name = mat.Name; int mattotal = last_mcl == null ? int.MinValue : curmcl.Find(x => x.Details.FDName == mat.FDName)?.Count ?? 0; // find mcl in material list if there, and its count if (mattotal >= 0) // if we have an he, adjust the totals by the trades { foreach (var trade in tradelist) { if (trade.fromelement.FDName == mat.FDName) { mattotal -= trade.offer; // may go negative if over offered } if (trade.element.FDName == mat.FDName) { mattotal += trade.receive; } } } Color wash = Color.Transparent; if (highlight?.FDName == mat.FDName) { wash = Color.FromArgb(80, 0, 75, 0); } if (selected != null) { bool difflevel = selected.type != t.Item1; if (lvl < selected.level) { offer = (int)Math.Pow(6, (selected.level - lvl) + (difflevel ? 1 : 0)); receive = 1; } else if (lvl > selected.level) { offer = difflevel ? 6 : 1; receive = (int)Math.Pow(3, (lvl - selected.level)); while (offer % 3 == 0) { offer /= 3; receive /= 3; } } else if (selected.type == t.Item1) { name = "Cancel"; wash = Color.FromArgb(80, 0, 32, 0); } else { offer = 6; receive = 1; } if (offer > mattotal) { wash = Color.FromArgb(80, 128, 0, 0); } } Bitmap bmp = DrawBadge(background, badgefont, offer, receive, lvl, name, mattotal, wash); var ie = extPictureTrades.AddImage(new Rectangle(hpos, vpos, background.Width, background.Height), bmp, imgowned: true); ie.Tag = new ElementTrade { type = t.Item1, element = mat, level = lvl, offer = offer, receive = receive }; maxhpos = Math.Max(maxhpos, hpos + bmp.Width); hpos += bmp.Width + hbadgemargin; nextvpos = Math.Max(nextvpos, vpos + bmp.Height + vbadgemargin); lvl++; } vpos = nextvpos; } extPictureTrades.Render(); }