Mercurial > repos > IBDev-IBBoard.WarFoundry.GUI.GTK
comparison UIControl/EditEquipmentUIControl.cs @ 64:e3fe48c4d794
Re #60: Add UI to add/remove/edit weapons in GTK
* Add most of basic "edit" interface, based on "add" interface
TODO:
* Set initial values
* Warn when setting to 0
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Thu, 02 Sep 2010 20:12:21 +0000 |
parents | |
children | 77448375d2f9 |
comparison
equal
deleted
inserted
replaced
63:c2d79b4209e3 | 64:e3fe48c4d794 |
---|---|
1 // This file (EditEquipmentUIControl.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 IBBoard | |
2 // | |
3 // // The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license. | |
4 using System; | |
5 using IBBoard.Commands; | |
6 using IBBoard.WarFoundry.API.Objects; | |
7 using IBBoard.WarFoundry.API.Util; | |
8 using IBBoard.WarFoundry.GUI.GTK.UIControl.Interfaces; | |
9 using IBBoard.WarFoundry.API.Commands; | |
10 using CustomMath = IBBoard.CustomMath; | |
11 using IBBoard.Lang; | |
12 using IBBoard.WarFoundry.GUI.GTK; | |
13 namespace IBBoard.WarFoundry.GUI.GTK.UIControl | |
14 { | |
15 public class EditEquipmentUIControl | |
16 { | |
17 private CommandStack commandStack; | |
18 private IEditEquipmentUI ui; | |
19 private Unit unit; | |
20 private UnitEquipmentItem equipItem; | |
21 private double minPercentage, maxPercentage; | |
22 private int minNumber, maxNumber; | |
23 private bool isRatioAmount; | |
24 private double equipmentAmount; | |
25 | |
26 | |
27 public EditEquipmentUIControl(Unit unit, UnitEquipmentItem item, CommandStack commandStack) | |
28 { | |
29 this.unit = unit; | |
30 this.commandStack = commandStack; | |
31 this.equipItem = item; | |
32 SetupUI(); | |
33 } | |
34 | |
35 private void SetupUI() | |
36 { | |
37 CreateEquipmentUI(); | |
38 ui.SetOkayEnabledState(false); | |
39 isRatioAmount = UnitEquipmentUtil.IsEquipmentRatioLimited(unit, equipItem); | |
40 maxPercentage = GetMaxPercentageLimit(equipItem); | |
41 minPercentage = GetMinPercentageLimit(equipItem); | |
42 maxNumber = GetMaxNumericLimit(equipItem); | |
43 minNumber = GetMinNumericLimit(equipItem); | |
44 | |
45 ui.SetUnitEquipmentLimits(isRatioAmount, minPercentage, maxPercentage, minNumber, maxNumber); | |
46 ui.SetUnitEquipmentLimitsEnabled(true); | |
47 ui.SetOkayEnabledState(HasNonZeroEquipmentAmount()); | |
48 SetEquipmentAmountControlEnabledStates(); | |
49 | |
50 //TODO: Set initial values | |
51 | |
52 ui.UnitEquipmentAmountChanged += HandleUnitEquipmentAmountChanged; | |
53 ui.UnitEquipmentAmountTypeChanged += HandleUnitEquipmentAmountChanged; | |
54 } | |
55 | |
56 private void HandleUnitEquipmentAmountChanged() | |
57 { | |
58 ui.SetOkayEnabledState(equipItem != null && HasNonZeroEquipmentAmount()); | |
59 isRatioAmount = ui.IsRatioEquipmentAmount; | |
60 | |
61 if (isRatioAmount) | |
62 { | |
63 double equipmentAmount = ui.EquipmentPercentageAmount; | |
64 SetEquipmentAmountsFromPercentage(equipmentAmount); | |
65 } | |
66 else | |
67 { | |
68 int equipmentIntAmount = ui.EquipmentNumericAmount; | |
69 equipmentAmount = equipmentIntAmount; | |
70 SetEquipmentAmountsFromNumber(equipmentIntAmount); | |
71 } | |
72 } | |
73 | |
74 private void SetEquipmentAmountsFromPercentage(double equipAmount) | |
75 { | |
76 if (equipAmount > maxPercentage) | |
77 { | |
78 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); | |
79 string percentageTooLargeTitle = Translation.GetTranslation("equipPercentageTooLargeTitle", "equipment percentage too large"); | |
80 // MessageBox.Show(ParentForm, percentageTooLarge, percentageTooLargeTitle); | |
81 equipAmount = maxPercentage; | |
82 } | |
83 else if (equipAmount < minPercentage) | |
84 { | |
85 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); | |
86 string percentageTooSmallTitle = Translation.GetTranslation("equipPercentageTooSmallTitle", "equipment percentage too small"); | |
87 // MessageBox.Show(ParentForm, percentageTooSmall, percentageTooSmallTitle); | |
88 equipAmount = minPercentage; | |
89 } | |
90 | |
91 ui.EquipmentNumericAmount = CalculateNumericValueFromPercentage(equipAmount); | |
92 ui.EquipmentPercentageAmount = equipAmount; | |
93 } | |
94 | |
95 private int CalculateNumericValueFromPercentage(double percent) | |
96 { | |
97 int calcedAmount = (int)CustomMath.IBBMath.Round((unit.Size * (percent / 100.0)), equipItem.RoundNumberUp); | |
98 return Math.Min(Math.Max(calcedAmount, minNumber), maxNumber); | |
99 } | |
100 | |
101 private void SetEquipmentAmountsFromNumber(int equipAmount) | |
102 { | |
103 if (equipAmount > maxNumber) | |
104 { | |
105 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); | |
106 string amountTooLargeTitle = Translation.GetTranslation("equipNumberTooLargeTitle", "equipment amount too large"); | |
107 //MessageBox.Show(ParentForm, amountTooLarge, amountTooLargeTitle); | |
108 equipAmount = maxNumber; | |
109 } | |
110 else if (equipAmount < minNumber) | |
111 { | |
112 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); | |
113 string amountTooSmallTitle = Translation.GetTranslation("equipNumberTooSmallTitle", "equipment amount too small"); | |
114 //MessageBox.Show(ParentForm, amountTooSmall, amountTooSmallTitle); | |
115 equipAmount = minNumber; | |
116 } | |
117 | |
118 ui.EquipmentPercentageAmount = CalcualtePercentageValueFromNumber(equipAmount); | |
119 ui.EquipmentNumericAmount = equipAmount; | |
120 } | |
121 | |
122 private double CalcualtePercentageValueFromNumber(int number) | |
123 { | |
124 double calcedAmount = RoundPercentage(CustomMath.IBBMath.Percentage(number, unit.Size)); | |
125 return Math.Min(Math.Max(calcedAmount, minPercentage), maxPercentage); | |
126 } | |
127 | |
128 //TODO Make abstract | |
129 protected void CreateEquipmentUI() | |
130 { | |
131 ui = new FrmEditEquipment(); | |
132 } | |
133 | |
134 private void SetEquipmentAmountControlEnabledStates() | |
135 { | |
136 ui.SetNumericAmountEnabledState(!isRatioAmount); | |
137 ui.SetPercentageAmountEnabledState(true); | |
138 } | |
139 | |
140 private double GetMaxPercentageLimit(UnitEquipmentItem equip) | |
141 { | |
142 double maxPercent = RoundPercentage(UnitEquipmentUtil.GetMaxEquipmentPercentage(unit, equip)); | |
143 return Math.Max(0, maxPercent); | |
144 } | |
145 | |
146 private double GetMinPercentageLimit(UnitEquipmentItem equip) | |
147 { | |
148 double minPercent = RoundPercentage(UnitEquipmentUtil.GetMinEquipmentPercentage(unit, equip)); | |
149 return Math.Max(0, minPercent); | |
150 } | |
151 | |
152 private int GetMaxNumericLimit(UnitEquipmentItem equip) | |
153 { | |
154 int maxNumber = UnitEquipmentUtil.GetMaxEquipmentCount(unit, equip); | |
155 return Math.Max(0, maxNumber); | |
156 } | |
157 private int GetMinNumericLimit(UnitEquipmentItem equip) | |
158 { | |
159 int minNumber = UnitEquipmentUtil.GetMinEquipmentCount(unit, equip); | |
160 return Math.Max(0, minNumber); | |
161 } | |
162 | |
163 private bool HasNonZeroEquipmentAmount() | |
164 { | |
165 bool nonZero; | |
166 | |
167 if (isRatioAmount) | |
168 { | |
169 nonZero = (ui.EquipmentPercentageAmount > 0); | |
170 } | |
171 | |
172 else | |
173 { | |
174 nonZero = (ui.EquipmentNumericAmount > 0); | |
175 } | |
176 | |
177 return nonZero; | |
178 } | |
179 | |
180 private double RoundPercentage(double percent) | |
181 { | |
182 return Math.Round(percent, 1); | |
183 } | |
184 | |
185 public void Show() | |
186 { | |
187 bool okayed = ui.ShowControl(); | |
188 | |
189 if (okayed) | |
190 { | |
191 if (isRatioAmount) | |
192 { | |
193 commandStack.Execute(new SetUnitEquipmentRatioAmountCommand(unit, equipItem, equipmentAmount)); | |
194 } | |
195 else | |
196 { | |
197 commandStack.Execute(new SetUnitEquipmentNumericAmountCommand(unit, equipItem, (int)equipmentAmount)); | |
198 } | |
199 } | |
200 | |
201 ui.Dispose(); | |
202 } | |
203 } | |
204 } | |
205 |