コード例 #1
0
        public void AddBlockOnContextMenuItem(MenuButton sender)
        {
            switch (_addBlockStep)
            {
            case AddBlockSteps.ChoiceInsertType:
            {
                if (!_addInsertTypeMenuButtons.ContainsKey(sender))
                {
                    return;
                }

                _addInsertInside = _addInsertTypeMenuButtons[sender];

                _contextMenu.ClearContextMenu();
                SetAddTypeMenuItems();

                _addBlockStep = AddBlockSteps.ChoiceBlockType;
            }
            break;

            case AddBlockSteps.ChoiceBlockType:
            {
                if (!_addTypeMenuButtons.ContainsKey(sender))
                {
                    return;
                }

                _addType = _addTypeMenuButtons[sender];

                _contextMenu.ClearContextMenu();
                SetAddBlocksMenuItems();

                _addBlockStep = AddBlockSteps.ChoiceBlock;
            }
            break;

            case AddBlockSteps.ChoiceBlock:
            {
                if (!_addBlockMenuButtons.ContainsKey(sender))
                {
                    return;
                }

                _contextMenu.gameObject.SetActive(false);

                _addBlockData = _addBlockMenuButtons[sender];

                _treePanel.AddBlock(_addTarget, _addBlockData, _addInsertInside);

                _editPanel.CurrentTool = EditTools.Cursor;

                _addBlockStep = AddBlockSteps.SetBlockData;
            }
            break;
            }
        }
コード例 #2
0
        private IAlgorithmBlock CreateBlockData(BlockData data)
        {
            IAlgorithmBlock result = null;

            switch (data.type)
            {
            case BlockType.Begin:
            {
                BeginBlock block = new BeginBlock();
                block.Data = data;
                result     = block;
            }
            break;

            case BlockType.Action:
            {
                ActionBlock block = new ActionBlock();
                block.Data = data;
                block.Name = data.name;
                result     = block;
            }
            break;

            case BlockType.If:
            {
                IfBlock block = new IfBlock();
                block.Data = data;
                result     = block;
            }
            break;

            case BlockType.While:
            {
                WhileBlock block = new WhileBlock();
                block.Data = data;
                result     = block;
            }
            break;

            case BlockType.Set:
            {
                SetBlock block = new SetBlock();
                block.Data = data;
                result     = block;
            }
            break;
            }

            return(result);
        }
コード例 #3
0
        private void SetAddBlocksMenuItems()
        {
            _addBlockMenuButtons = new Dictionary <MenuButton, IAlgorithmBlock>();

            foreach (BlockData itData in _resourceProvider.BlockDatas)
            {
                if (itData.type != _addType)
                {
                    continue;
                }

                IAlgorithmBlock blockData = CreateBlockData(itData);

                MenuButton button = _contextMenu.AddButton(itData.name);
                _addBlockMenuButtons.Add(button, blockData);
            }
        }
コード例 #4
0
        private AlgorithmBlockUI CreateBlock(IAlgorithmBlock blockData)
        {
            AlgorithmBlockUI result = null;

            if (blockData.Type == BlockType.Set)
            {
                result = Instantiate(_resourceProvider.SetBlockPrefab, _content);
            }
            else
            {
                result = Instantiate(_resourceProvider.AlgorithmBlockPrefab, _content);
            }

            result.BlockData = blockData;

            return(result);
        }
コード例 #5
0
        public void AddBlock(AlgorithmBlockUI beforeBlock, IAlgorithmBlock newBlockData, bool isInside)
        {
            int index = _blocks.IndexOf(beforeBlock) + 1;

            AlgorithmBlockUI newBlock = CreateBlock(newBlockData);

            if (isInside)
            {
                if (beforeBlock.InnerBlock != null)
                {
                    newBlock.NextBlock = beforeBlock.InnerBlock;
                    beforeBlock.InnerBlock.MainPrevBlock = newBlock;
                }

                beforeBlock.InnerBlock = newBlock;
            }
            else
            {
                if (beforeBlock.NextBlock != null)
                {
                    newBlock.NextBlock = beforeBlock.NextBlock;
                    beforeBlock.NextBlock.MainPrevBlock = newBlock;
                }

                beforeBlock.NextBlock = newBlock;

                index = FindOutsidePosition(beforeBlock);
            }

            _blocks.Insert(index, newBlock);

            newBlock.MainPrevBlock     = beforeBlock;
            newBlock.IsInsidePrevBlock = isInside;
            newBlock.RefreshAnData();

            SetContentSiblings();

            RefreshTreeBlocksListeners();
            OnTreeChanged?.Invoke(_blocks);
        }
コード例 #6
0
        private void ExecuteBlock(IAlgorithmBlock block)
        {
            if (block == null)
            {
                Debug.Log("IsDone");
                IsDone = true;
                return;
            }

            if (block.Type == BlockType.Action)
            {
                if (_procedures.ContainsKey(block.Data.name))
                {
                    _procedures[block.Data.name].Invoke();
                }

                return;
            }
            else if (block.Type == BlockType.Set)
            {
                SetBlock setBlock = block as SetBlock;

                if (setBlock != null)
                {
                    if (setBlock.Variable.Type == AlgorithmizmModels.Math.ValueType.Bool)
                    {
                        BoolVariable boolVariable = setBlock.Variable as BoolVariable;
                        boolVariable.IsTrue = ((IBoolean)setBlock.Value).IsTrue;
                    }
                    else if (setBlock.Variable.Type == AlgorithmizmModels.Math.ValueType.Number)
                    {
                        FloatVariable boolVariable = setBlock.Variable as FloatVariable;
                        boolVariable.Value = ((INumber)setBlock.Value).Value;
                    }
                }
            }
        }
コード例 #7
0
 public void ExecuteNext()
 {
     _currentBlock = _currentBlock?.Next;
     ExecuteBlock(_currentBlock);
 }
コード例 #8
0
 public void StartAlgorithm()
 {
     IsDone        = false;
     _currentBlock = Algorithm?.BeginBlock;
     ExecuteNext();
 }