package flare.vis.operator.layout
{
import flare.util.Property;
import flare.util.Shapes;
import flare.vis.data.Data;
import flare.vis.data.DataList;
import flare.vis.data.DataSprite;
import flash.geom.Point;
import flash.geom.Rectangle;
/**
* Layout that places wedges for pie and donut charts. In addition to
* the layout, this operator updates each node to have a "wedge" shape.
*/
public class PieLayout extends Layout
{
private var _field:Property;
/** The source property determining wedge size. */
public function get source():String { return _field.name; }
public function set source(f:String):void { _field = Property.$(f); }
/** The data group to layout. */
public var group:String = Data.NODES;
/** The radius of the pie/donut chart. If this value is not a number
* (NaN) the radius will be determined from the layout bounds. */
public var radius:Number = NaN;
/** The width of wedges, negative for a full pie slice. */
public var width:Number = -1;
/** The initial angle for the pie layout (in radians). */
public var startAngle:Number = Math.PI/2;
/** The total angular size of the layout (in radians, default 2 pi). */
public var angleWidth:Number = 2*Math.PI;
/**
* Creates a new PieLayout
* @param field the source data field for determining wedge size
* @param width the radial width of wedges, negative for full slices
*/
public function PieLayout(field:String=null, width:Number=-1,
group:String=Data.NODES)
{
layoutType = POLAR;
this.group = group;
this.width = width;
_field = (field==null) ? null : new Property(field);
}
/** @inheritDoc */
protected override function layout():void
{
var b:Rectangle = layoutBounds;
var r:Number = isNaN(radius) ? Math.min(b.width, b.height)/2 : radius;
var a:Number = startAngle, aw:Number;
var list:DataList = visualization.data.group(group);
var sum:Number = list.stats(_field.name).sum;
var anchor:Point = layoutAnchor;
list.visit(function(d:DataSprite):void {
var aw:Number = -angleWidth * (_field.getValue(d)/sum);
var rh:Number = (width < 0 ? 0 : width) * r;
var o:Object = _t.$(d);
d.origin = anchor;
o.x = 0;
o.y = 0;
o.u = a; o.w = aw; o.h = r; o.v = rh; o.shape = Shapes.WEDGE;
a += aw;
});
}
} }