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); }
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(); } } }
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); }