Пример #1
0
        public bool Transfer(IContainerReference sourceContainer, IContainerReference targetContainer, IItem entity)
        {
            if (!containers.ContainsKey(sourceContainer))
            {
                return(false);
            }

            if (Equals(sourceContainer, targetContainer))
            {
                // nothing to do.
                return(true);
            }

            if (CanAdd(targetContainer, entity))
            {
                if (Remove(sourceContainer, entity))
                {
                    if (Add(targetContainer, entity))
                    {
                        return(true);
                    }

                    // try to restore the broken entity ..
                    if (!Add(sourceContainer, entity))
                    {
                        throw new Exception("Whoha!");
                    }
                }
            }

            return(false);
        }
Пример #2
0
        // public List<IItem> Contents(IContainerReference container, List<IItem> collector)
        // {
        //     if (!containers.TryGetValue(container, out Container c))
        //     {
        //         if (collector == null)
        //         {
        //             collector = new List<IItem>();
        //         }
        //         else
        //         {
        //             collector.Clear();
        //         }
        //
        //         return collector;
        //     }
        //
        //     return c.Contents(collector);
        // }

        public ReadOnlyListWrapper <IItem> Contents(IContainerReference container)
        {
            if (!containers.TryGetValue(container, out Container c))
            {
                return(EmptySingleton);
            }

            return(c.Contents());
        }
Пример #3
0
        public bool CanAdd(IContainerReference container, IItem entity)
        {
            if (!containers.TryGetValue(container, out Container c))
            {
                return(Container.CanAddPrecheck(container, entity));
            }

            return(c.CanAdd(entity));
        }
Пример #4
0
        public bool Remove(IContainerReference container, IItem entity)
        {
            if (!containers.TryGetValue(container, out Container c))
            {
                return(false);
            }

            var retval = c.Remove(entity);

            itemParents.Remove(entity);
            if (c.IsEmpty)
            {
                containers.Remove(container);
            }

            return(retval);
        }
Пример #5
0
        public bool Add(IContainerReference container, IItem entity)
        {
            if (ContainerOf(entity) != null)
            {
                throw new ArgumentException("This item is already part of an collection.");
            }

            if (!containers.TryGetValue(container, out Container c))
            {
                c = new Container(container);
                c.Add(entity);
                containers[container] = c;
                itemParents[entity]   = container;
            }
            else
            {
                c.Add(entity);
                itemParents[entity] = container;
            }

            return(true);
        }
Пример #6
0
 public static bool CanAddPrecheck(IContainerReference id, IItem item)
 {
     return(id.ContainerType >= item.ItemType.Container);
 }
Пример #7
0
 public Container(IContainerReference id)
 {
     Id    = id ?? throw new ArgumentNullException(nameof(id));
     Items = new List <IItem>();
 }