view UI/EquipmentAmountControl.cs @ 66:68d4f7499212

Re #176: Bug when saving recently edited army * Make save button available whether army has previously been saved or not (partly for usability and partly to try to trigger bug) Bug seems to occur when opening an army as the first action, adding a unit and saving it, but not when creating a new army as the first action, then loading an old army as the second action, then adding a unit and saving it
author IBBoard <dev@ibboard.co.uk>
date Sat, 26 Sep 2009 09:51:53 +0000
parents 7ace7d2249ac
children 712915de47fd
line wrap: on
line source

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using IBBoard.Lang;
using IBBoard.WarFoundry.API;
using IBBoard.WarFoundry.API.Objects;

namespace IBBoard.WarFoundry.GUI.WinForms.UI
{
	public partial class EquipmentAmountControl : UserControl
	{
		private Unit unit;
		private UnitEquipmentItem equip;

		public EquipmentAmountControl()
		{
			InitializeComponent();
		}

		public void SetUnit(Unit equipUnit)
		{
			unit = equipUnit;
		}

		public void SetUnitEquipmentItem(UnitEquipmentItem unitEquipment)
		{
			equip = unitEquipment;
			SetWidgetValues();
		}

		public event EventHandler ValueChanged;

		private void OnValueChanged()
		{
			if (ValueChanged != null)
			{
				ValueChanged(this, new EventArgs());
			}
		}

		private void SetWidgetValues()
		{
			if (equip != null)
			{
				if (equip.IsRatioLimit)
				{
					double minPercent = equip.MinPercentage;
					double maxPercent = equip.MaxPercentage;
					SetUpDownControlMinMaxAndValue(percentage, minPercent, maxPercent);
					SetUpDownControlMinMaxAndValue(numeric, CalculateNumericValueFromPercentage(minPercent), CalculateNumericValueFromPercentage(maxPercent));
					rbEquipAll.Enabled = maxPercent == 100;

					if (minPercent == 100)
					{
						rbEquipAll.Checked = true;
						percentage.Enabled = false;
						rbPercentage.Enabled = false;
						numeric.Enabled = false;
						rbNumeric.Enabled = false;
					}
					else
					{
						rbPercentage.Checked = true;
						percentage.Enabled = true;
						rbPercentage.Enabled = true;
						numeric.Enabled = true;
						rbNumeric.Enabled = true;
					}
				}
				else
				{
					percentage.Enabled = false;
					rbPercentage.Enabled = false;
					int minNumber = equip.MinNumber;
					int maxNumber = equip.MaxNumber;
					SetUpDownControlMinMaxAndValue(numeric, (decimal) minNumber, (decimal) maxNumber);
					SetUpDownControlMinMaxAndValue(percentage, CalcualtePercentageValueFromNumber(minNumber), CalcualtePercentageValueFromNumber(maxNumber));
					rbEquipAll.Enabled = maxNumber == WarFoundryCore.INFINITY;
					
					if (minNumber == WarFoundryCore.INFINITY)
					{
						rbEquipAll.Checked = true;
						numeric.Enabled = false;
						rbNumeric.Enabled = false;
					}
					else
					{
						rbNumeric.Checked = true;
						numeric.Enabled = true;
						rbNumeric.Enabled = true;
					}
				}
			}
			else
			{
				Enabled = false;
			}
		}

		private void SetUpDownControlMinMaxAndValue(NumericUpDown upDownControl, double min, double max)
		{
			SetUpDownControlMinMaxAndValue(upDownControl, (decimal)min, (decimal)max);
		}

		private void SetUpDownControlMinMaxAndValue(NumericUpDown upDownControl, decimal min, decimal max)
		{
			upDownControl.Minimum = (min == WarFoundryCore.INFINITY ? unit.Size : min);
			upDownControl.Maximum = (max == WarFoundryCore.INFINITY ? unit.Size : max);
			upDownControl.Value = upDownControl.Value;
		}

		private void rbEquipAll_CheckedChanged(object sender, EventArgs e)
		{
			bool equipAll = rbEquipAll.Checked;
			numeric.Enabled = !equipAll;
			percentage.Enabled = !equipAll;

			if (equipAll)
			{
				numeric.Value = unit.Size;
				percentage.Value = 100;
			}

			radioCheckedChanged(sender, e);
		}

		private void percentage_ValueChanged(object sender, EventArgs e)
		{
			SetNumericValueFromPercentage();
			rbEquipAll.Checked = (percentage.Value == 100 && !rbNumeric.Checked);
			OnValueChanged();
		}

		private void SetNumericValueFromPercentage()
		{
			double percent = (double)percentage.Value;
			numeric.Value = CalculateNumericValueFromPercentage(percent);
		}

		private decimal CalculateNumericValueFromPercentage(double percent)
		{
			return (decimal) IBBMath.Round(unit.Size * (percent / 100.0), equip.RoundNumberUp);
		}

		private void numeric_ValueChanged(object sender, EventArgs e)
		{
			SetPercentageValueFromNumeric();
			OnValueChanged();
		}

		private void SetPercentageValueFromNumeric()
		{
			int number = (int)numeric.Value;
			percentage.Value = CalcualtePercentageValueFromNumber(number);
		}

		private decimal CalcualtePercentageValueFromNumber(int number)
		{
			decimal percent = 0;

			if (number > 0)
			{
				percent = (decimal) Math.Round((number / (unit.Size * 1.0)) * 100, 1);
			}
			else if (number == WarFoundryCore.INFINITY)
			{
				percent = 100;
			}

			return percent;
		}

		public double EquipmentAmount
		{
			get
			{
				double val = 0;

				if (rbNumeric.Checked)
				{
					val = (double) numeric.Value;
				}
				else if (rbPercentage.Checked)
				{
					val = (double) percentage.Value;
				}
				else if (rbEquipAll.Checked)
				{
					val = WarFoundryCore.INFINITY;
				}
				else
				{
					val = 0;
				}

				return val;
			}
		}

		public bool IsRatioEquipmentAmount
		{
			get
			{
				return rbPercentage.Checked;
			}
		}

		public void SetUnitEquipmentItemAmount(double equipAmountNum, bool isRatio)
		{
			if (isRatio)
			{
				percentage.Value = (decimal)equipAmountNum;
			}
			else if (equipAmountNum == WarFoundryCore.INFINITY)
			{
				rbEquipAll.Checked = true;
			}
			else
			{
				numeric.Value = (int)equipAmountNum;
			}
		}

		private void radioCheckedChanged(object sender, EventArgs e)
		{
			OnValueChanged();
		}
	}
}