public CrewViewModelCollection Clone(TankViewModelBase owner, TankViewModelCloneFlags flags) { var clone = new CrewViewModelCollection(_commandBindings); foreach (var crew in this) { var deepCopy = false; foreach (var role in crew.Crew.AllRoles) { switch (role) { case CrewRoleType.Commander: deepCopy = (flags & TankViewModelCloneFlags.Commander) == TankViewModelCloneFlags.Commander; break; case CrewRoleType.Driver: deepCopy = (flags & TankViewModelCloneFlags.Driver) == TankViewModelCloneFlags.Driver; break; case CrewRoleType.Gunner: deepCopy = (flags & TankViewModelCloneFlags.Gunner) == TankViewModelCloneFlags.Gunner; break; case CrewRoleType.Loader: deepCopy = (flags & TankViewModelCloneFlags.Loader) == TankViewModelCloneFlags.Loader; break; case CrewRoleType.Radioman: deepCopy = (flags & TankViewModelCloneFlags.Radioman) == TankViewModelCloneFlags.Radioman; break; } if (deepCopy) { break; } } if (deepCopy) { clone.Add(crew.Clone(owner, crew.Index)); } else { clone.Add(crew); } } return(clone); }
public virtual TankViewModelBase Clone(TankViewModelCloneFlags flags = TankViewModelCloneFlags.All) { var clone = (TankViewModelBase)this.MemberwiseClone(); var cloneModules = (flags & TankViewModelCloneFlags.AnyModule) == TankViewModelCloneFlags.AnyModule; if (cloneModules) { clone.LoadedModules = (ModuleViewModels)this.LoadedModules.Clone(clone, flags); clone.AvailableGuns = new Dictionary <IGun, GunViewModel>(this.AvailableGuns); } var cloneEquipments = (flags & TankViewModelCloneFlags.Equipments) == TankViewModelCloneFlags.Equipments; if (cloneEquipments) { clone.LoadedEquipments = new ObservableCollection <IEquipmentViewModel>(this.LoadedEquipments); clone.HandleEquipmentsChangeEvents(); } var cloneConsumables = (flags & TankViewModelCloneFlags.Consumables) == TankViewModelCloneFlags.Consumables; if (cloneConsumables) { clone.LoadedConsumables = new ObservableCollection <IConsumableViewModel>(this.LoadedConsumables); clone.HandleConsumablesChangeEvents(); } var cloneCrews = (flags & TankViewModelCloneFlags.AnyCrew) == TankViewModelCloneFlags.AnyCrew; if (cloneCrews) { clone.Crews = clone.Crews.Clone(clone, flags); clone.HandleCrewSkillsChangedEvent(); // fixme: potential event memory leak, weak event required } if (cloneEquipments || cloneCrews) { clone.ModificationContext = this.ModificationContext.Clone(); } clone.ClearEventHandlers(); return(clone); }