예제 #1
0
        private Rect CalculateDragElementRect(DragElement element, double newHorizOffset, double newVertOffset)
        {
            if (ElementBeingDragged == null)
            {
                throw new InvalidOperationException("ElementBeingDragged is null.");
            }

            Size elemSize = element.Element.RenderSize;

            double x, y;

            if (element.ModifyLeftOffset)
            {
                x = newHorizOffset;
            }
            else
            {
                x = ActualWidth - newHorizOffset - elemSize.Width;
            }

            if (element.ModifyTopOffset)
            {
                y = newVertOffset;
            }
            else
            {
                y = ActualHeight - newVertOffset - elemSize.Height;
            }

            Point elemLoc = new Point(x, y);

            return(new Rect(elemLoc, elemSize));
        }
예제 #2
0
        protected void AddDragListener(DragElement dragElement, Action <DragData> handler)
        {
            dragElement.DragChangedSignal.RemoveAllListeners();
            dragElement.DragChangedSignal.AddListener(handler);

            DragHandlers[dragElement.gameObject] = handler;
        }
예제 #3
0
        protected void AttachDragListener(DragElement dragElement, Action <DragStateType> func)
        {
            UnityAction <DragStateType> internalAction = (val) => { func(val); };

            dragElement.OnDragChanged.RemoveAllListeners();
            dragElement.OnDragChanged.AddListener(internalAction);
        }
예제 #4
0
 public void OnDrop(PointerEventData eventData)
 {
     if (eventData.pointerDrag != null)
     {
         hasElement = true;
         DragElement draggedElement = eventData.pointerDrag.GetComponent <DragElement>();
         draggedElement.SetCellReference(this);
         eventData.pointerDrag.GetComponent <RectTransform>().anchoredPosition = GetComponent <RectTransform>().anchoredPosition;
     }
 }
예제 #5
0
    private void LoadItems()
    {
        for (int i = 0; i < itemData.items.Count; i++)
        {
            Item item = itemData.items[i];

            DragElement dragElement = Instantiate(itemPrefab.gameObject, toolboxContent).GetComponent <DragElement>();
            dragElement.typeOfOperator = (i + 1);
            dragElement.GetComponent <Image>().sprite = item.sprite;
        }
    }
예제 #6
0
 private void OnMouseMove(object sender, MouseEventArgs e)
 {
     if (this._dragStart && e.LeftButton == MouseButtonState.Pressed)
     {
         var item       = this._selectedItem.Clone();
         var dragObject = new DragElement(item);
         DragDrop.DoDragDrop(this._selectRect, dragObject, DragDropEffects.Copy);
         e.Handled = true;
     }
     else
     {
         this._dragStart = false;
     }
 }
예제 #7
0
    private void ResetAnwser()
    {
        int childCount = answerPanel.childCount;

        for (int i = 0; i < childCount; i++)
        {
            DropObject slot = answerPanel.GetChild(i).GetComponent <DropObject>();
            slot.isEmpty = true;
            DragElement dragElement = slot.GetComponentInChildren <DragElement>();
            if (dragElement != null)
            {
                Destroy(dragElement.gameObject);
            }
        }
    }
예제 #8
0
            public DragData(object sender, DragEventArgs e)
            {
                from  = e.Data.GetData(typeof(DragElement)) as DragElement;
                _mode = GetDragMode(e);
                var senderElement = ((FrameworkElement)sender).DataContext as IDragElement;
                var conteiner     = ((FrameworkElement)e.OriginalSource).DataContext as IDragElement;

                if (conteiner is IContainer && ((IContainer)conteiner).AcceptType(senderElement.GetType()))
                {
                    to = new DragElement(senderElement, conteiner);
                }
                else
                {
                    to = new DragElement(conteiner, senderElement);
                }
            }
예제 #9
0
    private int[] GetCurrentAnwser()
    {
        int childCount = answerPanel.childCount;

        int[] currentAnswer = new int[childCount];
        for (int i = 0; i < childCount; i++)
        {
            currentAnswer[i] = -1;
            Transform   slot        = answerPanel.GetChild(i);
            DragElement itemElement = slot.GetComponentInChildren <DragElement>();
            if (itemElement != null)
            {
                currentAnswer[i] = itemElement.typeOfOperator;
            }
        }

        return(currentAnswer);
    }
예제 #10
0
    private void DisplayAnswer(int[] answer, bool isStartup)
    {
        int childCount  = answerPanel.childCount;
        int answerCount = answer.Length;

        int count = Math.Min(childCount, answerCount);

        for (int i = 0; i < count; i++)
        {
            int typeOfOperator = (answer[i] - 1);
            if (typeOfOperator < 0 || typeOfOperator >= itemData.items.Count)
            {
                continue;
            }

            DropObject dropObject = answerPanel.GetChild(i).GetComponent <DropObject>();

            DragElement dragElement = Instantiate(itemPrefab, dropObject.TransformCache).GetComponent <DragElement>();

            Item item = itemData.items[typeOfOperator];
            dragElement.typeOfOperator = typeOfOperator;
            dragElement.GetComponent <Image>().sprite = item.sprite;

            dropObject.isEmpty = false;

            if (isStartup)
            {
                dragElement.TransformCache.localPosition = new Vector2(50, -50);
            }
            else
            {
                dragElement.TransformCache.localPosition = Vector2.zero;
            }

            dragElement.cloneOnDragging = false;
            dragElement.isClonning      = false;
            dragElement.lastDropObject  = dropObject;
            //dragElement.GetComponent<Graphic>().raycastTarget = false;
        }
    }
예제 #11
0
        private DragElement CreateDragElement(FrameworkElement element)
        {
            bool modifyLeftOffset, modifyTopOffset;

            double left   = GetLeft(element);
            double right  = GetRight(element);
            double top    = GetTop(element);
            double bottom = GetBottom(element);

            var origHorizOffset = ResolveOffset(left, right, out modifyLeftOffset);
            var origVertOffset  = ResolveOffset(top, bottom, out modifyTopOffset);

            var dragElement = new DragElement
            {
                Element          = element,
                DataContext      = element.DataContext as IHudWindowElement,
                OrigHorizOffset  = origHorizOffset,
                OrigVertOffset   = origVertOffset,
                ModifyLeftOffset = modifyLeftOffset,
                ModifyTopOffset  = modifyTopOffset
            };

            return(dragElement);
        }
예제 #12
0
        private void SetElementPosition(DragElement element, double shiftX, double shiftY)
        {
            double newHorizontalOffset, newVerticalOffset;

            #region Calculate Offsets

            if (element.ModifyLeftOffset)
            {
                newHorizontalOffset = element.OrigHorizOffset + shiftX;
            }
            else
            {
                newHorizontalOffset = element.OrigHorizOffset - shiftX;
            }

            if (element.ModifyTopOffset)
            {
                newVerticalOffset = element.OrigVertOffset + shiftY;
            }
            else
            {
                newVerticalOffset = element.OrigVertOffset - shiftY;
            }

            if (!AllowDragOutOfView)
            {
                #region Verify Drag Element Location

                Rect elemRect = CalculateDragElementRect(element, newHorizontalOffset, newVerticalOffset);

                bool leftAlign  = elemRect.Left < 0;
                bool rightAlign = elemRect.Right > ActualWidth;

                if (leftAlign)
                {
                    newHorizontalOffset = element.ModifyLeftOffset ? 0 : ActualWidth - elemRect.Width;
                }
                else if (rightAlign)
                {
                    newHorizontalOffset = element.ModifyLeftOffset ? ActualWidth - elemRect.Width : 0;
                }

                bool topAlign = elemRect.Top < 0;

                bool bottomAlign = elemRect.Bottom > ActualHeight;

                if (topAlign)
                {
                    newVerticalOffset = element.ModifyTopOffset ? 0 : ActualHeight - elemRect.Height;
                }
                else if (bottomAlign)
                {
                    newVerticalOffset = element.ModifyTopOffset ? ActualHeight - elemRect.Height : 0;
                }

                #endregion
            }

            #endregion

            if (element.ModifyLeftOffset)
            {
                SetLeft(element.Element, newHorizontalOffset);

                if (element.DataContext != null)
                {
                    element.DataContext.OffsetX = newHorizontalOffset / XFraction;
                }
            }
            else
            {
                SetRight(element.Element, newHorizontalOffset);
            }

            if (element.ModifyTopOffset)
            {
                SetTop(element.Element, newVerticalOffset);

                if (element.DataContext != null)
                {
                    element.DataContext.OffsetY = newVerticalOffset / YFraction;
                }
            }
            else
            {
                SetBottom(element.Element, newVerticalOffset);
            }
        }
 void OnEnable()
 {
     //获取当前编辑自定义Inspector的对象
     element = (DragElement)target;
 }