Mercurial > repos > IBDev-IBBoard.WarFoundry.GUI.WinForms
view UI/EquipmentAmountControl.cs @ 83:6d5cb8c7b6ed
Fixes #204: Use new limits in WinForms UI
* Set initial amounts correctly
* Disable percentage option when all that can be done is "equip all"
* Remove unused references to "INFINITY"
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Fri, 30 Oct 2009 21:00:04 +0000 |
parents | 9dc22147c2db |
children | 0bb9f40d44eb |
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.CustomMath; using IBBoard.Limits; using IBBoard.WarFoundry.API; using IBBoard.WarFoundry.API.Objects; using IBBoard.WarFoundry.API.Util; namespace IBBoard.WarFoundry.GUI.WinForms.UI { public partial class EquipmentAmountControl : UserControl { private Unit unit; private UnitEquipmentItem equip; public event EventHandler ValueChanged; public EquipmentAmountControl() { InitializeComponent(); } public void SetUnit(Unit equipUnit) { unit = equipUnit; } public void SetUnitEquipmentItem(UnitEquipmentItem unitEquipment) { equip = unitEquipment; SetWidgetValues(); SetUnitEquipmentItemAmount(); } private void OnValueChanged() { if (ValueChanged != null) { ValueChanged(this, new EventArgs()); } } private void SetWidgetValues() { if (equip != null) { bool equipIsRatioLimit = UnitEquipmentUtil.IsEquipmentRatioLimited(unit, equip); double maxPercent = UnitEquipmentUtil.GetMaxEquipmentPercentage(unit, equip); double minPercent = UnitEquipmentUtil.GetMinEquipmentPercentage(unit, equip); int maxNumber = UnitEquipmentUtil.GetMaxEquipmentCount(unit, equip); int minNumber = UnitEquipmentUtil.GetMinEquipmentCount(unit, equip); SetUpDownControlMinMaxes(minPercent, maxPercent, minNumber, maxNumber); if (equipIsRatioLimit) { SetEquipmentAmountsFromPercentage(minPercent); } else { SetEquipmentAmountsFromNumber(minNumber); } rbEquipAll.Enabled = equipIsRatioLimit && maxPercent == 100; rbEquipAll.Checked = equipIsRatioLimit && minPercent == 100; percentage.Enabled = equipIsRatioLimit && minPercent != 100; rbPercentage.Enabled = percentage.Enabled; rbPercentage.Checked = equipIsRatioLimit && !rbEquipAll.Checked; numeric.Enabled = !equipIsRatioLimit || minPercent != 100; rbNumeric.Enabled = numeric.Enabled; rbNumeric.Checked = !equipIsRatioLimit; } else { Enabled = false; } } private void SetUpDownControlMinMaxes(double minPercent, double maxPercent, int minNumber, int maxNumber) { percentage.ValueChanged -= percentage_ValueChanged; numeric.ValueChanged -= numeric_ValueChanged; SetUpDownControlMinMax(percentage, minPercent, maxPercent); SetUpDownControlMinMax(numeric, (decimal) minNumber, (decimal) maxNumber); percentage.ValueChanged += percentage_ValueChanged; numeric.ValueChanged += numeric_ValueChanged; } private void SetUpDownControlMinMax(NumericUpDown upDownControl, double min, double max) { SetUpDownControlMinMax(upDownControl, (decimal)min, (decimal)max); } private void SetUpDownControlMinMax(NumericUpDown upDownControl, decimal min, decimal max) { upDownControl.Minimum = min; upDownControl.Maximum = max; } 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) { return (decimal) Math.Round((number / (unit.Size * 1.0)) * 100, 1); } 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 = 100; } else { val = 0; } return val; } } public bool IsRatioEquipmentAmount { get { return !rbNumeric.Checked; } } private void SetUnitEquipmentItemAmount() { double equipAmountNum = unit.GetEquipmentAmount(equip); if (equipAmountNum > 0) { bool isRatio = unit.GetEquipmentAmountIsRatio(equip); if (isRatio) { SetEquipmentAmountsFromPercentage(equipAmountNum); } else { int equipAmount = (int) equipAmountNum; SetEquipmentAmountsFromNumber(equipAmount); } } } private void SetEquipmentAmountsFromPercentage(double equipAmountNum) { numeric.Value = CalculateNumericValueFromPercentage(equipAmountNum); percentage.Value = (decimal) equipAmountNum; } private void SetEquipmentAmountsFromNumber(int equipAmount) { percentage.Value = CalcualtePercentageValueFromNumber(equipAmount); numeric.Value = equipAmount; } private void radioCheckedChanged(object sender, EventArgs e) { OnValueChanged(); } } }