Пример #1
0
        protected override void OnRender(DrawingContext drawingContext)
        {
            _segments.Children.Clear();

            var angle = FilteredData.Map(0, 100, 0, 360);

            var radius       = (_segments.RenderSize.Smallest() * CircleScale) / 2;
            var segmentWidth = radius * SegmentWidthPercentage;
            var inactivePath = new ArcPath(359.999, 0, segmentWidth, CircleScale, radius, _segments.RenderSize, null)
            {
                DataContext = this
            };
            var activePath = new ArcPath(angle, AngleOffset, segmentWidth, CircleScale, radius, _segments.RenderSize, FilteredData)
            {
                DataContext = this
            };

            inactivePath.Fill = SegmentSpaceBackground.GetMaterial(FallbackMaterialSet);
            activePath.Fill   = RingForeground.GetMaterial(FallbackMaterialSet);
            //inactivePath.SetBinding(Shape.FillProperty, new Binding("SegmentSpaceBackground"));
            //activePath.SetBinding(Shape.FillProperty, new Binding("RingForeground"));

            _segments.Children.Add(inactivePath);
            _segments.Children.Add(activePath);

            base.OnRender(drawingContext);
        }
Пример #2
0
    private void StMove()
    {
        // If right Click exit state
        if (Input.GetMouseButtonDown(1))
        {
            EndStMove();
            return;
        }

        // Draw  Path
        Vector3 pnt = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        pnt.z = transform.position.z; // Set Z
        Ray2D dir      = mCmds.FinalDir(new Ray2D(transform.position, transform.up));
        float timeLeft = mCmds.TimeLeft;

        mCursorGhost.SetActive(true);
        mCursorGhost.GetComponent <SpriteRenderer>().color = Color.red - new Color(0, 0, 0, .7f);
        Path curPath = null;

        // Min Move Distance or Back Half
        if (Trig.GetHalf(dir, pnt, 0, 0) == Trig.Half.back ||
            Vector3.Distance(dir.origin, pnt) < GameManager.MOVE_MIN_PNT_DIST)
        {
        }
        // Line if within Line tolerance, or within min straight distance of start
        else if (Trig.DistToLine(dir, pnt) < GameManager.MOVE_LINE_TOL ||
                 Vector2.Distance(dir.origin, Trig.NearestPointOnLine(dir, pnt)) < GameManager.MOVE_MIN_ARC_DIST)
        {
            curPath = new LinePath(dir, pnt);
        }
        // Else Arc
        else
        {
            curPath = new ArcPath(dir, pnt);
        }

        if (curPath != null)
        {
            // Render
            Stretch(curPath.RenderPoints(), pnt);

            // Place Ghost
            mCursorGhost.GetComponent <SpriteRenderer>().color = Color.green - new Color(0, 0, 0, .7f);
            float ghRot = Vector2.SignedAngle(Vector2.up, curPath.EndDir);
            mCursorGhost.transform.position = curPath.End;
            mCursorGhost.transform.rotation = Quaternion.AngleAxis(ghRot, Vector3.forward);
        }
        else
        {
            Retract();
            mCursorGhost.transform.position = pnt;
            mCursorGhost.transform.rotation = Quaternion.identity;
        }

        // If left Click and Path, Add Movement Segment
        if (curPath != null && Input.GetMouseButtonDown(0))
        {
            if (mCmds.Last())
            {
                mCmds.Last().Hide(false);
            }
            mCmds.Add(Draw.MakeMoveCmd(gameObject).Init(curPath, null));
            mCmds.Last().Hide(true);
            MoveGuides(mCmds.FinalDir(new Ray2D(transform.position, transform.up)));
            mStartMarker.SetActive(true);

            if (mCmds.TimeLeft < float.Epsilon)
            {
                Fin();
                EndStMove();
            }
        }
    }
Пример #3
0
        protected override void OnRender(DrawingContext drawingContext)
        {
            PART_focusedsegmentlabel.Foreground = SecondaryValueForeground.GetMaterial(FallbackMaterialSet);
            PART_segments.Children.Clear();

            var context = new ProviderContext(FilteredData.Count);

            MaterialProvider.Reset(context);

            var radius = (PART_segments.RenderSize.Smallest() * CircleScale) / 2;

            var total           = Data.SumValue();
            var angleTrace      = 0d;
            var actualRingWidth = radius * RingWidthPercentage;

            foreach (var d in FilteredData)
            {
                var materialSet = MaterialProvider.ProvideNext(context);
                var degrees     = (d.Value / total) * 360;

                var activePath = new ArcPath(degrees, angleTrace, actualRingWidth, CircleScale, radius, PART_segments.RenderSize, d)
                {
                    Fill          = SegmentForeground.GetMaterial(materialSet),
                    MouseOverFill = materialSet.GetMaterial(Luminosity.P700),
                    DataContext   = this
                };
                activePath.Click += segmentClicked;
                PART_segments.Children.Add(activePath);
                d.RenderedVisual = activePath;
                angleTrace      += degrees;
            }
            if (FocusedSegment == null)
            {
                return;
            }
            PART_categorylabels.Children.Clear();
            var diameter = PART_segments.RenderSize.Smallest() * CircleScale;

            var outerLabelRadius     = (diameter / 2) * OuterLabelPositionScale;
            var overlayedLabelRadius = (diameter / 2) - (actualRingWidth / 2);

            var targetAngularOffset = FocusedSegment.RequireType <ArcPath>().CalculateAngularOffset();

            MaterialProvider.Reset(context);
            foreach (var d in FilteredData)
            {
                var materialSet = MaterialProvider.ProvideNext(context);

                var categoryNameLabel = positionLabel(d, outerLabelRadius, targetAngularOffset, true);

                categoryNameLabel.Content = d.CategoryName;
                categoryNameLabel.BindTextualPrimitive <BarTotalPrimitive>(this);
                categoryNameLabel.Foreground = BarTotalForeground.GetMaterial(materialSet);
                PART_categorylabels.Children.Add(categoryNameLabel);

                var valueLabel = positionLabel(d, overlayedLabelRadius, targetAngularOffset);

                valueLabel.Content = d.Value;
                valueLabel.BindTextualPrimitive <ValuePrimitive>(this);
                valueLabel.Foreground = ValueForeground.GetMaterial(materialSet);
                PART_categorylabels.Children.Add(valueLabel);
            }
            base.OnRender(drawingContext);
        }