An automatic layout system.

Constructor

new(?parent:Object)

Create a new Flow instance.

Parameters:

parent

An optional parent h2d.Object instance to which Flow adds itself if set.

Variables

backgroundTile:Tile

Setting a background tile will create an h2d.ScaleGrid background which uses the Flow.borderWidth/Flow.borderHeigh values for its borders.

It will automatically resize when the reflow is done to cover the whole Flow area.

@:value(0)borderBottom:Int = 0

Bottom border width of the Flow.backgroundTile.

Does not affect padding by default, which can be enabled with -D flow_border compilation flag. If border padding is enabled, Flow.outerHeight will be affected accordingly even if background tile is not set and will follow the same constraint limitation as padding.

See also:

write onlyborderHeight:Int

Set the border height of the Flow.backgroundTile's top and bottom borders.

Does not affect padding by default, which can be enabled with -D flow_border compilation flag. If border padding is enabled, Flow.outerHeight will be affected accordingly even if background tile is not set and will follow the same constraint limitation as padding.

See also:

@:value(0)borderLeft:Int = 0

Left border width of the Flow.backgroundTile.

Does not affect padding by default, which can be enabled with -D flow_border compilation flag. If border padding is enabled, Flow.outerHeight will be affected accordingly even if background tile is not set and will follow the same constraint limitation as padding.

See also:

@:value(0)borderRight:Int = 0

Right border width of the Flow.backgroundTile.

Does not affect padding by default, which can be enabled with -D flow_border compilation flag. If border padding is enabled, Flow.outerHeight will be affected accordingly even if background tile is not set and will follow the same constraint limitation as padding.

See also:

@:value(0)borderTop:Int = 0

Top border width of the Flow.backgroundTile.

Does not affect padding by default, which can be enabled with -D flow_border compilation flag. If border padding is enabled, Flow.outerHeight will be affected accordingly even if background tile is not set and will follow the same constraint limitation as padding.

See also:

write onlyborderWidth:Int

Set the border width of the Flow.backgroundTile's left and right borders.

Does not affect padding by default, which can be enabled with -D flow_border compilation flag. If border padding is enabled, Flow.outerWidth will be affected accordingly even if background tile is not set and will follow the same constraint limitation as padding.

See also:

colWidth:Null<Int>

Sets the minimum colum width when Flow.layout is Vertical.

debug:Bool

When set to true, the Flow will display a debug overlay. Red box around the flow Green box for the client space. Blue boxes for each element.

enableInteractive:Bool

Adds an h2d.Interactive to the Flow that is accessible through Flow.interactive field. This Interactive is automatically resized to cover the whole Flow area.

Flow is added as a bottom-most (after the Flow.backgroundTile) child as to not impede flow elements with Interactives.

@:value(false)fillHeight:Bool = false

When set to true, if a height constraint is present and minHeight is null - Flow will expand to fill all the available vertical space

@:value(false)fillWidth:Bool = false

When set to true, if a width constraint is present and minWidth is null - Flow will expand to fill all the available horizontal space

horizontalAlign:Null<FlowAlign>

Horizontal alignment of elements inside the flow. See FlowAlign for more details.

@:value(0)horizontalSpacing:Int = 0

The horizontal separation spacing between two flowed elements.

read onlyinnerHeight:Int

Calculate the client height, which is the inner size of the flow without the borders and padding.

See also:

read onlyinnerWidth:Int

Calculate the client width, which is the inner size of the flow without the borders and padding.

See also:

@:value(true)isInline:Bool = true

When isInline is set to false, the flow size will be reported based on its bounds instead of its calculated size.

See also:

@:value(Horizontal)layout:FlowLayout = Horizontal

The Flow item layout rules. See FlowLayout for specific details on each mode.

lineHeight:Null<Int>

Sets the minimum row height when Flow.layout is Horizontal.

maxHeight:Null<Int>

Attempts to limit the Flow outer height to the specified height. Used as a baseline for overflow when Flow.multiline is enabled and Flow.layout is Vertical.

maxWidth:Null<Int>

Attempts to limit the Flow outer width to the specified width. Used as a baseline for overflow when Flow.multiline is enabled and Flow.layout is Horizontal.

minHeight:Null<Int>

Ensures that Flow is at least the specified outer height at all times when not null.

minWidth:Null<Int>

Ensures that Flow is at least the specified outer width at all times when not null.

@:value(false)multiline:Bool = false

When set to true, uses specified lineHeight/colWidth instead of maxWidth/maxHeight for alignment.

@:value(true)needReflow:Bool = true

If some sub element gets resized, you need to set reflow to true in order to force the reflow of elements. You can also directly call Flow.reflow which will immediately update all elements positions.

If a reflow is needed, Flow.reflow will be called before rendering the flow. Each change in one of the flow properties or addition/removal of elements will set needReflow to true.

read onlyouterHeight:Int

Flow total height Compared to Flow.innerHeight, it also includes paddings and, if enabled, borders (see Flow.borderHeight).

See also:

read onlyouterWidth:Int

Flow total width. Compared to Flow.innerWidth, it also includes paddings and, if enabled, borders (see Flow.borderWidth).

See also:

@:value(Expand)overflow:FlowOverflow = Expand

Enabling overflow will treat maxWidth/maxHeight and lineHeight/colWidth constraints as absolute : bigger elements will overflow instead of expanding the limit. See respective FlowOverflow values for more details.

write onlypadding:Int

Will set all padding values at the same time.

Note that padding is applied inside the flow boundaries and included in the size constraint, shrinking available space for Flow children.

See also:

@:value(0)paddingBottom:Int = 0

Sets the extra padding along the bottom edge of the Flow.

Note that padding is applied inside the flow boundaries and included in the size constraint, shrinking available space for Flow children.

write onlypaddingHorizontal:Int

Will set Flow.paddingLeft and Flow.paddingRight to the given value.

Note that padding is applied inside the flow boundaries and included in the size constraint, shrinking available space for Flow children.

@:value(0)paddingLeft:Int = 0

Sets the extra padding along the left edge of the Flow.

Note that padding is applied inside the flow boundaries and included in the size constraint, shrinking available space for Flow children.

@:value(0)paddingRight:Int = 0

Sets the extra padding along the right edge of the Flow.

Note that padding is applied inside the flow boundaries and included in the size constraint, shrinking available space for Flow children.

@:value(0)paddingTop:Int = 0

Sets the extra padding along the top edge of the Flow.

Note that padding is applied inside the flow boundaries and included in the size constraint, shrinking available space for Flow children.

write onlypaddingVertical:Int

Will set Flow.paddingTop and Flow.paddingBottom to the given value.

Note that padding is applied inside the flow boundaries and included in the size constraint, shrinking available space for Flow children.

@:value(false)reverse:Bool = false

When set to true, children are aligned in reverse order.

Note that it does not affect render ordering, and may cause overlap of elements due to them positioned in reverse order.

read onlyscrollBar:Flow

The scroll bar component created when overflow is set to Scroll

read onlyscrollBarCursor:Flow

The scroll bar cursor component created when overflow is set to Scroll

@:value(0.)scrollPosY:Float = 0.

The current scrolling position for the flow content (in pixels). Only applies when overflow is Scroll or Hidden.

@:value(30.)read onlyscrollWheelSpeed:Float = 30.

The amount of scrolling that is done when using mouse wheel (in pixels).

verticalAlign:Null<FlowAlign>

Vertical alignment of elements inside the flow. See FlowAlign for more details.

@:value(0)verticalSpacing:Int = 0

The vertical separation spacing between two flowed elements.

Methods

addSpacing(v:Int):Void

Adds some spacing by either increasing the padding of the latest non-absolute element or the padding of the flow if there are no elements in it.

The padding affected depends on the Flow.layout mode. It's impossible to add spacing with a Stack Flow layout.

getProperties(e:Object):FlowProperties

Get the per-element properties. Returns null if the element is not currently part of the Flow.

Requesting the properties will cause a reflow regardless if properties values were changed or not.

dynamiconAfterReflow():Void

Sent after the Flow.reflow was finished.

dynamiconBeforeReflow():Void

Sent at the start of the Flow.reflow.

reflow():Void

Call to force all flowed elements position to be updated. See Flow.needReflow for more information.

Inherited Variables

Defined by Object

private@:dox(show)allocated:Bool

A flag that indicates whether the object was allocated or not.

When adding children to allocated objects, onAdd is being called immediately, otherwise it's delayed until the whole tree is added to a currently active Scene.

@:value(1.)alpha:Float = 1.

The amount of transparency of the Object.

@:value(Alpha)blendMode:BlendMode = Alpha

The blending mode of the object.

If there is no Object.filter active, only applies to the current object (not inherited by children). Otherwise tells how the filter is blended with background.

filter:Filter

The post process filter for this object.

When set, Object.alpha value affects both filter and object transparency (use Drawable.color.a to set transparency only for the object).

name:String

The name of the object. Can be used to retrieve an object within a tree by using Object.getObjectByName.

read onlynumChildren:Int

How many immediate children this object has.

read onlyparent:Object

The parent object in the scene tree.

private@:dox(show)parentContainer:Object

The parent container of this object. See Object.contentChanged for more details.

private@:dox(show)posChanged:Bool

A flag that indicates that the object transform was modified and absolute position recalculation is required.

Automatically cleared on Object.sync and can be manually synced with the Object.syncPos.

@:value(0)rotation:Float = 0

The rotation angle of this object, in radians.

@:value(1)scaleX:Float = 1

The amount of horizontal scaling of this object.

@:value(1)scaleY:Float = 1

The amount of vertical scaling of this object.

@:value(true)visible:Bool = true

Is the object and its children are displayed on screen.

@:value(0)x:Float = 0

The x position (in pixels) of the object relative to its parent.

@:value(0)y:Float = 0

The y position (in pixels) of the object relative to its parent.

Inherited Methods

Defined by Object

private@:dox(show)addBounds(relativeTo:Object, out:Bounds, dx:Float, dy:Float, width:Float, height:Float):Void

Adds specified area in local coordinate space to the bounds. Expected to be used within Object.getBoundsRec.

Parameters:

relativeTo

An object relative to which the Object bounds coordinates should be. If not set, coordinates are in absolute coordinate space.

out

An output Bounds instance.

dx

The top-left X offset of the added bounds rectangle.

dy

The top-left Y offset of the added bounds rectangle.

width

The width of the added bounds rectangle.

height

The height of the added bounds rectangle.

addChild(s:Object):Void

Add a child object at the end of the children list.

private@:dox(show)calcAbsPos():Void

Internal usage Calculates the absolute object position transform. See `Object.syncPos` for a safe position sync method. This method does not ensure that object parents also have up-to-date transform nor does it clear the `Object.posChanged` flag.

private@:dox(show)clipBounds(ctx:RenderContext, bounds:Bounds):Void

Internal usage Clip a local bounds with our global viewport. Used during filter rendering in order to clip out areas that are off-screen and should not be rendered.

private@:dox(show)constraintSize(maxWidth:Float, maxHeight:Float):Void

Advanced usage This can be called by a parent container to constraint the size of its children. Negative value mean that constraint is to be disabled.

For example, Text constraints it's maximum width, causing word-wrap to occur within constrained area.

See also:

contains(o:Object):Bool

Tells if the object is contained into this object children, recursively.

private@:dox(show)contentChanged(s:Object):Void

Advanced usage Called by the children of a container object if they have `parentContainer` defined in them. Primary use-case is when the child size got changed, requiring content to reevaluate positioning such as `Flow` layouts, but also can be used for other purposes.

private@:dox(show)draw(ctx:RenderContext):Void

Override this method in order to add custom graphics rendering to your Object. draw is invoked before rendering of the object children.

drawTo(t:Texture):Void

Draw the object and all its children into the given Texture.

drawToTextures(texs:Array<Texture>, outputs:Array<Output>):Void

Draw the object and all its children into the given Textures.

private@:dox(show)emitTile(ctx:RenderContext, tile:Tile):Void

Draws single Tile instance with this Object transform.

find<T>(f:Object ‑> Null<T>):Null<T>

Find a single object in the tree by calling f on each and returning the first not-null value returned, or null if not found.

findAll<T>(f:Object ‑> Null<T>, ?arr:Array<T>):Array<T>

Find several objects in the tree by calling f on each and returning all the not-null values returned.

Parameters:

arr

An optional array instance to fill results with. Allocates a new array if not set.

getAbsPos():Matrix

Returns the updated absolute position matrix. See Object.getMatrix for current matrix values.

getBounds(?relativeTo:Object, ?out:Bounds):Bounds

Return the bounds of the object for its whole content, recursively.

Parameters:

relativeTo

An optional object relative to coordinates of which bounds are returned. Returns bounds in the absolute coordinates if not set.

out

An optional bounds instance to fill. Allocates new Bounds instance and returns it if not set.

private@:dox(show)getBoundsRec(relativeTo:Object, out:Bounds, forSize:Bool):Void

Override this method in order to expand the reported bounds of an object. Object.addBounds can be used to add bounds with respect to relativeTo. Do not remove the super call.

Parameters:

relativeTo

An object relative to which the Object bounds coordinates should be.

out

An output Bounds instance.

forSize

Whether it's being called for Object.getSize or Object.getBounds.

inlinegetChildAt(n:Int):Object

Return the nth element among the immediate children list of this object, or null if there is no Object at this position.

getChildIndex(o:Object):Int

Return the index of the object o within the immediate children list of this object, or -1 if it is not part of the children list.

private@:dox(show)getMatrix(m:Matrix):Void

Populates Matrix with current absolute object transform values. See Object.getAbsPos for up-to-date values.

getObjectByName(name:String):Object

Search for an object recursively by name, return null if not found.

getObjectsCount():Int

Return the total number of children in the whole tree, recursively.

getScene():Scene

Returns an h2d.Scene down the hierarchy tree or null if object is not added to Scene.

getSize(?out:Bounds):Bounds

Similar to getBounds(parent), but instead of the full content, it will return the size based on the alignment of the object. For instance for a text, Object.getBounds will return the full glyphs size whereas getSize will ignore the pixels under the baseline.

Parameters:

out

An optional bounds instance to fill. Allocates new Bounds instance and returns it if not set.

globalToLocal(pt:Point):Point

Convert an absolute screen position into a local position relative to the object origin, applying all the inherited transforms.

Parameters:

pt

A position to convert and return. Modifies the Point instance as is.

inlineiterator():ArrayIterator_h2d_Object

Return an iterator over this object immediate children

localToGlobal(?pt:Point):Point

Convert a local position (or [0,0] if pt is null) relative to the object origin into an absolute screen position, applying all the inherited transforms.

Parameters:

pt

An optional position to convert and return. Allocates new Point at 0,0 position if not set. Modifies the Point instance as is.

move(dx:Float, dy:Float):Void

Move the object by the specified amount along its current direction (Object.rotation angle).

private@:dox(show)onAdd():Void

Sent when object is being added to an allocated scene.

Do not remove the super call when overriding.

private@:dox(show)inlineonContentChanged():Void

Should be called when Object content was changed in order to notify parent container. See Object.contentChanged.

private@:dox(show)onHierarchyMoved(parentChanged:Bool):Void

Sent when object was already allocated and moved within scene object tree hierarchy.

Do not remove the super call when overriding.

Parameters:

parentChanged

Whether Object was moved withing same parent (through Layers.ysort for example) or relocated to a new one.

private@:dox(show)onRemove():Void

Sent when object is removed from the allocated scene.

Do not remove the super call when overriding.

inlineremove():Void

Same as parent.removeChild(this), but does nothing if parent is null.

inlinerotate(v:Float):Void

Rotate the object by the given angle (in radians)

inlinescale(v:Float):Void

Scale uniformly the object by the given factor.

private@:dox(show)setParentContainer(c:Object):Void

Sets the parent container for this Object and it's children. See Object.contentChanged for more details.

inlinesetPosition(x:Float, y:Float):Void

Set the position of the object relative to its parent.

inlinesetScale(v:Float):Void

Set the uniform scale for the object.

private@:dox(show)sync(ctx:RenderContext):Void

Performs a sync of data for rendering (such as absolute position recalculation). While this method can be used as a substitute to an update loop, it's primary purpose it to prepare the Object to be rendered.

Do not remove the super call when overriding.

private@:dox(show)syncPos():Void

Ensures that object has an up-to-date position transform.