protected virtual void UpdateEventChildren( float offsetX, float offsetY, DebugUiManager.Input input, bool parentEnabled) { }
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; } }
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; } } } }