view UI/EquipmentAmountControl.cs @ 43:7ace7d2249ac

Fixes #117: Add percentage and number boxes to equipment item dialogs * Add value changing when changing radio button selection * Add logic to equipment amount editing control to perform value setting (but see #146) Also, fixes #114 by rebuilding everything in to a single control
author IBBoard <dev@ibboard.co.uk>
date Mon, 07 Sep 2009 20:10:40 +0000
parents d06c2e390a14
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();
		}
	}
}