CodeWalker/Project/Panels/EditYtypMloEntSetPanel.cs
2019-12-28 23:24:36 +11:00

199 lines
6.4 KiB
C#

using CodeWalker.GameFiles;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CodeWalker.Project.Panels
{
public partial class EditYtypMloEntSetPanel : ProjectPanel
{
public ProjectForm ProjectForm;
public MCMloEntitySet CurrentEntitySet { get; set; }
private bool populatingui = false;
private bool SelectingLocation = false;
public EditYtypMloEntSetPanel(ProjectForm owner)
{
ProjectForm = owner;
InitializeComponent();
}
public void SetEntitySet(MCMloEntitySet entset)
{
CurrentEntitySet = entset;
Tag = entset;
UpdateFormTitle();
MloInstanceData instance = ProjectForm.TryGetMloInstance(entset?.OwnerMlo);
//ProjectForm.WorldForm?.SelectMloEntitySet(entset, instance);
UpdateControls();
}
private void UpdateControls()
{
if (CurrentEntitySet != null)
{
populatingui = true;
EntitySetNameTextBox.Text = CurrentEntitySet.Name;
ForceVisibleCheckBox.Checked = CurrentEntitySet.ForceVisible;
SelectedLocationGroupBox.Visible = false;
UpdateSelectedLocationRoomCombo();
populatingui = false;
}
else
{
EntitySetNameTextBox.Text = string.Empty;
ForceVisibleCheckBox.Checked = false;
SelectedLocationGroupBox.Visible = false;
SelectedLocationRoomCombo.Items.Clear();
}
UpdateLocationsListBox();
}
private void UpdateLocationsListBox()
{
LocationsListBox.Items.Clear();
if (CurrentEntitySet?.Locations != null)
{
for (int i = 0; i < CurrentEntitySet.Locations.Length; i++)
{
var loc = CurrentEntitySet.Locations[i];
var ent = ((CurrentEntitySet.Entities != null) && (i < CurrentEntitySet.Entities.Length)) ? CurrentEntitySet.Entities[i] : null;
var item = new LocationItem() { Location = loc, Entity = ent, Index = i };
LocationsListBox.Items.Add(item);
}
}
}
private void UpdateSelectedLocationRoomCombo()
{
SelectedLocationRoomCombo.Items.Clear();
if (CurrentEntitySet?.OwnerMlo?.rooms != null)
{
foreach (var room in CurrentEntitySet.OwnerMlo.rooms)
{
SelectedLocationRoomCombo.Items.Add(room);
}
}
}
private void UpdateFormTitle()
{
Text = CurrentEntitySet?.Name ?? "Entity Set";
}
private void EntitySetNameTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentEntitySet == null) return;
var str = EntitySetNameTextBox.Text;
if (CurrentEntitySet.Name != str)
{
uint h = 0;
if (uint.TryParse(str, out h))
{
CurrentEntitySet._Data.name = h;
}
else
{
JenkIndex.Ensure(str);
CurrentEntitySet._Data.name = JenkHash.GenHash(str);
}
TreeNode tn = ProjectForm.ProjectExplorer?.FindMloEntitySetTreeNode(CurrentEntitySet);
if (tn != null)
{
tn.Text = CurrentEntitySet.Name;
}
UpdateFormTitle();
ProjectForm.SetYtypHasChanged(true);
}
}
private void ForceVisibleCheckBox_CheckedChanged(object sender, EventArgs e)
{
if (CurrentEntitySet == null) return;
CurrentEntitySet.ForceVisible = ForceVisibleCheckBox.Checked;
}
private void LocationsListBox_SelectedIndexChanged(object sender, EventArgs e)
{
SelectedLocationGroupBox.Visible = false;
if (CurrentEntitySet == null) return;
var item = LocationsListBox.SelectedItem as LocationItem;
if (item == null) return;
SelectingLocation = true;
SelectedLocationEntityLabel.Text = (item.Entity != null) ? item.Entity.Name : "-";
SelectedLocationRoomCombo.SelectedIndex = (item.Location < SelectedLocationRoomCombo.Items.Count) ? (int)item.Location : 0;
SelectingLocation = false;
SelectedLocationGroupBox.Visible = true;
}
private void SelectedLocationRoomCombo_SelectedIndexChanged(object sender, EventArgs e)
{
if (SelectingLocation) return;
if (CurrentEntitySet?.Locations == null) return;
var item = LocationsListBox.SelectedItem as LocationItem;
if (item == null) return;
item.Location = (SelectedLocationRoomCombo.SelectedIndex >= 0) ? (uint)SelectedLocationRoomCombo.SelectedIndex : 0;
var ind = item.Index;
if (ind < CurrentEntitySet.Locations.Length)
{
CurrentEntitySet.Locations[ind] = item.Location;
ProjectForm.SetYtypHasChanged(true);
if ((ind >= 0) && (ind < LocationsListBox.Items.Count))
{
LocationsListBox.Items[ind] = LocationsListBox.Items[ind];//refresh the item text...
}
}
}
private void AddEntityButton_Click(object sender, EventArgs e)
{
ProjectForm.SetProjectItem(CurrentEntitySet);
ProjectForm.NewMloEntity();
}
private void DeleteButton_Click(object sender, EventArgs e)
{
ProjectForm.SetProjectItem(CurrentEntitySet);
ProjectForm.DeleteMloEntitySet();
}
class LocationItem
{
public uint Location { get; set; }
public MCEntityDef Entity { get; set; }
public int Index { get; set; }
public override string ToString()
{
if (Entity == null) return Location.ToString();
return Location.ToString() + ": " + Entity.ToString();
}
}
}
}