diff FrmMainWindow.cs @ 162:354c1d2ad086

Re #423: Support nested units in GTK UI * Add "add unit" context menu to tree * Add quick hacks to unit dialog to work with both nesting and direct category units
author IBBoard <dev@ibboard.co.uk>
date Sun, 05 Aug 2012 21:01:00 +0100
parents 89e2442bbb60
children 219340630150
line wrap: on
line diff
--- a/FrmMainWindow.cs	Tue Jul 17 20:46:44 2012 +0100
+++ b/FrmMainWindow.cs	Sun Aug 05 21:01:00 2012 +0100
@@ -240,7 +240,7 @@
 		{
 			foreach (FileLoadFailure failure in failures)
 			{
-				logger.Warn("Failed to load " + failure.FailedFile.FullName + ": " + failure.Message);
+				logger.Warn("Failed to load " + failure.FailedFile.Name + ": " + failure.Message);
 			}
 		}
 
@@ -331,8 +331,7 @@
 						treeUnits.ExpandToPath(path);
 					}
 				}
-			}
-			while (model.IterNext(ref iter));
+			} while (model.IterNext(ref iter));
 		}
 
 		private void OnUnitRemoved(WarFoundryObject obj)
@@ -373,8 +372,7 @@
 								removed = true;
 								break;
 							}
-						}
-						while (model.IterNext(ref innerIter));
+						} while (model.IterNext(ref innerIter));
 
 						if (removed)
 						{
@@ -382,8 +380,7 @@
 						}
 					}
 				}
-			}
-			while (model.IterNext(ref iter));
+			} while (model.IterNext(ref iter));
 		}
 
 		private void RemoveUnitTab(WFObjects.Unit unit)
@@ -1177,15 +1174,26 @@
 		protected virtual void OnTreeUnitsPopupMenu(object o, Gtk.PopupMenuArgs args)
 		{
 			object selectedItem = TreeUtils.GetSelectedItem(treeUnits);
+			WFObjects.Unit theUnit = selectedItem as WFObjects.Unit;
 
-			if (selectedItem is WFObjects.Unit)
+			if (theUnit != null)
 			{
 				Menu menu = new Menu();
 				ImageMenuItem delete = new ImageMenuItem(Translation.GetTranslation("menuRemoveUnit", "remove unit"));
 				delete.Image = new Gtk.Image(Stock.Delete, IconSize.Menu);
 				delete.Activated += new EventHandler(OnUnitDelete);
-				delete.Data["unit"] = selectedItem;
+				delete.Data["unit"] = theUnit;
 				menu.Append(delete);
+
+				if (theUnit.UnitType.ContainedUnitTypes.Length > 0)
+				{					
+					ImageMenuItem addContained = new ImageMenuItem(Translation.GetTranslation("menuAddUnit", "add unit"));
+					addContained.Image = new Gtk.Image(Stock.Add, IconSize.Menu);
+					addContained.Activated += new EventHandler(OnSubUnitAdd);
+					addContained.Data["unit"] = theUnit;
+					menu.Append(addContained);
+				}
+
 				menu.ShowAll();
 				menu.Popup();
 			}
@@ -1197,6 +1205,24 @@
 			commandStack.Execute(command);
 		}
 
+		void OnSubUnitAdd(object sender, EventArgs e)
+		{
+			WFObjects.Unit unit = (WFObjects.Unit)((ImageMenuItem)sender).Data["unit"];
+			logger.DebugFormat("Show FrmNewUnit for contained units of {0}", unit.Name);
+			FrmNewUnit newUnit = new FrmNewUnit(unit, WarFoundryCore.CurrentArmy);
+			ResponseType response = (ResponseType)newUnit.Run();
+			newUnit.Hide();
+			
+			if (response == ResponseType.Ok)
+			{
+				CreateAndAddUnitCommand cmd = new CreateAndAddUnitCommand(newUnit.SelectedUnit, WarFoundryCore.CurrentArmy.GetCategory(newUnit.SelectedUnit.MainCategory), unit);
+				commandStack.Execute(cmd);
+				ShowUnitWidget(cmd.Unit);
+			}
+			
+			newUnit.Dispose();
+		}
+
 		[GLib.ConnectBefore]
 
 		protected virtual void UnitTreeButtonPressed(object o, Gtk.ButtonPressEventArgs args)