示例#1
0
            public void AddItem(object item, string categoryName)
            {
                int           index;
                List <object> category;

                if (!m_categories.TryGetValue(categoryName, out category))
                {
                    index    = m_categories.Count;
                    category = new List <object>();
                    m_categories.Add(categoryName, category);

                    ItemInserted.Raise(this, new ItemInsertedEventArgs <object>(index, categoryName, this));
                }
                index = category.Count;
                category.Add(item);

                ItemInserted.Raise(this, new ItemInsertedEventArgs <object>(index, item, categoryName));
            }
示例#2
0
        private void DomNode_ChildInserted(object sender, ChildEventArgs e)
        {
            AddNode(e.Child);
            if (IsCircuitItem(e.Child, e.Parent))
            {
                if (e.Child.Is <Wire>())
                {
                    var connection = e.Child.Cast <Wire>();
                    if (connection.InputElement.Is <Group>())  // set dirty to force update group pin connectivity
                    {
                        connection.InputElement.Cast <Group>().Dirty = true;
                    }

                    if (connection.OutputElement.Is <Group>())
                    {
                        connection.OutputElement.Cast <Group>().Dirty = true;
                    }
                }

                ItemInserted.Raise(this, new ItemInsertedEventArgs <object>(e.Index, e.Child, e.Parent));

                var circuitValidator = DomNode.GetRoot().As <CircuitValidator>();
                if (circuitValidator != null)
                {
                    var transactionContext = circuitValidator.ActiveHistoryContext;
                    if (transactionContext != null && transactionContext != this)
                    {
                        if (transactionContext.DomNode.Ancestry.FirstOrDefault(x => x == e.Parent) != null)
                        {
                            if (transactionContext.InTransaction)
                            {
                                transactionContext.AddOperation(new ChildInsertedOperation(e));
#if DEBUG_VERBOSE
                                var parent = transactionContext.DomNode.Ancestry.FirstOrDefault(x => x == e.Parent);
                                Trace.TraceInformation("PARENT GRAPH {0} --  Added {1} to parent {2}",
                                                       CircuitUtil.GetDomNodeName(parent), CircuitUtil.GetDomNodeName(e.Child), CircuitUtil.GetDomNodeName(e.Parent));
#endif
                            }
                        }
                    }
                }
            }
        }
示例#3
0
        private void GenerateVirtual()
        {
            var items = s_random.Next(10000, 100001);

            Outputs.WriteLine(
                OutputMessageType.Info,
                "Adding {0} items to the virtual list.",
                items);

            var arrayItems = new object[items];

            for (var i = 0; i < items; i++)
            {
                var data = CreateItem(null);
                data.ItemChanged += DataItemChanged;
                arrayItems[i]     = data;
                m_data.Add(data);
            }

            // Can accept an array of objects or single object
            ItemInserted.Raise(this, new ItemInsertedEventArgs <object>(-1, arrayItems));
        }
示例#4
0
        private void GenerateHierarchical(DataItem parent)
        {
            DataItem root       = null;
            var      tempParent = parent;

            var items = s_random.Next(3, 10);

            for (var i = 0; i < items; i++)
            {
                var data = CreateItem(tempParent);
                data.ItemChanged += DataItemChanged;

                if (root == null)
                {
                    root = data;
                }

                if (tempParent == null)
                {
                    m_data.Add(data);
                }
                else
                {
                    tempParent.Children.Add(data);
                }

                tempParent = data;
            }

            ItemInserted.Raise(this, new ItemInsertedEventArgs <object>(-1, root, parent));

            if (parent != null)
            {
                ItemChanged.Raise(this, new ItemChangedEventArgs <object>(parent));
            }
        }
示例#5
0
 private void root_ChildInserted(object sender, ChildEventArgs e)
 {
     ItemInserted.Raise(this, new ItemInsertedEventArgs <object>(-1, e.Child, e.Parent));
 }
示例#6
0
 void DomNode_ChildInserted(object sender, ChildEventArgs e)
 {
     ItemInserted.Raise(this, new ItemInsertedEventArgs <object>(e.Index, e.Child, e.Parent));
 }
示例#7
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="Item"></param>
 /// <param name="Index"></param>
 protected virtual void OnItemInserted(T Item, int Index)
 {
     itemInserted?.Invoke(this, new EventArgs <object>(Item, Index));
     ItemInserted?.Invoke(this, new EventArgs <T>(Item, Index));
 }
示例#8
0
 /// <summary>
 /// Raises the ItemInserted event and performs custom processing</summary>
 /// <param name="e">ItemInsertedEventArgs containing event data</param>
 protected virtual void OnObjectInserted(ItemInsertedEventArgs <object> e)
 {
     ItemInserted.Raise(this, e);
 }
示例#9
0
        /// <summary>
        /// Add's the given item, with the given amount to the pool.
        /// Amount will be batched automatically based on max stack size.
        /// </summary>
        /// <param name="newItem"></param>
        /// <param name="amount"></param>
        public bool Add(T newItem, int amount, out string message)
        {
            message = string.Empty;

            if (amount <= 0)
            {
                throw new Exception("[ItemInsert]: Item amount cannot be zero or less.");
            }

            // Seperate into batches, if the amount is too much.
            if (amount > _maxStackSize)
            {
                var seperateAmount = Mathf.CeilToInt((float)amount / _maxStackSize);
                int totalAmount    = amount;
                int leftOver       = totalAmount;
                for (int i = 0; i < seperateAmount; i++)
                {
                    if (leftOver >= _maxStackSize)
                    {
                        if (!Add(newItem, _maxStackSize, out message))
                        {
                            return(false);
                        }
                    }
                    else if (leftOver > 0)
                    {
                        if (!Add(newItem, leftOver, out message))
                        {
                            return(false);
                        }
                    }

                    leftOver -= _maxStackSize;
                    if (leftOver <= 0)
                    {
                        break;
                    }
                }
                return(true);
            }

            var validItems = _items
                             .Where(a => a != null && a.Item.Id == newItem.Id && a.Amount < _maxStackSize)
                             .OrderByDescending(a => a.Amount);

            // Add amount to existing items in the inventory already
            int totalValidAmount = amount;

            foreach (var item in validItems)
            {
                int differenceAmount = _maxStackSize - item.Amount;

                if (totalValidAmount >= differenceAmount)
                {
                    totalValidAmount -= differenceAmount;
                    int oldAmount = item.Amount;
                    item.Amount += differenceAmount;
                    ItemUpdated?.Invoke(this, new InventoryArgs(item.Item, oldAmount, item.Amount));
                    RenderChange(Array.IndexOf(_items, item), item);
                }
                else
                {
                    int oldAmount = item.Amount;
                    item.Amount += totalValidAmount;
                    ItemUpdated?.Invoke(this, new InventoryArgs(item.Item, oldAmount, item.Amount));
                    RenderChange(Array.IndexOf(_items, item), item);
                    totalValidAmount = 0;
                }

                if (totalValidAmount == 0)
                {
                    break;
                }
            }

            // Add new item, if there is still amount left
            if (totalValidAmount > 0)
            {
                if (_items.All(a => a != null))
                {
                    if (amount - totalValidAmount == 0)
                    {
                        message = "Inventory is full.";
                    }
                    else
                    {
                        message = "Inventory is full, only added " + (amount - totalValidAmount) + " amount.";
                    }
                    return(false);
                }

                var item           = new InventoryItem(newItem, totalValidAmount);
                var firstOpenIndex = Array.FindIndex(_items, a => a == null);
                if (firstOpenIndex == -1)
                {
                    throw new Exception("Inventory is full, we shouldn't have gotten here..");
                }
                _items[firstOpenIndex] = item;

                ItemInserted?.Invoke(this, new InventoryArgs(newItem, 0, item.Amount));
                RenderChange(firstOpenIndex, item);
            }
            return(true);
        }
示例#10
0
 protected virtual void OnItemInserted(ItemInsertedEventArgs args)
 {
     ItemInserted?.Invoke(this, args);
 }