Пример #1
0
        public static bool HitTestCore(HitChain hitTestHint, HitTestHint layoutHint, IEnumerable <RenderElement> hitTestIter)
        {
            switch (layoutHint)
            {
            default:
            {
                foreach (RenderElement renderE in hitTestIter)
                {
                    if (renderE.HitTestCore(hitTestHint))
                    {
                        return(true);
                    }
                }
            }
                return(false);

            case HitTestHint.HorizontalRowNonOverlap:
            {
                foreach (RenderElement renderE in hitTestIter)
                {
                    if (renderE.HitTestCore(hitTestHint))
                    {
                        return(true);
                    }
                    else if (renderE.Right < hitTestHint.TestPointX)
                    {
                        //hitTestIter iterates from right to left
                        //so in this case (eg. we have whitespace between each elem)
                        //this should be stop

                        return(false);
                    }
                }
            }
                return(false);

            case HitTestHint.VerticalColumnNonOverlap:
            {
                foreach (RenderElement renderE in hitTestIter)
                {
                    if (renderE.HitTestCore(hitTestHint))
                    {
                        return(true);
                    }
                    else if (renderE.Bottom < hitTestHint.TestPointY)
                    {
                        //hitTestIter iterates from bottom to top
                        //so in this case (eg. we have whitespace between each elem)
                        //this should be stop
                        return(false);
                    }
                }
            }
                return(false);
            }
        }
Пример #2
0
        public static void DrawChildContent(HitTestHint hitTestHint, IEnumerable <RenderElement> drawingIter, DrawBoard d, UpdateArea updateArea)
        {
            int enter_canvas_x = d.OriginX;
            int enter_canvas_y = d.OriginY;

            switch (hitTestHint)
            {
            default:
            {
                foreach (RenderElement child in drawingIter)
                {
                    if (child.IntersectsWith(updateArea) ||
                        !child.NeedClipArea)
                    {
                        //if the child not need clip
                        //its children (if exist) may intersect
                        int x = child.X;
                        int y = child.Y;

                        d.SetCanvasOrigin(enter_canvas_x + x, enter_canvas_y + y);
                        updateArea.Offset(-x, -y);
                        RenderElement.Render(child, d, updateArea);
                        updateArea.Offset(x, y);
                    }
                }

                //restore
                d.SetCanvasOrigin(enter_canvas_x, enter_canvas_y);
            }
            break;

            case HitTestHint.HorizontalRowNonOverlap:
            {
                bool found = false;
                foreach (RenderElement child in drawingIter)
                {
                    if (child.IntersectsWith(updateArea))
                    {
                        found = true;
                        //if the child not need clip
                        //its children (if exist) may intersect
                        int x = child.X;
                        int y = child.Y;

                        d.SetCanvasOrigin(enter_canvas_x + x, enter_canvas_y + y);
                        updateArea.Offset(-x, -y);
                        RenderElement.Render(child, d, updateArea);
                        updateArea.Offset(x, y);
                    }
                    else if (found)
                    {
                        break;
                    }
                }

                //restore
                d.SetCanvasOrigin(enter_canvas_x, enter_canvas_y);
            }
            break;

            case HitTestHint.VerticalColumnNonOverlap:
            {
                bool found = false;
                foreach (RenderElement child in drawingIter)
                {
                    if (child.IntersectsWith(updateArea))
                    {
                        found = true;
                        //if the child not need clip
                        //its children (if exist) may intersect
                        int x = child.X;
                        int y = child.Y;

                        d.SetCanvasOrigin(enter_canvas_x + x, enter_canvas_y + y);
                        updateArea.Offset(-x, -y);
                        RenderElement.Render(child, d, updateArea);
                        updateArea.Offset(x, y);
                    }
                    else if (found)
                    {
                        break;
                    }
                }
                d.SetCanvasOrigin(enter_canvas_x, enter_canvas_y);
            }
            break;
            }
        }