private void AddSpawnItem(Control pnlLine, SpawnItemButton btnInsertAfter, bool isBindCurrent, SpawnItem newItem = null) { var line = GetLine(pnlLine); var insertAfterItem = btnInsertAfter == null ? null : btnInsertAfter.Item; if (newItem == null) { newItem = line.InsertItem(Pack.SpawnItemConfig.Types.Keys.First(), insertAfterItem); } else { line.InsertItem(newItem, insertAfterItem); } var newBtn = AddSpawnItemButton(pnlLine, newItem); if (isBindCurrent) { BindSpawnItem(newBtn); } IsNeedSave = true; UpdatePrognosis(); }
private void RemoveSpawnItemButton(SpawnItemButton btnItem) { BindSpawnItem(null); var pnlLine = btnItem.Parent; var line = GetLine(pnlLine); line.RemoveItem(btnItem.Item); pnlLine.Controls.Remove(btnItem); pnlLine.Refresh(); UpdatePrognosis(); }
private static SpawnItemButton GetNearButton(Control pnlLine, int locationX) { SpawnItemButton result = null; foreach (SpawnItemButton btn in pnlLine.Controls) { if (btn.Right <= locationX && (result == null || btn.Right > result.Right)) { result = btn; } } return(result); }
private SpawnItemButton AddSpawnItemButton(Control pnlLine, SpawnItem item) { var btnItem = new SpawnItemButton(item, (fileName) => ilSpawnItemTypesLarge.Images[GetImageIndex(ilSpawnItemTypesLarge, fileName, false)], (fileName) => ilAttachmentNames.Images[GetImageIndex(ilAttachmentNames, fileName, false)]); btnItem.ContextMenu = cmButton; btnItem.MouseDown += btnItem_MouseDown; pnlLine.Controls.Add(btnItem); pnlLine.Refresh(); return(btnItem); }
private void ShowInsertWizard(Control pnlLine, SpawnItemButton btnPrev = null) { using (var frm = new WizardForm(this)) { if (frm.ShowDialog() != DialogResult.OK) { return; } int totalProbability = frm.Items.Sum(itm => itm.Probability); var itemsByRange = new List <Tuple <int, int, WizardForm.Item> >(frm.Items.Count); int probabilityStart = 0; foreach (var item in frm.Items) { itemsByRange.Add( new Tuple <int, int, WizardForm.Item>(probabilityStart, probabilityStart + item.Probability, item)); probabilityStart += item.Probability; } Random rnd = new Random(0); pnlLine.SuspendLayout(); SuspendDrawing(pnlLine); BeginBinding(); try { for (int i = 0; i < frm.Count; i++) { int index = rnd.Next(0, totalProbability); var wizardItem = itemsByRange.First(itm => itm.Item1 <= index && index < itm.Item2).Item3; wizardItem.Delay = frm.Interval; // NOTE: клонируем item, т.к. если копировать ссылку, то потом получим несколько ссылок на одно и то же и будут непонятные ошибки при редактировании AddSpawnItem(pnlLine, btnPrev, false, wizardItem.Clone()); } BindSpawnItem(null); } finally { pnlLine.ResumeLayout(); ResumeDrawing(pnlLine); EndBinding(); } UpdatePrognosis(); } }
private void pnlLine_MouseDown(object sender, MouseEventArgs e) { Panel pnlLine = (Panel)sender; _insertAfterBtnItem = null; if (e.Button == MouseButtons.Right && pnlLine.Controls.Count > 0) { // ищем ближайший слева контрол от позиции клика _insertAfterBtnItem = GetNearButton(pnlLine, e.X); } else if (e.Button == MouseButtons.Left) { DoDragDrop(pnlLine, DragDropEffects.Move); } BindSpawnItem(null); }
private void BindSpawnItem(SpawnItemButton btnItem) { if (_curItemButton != null) { _curItemButton.IsSelected = false; } _curItemButton = btnItem; if (_curItemButton == null) { pnlSpawnItemBinding.Visible = false; } else { var item = _curItemButton.Item; var line = GetCurrentLine(); BeginBinding(); try { _curItemButton.IsSelected = true; pnlSpawnItemBinding.Visible = true; cmbSpawnItemType.EditValue = item.Type; txtSpawnItemDelay.Value = (decimal)item.Delay; // для не-первого айтема не даём ставить Delay меньше 1, т.к. в этом случае он сольётся с предыдущим. Для подобных настроек есть отдельные линии. txtSpawnItemDelay.Properties.MinValue = line.Items.FirstOrDefault() == item ? 0 : 1; BindAbsoluteTime(); gvAttachmentTypes.RefreshData(); } finally { EndBinding(); } _curItemButton.Refresh(); } }