comparison UIControl/AddEquipmentUIControl.cs @ 62:f733073967a2

Re #60: Add UI to add/remove/edit weapons in GTK * Add initial code to keep numeric and percentage in sync TODO: Allow users to change the non-selected one (e.g. select percentage but set the percentage by incrementing the number)
author IBBoard <dev@ibboard.co.uk>
date Sun, 29 Aug 2010 15:44:20 +0000
parents e7ad676a7344
children c2d79b4209e3
comparison
equal deleted inserted replaced
61:e7ad676a7344 62:f733073967a2
5 using IBBoard.Commands; 5 using IBBoard.Commands;
6 using IBBoard.WarFoundry.API.Objects; 6 using IBBoard.WarFoundry.API.Objects;
7 using IBBoard.WarFoundry.API.Util; 7 using IBBoard.WarFoundry.API.Util;
8 using IBBoard.WarFoundry.GUI.GTK.UIControl.Interfaces; 8 using IBBoard.WarFoundry.GUI.GTK.UIControl.Interfaces;
9 using IBBoard.WarFoundry.API.Commands; 9 using IBBoard.WarFoundry.API.Commands;
10 using CustomMath = IBBoard.CustomMath;
11 using IBBoard.Lang;
10 namespace IBBoard.WarFoundry.GUI.GTK.UIControl 12 namespace IBBoard.WarFoundry.GUI.GTK.UIControl
11 { 13 {
12 public class AddEquipmentUIControl 14 public class AddEquipmentUIControl
13 { 15 {
14 private Unit unit; 16 private Unit unit;
32 ui.UnitEquipmentItemChoiceChanged += HandleUiUnitEquipmentItemChoiceChanged; 34 ui.UnitEquipmentItemChoiceChanged += HandleUiUnitEquipmentItemChoiceChanged;
33 ui.UnitEquipmentAmountChanged += HandleUnitEquipmentAmountChanged; 35 ui.UnitEquipmentAmountChanged += HandleUnitEquipmentAmountChanged;
34 ui.UnitEquipmentAmountTypeChanged += HandleUnitEquipmentAmountChanged; 36 ui.UnitEquipmentAmountTypeChanged += HandleUnitEquipmentAmountChanged;
35 } 37 }
36 38
37 private void HandleUnitEquipmentAmountChanged () 39 private void HandleUnitEquipmentAmountChanged()
38 { 40 {
39 ui.SetOkayEnabledState(ui.SelectedUnitEquipmentItem != null && HasNonZeroEquipmentAmount()); 41 ui.SetOkayEnabledState(ui.SelectedUnitEquipmentItem != null && HasNonZeroEquipmentAmount());
40 } 42
41 43 if (ui.IsRatioEquipmentAmount)
44 {
45 SetEquipmentAmountsFromPercentage(ui.EquipmentPercentageAmount);
46 }
47 else
48 {
49 SetEquipmentAmountsFromNumber(ui.EquipmentNumericAmount);
50 }
51 }
52
53 private void SetEquipmentAmountsFromPercentage(double equipAmount)
54 {
55 UnitEquipmentItem currEquipItem = ui.SelectedUnitEquipmentItem;
56
57 double maxPercentage = GetMaxPercentageLimit(currEquipItem);
58 double minPercentage = GetMinPercentageLimit(currEquipItem);
59
60 if (equipAmount > maxPercentage)
61 {
62 string percentageTooLarge = Translation.GetTranslation("equipPercentageTooLarge", "the current percentage ({0}%) was larger than the maximum for the equipment item ({1}%) - the maximum value will be used instead", equipAmount, maxPercentage);
63 string percentageTooLargeTitle = Translation.GetTranslation("equipPercentageTooLargeTitle", "equipment percentage too large");
64 // MessageBox.Show(ParentForm, percentageTooLarge, percentageTooLargeTitle);
65 equipAmount = maxPercentage;
66 }
67 else if (equipAmount < minPercentage)
68 {
69 string percentageTooSmall = Translation.GetTranslation("equipPercentageTooSmall", "the current percentage ({0}%) was smaller than the minimum for the equipment item ({1}%) - the minimum value will be used instead", equipAmount, minPercentage);
70 string percentageTooSmallTitle = Translation.GetTranslation("equipPercentageTooSmallTitle", "equipment percentage too small");
71 // MessageBox.Show(ParentForm, percentageTooSmall, percentageTooSmallTitle);
72 equipAmount = minPercentage;
73 }
74
75 ui.EquipmentNumericAmount = CalculateNumericValueFromPercentage(equipAmount, currEquipItem);
76 ui.EquipmentPercentageAmount = equipAmount;
77 }
78
79 private int CalculateNumericValueFromPercentage(double percent, UnitEquipmentItem equip)
80 {
81 int calcedAmount = (int)CustomMath.IBBMath.Round((double)(unit.Size * (percent / 100)), equip.RoundNumberUp);
82 return Math.Min(Math.Max(calcedAmount, GetMinNumericLimit(equip)), GetMaxNumericLimit(equip));
83 }
84
85 private void SetEquipmentAmountsFromNumber(int equipAmount)
86 {
87 UnitEquipmentItem currEquipItem = ui.SelectedUnitEquipmentItem;
88 int maxNumber = GetMaxNumericLimit(currEquipItem);
89 int minNumber = GetMinNumericLimit(currEquipItem);
90
91 if (equipAmount > maxNumber)
92 {
93 string amountTooLarge = Translation.GetTranslation("equipNumberTooLarge", "the current amount ({0}) was larger than the maximum for the equipment item ({1}) - the maximum value will be used instead", equipAmount, maxNumber);
94 string amountTooLargeTitle = Translation.GetTranslation("equipNumberTooLargeTitle", "equipment amount too large");
95 //MessageBox.Show(ParentForm, amountTooLarge, amountTooLargeTitle);
96 equipAmount = maxNumber;
97 }
98 else if (equipAmount < minNumber)
99 {
100 string amountTooSmall = Translation.GetTranslation("equipNumberTooSmall", "the current amount ({0}) was smaller than the minimum for the equipment item ({1}) - the minimum value will be used instead", equipAmount, minNumber);
101 string amountTooSmallTitle = Translation.GetTranslation("equipNumberTooSmallTitle", "equipment amount too small");
102 //MessageBox.Show(ParentForm, amountTooSmall, amountTooSmallTitle);
103 equipAmount = minNumber;
104 }
105
106 ui.EquipmentPercentageAmount = CalcualtePercentageValueFromNumber(equipAmount, currEquipItem);
107 ui.EquipmentNumericAmount = equipAmount;
108 }
109
110 private double CalcualtePercentageValueFromNumber(int number, UnitEquipmentItem equip)
111 {
112 double calcedAmount = RoundPercentage(CustomMath.IBBMath.Percentage(number, unit.Size));
113 return Math.Min(Math.Max(calcedAmount, GetMinPercentageLimit(equip)), GetMaxPercentageLimit(equip));
114 }
115
42 //TODO Make abstract 116 //TODO Make abstract
43 protected void CreateEquipmentUI() 117 protected void CreateEquipmentUI()
44 { 118 {
45 ui = new FrmAddEquipment(); 119 ui = new FrmAddEquipment();
46 } 120 }
48 private void HandleUiUnitEquipmentItemChoiceChanged(UnitEquipmentItem equip) 122 private void HandleUiUnitEquipmentItemChoiceChanged(UnitEquipmentItem equip)
49 { 123 {
50 if (equip != null) 124 if (equip != null)
51 { 125 {
52 bool equipIsRatioLimit = UnitEquipmentUtil.IsEquipmentRatioLimited(unit, equip); 126 bool equipIsRatioLimit = UnitEquipmentUtil.IsEquipmentRatioLimited(unit, equip);
53 double maxPercent = RoundPercentage(UnitEquipmentUtil.GetMaxEquipmentPercentage(unit, equip)); 127 double maxPercent = GetMaxPercentageLimit(equip);
54 maxPercent = Math.Max(0, maxPercent); 128 double minPercent = GetMinPercentageLimit(equip);
55 double minPercent = RoundPercentage(UnitEquipmentUtil.GetMinEquipmentPercentage(unit, equip)); 129 int maxNumber = GetMaxNumericLimit(equip);
56 minPercent = Math.Max(0, minPercent); 130 int minNumber = GetMinNumericLimit(equip);
57 int maxNumber = UnitEquipmentUtil.GetMaxEquipmentCount(unit, equip);
58 maxNumber = Math.Max(0, maxNumber);
59 int minNumber = UnitEquipmentUtil.GetMinEquipmentCount(unit, equip);
60 minNumber = Math.Max(0, minNumber);
61 131
62 ui.SetUnitEquipmentLimits(equipIsRatioLimit, minPercent, maxPercent, minNumber, maxNumber); 132 ui.SetUnitEquipmentLimits(equipIsRatioLimit, minPercent, maxPercent, minNumber, maxNumber);
63 ui.SetUnitEquipmentLimitsEnabled(true); 133 ui.SetUnitEquipmentLimitsEnabled(true);
64 ui.SetOkayEnabledState(HasNonZeroEquipmentAmount()); 134 ui.SetOkayEnabledState(HasNonZeroEquipmentAmount());
65 } 135 }
68 ui.SetUnitEquipmentLimits(true, 0, 0, 0, 0); 138 ui.SetUnitEquipmentLimits(true, 0, 0, 0, 0);
69 ui.SetUnitEquipmentLimitsEnabled(false); 139 ui.SetUnitEquipmentLimitsEnabled(false);
70 ui.SetOkayEnabledState(false); 140 ui.SetOkayEnabledState(false);
71 } 141 }
72 } 142 }
73 143 private double GetMaxPercentageLimit(UnitEquipmentItem equip)
144 {
145 double maxPercent = RoundPercentage(UnitEquipmentUtil.GetMaxEquipmentPercentage(unit, equip));
146 return Math.Max(0, maxPercent);
147 }
148
149 private double GetMinPercentageLimit(UnitEquipmentItem equip)
150 {
151 double minPercent = RoundPercentage(UnitEquipmentUtil.GetMinEquipmentPercentage(unit, equip));
152 return Math.Max(0, minPercent);
153 }
154
155 private int GetMaxNumericLimit(UnitEquipmentItem equip)
156 {
157 int maxNumber = UnitEquipmentUtil.GetMaxEquipmentCount(unit, equip);
158 return Math.Max(0, maxNumber);
159 }
160 private int GetMinNumericLimit(UnitEquipmentItem equip)
161 {
162 int minNumber = UnitEquipmentUtil.GetMinEquipmentCount(unit, equip);
163 return Math.Max(0, minNumber);
164 }
165
74 private bool HasNonZeroEquipmentAmount() 166 private bool HasNonZeroEquipmentAmount()
75 { 167 {
76 bool nonZero; 168 bool nonZero;
77 169
78 if (ui.IsRatioEquipmentAmount) 170 if (ui.IsRatioEquipmentAmount)