void HitTestCoreWithChain(HitChain hitPointChain, int x, int y) { hitPointChain.ClearAll(); hitPointChain.SetStartTestPoint(x, y); RenderElement commonElement = this.topRenderElement; commonElement.HitTestCore(hitPointChain); }
void SwapHitChain(HitChain hitChain) { if (_previousChain != null) { _hitChainStack.Push(_previousChain); } _previousChain = hitChain; //temp fix here _previousChain.ClearAll(); }
void IEventPortal.PortalMouseMove(UIMouseEventArgs e) { HitChain hitPointChain = GetFreeHitChain(); #if DEBUG _dbugHitChainPhase = dbugHitChainPhase.MouseMove; #endif HitTestCoreWithPrevChainHint(hitPointChain, _previousChain, e.X, e.Y); _previousChain.ClearAll(); SetEventOrigin(e, hitPointChain); //------------------------------------------------------- ForEachOnlyEventPortalBubbleUp(e, hitPointChain, (portal) => { portal.PortalMouseMove(e); return(true); }); //------------------------------------------------------- if (!e.CancelBubbling) { bool foundSomeHit = false; ForEachEventListenerBubbleUp(e, hitPointChain, (listener) => { foundSomeHit = true; bool isFirstMouseEnter = false; if (e.CurrentMouseActive != null && e.CurrentMouseActive != listener) { e.CurrentMouseActive.ListenMouseLeave(e); isFirstMouseEnter = true; } if (!e.IsCanceled) { e.CurrentMouseActive = listener; e.IsFirstMouseEnter = isFirstMouseEnter; e.CurrentMouseActive.ListenMouseMove(e); e.IsFirstMouseEnter = false; } return(true);//stop }); if (!foundSomeHit && e.CurrentMouseActive != null) { e.CurrentMouseActive.ListenMouseLeave(e); if (!e.IsCanceled) { e.CurrentMouseActive = null; } } } SwapHitChain(hitPointChain); e.StopPropagation(); }
// static RenderElement HitTestOnPreviousChain(HitChain hitPointChain, HitChain previousChain, int x, int y) // { //#if DEBUG // if (hitPointChain == previousChain) // { // throw new NotSupportedException(); // } //#endif // if (previousChain.Count > 0) // { // previousChain.SetStartTestPoint(x, y); // //test on prev chain top to bottom // int j = previousChain.Count; // for (int i = 0; i < j; ++i) // { // HitInfo hitInfo = previousChain.GetHitInfo(i); // RenderElement elem = hitInfo.HitElemAsRenderElement; // if (elem != null && elem.VisibleAndHasParent) // { // if (elem.Contains(hitInfo.point)) // { // RenderElement found = elem.FindUnderlyingSiblingAtPoint(hitInfo.point); // if (found == null) // { // Point leftTop = elem.Location; // hitPointChain.OffsetTestPoint(leftTop.X, leftTop.Y); // hitPointChain.AddHitObject(elem); // //add to chain // } // else // { // break; // } // } // } // else // { // break; // } // } // } // //--------------------------------- // if (hitPointChain.Count > 0) // { // var commonElement = hitPointChain.GetHitInfo(hitPointChain.Count - 1).HitElemAsRenderElement; // hitPointChain.RemoveCurrentHit(); // return commonElement; // } // else // { // return null; // } // } void HitTestCoreWithPrevChainHint(HitChain hitPointChain, HitChain previousChain, int x, int y) { //--------------------------------- //test on previous chain first , find common element hitPointChain.ClearAll(); hitPointChain.SetStartTestPoint(x, y); #if DEBUG hitPointChain.dbugHitPhase = _dbugHitChainPhase; #endif //if (this.dbugId > 0 && isDragging && previousChain.Count > 1) //{ //} //RenderElement commonElement = HitTestOnPreviousChain(hitPointChain, previousChain, x, y); //temp fix //TODO: fix bug on HitTestOnPreviousChain() RenderElement commonElement = _topRenderElement; ////use root //if (isDragging) //{ // if (commonElement != this.topRenderElement) // { // } //} //if (lastCommonElement != null && commonElement != null && // lastCommonElement != commonElement && isDragging) //{ // Console.WriteLine(commonElement.dbug_GetBoundInfo()); //} //if (commonElement == null) //{ // commonElement = this.topRenderElement; //} //if (commonElement != this.topRenderElement) //{ //} //lastCommonElement = commonElement; commonElement.HitTestCore(hitPointChain); //this.topRenderElement.HitTestCore(hitPointChain); }
void ReleaseHitChain(HitChain hitChain) { hitChain.ClearAll(); _hitChainStack.Push(hitChain); }