changeset 83:89cc29b4c012

Re #90: Stop new units showing up twice * Hand all of unit adding/removing down to category * Refactor out OnFailedRequirement method in Army * Make Army listen to and propogate FailedRequirement events from Units * Add OnUnitAdded/Removed method to ArmyCategory that takes list of failures * Remove direct reference to Army from Unit and go via ArmyCategory instead
author IBBoard <dev@ibboard.co.uk>
date Sat, 27 Jun 2009 19:39:04 +0000
parents 3ea0ab04352b
children 2b977962302a
files api/Commands/CreateAndAddUnitCommand.cs api/Objects/Army.cs api/Objects/ArmyCategory.cs api/Objects/Unit.cs
diffstat 4 files changed, 94 insertions(+), 92 deletions(-) [+]
line wrap: on
line diff
--- a/api/Commands/CreateAndAddUnitCommand.cs	Sat Jun 27 18:59:49 2009 +0000
+++ b/api/Commands/CreateAndAddUnitCommand.cs	Sat Jun 27 19:39:04 2009 +0000
@@ -12,17 +12,17 @@
 	public class CreateAndAddUnitCommand : Command
 	{
 		private UnitType addedUnitType;
-		private Army army;
+		private ArmyCategory armyCat;
 		private Unit addedUnit;
 		
-		public CreateAndAddUnitCommand(UnitType toAdd, Army armyTo)
+		public CreateAndAddUnitCommand(UnitType toAdd, ArmyCategory armyCatTo)
 		{
 			addedUnitType = toAdd;
-			army = armyTo;
+			armyCat = armyCatTo;
 		}
 
 		[Obsolete("Use two parameter constructor instead")]
-		public CreateAndAddUnitCommand(UnitType toAdd, ArmyCategory catTo, Army armyTo) : this(toAdd, armyTo)
+		public CreateAndAddUnitCommand(UnitType toAdd, ArmyCategory catTo, Army armyTo) : this(toAdd, catTo)
 		{
 		}
 
@@ -33,7 +33,7 @@
 
 		public override bool CanExecute()
 		{
-			return (addedUnitType!=null && army!=null);
+			return (addedUnitType!=null && armyCat!=null);
 		}
 
 		public override string Description
@@ -48,19 +48,19 @@
 
 		public override bool Execute()
 		{
-			addedUnit = new Unit(addedUnitType, army);
+			addedUnit = new Unit(addedUnitType, armyCat);
 			this.Redo();
 			return true;
 		}
 
 		public override void Redo()
 		{
-			army.AddUnit(addedUnit);
+			armyCat.AddUnit(addedUnit);
 		}
 
 		public override void Undo()
-		{
-			army.RemoveUnit(addedUnit);
+		{
+			armyCat.RemoveUnit(addedUnit);
 		}
 
 
--- a/api/Objects/Army.cs	Sat Jun 27 18:59:49 2009 +0000
+++ b/api/Objects/Army.cs	Sat Jun 27 19:39:04 2009 +0000
@@ -69,6 +69,7 @@
 						cat.PointsValueChanged+= PointsValueChangedMethod;
 						cat.UnitAdded+=new ObjectAddDelegate(Army_UnitAdded);
 						cat.UnitRemoved+=new ObjectRemoveDelegate(Army_UnitRemoved);
+						cat.FailedRequirement+=new FailedUnitRequirementDelegate(Army_FailedRequirement);
 					}
 				}
 				
@@ -97,19 +98,16 @@
 		protected void OnUnitAdded(Unit unit)
 		{
 			OnUnitAdded(unit, null);
-		}
-
-		protected void OnUnitAdded(Unit unit, List<FailedUnitRequirement> failedReqs)
-		{
-			if (UnitAdded!=null)
-			{
-				UnitAdded(unit);
-			}
-
-			if (FailedRequirement!=null && failedReqs!=null && failedReqs.Count > 0)
-			{
-				FailedRequirement(failedReqs);
-			}
+		}
+
+		protected void OnUnitAdded(Unit unit, List<FailedUnitRequirement> failedReqs)
+		{
+			if (UnitAdded != null)
+			{
+				UnitAdded(unit);
+			}
+
+			OnFailedRequirement(failedReqs);
 		}
 
 		protected void OnUnitRemoved(Unit unit)
@@ -122,12 +120,17 @@
 			if (UnitRemoved!=null)
 			{
 				UnitRemoved(unit);
-			}
-
-			if (FailedRequirement!=null && failedReqs!=null && failedReqs.Count > 0)
-			{
-				FailedRequirement(failedReqs);
-			}
+			}
+
+			OnFailedRequirement(failedReqs);
+		}
+
+		protected void OnFailedRequirement(List<FailedUnitRequirement> failedReqs)
+		{
+			if (FailedRequirement != null && failedReqs != null && failedReqs.Count > 0)
+			{
+				FailedRequirement(failedReqs);
+			}
 		}
 
 		private void OnPointsValueChanged(double oldValue, double newValue)
@@ -160,17 +163,13 @@
 		
 		public void AddUnit(Unit unit)
 		{
-			unit.Army = this;
 			ArmyCategory armyCat = GetCategory(unit.UnitType.MainCategory);
 			armyCat.AddUnit(unit);
 		}
 		
 		public void RemoveUnit(Unit unit)
 		{
-			List<FailedUnitRequirement> failedReqs = CanRemoveUnit(unit);
-			unit.Army = null;
 			unit.Category.RemoveUnit(unit);
-			OnUnitRemoved(unit, failedReqs);
 		}
 
 		public Unit[] GetUnits(Category cat)
@@ -254,14 +253,19 @@
 			return count;
 		}
 
-		private void Army_UnitAdded(object val)
+		private void Army_UnitAdded(WarFoundryObject val)
 		{
 			OnUnitAdded((Unit)val);
-		}
-
-		private void Army_UnitRemoved(object val)
+		}
+
+		private void Army_UnitRemoved(WarFoundryObject val)
 		{
 			OnUnitRemoved((Unit)val);
+		}
+
+		private void Army_FailedRequirement(List<FailedUnitRequirement> val)
+		{
+			OnFailedRequirement(val);
 		}
 	}
 }
--- a/api/Objects/ArmyCategory.cs	Sat Jun 27 18:59:49 2009 +0000
+++ b/api/Objects/ArmyCategory.cs	Sat Jun 27 19:39:04 2009 +0000
@@ -21,7 +21,8 @@
 		private DoubleValChangedDelegate PointsValueChangedMethod;
 		public event DoubleValChangedDelegate PointsValueChanged;
 		public event ObjectAddDelegate UnitAdded;
-		public event ObjectRemoveDelegate UnitRemoved;
+		public event ObjectRemoveDelegate UnitRemoved;
+		public event FailedUnitRequirementDelegate FailedRequirement;
 
 		public ArmyCategory(Army army, Category cat) : base()
 		{
@@ -74,16 +75,17 @@
 			unitTypes.TryGetValue(unit.UnitType.ID, out unitTypeCount);
 			unitTypes[unit.UnitType.ID] = (int)unitTypeCount + 1;
 			TotalPoints+= unit.PointsValue;
-			OnUnitAdded(unit);
+			OnUnitAdded(unit, failedReqs);
 		}
 
 		internal void RemoveUnit(Unit unit)
 		{
+			List<FailedUnitRequirement> failedReqs = ParentArmy.CanRemoveUnit(unit);
 			units.Remove(unit);
 			unitTypes[unit.UnitType.ID] = ((int)unitTypes[unit.UnitType.ID])-1;
 			TotalPoints-= unit.PointsValue;
 			unit.PointsValueChanged-= PointsValueChangedMethod;
-			OnUnitRemoved(unit);
+			OnUnitRemoved(unit, failedReqs);
 		}
 
 		public int GetUnitTypeCount(UnitType unitType)
@@ -122,23 +124,43 @@
 			{
 				double diff = newVal - oldVal;
 				TotalPoints+= diff;
-			}
-		}
-
-		private void OnUnitAdded(Unit unit)
-		{
-			if (UnitAdded!=null)
-			{
-				UnitAdded(unit);
-			}
-		}
-
-		private void OnUnitRemoved(Unit unit)
-		{
-			if (UnitRemoved!=null)
-			{
-				UnitRemoved(unit);
-			}
+			}
+		}
+
+		protected void OnUnitAdded(Unit unit)
+		{
+			OnUnitAdded(unit, null);
+		}
+
+		protected void OnUnitAdded(Unit unit, List<FailedUnitRequirement> failedReqs)
+		{
+			if (UnitAdded != null)
+			{
+				UnitAdded(unit);
+			}
+
+			if (FailedRequirement != null && failedReqs != null && failedReqs.Count > 0)
+			{
+				FailedRequirement(failedReqs);
+			}
+		}
+
+		protected void OnUnitRemoved(Unit unit)
+		{
+			OnUnitRemoved(unit, null);
+		}
+
+		protected void OnUnitRemoved(Unit unit, List<FailedUnitRequirement> failedReqs)
+		{
+			if (UnitRemoved != null)
+			{
+				UnitRemoved(unit);
+			}
+
+			if (FailedRequirement != null && failedReqs != null && failedReqs.Count > 0)
+			{
+				FailedRequirement(failedReqs);
+			}
 		}
 
 		protected virtual void OnPointsValueChanged(double oldValue, double newValue)
--- a/api/Objects/Unit.cs	Sat Jun 27 18:59:49 2009 +0000
+++ b/api/Objects/Unit.cs	Sat Jun 27 19:39:04 2009 +0000
@@ -17,7 +17,6 @@
 	{
 		private UnitType type;
 		private int size;
-		private Army army;
 		private Unit parentUnit;
 		private double points;
 		private ArmyCategory cat;
@@ -25,13 +24,13 @@
 		private List<Unit> containedUnits = new List<Unit>();
 		public event DoubleValChangedDelegate PointsValueChanged;
 		public event IntValChangedDelegate UnitSizeChanged;
-		public event DoubleValChangedDelegate UnitEquipmentAmountChanged;
-
-		public Unit(UnitType unitType, Army parentArmy) : this(unitType, unitType.MinSize, parentArmy){}
-
-		public Unit(UnitType unitType, int startSize, Army parentArmy)
-		{
-			Army = parentArmy;
+		public event DoubleValChangedDelegate UnitEquipmentAmountChanged;
+
+		public Unit(UnitType unitType, ArmyCategory parentArmyCat) : this(unitType, unitType.MinSize, parentArmyCat) { }
+
+		public Unit(UnitType unitType, int startSize, ArmyCategory parentArmyCat)
+		{
+			Category = parentArmyCat;
 			type = unitType;
 			Size = startSize;
 			SetInitialEquipment();
@@ -143,16 +142,7 @@
 
 		public Army Army
 		{
-			get { return army; }
-			set 
-			{
-				army = value;
-
-				if (army == null)
-				{
-					Category = null;
-				}
-			}
+			get { return (Category == null ? null : Category.ParentArmy); }
 		}
 
 		public Race Race
@@ -161,24 +151,10 @@
 		}
 
 		public ArmyCategory Category
-		{
-			get 
-			{ 
-				if (cat==null)
-				{
-					if (Army!=null)
-					{
-						return Army.GetCategory(UnitType.MainCategory);
-					}
-					else
-					{
-						return null;
-					}
-				}
-				else
-				{
-					return cat; 
-				}
+		{
+			get
+			{
+				return cat;
 			}
 			set { cat = value; }
 		}