Mercurial > repos > IBDev-IBBoard.WarFoundry.GUI.GTK
annotate Widgets/UnitDisplayWidget.cs @ 114:8b99d6aa623f WarFoundry_v0.1
* Create short-lived branch for final v0.1 release
no-open-ticket
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sat, 30 Apr 2011 14:06:05 +0000 |
parents | 4a33b3012100 |
children |
rev | line source |
---|---|
19
a191d0655f55
Re #121: Migrate to AGPL license
IBBoard <dev@ibboard.co.uk>
parents:
15
diff
changeset
|
1 // This file (UnitDisplayWidget.cs) is a part of the IBBoard.WarFoundry.GTK project and is copyright 2008, 2009 IBBoard. |
0 | 2 // |
19
a191d0655f55
Re #121: Migrate to AGPL license
IBBoard <dev@ibboard.co.uk>
parents:
15
diff
changeset
|
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. |
0 | 4 |
5 using System; | |
6 using Gtk; | |
7 using IBBoard.Commands; | |
113 | 8 using IBBoard.GtkSharp; |
0 | 9 using IBBoard.Lang; |
10 using IBBoard.WarFoundry.API; | |
113 | 11 using IBBoard.WarFoundry.API.Commands; |
0 | 12 using IBBoard.WarFoundry.API.Objects; |
113 | 13 using IBBoard.WarFoundry.API.Util; |
14 using IBBoard.WarFoundry.GUI.GTK.UIControl; | |
15 using log4net; | |
16 using WFObjects = IBBoard.WarFoundry.API.Objects; | |
17 using System.Collections.Generic; | |
18 using IBBoard.GtkSharp.Translatable; | |
0 | 19 |
113 | 20 namespace IBBoard.WarFoundry.GUI.GTK.Widgets |
0 | 21 { |
5 | 22 [System.ComponentModel.Category("WarFoundry GTK# GUI")] |
23 [System.ComponentModel.ToolboxItem(true)] | |
0 | 24 public partial class UnitDisplayWidget : Gtk.Bin |
113 | 25 { |
26 private static ILog log = LogManager.GetLogger(typeof(UnitDisplayWidget)); | |
27 private WFObjects.Unit unit; | |
0 | 28 private CommandStack stack; |
113 | 29 private Dictionary<string, NodeView> statsViews = new Dictionary<string, NodeView>(); |
30 | |
31 public UnitDisplayWidget(WFObjects.Unit sourceUnit, CommandStack commandStack) | |
0 | 32 { |
33 this.Build(); | |
34 stack = commandStack; | |
35 unit = sourceUnit; | |
36 unitName.Text = unit.Name; | |
37 unitSize.Value = unit.Size; | |
113 | 38 int maxSize = (unit.UnitType.MaxSize == WarFoundryCore.INFINITY ? int.MaxValue : unit.UnitType.MaxSize); |
39 int minSize = unit.UnitType.MinSize; | |
40 unitSize.SetRange(minSize, maxSize); | |
41 unitSize.Sensitive = (maxSize != minSize); | |
42 notesView.Buffer.Text = unit.UnitType.Notes; | |
43 unit.NameChanged += UnitNameChanged; | |
44 unit.UnitSizeChanged += UnitSizeChanged; | |
45 unit.UnitEquipmentAmountChanged += HandleUnitUnitEquipmentAmountChanged; | |
46 equipmentList.Selection.Changed += HandleEquipmentListSelectionChanged; | |
47 SetAbilities(); | |
48 SetStats(); | |
49 SetWeapons(); | |
50 SetAddButtonEnabledState(); | |
51 ControlTranslator.TranslateWidget(this); | |
52 } | |
53 | |
54 private void HandleEquipmentListSelectionChanged(object sender, EventArgs e) | |
55 { | |
56 SetButtonsEnabledState(); | |
57 } | |
58 | |
59 private void SetButtonsEnabledState() | |
60 { | |
61 UnitEquipmentItem equipItem = GetSelectedEquipmentItem(); | |
62 bttnReplaceWeapon.Sensitive = (equipItem != null && equipItem.HasAlternatives()); | |
63 bttnEditWeapon.Sensitive = (UnitEquipmentUtil.CanEditEquipmentAmount(unit, equipItem)); | |
64 bttnRemoveWeapon.Sensitive = (equipItem != null && !equipItem.IsRequired); | |
65 } | |
66 | |
67 private void SetAddButtonEnabledState() | |
68 { | |
69 bttnAddWeapon.Sensitive = AddEquipmentUIControl.HasEquipmentToAdd(unit); | |
70 } | |
71 | |
72 private UnitEquipmentItem GetSelectedEquipmentItem() | |
73 { | |
74 return (UnitEquipmentItem)TreeUtils.GetSelectedItem(equipmentList); | |
75 } | |
76 | |
77 private void SetAbilities() | |
78 { | |
79 CellRendererText renderer = new CellRendererText(); | |
80 abilitiesList.AppendColumn("", renderer, new TreeCellDataFunc(RenderAbility)); | |
0 | 81 |
113 | 82 ListStore model = new ListStore(typeof(Ability)); |
83 | |
84 foreach (Ability ability in unit.UnitType.GetRequiredAbilities()) | |
0 | 85 { |
113 | 86 model.AppendValues(ability); |
0 | 87 } |
88 | |
113 | 89 abilitiesList.Model = model; |
90 } | |
91 | |
92 public void RenderAbility(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter) | |
93 { | |
94 object o = model.GetValue(iter, 0); | |
95 | |
96 if (o is Ability) | |
97 { | |
98 Ability ability = (Ability)o; | |
99 (cell as CellRendererText).Text = ability.Name; | |
100 } | |
101 | |
13 | 102 } |
103 | |
104 private void SetStats() | |
105 { | |
113 | 106 Stat[][] stats = unit.UnitStatsArraysWithName; |
107 string[] statsIDs = unit.UnitStatsArrayIDs; | |
108 int statsCount = stats.Length; | |
109 log.DebugFormat("Unit {0} has {1} stats arrays", unit.UnitType.Name, statsCount); | |
13 | 110 |
113 | 111 for (int i = 0; i < statsCount; i++) |
0 | 112 { |
113 | 113 NodeView statsGrid = GetStatsView(statsIDs[i]); |
114 TreeStore model = (TreeStore)statsGrid.Model; | |
115 log.DebugFormat("Adding row to data table for {0}", statsIDs[i]); | |
116 log.DebugFormat("TreeStore supports {0} columns", model.NColumns); | |
117 model.AppendValues((object)stats[i]); | |
118 } | |
119 } | |
120 | |
121 private NodeView GetStatsView(string statsID) | |
122 { | |
123 NodeView statsView; | |
124 | |
125 if (statsViews.ContainsKey(statsID)) | |
126 { | |
127 statsView = DictionaryUtils.GetValue(statsViews, statsID); | |
128 } | |
129 else | |
130 { | |
131 statsView = CreateStatsView(statsID); | |
132 statsViews[statsID] = statsView; | |
13 | 133 } |
0 | 134 |
113 | 135 return statsView; |
0 | 136 } |
113 | 137 |
138 private NodeView CreateStatsView(string statsID) | |
0 | 139 { |
113 | 140 log.DebugFormat("Create NodeView for stats ID {0}", statsID); |
141 SystemStats sysStats = unit.Race.GameSystem.GetSystemStatsForID(statsID); | |
142 StatSlot[] sysStatSlots = sysStats.StatSlots; | |
143 int statsCount = sysStatSlots.Length; | |
144 NodeView statsGrid = CreateNodeView(); | |
145 CellRendererText renderer = new CellRendererText(); | |
146 statsGrid.AppendColumn(Translation.GetTranslation("UnitNameColumn", "Unit Type", null), renderer, RenderUnitStat); | |
147 | |
148 for (int i = 0; i < statsCount; i++) | |
0 | 149 { |
113 | 150 StatSlot stat = sysStatSlots[i]; |
151 string slotName = stat.Name; | |
152 statsGrid.AppendColumn(slotName, renderer, RenderUnitStat); | |
0 | 153 } |
113 | 154 |
155 statsGrid.Model = new TreeStore(typeof(Stat[])); | |
156 return statsGrid; | |
0 | 157 } |
113 | 158 |
159 private NodeView CreateNodeView() | |
160 { | |
161 NodeView nodeView = new NodeView(); | |
162 statsRepeatBox.Add(nodeView); | |
163 return nodeView; | |
164 } | |
165 | |
0 | 166 private void RenderUnitStat(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter) |
167 { | |
168 object o = model.GetValue(iter, 0); | |
169 | |
113 | 170 if (o is Stat[]) |
0 | 171 { |
113 | 172 Stat[] stats = (Stat[])o; |
173 (cell as CellRendererText).Text = stats[GetStatColumnIndex(column)].SlotValueString; | |
0 | 174 } |
175 } | |
15
85db2c9a1546
Fixes #95: Can't re-open GTK# tabs
IBBoard <dev@ibboard.co.uk>
parents:
13
diff
changeset
|
176 |
113 | 177 private int GetStatColumnIndex(TreeViewColumn column) |
178 { | |
179 int idx = -1; | |
180 TreeViewColumn[] cols = ((TreeView)column.TreeView).Columns; | |
181 int colCount = cols.Length; | |
182 | |
183 for (int i = 0; i < colCount; i++) | |
184 { | |
185 if (cols[i] == column) | |
186 { | |
187 idx = i; | |
188 break; | |
189 } | |
190 } | |
191 | |
192 return idx; | |
193 } | |
194 | |
195 private void SetWeapons() | |
196 { | |
197 CellRendererText renderer = new CellRendererText(); | |
198 equipmentList.AppendColumn("", renderer, new TreeCellDataFunc(RenderEquipmentLine)); | |
199 | |
200 ListStore model = new ListStore(typeof(UnitEquipmentItem)); | |
201 | |
202 foreach (UnitEquipmentItem item in unit.GetEquipment()) | |
203 { | |
204 model.AppendValues(item); | |
205 } | |
206 | |
207 equipmentList.Model = model; | |
208 } | |
209 | |
210 public void RenderEquipmentLine(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter) | |
211 { | |
212 object o = model.GetValue(iter, 0); | |
213 | |
214 if (o is UnitEquipmentItem) | |
215 { | |
216 UnitEquipmentItem item = (UnitEquipmentItem)o; | |
217 (cell as CellRendererText).Text = GetUnitEquipmentText(item); | |
218 } | |
219 | |
220 } | |
221 | |
222 private string GetUnitEquipmentText(UnitEquipmentItem item) | |
223 { | |
224 string translation = ""; | |
225 | |
226 if (item.Cost == 0) | |
227 { | |
228 translation = Translation.GetTranslation("equipmentAmountWithZeroCost", "{0} ({1} - free)", item.Name, GetAmountString(item)); | |
229 } | |
230 else | |
231 { | |
232 translation = Translation.GetTranslation("equipmentAmountWithCost", "{0} ({1} at {2}pts each)", item.Name, GetAmountString(item), item.Cost); | |
233 } | |
234 | |
235 return translation; | |
236 } | |
237 | |
238 private string GetAmountString(UnitEquipmentItem item) | |
239 { | |
240 double amount = UnitEquipmentUtil.GetEquipmentAmount(unit, item); | |
241 string amountString = ""; | |
242 | |
243 if (UnitEquipmentUtil.GetEquipmentAmountIsRatio(unit, item)) | |
244 { | |
245 int number = UnitEquipmentUtil.GetEquipmentAmountTaken(unit, item); | |
246 | |
247 if (amount == 100) | |
248 { | |
249 amountString = Translation.GetTranslation("equipmentChoiceAmountAll", "all ({1})", amount, number); | |
250 } | |
251 else | |
252 { | |
253 amountString = Translation.GetTranslation("equipmentChoiceAmountPercentage", "{0}% ({1})", amount, number); | |
254 } | |
255 } | |
256 else | |
257 { | |
258 amountString = Translation.GetTranslation("equipmentChoiceAmountNumber", "{0}", amount); | |
259 } | |
260 | |
261 return amountString; | |
262 } | |
263 | |
264 public WFObjects.Unit Unit | |
15
85db2c9a1546
Fixes #95: Can't re-open GTK# tabs
IBBoard <dev@ibboard.co.uk>
parents:
13
diff
changeset
|
265 { |
85db2c9a1546
Fixes #95: Can't re-open GTK# tabs
IBBoard <dev@ibboard.co.uk>
parents:
13
diff
changeset
|
266 get { return unit; } |
85db2c9a1546
Fixes #95: Can't re-open GTK# tabs
IBBoard <dev@ibboard.co.uk>
parents:
13
diff
changeset
|
267 } |
113 | 268 |
0 | 269 private void UnitNameChanged(WarFoundryObject obj, string oldValue, string newValue) |
270 { | |
271 unitName.Text = newValue; | |
272 } | |
113 | 273 |
0 | 274 private void UnitSizeChanged(WarFoundryObject obj, int oldValue, int newValue) |
275 { | |
276 unitSize.Value = newValue; | |
277 } | |
278 | |
113 | 279 private void HandleUnitUnitEquipmentAmountChanged(WarFoundryObject obj, double oldValue, double newValue) |
280 { | |
281 if (oldValue == 0) | |
282 { | |
283 ((ListStore)equipmentList.Model).AppendValues(obj); | |
284 } | |
285 else | |
286 { | |
287 if (newValue == 0) | |
288 { | |
289 TreeIter treeIter = TreeUtils.GetItemIter(equipmentList, obj); | |
290 ((ListStore)equipmentList.Model).Remove(ref treeIter); | |
291 } | |
292 } | |
293 | |
294 SetAddButtonEnabledState(); | |
295 equipmentList.QueueDraw(); | |
296 } | |
297 | |
298 protected virtual void OnUnitSizeFocusOut(object o, Gtk.FocusOutEventArgs args) | |
0 | 299 { |
300 SetNewUnitSize(); | |
301 } | |
302 | |
303 [GLib.ConnectBefore ()] | |
113 | 304 |
305 protected virtual void OnUnitSizeKeyPress(object o, Gtk.KeyPressEventArgs args) | |
0 | 306 { |
113 | 307 if (args.Event.Key == Gdk.Key.Return || args.Event.Key == Gdk.Key.KP_Enter) |
0 | 308 { |
309 SetNewUnitSize(); | |
310 } | |
311 } | |
113 | 312 |
0 | 313 private void SetNewUnitSize() |
314 { | |
113 | 315 if (unitSize.Value != unit.Size) |
0 | 316 { |
317 SetUnitSizeCommand cmd = new SetUnitSizeCommand(unit, (int)Math.Round(unitSize.Value)); | |
318 stack.Execute(cmd); | |
319 } | |
320 } | |
321 | |
113 | 322 protected virtual void OnUnitNameFocusOut(object o, Gtk.FocusOutEventArgs args) |
0 | 323 { |
324 SetNewUnitName(); | |
325 } | |
326 | |
327 [GLib.ConnectBefore ()] | |
113 | 328 |
329 protected virtual void OnUnitNameKeyPress(object o, Gtk.KeyPressEventArgs args) | |
0 | 330 { |
113 | 331 if (args.Event.Key == Gdk.Key.Return || args.Event.Key == Gdk.Key.KP_Enter) |
0 | 332 { |
333 SetNewUnitName(); | |
334 } | |
335 } | |
113 | 336 |
0 | 337 private void SetNewUnitName() |
338 { | |
113 | 339 if (unitName.Text != unit.Name) |
0 | 340 { |
341 SetNameCommand cmd = new SetNameCommand(unit, unitName.Text); | |
342 stack.Execute(cmd); | |
343 } | |
344 } | |
113 | 345 |
346 private void OnBttnAddEquipmentClicked(object sender, System.EventArgs e) | |
347 { | |
348 AddEquipment(); | |
349 } | |
350 | |
351 private void AddEquipment() | |
352 { | |
353 AddEquipmentUIControl addEquipment = new AddEquipmentUIControl(unit, stack); | |
354 addEquipment.Show(); | |
355 } | |
356 | |
357 protected virtual void HandleRemoveButtonActivated(object sender, System.EventArgs e) | |
358 { | |
359 UnitEquipmentItem item = GetSelectedEquipmentItem(); | |
360 log.Debug("Remove " + item); | |
361 | |
362 if (item != null) | |
363 { | |
364 SetUnitEquipmentNumericAmountCommand cmd = new SetUnitEquipmentNumericAmountCommand(unit, item, 0); | |
365 stack.Execute(cmd); | |
366 } | |
367 } | |
368 | |
369 protected virtual void HandleEditButtonClicked(object sender, System.EventArgs e) | |
370 { | |
371 UnitEquipmentItem item = GetSelectedEquipmentItem(); | |
372 log.Debug("Edit " + item); | |
373 | |
374 if (item != null) | |
375 { | |
376 EditEquipmentUIControl editEquipment = new EditEquipmentUIControl(unit, item, stack); | |
377 editEquipment.Show(); | |
378 } | |
379 } | |
380 | |
381 protected virtual void HandleReplaceButtonClicked(object sender, System.EventArgs e) | |
382 { | |
383 UnitEquipmentItem item = GetSelectedEquipmentItem(); | |
384 log.Debug("Replace " + item); | |
385 | |
386 if (item != null) | |
387 { | |
388 ReplaceEquipmentUIControl addEquipment = new ReplaceEquipmentUIControl(unit, item, stack); | |
389 addEquipment.Show(); | |
390 } | |
391 } | |
0 | 392 } |
113 | 393 } |