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; // 逆順で更新。後のものほど手前に描画されるので、手前のものを優先してイベントを処理する。 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; } } } }