Flow
The h2d.Flow class allows to properly arrange child objects (h2d.Object).
A first glance at Flows
Demo 1
Screenshot 1

As you can see every child is placed without overlapping each other. The default layout is Horizontal (h2d.Flow.FlowLayout.Horizontal), thus the elements are placed next to each other and that horizontally.
Code 1
class FlowsDemo extends hxd.App { static function main() {new FlowsDemo();} override function init() { // the mere container var flow = new h2d.Flow( s2d ); flow.setPosition( 50, 50 ); // setting the flow design // by default will be: //flow.layout = h2d.Flow.FlowLayout.Horizontal; // these objects below get added to the flow var t = new h2d.Text( hxd.res.DefaultFont.get(), flow ); t.text = "Some text."; var tile = h2d.Tile.fromColor( 0x0000FF, 96, 32 ); var b = new h2d.Bitmap( tile, flow ); var t = new h2d.Text( hxd.res.DefaultFont.get(), flow ); t.text = "A bigger text."; t.scale(3); var ia = new h2d.Interactive( 50, 50, flow ); ia.backgroundColor = 0xFF808080; ia.onClick = (e)->{trace("Click!");}; // red line to draw the flow borders var t = new h2d.Text( hxd.res.DefaultFont.get(), s2d ); t.text = "Red-lined rectangle represents the h2d.Flow object."; var g = new h2d.Graphics( s2d ); g.lineStyle( 1, 0xFF0000 ); var bounds = flow.getBounds(); g.drawRect( bounds.x, bounds.y, bounds.width, bounds.height ); } }
Demo 2
The second sample code will give the h2d.Interactive the ability to change the properties of the Flow. Each time you press the button "click me!" the Flow content changes and a trace() prints the currently active Flow setting to the console.
Screenshot 2

Code 2
class FlowsDemo2 extends hxd.App { static function main() {new FlowsDemo2();} override function init() { // our Flow object var flow = new h2d.Flow( s2d ); flow.setPosition( 50, 50 ); // these objects below get added to the flow var t = new h2d.Text( hxd.res.DefaultFont.get(), flow ); t.text = "Some text."; var tile = h2d.Tile.fromColor( 0x0000FF, 96, 32 ); var b = new h2d.Bitmap( tile, flow ); var t = new h2d.Text( hxd.res.DefaultFont.get(), flow ); t.text = "A bigger text."; t.scale(3); // red line to draw the flow borders var t = new h2d.Text( hxd.res.DefaultFont.get(), s2d ); t.text = "Red-lined rectangle represents the h2d.Flow object."; var g = new h2d.Graphics( s2d ); var draw_flow_borders = ()->{ g.clear(); g.lineStyle( 1, 0xFF0000 ); var bounds = flow.getBounds(); g.drawRect( bounds.x, bounds.y, bounds.width, bounds.height ); }; // this interactive will also be part of the Flow // but also serves as button to change the Flow's properties var ia = new h2d.Interactive( 50, 50, flow ); ia.backgroundColor = 0xFF00cc66; ia.onClick = (e)->{ // random flow layout var a = h2d.Flow.FlowLayout.createAll(); flow.layout = a[ Math.round( hxd.Math.random( a.length-1 ) ) ]; // random flow align var a = h2d.Flow.FlowAlign.createAll(); flow.horizontalAlign = a[ Math.round( hxd.Math.random( a.length-1 ) ) ]; flow.verticalAlign = a[ Math.round( hxd.Math.random( a.length-1 ) ) ]; // random spacing var s = Math.floor( hxd.Math.random(48) ); flow.horizontalSpacing = s; var s = Math.floor( hxd.Math.random(48) ); flow.verticalSpacing = s; trace("Flow's propterties have been changed"); trace( "\nlayout = "+flow.layout, "\nhorizontalAlign = "+flow.horizontalAlign, "\nverticalAlign = "+ flow.verticalAlign, "\nhorizontalSpacing = "+flow.horizontalSpacing, "\nverticalSpacing = "+flow.verticalSpacing ); draw_flow_borders(); }; var t = new h2d.Text( hxd.res.DefaultFont.get(), ia ); t.text = "click me!"; draw_flow_borders(); } }
More samples
There are other samples you can look at and learn from:
- Another interactive example to understand the use of Flows
- The most detailed sample at this moment can be found in our repository (which you'll also find on your local machine:
HaxeToolkit\haxe\lib\heaps\git\samples\Flows.hx)
