Beispiel #1
0
 protected virtual void UpdateEventChildren(
     float offsetX,
     float offsetY,
     DebugUiManager.Input input,
     bool parentEnabled)
 {
 }
Beispiel #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;
            }
        }
Beispiel #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;
            // 逆順で更新。後のものほど手前に描画されるので、手前のものを優先してイベントを処理する。
            var child = _lastChild;

            while (child != null)
            {
                child.UpdateEventRecursive(
                    leftX,
                    topY,
                    input,
                    parentEnabled && enabled);
                child = child._previousBrother;
            }
            // 無効なら以降処理しない。ここまでは初期化が絡むので毎回やらねばならない。
            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;
                    }
                }
            }
        }