コード例 #1
0
        private void DisplayTradeSelection(MaterialCommodityData highlight = null)  // last_he and current_mcl can be null
        {
            int sel = extComboBoxTraderType.SelectedIndex;

            var mcl = new List <Tuple <MaterialCommodityData.MaterialGroupType, MaterialCommodityData[]> >();                                                  // list of groups vs data
            Dictionary <MaterialCommodityData.MaterialGroupType, string> mattxgroupnames = new Dictionary <MaterialCommodityData.MaterialGroupType, string>(); // translated names of groups

            foreach (var t in Enum.GetValues(typeof(MaterialCommodityData.MaterialGroupType)))                                                                 // relies on MCD being in order
            {
                var  matgroup = (MaterialCommodityData.MaterialGroupType)t;
                bool ok       = (sel == 0 && matgroup >= MaterialCommodityData.MaterialGroupType.RawCategory1 && matgroup <= MaterialCommodityData.MaterialGroupType.RawCategory7);
                ok |= (sel == 1 && matgroup >= MaterialCommodityData.MaterialGroupType.EncodedEmissionData && matgroup <= MaterialCommodityData.MaterialGroupType.EncodedFirmware);
                ok |= (sel == 2 && matgroup >= MaterialCommodityData.MaterialGroupType.ManufacturedChemical);
                if (ok)
                {
                    var list = MaterialCommodityData.Get(x => x.MaterialGroup == matgroup);
                    mcl.Add(new Tuple <MaterialCommodityData.MaterialGroupType, MaterialCommodityData[]>(matgroup, list));
                    mattxgroupnames[matgroup] = list[0].TranslatedMaterialGroup;
                }
            }

            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)
            {
                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 : last_mcl.FindFDName(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 trades)
                        {
                            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();
        }