예제 #1
0
 protected virtual void UpdateEventChildren(
     float offsetX,
     float offsetY,
     DebugUiManager.Input input,
     bool parentEnabled)
 {
 }
예제 #2
0
        protected override void UpdateEventChildren(
            float offsetX,
            float offsetY,
            DebugUiManager.Input input,
            bool parentEnabled)
        {
            var child = lastChild;

            while (child != null)
            {
                child.UpdateEventRecursive(
                    LeftX,
                    TopY,
                    input,
                    parentEnabled && Enabled);
                child = child.PreviousBrother;
            }
        }
예제 #3
0
        public void UpdateEventRecursive(
            float offsetX,
            float offsetY,
            DebugUiManager.Input input,
            bool parentEnabled)
        {
            // イベント状態リセット
            HasJustClicked     = false;
            HasJustDragStarted = false;
            IsPointerDown      = false;
            IsPointerOver      = false;
            bool prevDragging = IsDragging;

            IsDragging = false;
            // グローバル座標を計算して子優先。enabled=falseでもリセットのために回す必要あり
            LeftX = offsetX + LocalLeftX;
            TopY  = offsetY + LocalTopY;
            // 逆順で更新。後のものほど手前に描画されるので、手前のものを優先してイベントを処理する。
            UpdateEventChildren(LeftX, TopY, input, parentEnabled && Enabled);
            // 無効なら以降処理しない。ここまでは初期化が絡むので毎回やらねばならない。
            if ((parentEnabled && Enabled) == false)
            {
                return;
            }

            // 自分の当たり判定。isPointerOver自体はイベント無効でも更新。
            LocalPointerX = input.pointerX - offsetX;
            LocalPointerY = input.pointerY - offsetY;
            float clientX = LocalPointerX - LocalLeftX;
            float clientY = LocalPointerY - LocalTopY;

            if ((clientX >= 0f) &&
                (clientX < Width) &&
                (clientY >= 0f) &&
                (clientY < Height))
            {
                IsPointerOver = true;
            }

            // 有効で、イベントも取り、下流で当たっていなければ、イベント処理
            if (EventEnabled)
            {
                // ポインタがどこにあろうが、前のフレームがドラッグ中でPointerDownならドラッグを維持
                if (Draggable && prevDragging && input.isPointerDown)
                {
                    IsDragging = true;
                }

                // まだ他のコントロールにイベントを処理されていなくて、ポインタが上にあれば、
                if ((input.eventConsumer == null) && IsPointerOver)
                {
                    if (input.hasJustClicked)
                    {
                        input.eventConsumer = this;
                        HasJustClicked      = true;
                    }

                    if (Draggable)
                    {
                        // ドラッグ開始
                        if (input.hasJustDragStarted)
                        {
                            IsDragging           = true;
                            HasJustDragStarted   = true;
                            input.eventConsumer  = this;
                            input.draggedControl = this;
                            if (OnDragStart != null)
                            {
                                OnDragStart();
                            }
                        }
                    }

                    if (input.isPointerDown)
                    {
                        input.eventConsumer = this;
                        IsPointerDown       = true;
                    }
                }

                if (input.hasJustClicked)
                {
                    if ((input.eventConsumer == this) && IsPointerOver)
                    {
                        HasFocus = true;
                    }
                    else
                    {
                        HasFocus = false;
                    }
                }
            }
        }