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