Revision: 4759
          http://sourceforge.net/p/vexi/code/4759
Author:   mkpg2
Date:     2015-01-25 22:38:44 +0000 (Sun, 25 Jan 2015)
Log Message:
-----------
Flow layout.

Modified Paths:
--------------
    branches/vexi3/org.vexi-vexi.widgets/src_main/vexi/layout/flow.t

Added Paths:
-----------
    branches/vexi3/org.vexi-vexi.widgets/src_poke/poke/layout/PokeFlow.t

Modified: branches/vexi3/org.vexi-vexi.widgets/src_main/vexi/layout/flow.t
===================================================================
--- branches/vexi3/org.vexi-vexi.widgets/src_main/vexi/layout/flow.t    
2015-01-13 07:08:18 UTC (rev 4758)
+++ branches/vexi3/org.vexi-vexi.widgets/src_main/vexi/layout/flow.t    
2015-01-25 22:38:44 UTC (rev 4759)
@@ -1,27 +1,103 @@
 <!-- Copyright 2009 - see COPYING for details [LGPL] -->
 
-<vexi xmlns:ui="vexi://ui" xmlns:meta="vexi://meta" xmlns:lay="vexi.layout">
+<vexi xmlns:ui="vexi://ui" 
+      xmlns:role="org.vexi.lib.role"
+      xmlns:meta="vexi://meta"  
+      xmlns:lay="vexi.layout">
     <meta:doc>
         <author>Charles Goodwin</author>
+        <author>Mike Goodwin</author>
         <name>Flow Layout</name>
-        <desc>A very hacky implementation of flow layout</desc>
+        <desc>
+        Lays out children filling first row/column (horizontal/vertical) 
before flowing onto the next row. 
+        Essentially in the manner that wrapped text is layed out.
+        </desc>
     </meta:doc>
     
-    <ui:box redirect=":$content" align="topleft">
-        <lay:grid id="content" shrink="true" />
+    <ui:box layout="place" align="topleft">
+        var _x;
+        var _y;
+        var _width;
+        var _height;
         
-        /** match content cols to width so grid handles line breaking */
-        thisbox.width ++= function(v) { $content.cols = v;  return; }
+    
+    
+        var dirty;
+        const max = vexi.math.max;
+        const doReflow = function(){
+            if(!visible){
+                dirty = true;
+                return;
+            }else{
+                dirty = false;
+            }
+             
+            var rankSize = 0;
+            var offsetRank = 0;
+            var offset = 0;
+            for(var i, b in thisbox){
+                var offset0 = offset;
+                var offsetRank1 = offsetRank; 
+                var offset1 = offset+b[_width];
+                if(offset1>thisbox[_width] and i!=0){
+                    offsetRank1 += rankSize;
+                    offset0 = 0;
+                    offset1 = b[_width];
+                    rankSize = 0;
+                }
+                
+                rankSize = max(rankSize, b[_height]); 
+                
+                b[_x] = offset0;
+                b[_y] = offsetRank1;
+                
+                offset = offset1;     
+                offsetRank = offsetRank1;                          
+            }
+            thisbox[_height] = offsetRank + rankSize;
+        };
         
-        /** So content doesn't shrink */
-        $content.height ++= function(v) { minheight = v; return; }
         
-        /** initialize colspan and assign width->colspan update trap */
-        $content.ChildAdded ++= function(v) { v.colspan = v.width; v.width ++= 
static.childWrite; return; }
+        const reflowTrap = function(v) { 
+            cascade = v; 
+            doReflow(); 
+        };
         
+        thisbox.orient ++= function(v){
+            cascade = v;
+            if("horizontal"==v){
+                _x = "x";
+                _y = "y";
+                _width = "width";
+                _height = "height";
+                
+                
+            }else{
+                _x = "y";
+                _y = "x";            
+                _height = "width";
+                _width = "height";
+            }
+            
+            thisbox[_width] ++= reflowTrap;
+            thisbox[_height] --= reflowTrap;
+                
+        };
+        orient = "horizontal";
+        
+        
+        thisbox.visible ++= function(v) { 
+            cascade = v; 
+            if(v and dirty){
+                doReflow();             
+            }            
+        };
+                
+        thisbox.Children ++= function(v){
+            cascade = v;
+            doReflow();
+        };        
+        
     </ui:box>
     
-    /** match content width to colspans so they flow in the grid */
-    static.childWrite = function(v) { trapee.colspan = v; }
-    
 </vexi>

Added: branches/vexi3/org.vexi-vexi.widgets/src_poke/poke/layout/PokeFlow.t
===================================================================
--- branches/vexi3/org.vexi-vexi.widgets/src_poke/poke/layout/PokeFlow.t        
                        (rev 0)
+++ branches/vexi3/org.vexi-vexi.widgets/src_poke/poke/layout/PokeFlow.t        
2015-01-25 22:38:44 UTC (rev 4759)
@@ -0,0 +1,32 @@
+<!-- public domain -->
+
+<vexi xmlns:ui="vexi://ui" 
+      xmlns:wi="vexi.widget"
+      xmlns:lay="vexi.layout"
+      xmlns:lang="vexi://lang">
+    <ui:box fill="white">
+        <lang:subtemplate property="Item">
+            <wi:border width="200" height="30" border="black" depth="1"/>      
      
+        </lang:subtemplate>
+        
+        <ui:Box align="topleft"> 
+            <lay:flow id="flow1" fill="red"/>
+        </ui:Box>
+        <ui:Box align="topleft"> 
+            <lay:flow id="flow2" fill="blue" orient="vertical"/>
+        </ui:Box>
+        
+        const addItem = function(flow, i){
+            const item = new Item();
+            item.text = "Item "+i;
+            flow.add(item);
+        }
+        
+        for(var i=0; 12>i; i++){
+            addItem($flow1, i);
+            addItem($flow2, i);            
+        }
+        
+        vexi.ui.frame = thisbox;        
+    </ui:box>
+</vexi>

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
New Year. New Location. New Benefits. New Data Center in Ashburn, VA.
GigeNET is offering a free month of service with a new server in Ashburn.
Choose from 2 high performing configs, both with 100TB of bandwidth.
Higher redundancy.Lower latency.Increased capacity.Completely compliant.
http://p.sf.net/sfu/gigenet
_______________________________________________
Vexi-svn mailing list
Vexi-svn@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/vexi-svn

Reply via email to