public void AddNestObjectComponentIfNeeded()
 {
     if (!InstructionHelper.IsGroupInstruction(instruction))
     {
         return;
     }
     nestObject = GameObject.Instantiate(NestPrefab);
     nestObject.GetComponent <Image>().color = instruction.GetComponent <Image>().color;
     nestObject.transform.SetParent(container.transform);
     nestObject.transform.SetAsFirstSibling();
 }
        public void RearrangePositions(GameObject parentContainer)
        {
            GameObject parentInstruction = null;

            for (int i = 0; i < parentContainer.transform.childCount; i++)
            {
                var child = parentContainer.transform.GetChild(i);
                if (child.tag == "Instruction" || parentContainer.name == "SolutionPanel")
                {
                    parentInstruction = child.gameObject;
                    break;
                }
            }

            if (parentInstruction == null)
            {
                throw new Exception($"Tried to RearrangePositions in null transform. ParentContainer: {parentContainer.name}");
            }

            var currentTopLeft = GetTopLeftForFirst(parentContainer);

            Debug.Log($"Rearranging in {parentInstruction.name}, it has {parentInstruction.transform.childCount} children", parentInstruction);

            for (int i = 0; i < parentInstruction.transform.childCount; i++)
            {
                var currentChildContainer = parentInstruction.transform.GetChild(i).gameObject;
                var rectTransform         = currentChildContainer.GetComponent <RectTransform>();
                var size = rectTransform.sizeDelta;

                var offset = new Vector2(size.x / 2, -size.y / 2);

                var codeLine = GetCorrespondingCodeLine(currentChildContainer);

                if (codeLine == null)
                {
                    continue;                   //FillerInstruction has no codeline
                }
                rectTransform.anchoredPosition = currentTopLeft + offset;

                foreach (var child in codeLine.children)
                {
                    RearrangePositions(currentChildContainer);
                }

                currentTopLeft -= new Vector2(0, codeLine.BlockHeight);
                if (InstructionHelper.IsGroupInstruction(codeLine.instruction))
                {
                    currentTopLeft -= new Vector2(0, 10);
                }
            }
        }
        public void RearrangePositions(List <CodeLine> lines, Vector2 topLeft)
        {
            if (lines.Count == 0)
            {
                return;
            }
            var parentContainer = lines[0].container.transform.parent.parent;
            var currentTopLeft  = topLeft;// GetTopLeftForFirst(parentContainer.gameObject);

            for (int i = 0; i < lines.Count; i++)
            {
                var currentChildContainer = lines[i].container;
                var rectTransform         = currentChildContainer.GetComponent <RectTransform>();
                var size = rectTransform.sizeDelta;

                var offset = new Vector2(size.x / 2, -size.y / 2);

                var currentLine = lines[i];
                if (InstructionHelper.IsGroupInstruction(currentLine.instruction))
                {
                }

                //var oldPosition = rectTransform.anchoredPosition;

                rectTransform.anchoredPosition = currentTopLeft + offset;

                //var newPosition = rectTransform.anchoredPosition;
                //var instructionRT = lines[i].instruction.GetComponent<RectTransform>();
                //instructionRT.anchoredPosition -= newPosition - oldPosition;

                RearrangePositions(lines[i].children, FirstChildOffset);

                currentTopLeft -= new Vector2(0, currentLine.YSpacing);
                if (InstructionHelper.IsGroupInstruction(currentLine.instruction))
                {
                }
            }
        }
        public CodeLine GetParentBlockUnderMousePosition(List <GameObject> allContainers)
        {
            ClearTemporaryInstructionFlag(allContainers);
            var mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

            for (int i = allContainers.Count - 1; i >= 0; i--)
            {
                Debug.Log(i);
                GameObject container = allContainers[i];
                if (IsContainerUnpinned(container))
                {
                    continue;
                }
                var correspondingCodeLine = GetCorrespondingCodeLine(container);
                if (correspondingCodeLine == null)
                {
                    Debug.Log("correspondingCodeLine was null");
                    continue;
                }
                if (!InstructionHelper.IsGroupInstruction(correspondingCodeLine.instruction))
                {
                    continue;
                }

                if (correspondingCodeLine.IsInsideNest(mousePosition))
                {
                    if (draggedObject != null)
                    {
                        correspondingCodeLine.TemporaryCodeLine = unpinnedCodeline ?? fakeSingleLine;
                    }
                    Debug.Log($"currentContainerIndex: {correspondingCodeLine.InstructionIndex}, {i}");
                    return(correspondingCodeLine);
                }
            }

            return(null);
        }