using LibW4M.Data; using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace W4Gui.Components { public partial class CollectiveListBox : ListBox { public CollectiveListBox() { this.SelectedIndexChanged += selectedIndexChanged; } private bool blockEventTriggers = false; private int totalUntitled = 0; private int lastSelected = -1; public int LastSelected { get { return lastSelected; } } public int CurrentlySelected { get { return this.SelectedIndex; } } public bool IsItemSelected { get { return this.CurrentlySelected >= 0; } } private void unselectWithoutSaveTrigger() { toggleEvents(); this.lastSelected = -1; this.SelectedIndex = -1; toggleEvents(); } public event EventHandler Unselected; public event EventHandler Selected; private void toggleEvents() { this.blockEventTriggers = !this.blockEventTriggers; } protected virtual void OnUnselected(EventArgs e) { EventHandler handler = Unselected; if (handler != null && !blockEventTriggers) { handler(this, e); } } protected virtual void OnSelected(EventArgs e) { EventHandler handler = Selected; if (handler != null && !blockEventTriggers) { handler(this, e); } } private void selectedIndexChanged(object? sender, EventArgs e) { if (LastSelected >= 0 && LastSelected != CurrentlySelected) OnUnselected(e); if (CurrentlySelected >= 0 && LastSelected != CurrentlySelected) OnSelected(e); lastSelected = CurrentlySelected; } public void Add(string name) { this.Items.Add(name); } public void Delete(int idx) { toggleEvents(); int selIndx = this.SelectedIndex; unselectWithoutSaveTrigger(); this.Items.RemoveAt(idx); toggleEvents(); if (selIndx == idx) { if((selIndx - 1) < 0 && this.Items.Count > 0) { this.SelectedIndex = 0; } else if(selIndx > (this.Items.Count - 1)) { this.SelectedIndex = this.Items.Count - 1; } else { this.SelectedIndex = selIndx; } } } private string processName(string name) { if(name == "") { totalUntitled++; return "Untitled " + totalUntitled.ToString(); } return name; } public void UpdateName(int idx, string name) { if (idx >= this.Items.Count) return; if (idx < 0) return; if(name != "") { toggleEvents(); this.Items[idx] = name; toggleEvents(); } } public void LoadArray(SaveDataEntry[] arr) { toggleEvents(); unselectWithoutSaveTrigger(); this.Items.Clear(); for (int i = 0; i < arr.Length; i++) { string name = arr[i].FriendlyName; this.Items.Add(processName(name)); } toggleEvents(); } public void LoadCollective(SaveDataCollective collective) { toggleEvents(); unselectWithoutSaveTrigger(); this.Items.Clear(); for (int i = 0; i < collective.Length; i++) { string name = collective[i].FriendlyName; this.Items.Add(processName(name)); } toggleEvents(); } } }