Worms4Editor/W4Gui/Components/CollectiveListBox.cs

174 lines
4.3 KiB
C#

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<EventArgs> Unselected;
public event EventHandler<EventArgs> Selected;
private void toggleEvents()
{
this.blockEventTriggers = !this.blockEventTriggers;
}
protected virtual void OnUnselected(EventArgs e)
{
EventHandler<EventArgs> handler = Unselected;
if (handler != null && !blockEventTriggers)
{
handler(this, e);
}
}
protected virtual void OnSelected(EventArgs e)
{
EventHandler<EventArgs> 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();
}
}
}