Mercurial > repos > IBDev-IBBoard.WarFoundry.GUI.GTK
annotate FrmMainWindow.cs @ 23:d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
* Refactor file saving in to a common method
* Replace fixed location with dialog
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Mon, 17 Aug 2009 19:49:05 +0000 |
parents | 2cf1af4c9baf |
children | 01ddadfa9653 |
rev | line source |
---|---|
19
a191d0655f55
Re #121: Migrate to AGPL license
IBBoard <dev@ibboard.co.uk>
parents:
18
diff
changeset
|
1 // This file (FrmMainWindow.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:
18
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 System.IO; | |
7 using System.Collections.Generic; | |
8 using System.Configuration; | |
13 | 9 using Gtk; |
10 using IBBoard; | |
0 | 11 using IBBoard.Commands; |
12
685532d43a96
Re #88: Complete initial GTK# UI
IBBoard <dev@ibboard.co.uk>
parents:
10
diff
changeset
|
12 using IBBoard.GtkSharp; |
0 | 13 using IBBoard.IO; |
13 | 14 using IBBoard.Lang; |
15 using IBBoard.Logging; | |
0 | 16 using IBBoard.CustomMath; |
17 using IBBoard.WarFoundry.API; | |
18 using IBBoard.WarFoundry.API.Factories; | |
13 | 19 using IBBoard.WarFoundry.API.Factories.Xml; |
20 using IBBoard.WarFoundry.API.Objects; | |
0 | 21 using IBBoard.WarFoundry.API.Commands; |
22 using IBBoard.WarFoundry.API.Savers; | |
23 using IBBoard.WarFoundry.API.Requirements; | |
6
cfc7683e73f9
Fix breakage from r33 by completing update of move to IBBoard.WarFoundry.GTK sub-packages
IBBoard <dev@ibboard.co.uk>
parents:
5
diff
changeset
|
24 using IBBoard.WarFoundry.GTK.Widgets; |
13 | 25 using IBBoard.WarFoundry.Plugin.Rollcall; |
0 | 26 using IBBoard.Xml; |
27 using log4net; | |
28 | |
13 | 29 namespace IBBoard.WarFoundry.GTK |
21 | 30 { |
0 | 31 public partial class FrmMainWindow: Gtk.Window |
32 { | |
33 private static readonly string AppTitle = "WarFoundry"; | |
13 | 34 private const int CATEGORY_BUTTON_SEPARATOR_INDEX = 6; |
35 | |
36 private Preferences preferences; | |
37 private ILog logger = LogManager.GetLogger(typeof(FrmMainWindow)); | |
38 | |
0 | 39 private CommandStack commandStack; |
40 private Dictionary<ToolButton, Category> categoryMap = new Dictionary<ToolButton, Category>(); | |
13 | 41 private Dictionary<IBBoard.WarFoundry.API.Objects.Unit, UnitDisplayWidget> unitToWidgetMap = new Dictionary<IBBoard.WarFoundry.API.Objects.Unit,UnitDisplayWidget>(); |
42 | |
43 private ObjectAddDelegate UnitAddedMethod; | |
44 private ObjectRemoveDelegate UnitRemovedMethod; | |
45 private DoubleValChangedDelegate PointsValueChangedMethod; | |
0 | 46 private FailedUnitRequirementDelegate FailedUnitRequirementMethod; |
47 private StringValChangedDelegate UnitNameChangedMethod; | |
21 | 48 |
0 | 49 private GameSystem system; |
50 private string loadedArmyPath; | |
21 | 51 |
0 | 52 private MenuToolButton undoMenuButton, redoMenuButton; |
21 | 53 |
0 | 54 public static void Main (string[] args) |
21 | 55 { |
13 | 56 try |
0 | 57 { |
58 Application.Init(); | |
59 FrmMainWindow win = new FrmMainWindow(args); | |
60 win.Show(); | |
61 Application.Run(); | |
13 | 62 LogManager.GetLogger(typeof(FrmMainWindow)).Debug("Application ended"); |
63 } | |
64 catch(Exception ex) | |
65 { | |
66 LogManager.GetLogger(typeof(FrmMainWindow)).Fatal("("+ex.GetType().Name+") "+ex.Message + Environment.NewLine + ex.StackTrace); | |
0 | 67 } |
68 } | |
21 | 69 |
0 | 70 public FrmMainWindow() : this(new string[0]) |
71 { | |
72 //Do nothing extra | |
73 } | |
21 | 74 |
0 | 75 public FrmMainWindow (string[] args): base (Gtk.WindowType.Toplevel) |
76 { | |
77 logger.Info("Opening FrmMainWindow"); | |
78 Build (); | |
79 //Replace the undo/redo buttons with menu versions, which Monodevelop's GUI editor doesn't currently support | |
80 redoMenuButton = new MenuToolButton("gtk-redo"); | |
81 redoMenuButton.Label = "Redo"; | |
10
c687bbe901f8
Re #37 - Resolve deprecation warnings
IBBoard <dev@ibboard.co.uk>
parents:
8
diff
changeset
|
82 redoMenuButton.TooltipText = "Redo"; |
0 | 83 redoMenuButton.Clicked+= redoTBButtonActivated; |
84 toolbar.Insert(redoMenuButton, CATEGORY_BUTTON_SEPARATOR_INDEX); | |
85 undoMenuButton = new MenuToolButton("gtk-undo"); | |
86 undoMenuButton.Label = "Undo"; | |
10
c687bbe901f8
Re #37 - Resolve deprecation warnings
IBBoard <dev@ibboard.co.uk>
parents:
8
diff
changeset
|
87 undoMenuButton.TooltipText = "Undo"; |
0 | 88 undoMenuButton.Clicked+= undoTBButtonActivated; |
89 toolbar.Insert(undoMenuButton, CATEGORY_BUTTON_SEPARATOR_INDEX); | |
90 toolbar.Remove(toolbar.Children[CATEGORY_BUTTON_SEPARATOR_INDEX-1]); | |
91 toolbar.Remove(toolbar.Children[CATEGORY_BUTTON_SEPARATOR_INDEX-2]); | |
92 toolbar.ShowAll(); | |
21 | 93 |
0 | 94 Title = AppTitle; |
95 TreeViewColumn mainColumn = new TreeViewColumn (); | |
96 mainColumn.Title = "Army Categories"; | |
97 CellRendererText mainCell = new CellRendererText (); | |
98 mainColumn.PackStart (mainCell, true); | |
99 treeUnits.AppendColumn(mainColumn); | |
100 mainColumn.SetCellDataFunc(mainCell, new TreeCellDataFunc(RenderCategoryTreeObjectName)); | |
101 treeUnits.Model = new TreeStore(typeof(WarFoundryObject)); | |
102 logger.Debug("Loading preferences"); | |
103 Preferences = new Preferences("WarFoundryGTK"); | |
104 logger.Debug("Loading translations"); | |
21 | 105 |
8
20c5fd0bb79d
Fixes #5 - Stop missing translations being fatal
IBBoard <dev@ibboard.co.uk>
parents:
6
diff
changeset
|
106 try |
20c5fd0bb79d
Fixes #5 - Stop missing translations being fatal
IBBoard <dev@ibboard.co.uk>
parents:
6
diff
changeset
|
107 { |
20c5fd0bb79d
Fixes #5 - Stop missing translations being fatal
IBBoard <dev@ibboard.co.uk>
parents:
6
diff
changeset
|
108 Translation.InitialiseTranslations(Constants.ExecutablePath, Preferences["language"].ToString()); |
20c5fd0bb79d
Fixes #5 - Stop missing translations being fatal
IBBoard <dev@ibboard.co.uk>
parents:
6
diff
changeset
|
109 } |
20c5fd0bb79d
Fixes #5 - Stop missing translations being fatal
IBBoard <dev@ibboard.co.uk>
parents:
6
diff
changeset
|
110 catch (TranslationLoadException ex) |
20c5fd0bb79d
Fixes #5 - Stop missing translations being fatal
IBBoard <dev@ibboard.co.uk>
parents:
6
diff
changeset
|
111 { |
20c5fd0bb79d
Fixes #5 - Stop missing translations being fatal
IBBoard <dev@ibboard.co.uk>
parents:
6
diff
changeset
|
112 logger.Error(ex); |
20c5fd0bb79d
Fixes #5 - Stop missing translations being fatal
IBBoard <dev@ibboard.co.uk>
parents:
6
diff
changeset
|
113 MessageDialog dialog = new MessageDialog(this, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, ex.Message); |
20c5fd0bb79d
Fixes #5 - Stop missing translations being fatal
IBBoard <dev@ibboard.co.uk>
parents:
6
diff
changeset
|
114 dialog.Title = "Translation loading failed"; |
20c5fd0bb79d
Fixes #5 - Stop missing translations being fatal
IBBoard <dev@ibboard.co.uk>
parents:
6
diff
changeset
|
115 dialog.Run(); |
20c5fd0bb79d
Fixes #5 - Stop missing translations being fatal
IBBoard <dev@ibboard.co.uk>
parents:
6
diff
changeset
|
116 dialog.Destroy(); |
20c5fd0bb79d
Fixes #5 - Stop missing translations being fatal
IBBoard <dev@ibboard.co.uk>
parents:
6
diff
changeset
|
117 } |
21 | 118 |
13 | 119 logger.Debug("Initialising"); |
120 commandStack = new CommandStack(); | |
0 | 121 commandStack.CommandStackUpdated+=new MethodInvoker(commandStack_CommandStackUpdated); |
122 WarFoundryCore.GameSystemChanged+= new GameSystemChangedDelegate(OnGameSystemChanged); | |
123 WarFoundryCore.ArmyChanged+= new ArmyChangedDelegate(OnArmyChanged); | |
124 Destroyed+= new EventHandler(OnWindowDestroyed); | |
125 //TODO: Translate and subscribe to other events | |
13 | 126 UnitAddedMethod = new ObjectAddDelegate(OnUnitAdded); |
127 UnitRemovedMethod = new ObjectRemoveDelegate(OnUnitRemoved); | |
128 PointsValueChangedMethod = new DoubleValChangedDelegate(OnPointsValueChanged); | |
0 | 129 FailedUnitRequirementMethod = new FailedUnitRequirementDelegate(OnFailedUnitRequirement); |
130 UnitNameChangedMethod = new StringValChangedDelegate(OnUnitNameChanged); | |
21 | 131 |
18
c4d9b1ec75ed
Re #124: Remove "factory factory"
IBBoard <dev@ibboard.co.uk>
parents:
17
diff
changeset
|
132 //FIXME: Temporary hack to add paths and factories before we get preferences and plugins |
0 | 133 WarFoundryLoader.GetDefault().AddLoadDirectory(new DirectoryInfo(Constants.ExecutablePath + Constants.DirectoryString + "data")); |
18
c4d9b1ec75ed
Re #124: Remove "factory factory"
IBBoard <dev@ibboard.co.uk>
parents:
17
diff
changeset
|
134 WarFoundryLoader.GetDefault().RegisterFactory(WarFoundryXmlFactory.GetFactory()); |
c4d9b1ec75ed
Re #124: Remove "factory factory"
IBBoard <dev@ibboard.co.uk>
parents:
17
diff
changeset
|
135 WarFoundryLoader.GetDefault().RegisterNonNativeFactory(RollcallFactory.GetFactory()); |
21 | 136 WarFoundrySaver.SetFileSaver(new WarFoundryXmlSaver()); |
137 | |
15
85db2c9a1546
Fixes #95: Can't re-open GTK# tabs
IBBoard <dev@ibboard.co.uk>
parents:
14
diff
changeset
|
138 logger.Debug("Initialising complete - seeing if we can load default army or system"); |
21 | 139 |
0 | 140 if (args.Length == 1) |
141 { | |
21 | 142 logger.Debug("Attempting to load from file"); |
0 | 143 FileInfo file = new FileInfo(args[0]); |
21 | 144 |
0 | 145 try |
146 { | |
5 | 147 ICollection<IWarFoundryObject> objects = WarFoundryLoader.GetDefault().LoadFile(file); |
148 | |
149 if (objects.Count == 1) | |
0 | 150 { |
5 | 151 List<IWarFoundryObject> objectList = new List<IWarFoundryObject>(); |
152 objectList.AddRange(objects); | |
153 IWarFoundryObject loadedObject = objectList[0]; | |
21 | 154 |
5 | 155 if (loadedObject is Army) |
156 { | |
157 WarFoundryCore.CurrentArmy = (Army)loadedObject; | |
158 logger.InfoFormat("Loaded army from {0}", file.FullName); | |
159 } | |
160 else if (loadedObject is GameSystem) | |
161 { | |
162 WarFoundryCore.CurrentGameSystem = (GameSystem)loadedObject; | |
163 logger.InfoFormat("Loaded game system from {0}", file.FullName); | |
164 } | |
0 | 165 } |
166 } | |
167 catch (InvalidFileException ex) | |
168 { | |
169 //TODO: show error dialog | |
170 logger.Error(ex); | |
171 } | |
172 } | |
173 else | |
174 { | |
175 string gameSystemID = Preferences.GetStringProperty("currSystem"); | |
176 | |
177 if (gameSystemID!=null && !"".Equals(gameSystemID)) | |
178 { | |
179 logger.Debug("Attempting to load current game system from properties"); | |
180 GameSystem sys = WarFoundryLoader.GetDefault().GetGameSystem(gameSystemID); | |
21 | 181 |
0 | 182 if (sys!=null) |
183 { | |
184 WarFoundryCore.CurrentGameSystem = sys; | |
185 logger.InfoFormat("Loaded game system {0} from properties", gameSystemID); | |
186 } | |
187 } | |
188 } | |
189 } | |
21 | 190 |
0 | 191 private void RenderCategoryTreeObjectName(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter) |
192 { | |
193 object o = model.GetValue(iter, 0); | |
21 | 194 |
0 | 195 if (o is ArmyCategory) |
196 { | |
197 ArmyCategory c = (ArmyCategory)o; | |
198 string name = ""; | |
21 | 199 |
0 | 200 if (Preferences.GetBooleanProperty("ShowCatPercentage")) |
201 { | |
202 name = Translation.GetTranslation("categoryTreeCatName", "{0} - {1}pts", c.Name, c.PointsTotal); | |
203 } | |
204 else | |
205 { | |
206 name = Translation.GetTranslation("categoryTreeCatNamePercentage", "{0} - {1}pts ({2}%)", c.Name, c.PointsTotal, (c.ParentArmy.PointsTotal > 0 ? Math.Round((c.PointsTotal / c.ParentArmy.PointsTotal) * 100) : 0)); | |
207 } | |
21 | 208 |
0 | 209 (cell as CellRendererText).Text = name; |
210 } | |
211 else if (o is IBBoard.WarFoundry.API.Objects.Unit) | |
212 { | |
213 IBBoard.WarFoundry.API.Objects.Unit u = (IBBoard.WarFoundry.API.Objects.Unit)o; | |
214 string name = Translation.GetTranslation("categoryTreeCatName", "{0} - {1}pts", u.Name, u.PointsValue); | |
215 (cell as CellRendererText).Text = name; | |
216 } | |
217 } | |
21 | 218 |
0 | 219 private void OnWindowDestroyed(object source, EventArgs args) |
220 { | |
221 logger.Info("Exiting"); | |
222 Application.Quit(); | |
223 } | |
21 | 224 |
0 | 225 private void OnUnitNameChanged(WarFoundryObject val, string oldValue, string newValue) |
226 { | |
227 IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)val; | |
228 UnitDisplayWidget widget; | |
229 unitToWidgetMap.TryGetValue(unit, out widget); | |
21 | 230 |
0 | 231 if (widget!=null) |
232 { | |
233 unitsNotebook.SetTabLabelText(widget, newValue); | |
234 } | |
235 } | |
21 | 236 |
0 | 237 private void OnUnitAdded(WarFoundryObject val) |
238 { | |
239 IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)val; | |
240 unit.NameChanged+= UnitNameChangedMethod; | |
241 AddUnitToTree(unit); | |
242 } | |
21 | 243 |
0 | 244 private void AddUnitToTree(IBBoard.WarFoundry.API.Objects.Unit unit) |
245 { | |
246 TreeStore model = (TreeStore)treeUnits.Model; | |
247 TreeIter iter; | |
248 model.GetIterFirst(out iter); | |
21 | 249 |
0 | 250 do |
251 { | |
252 object obj = model.GetValue(iter, 0); | |
21 | 253 |
0 | 254 if (obj is ArmyCategory) |
255 { | |
256 ArmyCategory cat = (ArmyCategory)obj; | |
21 | 257 |
0 | 258 if (cat.Equals(unit.Category)) |
259 { | |
260 model.AppendValues(iter, unit); | |
261 TreePath path = model.GetPath(iter); | |
262 treeUnits.ExpandToPath(path); | |
263 } | |
264 } | |
265 } | |
266 while (model.IterNext(ref iter)); | |
267 } | |
21 | 268 |
0 | 269 private void OnUnitRemoved(WarFoundryObject obj) |
270 { | |
271 IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)obj; | |
272 unit.NameChanged-= UnitNameChangedMethod; | |
273 RemoveUnitFromTree(unit); | |
21 | 274 |
0 | 275 //See if unit has a tab open and close it if it does |
276 } | |
21 | 277 |
0 | 278 private void RemoveUnitFromTree(IBBoard.WarFoundry.API.Objects.Unit unit) |
279 { | |
280 TreeStore model = (TreeStore)treeUnits.Model; | |
281 TreeIter iter; | |
282 model.GetIterFirst(out iter); | |
283 bool removed = false; | |
21 | 284 |
0 | 285 do |
286 { | |
287 object obj = model.GetValue(iter, 0); | |
21 | 288 |
0 | 289 if (obj is ArmyCategory) |
290 { | |
291 ArmyCategory cat = (ArmyCategory)obj; | |
21 | 292 |
0 | 293 if (unit.Category == null || cat.Equals(unit.Category)) |
294 { | |
295 TreeIter innerIter; | |
296 model.IterChildren(out innerIter, iter); | |
21 | 297 |
0 | 298 do |
299 { | |
300 object innerObj = model.GetValue(innerIter, 0); | |
21 | 301 |
0 | 302 if (unit.Equals(innerObj)) |
303 { | |
304 model.Remove(ref innerIter); | |
305 removed = true; | |
306 break; | |
307 } | |
308 } | |
309 while (model.IterNext(ref innerIter)); | |
21 | 310 |
0 | 311 if (removed) |
312 { | |
313 break; | |
314 } | |
315 } | |
316 } | |
317 } | |
318 while (model.IterNext(ref iter)); | |
319 } | |
21 | 320 |
0 | 321 private void OnPointsValueChanged(WarFoundryObject obj, double before, double after) |
322 { | |
323 //Set points in panel | |
324 } | |
21 | 325 |
0 | 326 private void OnFailedUnitRequirement(List<FailedUnitRequirement> failedRequirement) |
327 { | |
328 //Show error message in panel | |
329 } | |
21 | 330 |
0 | 331 public Preferences Preferences |
332 { | |
333 get { return preferences; } | |
21 | 334 set { preferences = value; } |
0 | 335 } |
21 | 336 |
0 | 337 /*public AbstractNativeWarFoundryFactory Factory |
338 { | |
339 get { return WarFoundryFactoryFactory.GetFactoryFactory().GetFactory(Constants.ExecutablePath, factoryType); } | |
340 }*/ | |
21 | 341 |
0 | 342 protected void OnDeleteEvent (object sender, DeleteEventArgs a) |
343 { | |
344 Application.Quit (); | |
345 a.RetVal = true; | |
346 } | |
347 | |
348 protected virtual void OnExitActivated(object sender, System.EventArgs e) | |
349 { | |
350 Application.Quit(); | |
351 } | |
352 | |
353 protected virtual void OnChangeGameSystemActivated(object sender, System.EventArgs e) | |
354 { | |
355 ChangeCurrentGameSystem(); | |
356 } | |
357 | |
358 protected virtual void OnCreateArmyActivated(object sender, System.EventArgs e) | |
359 { | |
360 CreateNewArmy(); | |
361 } | |
362 | |
363 protected virtual void OnReloadFilesActivated(object sender, System.EventArgs e) | |
364 { | |
365 } | |
366 | |
367 protected virtual void OnSaveArmyAsActivated(object sender, System.EventArgs e) | |
368 { | |
369 SaveCurrentArmyAs(); | |
370 } | |
371 | |
372 protected virtual void OnCloseArmyActivated(object sender, System.EventArgs e) | |
373 { | |
374 CloseCurrentArmy(); | |
375 } | |
376 | |
377 protected virtual void OnOpenArmyActivated(object sender, System.EventArgs e) | |
378 { | |
379 OpenArmy(); | |
380 } | |
381 | |
382 protected virtual void OnSaveArmyActivated(object sender, System.EventArgs e) | |
383 { | |
384 SaveCurrentArmy(); | |
385 } | |
21 | 386 |
0 | 387 protected virtual void OnAddUnitActivated(object sender, System.EventArgs e) |
388 { | |
389 if (sender is ToolButton) | |
390 { | |
391 Category cat = null; | |
392 categoryMap.TryGetValue((ToolButton)sender, out cat); | |
21 | 393 |
0 | 394 if (cat!=null) |
395 { | |
396 logger.DebugFormat("Show FrmNewUnit for {0}", cat.Name); | |
397 FrmNewUnit newUnit = new FrmNewUnit(WarFoundryCore.CurrentArmy.Race, cat, WarFoundryCore.CurrentArmy); | |
398 ResponseType response = (ResponseType)newUnit.Run(); | |
399 newUnit.Hide(); | |
21 | 400 |
0 | 401 if (response==ResponseType.Ok) |
402 { | |
14
abbf8a3ac431
Re #90: Stop new units showing up twice
IBBoard <dev@ibboard.co.uk>
parents:
13
diff
changeset
|
403 CreateAndAddUnitCommand cmd = new CreateAndAddUnitCommand(newUnit.SelectedUnit, WarFoundryCore.CurrentArmy.GetCategory(cat)); |
0 | 404 commandStack.Execute(cmd); |
405 } | |
21 | 406 |
0 | 407 newUnit.Dispose(); |
408 } | |
409 } | |
410 } | |
21 | 411 |
13 | 412 public CommandStack CommandStack |
413 { | |
414 get { return commandStack; } | |
0 | 415 } |
21 | 416 |
0 | 417 private void SetAppTitle() |
418 { | |
419 if (WarFoundryCore.CurrentArmy!=null) | |
420 { | |
421 Title = AppTitle + " - " + WarFoundryCore.CurrentGameSystem.Name + " - " + WarFoundryCore.CurrentArmy.Name; | |
422 } | |
423 else if (WarFoundryCore.CurrentGameSystem!=null) | |
424 { | |
425 Title = AppTitle + " - " + WarFoundryCore.CurrentGameSystem.Name; | |
426 } | |
427 else | |
428 { | |
429 Title = AppTitle; | |
430 } | |
431 } | |
21 | 432 |
0 | 433 private void OnGameSystemChanged(GameSystem oldSys, GameSystem newSys) |
434 { | |
435 system = newSys; | |
436 SetAppTitle(); | |
437 miCreateArmy.Sensitive = system!=null; | |
438 newArmyButton.Sensitive = system!=null; | |
439 RemoveCategoryButtons(); | |
21 | 440 |
0 | 441 if (system!=null) |
442 { | |
443 AddCategoryButtons(system.Categories); | |
444 } | |
445 } | |
21 | 446 |
0 | 447 private void OnArmyChanged(Army oldArmy, Army newArmy) |
448 { | |
449 loadedArmyPath = null; | |
450 SetAppTitle(); | |
451 SetArmyTree(newArmy); | |
21 | 452 |
0 | 453 if (oldArmy!=null) |
13 | 454 { |
455 oldArmy.UnitAdded-= UnitAddedMethod; | |
456 oldArmy.UnitRemoved-= UnitRemovedMethod; | |
457 oldArmy.PointsValueChanged-= PointsValueChangedMethod; | |
21 | 458 oldArmy.FailedRequirement-=FailedUnitRequirementMethod; |
0 | 459 } |
21 | 460 |
0 | 461 unitToWidgetMap.Clear(); |
21 | 462 |
0 | 463 while (unitsNotebook.NPages > 0) |
464 { | |
465 unitsNotebook.RemovePage(0); | |
466 } | |
21 | 467 |
13 | 468 if (newArmy==null) |
469 { | |
470 DisableCategoryButtons(); | |
471 } | |
472 else | |
473 { | |
474 newArmy.UnitAdded+= UnitAddedMethod; | |
475 newArmy.UnitRemoved+= UnitRemovedMethod; | |
476 newArmy.PointsValueChanged+= PointsValueChangedMethod; | |
477 newArmy.FailedRequirement+=FailedUnitRequirementMethod; | |
478 //TODO: Clear all buttons | |
479 EnableCategoryButtons(); | |
480 | |
481 if (newArmy.Race.HasCategoryOverrides()) | |
482 { | |
483 RemoveCategoryButtons(); | |
484 AddCategoryButtons(newArmy.Race.Categories); | |
485 } | |
0 | 486 } |
21 | 487 |
0 | 488 miCloseArmy.Sensitive = newArmy!=null; |
489 miSaveArmyAs.Sensitive = newArmy!=null; | |
490 //New army has no changes, so we can't save it | |
491 miSaveArmy.Sensitive = false; | |
13 | 492 saveArmyButton.Sensitive = false; |
493 | |
494 CommandStack.Reset(); | |
0 | 495 SetPointsPanelText(); |
496 } | |
21 | 497 |
0 | 498 private void SetArmyTree(Army army) |
499 { | |
500 logger.Debug("Resetting tree"); | |
501 TreeStore store = (TreeStore)treeUnits.Model; | |
502 store.Clear(); | |
503 TreeIter iter; | |
21 | 504 |
0 | 505 if (army!=null) |
506 { | |
507 logger.Debug("Loading in categories to tree"); | |
21 | 508 |
0 | 509 foreach (ArmyCategory cat in army.Categories) |
510 { | |
511 logger.DebugFormat("Append category {0}", cat.Name); | |
512 iter = store.AppendValues(cat); | |
21 | 513 |
0 | 514 foreach (IBBoard.WarFoundry.API.Objects.Unit unit in cat.GetUnits()) |
515 { | |
516 store.AppendValues(iter, unit); | |
21 | 517 } |
0 | 518 } |
21 | 519 |
0 | 520 logger.Debug("Finished loading tree categories"); |
521 } | |
522 } | |
21 | 523 |
0 | 524 private void DisableCategoryButtons() |
525 { | |
526 SetCategoryButtonsSensitive(false); | |
527 } | |
21 | 528 |
0 | 529 private void EnableCategoryButtons() |
530 { | |
531 SetCategoryButtonsSensitive(true); | |
532 } | |
21 | 533 |
0 | 534 private void SetCategoryButtonsSensitive(bool state) |
535 { | |
536 int toolbarButtonCount = toolbar.Children.Length - 1; | |
537 logger.Debug("Last button index: "+toolbarButtonCount); | |
21 | 538 |
0 | 539 for (int i = toolbarButtonCount; i > CATEGORY_BUTTON_SEPARATOR_INDEX; i--) |
540 { | |
541 logger.DebugFormat("Setting button {0} state to {1}", i, state); | |
542 toolbar.Children[i].Sensitive = state; | |
543 } | |
544 } | |
21 | 545 |
0 | 546 private void RemoveCategoryButtons() |
547 { | |
548 int toolbarButtonCount = toolbar.Children.Length - 1; | |
21 | 549 |
0 | 550 for (int i = toolbarButtonCount; i > CATEGORY_BUTTON_SEPARATOR_INDEX; i--) |
551 { | |
552 toolbar.Remove(toolbar.Children[i]); | |
553 } | |
21 | 554 |
0 | 555 categoryMap.Clear(); |
556 } | |
21 | 557 |
0 | 558 private void AddCategoryButtons(Category[] cats) |
559 { | |
560 if (cats!=null && cats.Length > 0) | |
561 { | |
562 logger.DebugFormat("Toolbar button count: {0}. Adding {1} categories.", toolbar.Children.Length, cats.Length); | |
21 | 563 |
0 | 564 foreach (Category cat in cats) |
565 { | |
566 ToolButton button = new ToolButton("gtk-add"); | |
567 button.Label = cat.Name; | |
10
c687bbe901f8
Re #37 - Resolve deprecation warnings
IBBoard <dev@ibboard.co.uk>
parents:
8
diff
changeset
|
568 button.TooltipText = "Add unit from "+cat.Name; |
0 | 569 //TODO: See if we can associate data in some way, the same as we can with SWF. For now we just use the map. |
570 categoryMap.Add(button, cat); | |
571 button.Clicked+= new System.EventHandler(OnAddUnitActivated); | |
572 toolbar.Insert(button, -1); | |
573 } | |
574 } | |
21 | 575 |
0 | 576 toolbar.Children[CATEGORY_BUTTON_SEPARATOR_INDEX].Visible = cats!=null && cats.Length>0; |
21 | 577 |
0 | 578 toolbar.ShowAll(); |
579 } | |
21 | 580 |
0 | 581 private void SetPointsPanelText() |
582 { | |
583 //TODO: Set the points value in the status bar | |
584 } | |
21 | 585 |
13 | 586 private void commandStack_CommandStackUpdated() |
587 { | |
588 undoMenuButton.Sensitive = commandStack.CanUndo(); | |
589 miUndo.Sensitive = undoMenuButton.Sensitive; | |
590 redoMenuButton.Sensitive = commandStack.CanRedo(); | |
591 miRedo.Sensitive = redoMenuButton.Sensitive; | |
0 | 592 int redoLength = commandStack.RedoLength; |
13 | 593 //TODO: Build menus for undo/redo and find way of adding tooltips |
594 /*int maxRedo = Math.Min(10, redoLength); | |
595 MenuItem[] menuItems = null; | |
21 | 596 |
13 | 597 if (redoLength > 0) |
598 { | |
599 menuItems = new MenuItem[maxRedo]; | |
600 Command com; | |
601 MenuItem mi; | |
602 | |
603 for (int i = 0; i < maxRedo; i++) | |
604 { | |
605 com = commandStack.PeekRedoCommand(i+1); | |
606 | |
607 if (com == null) | |
608 { | |
21 | 609 break; |
13 | 610 } |
611 | |
612 mi = new MenuItem(com.Description); | |
613 mi.Click+=new EventHandler(redoMenu_Click); | |
614 menuItems[i] = mi; | |
615 } | |
616 } | |
617 | |
618 redoMenu.MenuItems.Clear(); | |
619 | |
620 if (menuItems!=null && menuItems[0]!=null) | |
621 { | |
622 bttnRedo.ToolTipText = menuItems[0].Text; | |
623 redoMenu.MenuItems.AddRange(menuItems); | |
0 | 624 }*/ |
625 //TODO: Put above code back when we have a dropdown version of the redo button | |
626 if (redoLength > 0) | |
627 { | |
628 //redoMenuButton.Tooltip = CommandStack.PeekRedoCommand().Description; | |
13 | 629 } |
630 | |
631 int undoLength = commandStack.UndoLength; | |
632 /*int maxUndo = Math.Min(10, undoLength); | |
633 MenuItem[] menuItemsUndo = null; | |
21 | 634 |
13 | 635 if (undoLength > 0) |
636 { | |
637 menuItemsUndo = new MenuItem[maxUndo]; | |
638 Command com; | |
639 MenuItem mi; | |
640 | |
641 for (int i = 0; i < maxUndo; i++) | |
642 { | |
643 com = commandStack.PeekUndoCommand(i+1); | |
644 | |
645 if (com == null) | |
646 { | |
21 | 647 break; |
13 | 648 } |
649 | |
650 mi = new MenuItem(com.UndoDescription); | |
651 mi.Click+=new EventHandler(undoMenu_Click); | |
652 menuItemsUndo[i] = mi; | |
653 } | |
654 } | |
655 | |
656 undoMenu.MenuItems.Clear(); | |
657 | |
658 if (menuItemsUndo!=null && menuItemsUndo[0]!=null) | |
659 { | |
660 bttnUndo.ToolTipText = menuItemsUndo[0].Text; | |
661 undoMenu.MenuItems.AddRange(menuItemsUndo); | |
21 | 662 }*/ |
13 | 663 //TODO: Put above code back when we have a dropdown version of the undo button |
0 | 664 if (undoLength > 0) |
665 { | |
666 //undoMenuButton.Tooltip = CommandStack.PeekUndoCommand().UndoDescription; | |
667 } | |
21 | 668 |
13 | 669 saveArmyButton.Sensitive = commandStack.IsDirty() && WarFoundryCore.CurrentArmy!=null && CanSave(); |
670 miSaveArmy.Sensitive = commandStack.IsDirty() && WarFoundryCore.CurrentArmy!=null && CanSave(); | |
21 | 671 } |
672 | |
0 | 673 private bool CanSave() |
674 { | |
675 return loadedArmyPath!=null && WarFoundryCore.CurrentArmy!=null && WarFoundrySaver.GetSaver()!=null; | |
13 | 676 } |
677 | |
678 private bool SaveCurrentArmyOrSaveAs() | |
679 { | |
680 if (CanSave()) | |
681 { | |
682 return SaveCurrentArmy(); | |
683 } | |
21 | 684 else |
13 | 685 { |
686 return SaveCurrentArmyAs(); | |
687 } | |
0 | 688 } |
21 | 689 |
0 | 690 private bool OpenArmy() |
691 { | |
692 //TODO: Open dialog for file selection then open army | |
693 bool success = false; | |
694 loadedArmyPath = null;//TODO: Set loaded file path | |
695 return success; | |
13 | 696 } |
697 | |
698 private bool SaveCurrentArmy() | |
0 | 699 { |
700 bool success = false; | |
21 | 701 |
13 | 702 if (CanSave()) |
0 | 703 { |
23
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
704 success = SaveArmyToPath(WarFoundryCore.CurrentArmy, loadedArmyPath); |
0 | 705 } |
21 | 706 |
13 | 707 return success; |
708 } | |
709 | |
710 private bool SaveCurrentArmyAs() | |
711 { | |
23
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
712 |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
713 FileChooserDialog fileDialog = new FileChooserDialog("Save file as", this, FileChooserAction.Save, "Cancel", ResponseType.Cancel, "Save", ResponseType.Accept); |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
714 FileFilter filter = new FileFilter(); |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
715 filter.AddPattern("*.army"); |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
716 filter.Name = "WarFoundry Army files (*.army)"; |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
717 fileDialog.AddFilter(filter); |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
718 int response = fileDialog.Run(); |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
719 string filePath = null; |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
720 |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
721 if (response == (int)ResponseType.Accept) |
13 | 722 { |
23
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
723 filePath = fileDialog.Filename; |
13 | 724 } |
23
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
725 |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
726 fileDialog.Hide(); |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
727 fileDialog.Dispose(); |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
728 |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
729 return SaveArmyToPath(WarFoundryCore.CurrentArmy, filePath); |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
730 } |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
731 |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
732 private bool SaveArmyToPath(Army army, string filePath) |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
733 { |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
734 bool success = false; |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
735 |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
736 if (filePath!=null) |
13 | 737 { |
23
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
738 if (WarFoundrySaver.GetSaver().Save(WarFoundryCore.CurrentArmy, filePath)) |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
739 { |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
740 miSaveArmy.Sensitive = false; |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
741 saveArmyButton.Sensitive = false; |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
742 CommandStack.setCleanMark(); |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
743 loadedArmyPath = filePath; |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
744 success = true; |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
745 } |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
746 else |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
747 { |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
748 MessageDialog dialog = new MessageDialog(this, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, "Failed to save file to "+filePath); |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
749 dialog.Show(); |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
750 dialog.Dispose(); |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
751 } |
21 | 752 } |
23
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
753 //else user cancelled |
d661cb257511
Re #86: Initial GTK# GUI (because of Re #53)
IBBoard <dev@ibboard.co.uk>
parents:
21
diff
changeset
|
754 |
21 | 755 return success; |
0 | 756 } |
21 | 757 |
13 | 758 private bool CloseCurrentArmy() |
759 { | |
760 if (WarFoundryCore.CurrentArmy!=null) | |
761 { | |
762 bool canClose = false; | |
763 | |
764 if (CommandStack.IsDirty()) | |
0 | 765 { |
21 | 766 MessageDialog dia = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Question, ButtonsType.YesNo | ButtonsType.Cancel, "The army \""+WarFoundryCore.CurrentArmy.Name+"\" has been modified.\r\nSave changes before closing army?"); |
0 | 767 ResponseType dr = (ResponseType)dia.Run(); |
768 | |
13 | 769 if (dr == ResponseType.Yes) |
0 | 770 { |
771 //They want to save so try to save it or prompt for save as | |
13 | 772 //If they cancel the save as then assume they don't want to close |
773 canClose = SaveCurrentArmyOrSaveAs(); | |
774 } | |
775 else if (dr == ResponseType.No) | |
0 | 776 { |
13 | 777 //They don't care about their changes |
778 canClose = true; | |
0 | 779 } |
780 else | |
781 { | |
782 //Assume cancel or close with the X button | |
783 canClose = false; | |
784 } | |
21 | 785 |
13 | 786 dia.Dispose(); |
787 } | |
788 else | |
789 { | |
790 //Nothing has changed so we can safely close | |
791 canClose = true; | |
792 } | |
793 | |
794 if (canClose) | |
0 | 795 { |
13 | 796 //do close |
797 WarFoundryCore.CurrentArmy = null; | |
798 return true; | |
799 } | |
800 else | |
801 { | |
802 return false; | |
803 } | |
804 } | |
805 else | |
806 { | |
807 //pretend we succeeded | |
808 return true; | |
809 } | |
810 } | |
811 | |
812 private void CreateNewArmy() | |
0 | 813 { |
814 logger.Debug("Create new army"); | |
815 FrmNewArmy newArmy = new FrmNewArmy(WarFoundryCore.CurrentGameSystem); | |
816 ResponseType type = (ResponseType)newArmy.Run(); | |
817 newArmy.Hide(); | |
21 | 818 |
0 | 819 if (type == ResponseType.Ok) |
13 | 820 { |
821 if (CloseCurrentArmy()) | |
0 | 822 { |
823 WarFoundryCore.CurrentArmy = new Army(newArmy.SelectedRace, newArmy.ArmyName, newArmy.ArmySize); | |
824 } | |
825 } | |
826 else | |
827 { | |
828 logger.Debug("Create new army cancelled"); | |
829 } | |
21 | 830 |
13 | 831 newArmy.Destroy(); |
0 | 832 } |
21 | 833 |
0 | 834 private void ChangeCurrentGameSystem() |
21 | 835 { |
0 | 836 logger.Debug("Changing game system"); |
837 FrmChangeGameSystem dialog = new FrmChangeGameSystem(this); | |
838 ResponseType type = (ResponseType)dialog.Run(); | |
839 dialog.Hide(); | |
21 | 840 |
0 | 841 if (type == ResponseType.Ok) |
842 { | |
843 WarFoundryCore.CurrentGameSystem = dialog.SelectedSystem; | |
844 } | |
845 else | |
846 { | |
847 logger.Debug("Game system change cancelled"); | |
848 } | |
21 | 849 |
0 | 850 dialog.Destroy(); |
851 } | |
852 | |
853 protected virtual void undoTBButtonActivated (object sender, System.EventArgs e) | |
854 { | |
855 CommandStack.Undo(); | |
856 } | |
857 | |
858 protected virtual void redoTBButtonActivated (object sender, System.EventArgs e) | |
859 { | |
860 CommandStack.Redo(); | |
861 } | |
862 | |
863 protected virtual void saveTBButtonActivated (object sender, System.EventArgs e) | |
864 { | |
865 SaveCurrentArmy(); | |
866 } | |
867 | |
868 protected virtual void openTBButtonActivated (object sender, System.EventArgs e) | |
869 { | |
870 OpenArmy(); | |
871 } | |
872 | |
873 protected virtual void newTBButtonActivated (object sender, System.EventArgs e) | |
874 { | |
875 CreateNewArmy(); | |
876 } | |
877 | |
878 protected virtual void ArmyRowActivated (object o, Gtk.RowActivatedArgs args) | |
879 { | |
880 TreeModel model = treeUnits.Model; | |
881 TreeIter iter; | |
882 model.GetIter(out iter, args.Path); | |
883 object obj = model.GetValue(iter, 0); | |
21 | 884 |
0 | 885 if (obj is IBBoard.WarFoundry.API.Objects.Unit) |
886 { | |
887 IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)obj; | |
21 | 888 |
0 | 889 UnitDisplayWidget widget; |
890 unitToWidgetMap.TryGetValue(unit, out widget); | |
21 | 891 |
0 | 892 if (widget!=null) |
893 { | |
894 logger.DebugFormat("Selecting existing page for "+unit.Name); | |
895 unitsNotebook.Page = unitsNotebook.PageNum(widget); | |
896 } | |
897 else | |
898 { | |
899 widget = new UnitDisplayWidget(unit, CommandStack); | |
900 logger.Debug("Adding page for "+unit.Name); | |
901 unitToWidgetMap[unit] = widget; | |
15
85db2c9a1546
Fixes #95: Can't re-open GTK# tabs
IBBoard <dev@ibboard.co.uk>
parents:
14
diff
changeset
|
902 widget.Destroyed+= new EventHandler(UnitWidgetDestroyed); |
12
685532d43a96
Re #88: Complete initial GTK# UI
IBBoard <dev@ibboard.co.uk>
parents:
10
diff
changeset
|
903 int pageNum = NotebookUtil.AddPageToNotebookWithCloseButton(unitsNotebook, widget, unit.Name); |
0 | 904 logger.Debug("Page added at index "+pageNum); |
905 unitsNotebook.ShowAll(); | |
906 unitsNotebook.Page = pageNum; | |
907 } | |
908 } | |
909 } | |
15
85db2c9a1546
Fixes #95: Can't re-open GTK# tabs
IBBoard <dev@ibboard.co.uk>
parents:
14
diff
changeset
|
910 |
85db2c9a1546
Fixes #95: Can't re-open GTK# tabs
IBBoard <dev@ibboard.co.uk>
parents:
14
diff
changeset
|
911 private void UnitWidgetDestroyed(object sender, EventArgs e) |
85db2c9a1546
Fixes #95: Can't re-open GTK# tabs
IBBoard <dev@ibboard.co.uk>
parents:
14
diff
changeset
|
912 { |
85db2c9a1546
Fixes #95: Can't re-open GTK# tabs
IBBoard <dev@ibboard.co.uk>
parents:
14
diff
changeset
|
913 if (sender is UnitDisplayWidget) |
85db2c9a1546
Fixes #95: Can't re-open GTK# tabs
IBBoard <dev@ibboard.co.uk>
parents:
14
diff
changeset
|
914 { |
85db2c9a1546
Fixes #95: Can't re-open GTK# tabs
IBBoard <dev@ibboard.co.uk>
parents:
14
diff
changeset
|
915 unitToWidgetMap.Remove(((UnitDisplayWidget)sender).Unit); |
85db2c9a1546
Fixes #95: Can't re-open GTK# tabs
IBBoard <dev@ibboard.co.uk>
parents:
14
diff
changeset
|
916 } |
85db2c9a1546
Fixes #95: Can't re-open GTK# tabs
IBBoard <dev@ibboard.co.uk>
parents:
14
diff
changeset
|
917 } |
0 | 918 } |
919 } |