/// <summary> /// Обновить контрол /// </summary> /// <param name="dataListIn">Список строк (пара строка-количество)</param> /// <param name="sizeChecked">Размер иконок (true = большие)</param> public void UpdateControl(SiegeDataBase.ResourseDictionary dataListIn, bool sizeChecked) { var iconSize = IconSize[Convert.ToInt32(sizeChecked)]; var fontSize = FontSize[Convert.ToInt32(sizeChecked)]; // при необходимости добавим заголовок var addintionalTopFromTitle = 0; if (!string.IsNullOrEmpty(Title)) { if (_labelTitle == null) { _labelTitle = new Label { Text = Title, Location = new Point(Left, Top), AutoSize = true }; _parentControl.Controls.Add(_labelTitle); } else { _labelTitle.Left = Left; _labelTitle.Top = Top; } _labelTitle.Visible = dataListIn.Count > 0; if (dataListIn.Count > 0) addintionalTopFromTitle = _labelTitle.Height + ConstTitlePaddingBottom; } // размножим список, если нужно var dataList = new SiegeDataBase.ResourseDictionary(); foreach (var data in dataListIn) { var id = data.Key.Split(';'); var count = data.Value; for (var i = 0; i < id.Length; i++) { var code = id[i]; if (i > 0) code = "•" + code; dataList.Add(code, count); } } _itemsCount = dataList.Count; var hideenLines = 0; var hiddenList = new List<string>(); // рассчитаем внешний вид контрола //var maxPict = Math.Max(_picturesList.Count, dataList.Count); //for (var i = 0; i < dataList.Count; i++) var k = -1; foreach (var data in dataList) { k++; var formatString = LabelFormat; // сохранили код var resCode = data.Key; // может ли строка быть линком bool linked = false; bool hidden = false; // определим или-строки var orCode = resCode.StartsWith("•"); if (orCode) resCode = Functions.SubString(resCode, 1); // рассчитаем описание строки string resName = null; if (!Functions.inList(resCode.ToLower(), "level", "rank", "castlerating")) linked = SiegeDataBase.DataLanguages.Get(resCode, out resName); if (string.IsNullOrEmpty(resName)) { bool res; var building = SiegeDataBase.DataBuildings.Get(resCode, out res); if (res) { resName = building.Name; linked = true; } } // заодно определим файл иконки (ибо потом поздно будет) var resFile = SiegeDataBase.DataObjectsUi.Get(resCode); // если всё равно имени нет, значит там не код, а просто текст if (string.IsNullOrEmpty(resName)) { resName = SiegeDataBase.GetLocalizedStringRequirements(resCode); resFile = SiegeDataBase.PictureNotAvailable; } if (hiddenList.Contains(resName)) { hidden = true; hideenLines++; } else hiddenList.Add(resName); PictureBox pict; LinkLabel label; if (_picturesList.Count <= k) { // создаём каждую новую строчку pict = new PictureBox { Size = new Size(iconSize, iconSize), Anchor = AnchorStyles.Left | AnchorStyles.Top, SizeMode = PictureBoxSizeMode.Zoom }; label = new LinkLabel { Anchor = Width > 0 ? AnchorStyles.Left | AnchorStyles.Top : AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right, TextAlign = ContentAlignment.MiddleLeft, LinkArea = new LinkArea() }; label.AutoSize = Width == 0; if (OnClick != null) label.LinkClicked += OnClick; _parentControl.Controls.Add(pict); _parentControl.Controls.Add(label); _picturesList.Add(pict); _labelsList.Add(label); } else { pict = _picturesList[k]; label = _labelsList[k]; pict.Visible = true; label.Visible = true; } if (hidden) { pict.Visible = false; label.Visible = false; continue; } pict.Left = Left + 2; pict.Top = Top + addintionalTopFromTitle + iconSize*(k - hideenLines); pict.Width = iconSize; pict.Height = iconSize; label.Left = pict.Left + iconSize; label.Top = Top + addintionalTopFromTitle + iconSize*(k - hideenLines); label.Width = _parentControl.ClientSize.Width - pict.Left + Width - iconSize; label.Height = iconSize; label.Font = new Font(label.Font.FontFamily, fontSize, label.Font.Style); label.Tag = linked ? resCode : null; // рассчитаем иконку var img = Path.Combine(SiegeDataBase.GamePath, @"Data\Textures\"); img = Path.Combine(img, resFile ?? SiegeDataBase.PictureError); pict.Image = TgaImages.GetFromFile(img); // расчитаем текст if (!linked) formatString = formatString.Replace("•", ""); // проверяем формат вывода строки // 0 - формат всей строки // 1 - формат количественных данных var format = formatString.Split('|'); // цифра количества форматируется лишь в том случае, если строка является ссылкой // (при этом нулевое значение преобразуется в пустое) var formatedCount = linked && format.Length > 1 ? data.Value > 1 ? string.Format(format[1], data.Value) : "" : data.Value.ToString(); label.Text = string.Format(format[0], LabelToLower ? (resName ?? "").ToLower() : resName, format.Length == 1 ? data.Value.ToString() : formatedCount); // отметим пометочкой или-строки if (orCode) { label.Text = "или " + label.Text; pict.Visible = false; } // расчитаем границы линка, еслиэто необходимо var link1 = label.Text.IndexOf("•"); var link2 = label.Text.LastIndexOf("•"); label.LinkArea = LinkedText && linked && link1 >= 0 ? new LinkArea(link1, link2 - 2) : new LinkArea(); // удаляем метки линка if (link1 >= 0) label.Text = label.Text.Replace("•", ""); } // убираем лишние строки for (var i = dataList.Count; i < _picturesList.Count; i++) { _picturesList[i].Visible = false; _labelsList[i].Visible = false; } // сместим дочерний контрол, при необходимости if (LinkedControl != null) { LinkedControl.Top = Top + addintionalTopFromTitle + iconSize*(_itemsCount - hideenLines) + ConstLinkedControlPadding; } }
/* /// <summary> /// Обновить контрол /// </summary> /// <param name="dataList">Список строк (пара строка-количество)</param> /// <param name="sizeChecked">Размер иконок (true = большие)</param> public void UpdateControl(IList<SiegeBuildingStructure.ResoursePair> dataList, bool sizeChecked) { UpdateControl(dataList, sizeChecked, Top); } */ /// <summary> /// Обновить контрол /// </summary> /// <param name="strList">Список строк (пара строка-количество)</param> /// <param name="sizeChecked">Размер иконок (true = большие)</param> public void UpdateControl(IList<string> strList, bool sizeChecked) { var list = new SiegeDataBase.ResourseDictionary(); foreach (var str in strList) { var pos = str.IndexOf(','); var id = pos > 0 ? Functions.SubString(str, 0, pos).Trim() : str; var count = 1; if (pos > 0) Int32.TryParse(Functions.SubString(str, pos + 1).Trim(), out count); list.Add(id, count); } UpdateControl(list, sizeChecked); }