FlowView

superclass: SCViewHolder

an SCCompositeView with a FlowLayout as decorator

FlowView.new(parent,bounds)

In the simplest respect this is a lazy contraction of this :

w = GUI.window.new;

w.view.decorator = FlowLayout.new( w.bounds );

w.front;

Crucial style gui objects and normal sc views can easily coexist here.

(

// makes a window automatically

f = FlowView.new;

//lazy crucial gui objects work

ActionButton(f,"a");

// normal sc views are flowed

GUI.slider.new(f,Rect(0,0,100,100));

// rather than this : f.decorator.nextLine

// do this :

f.startRow;

// it will insert a StartRow object into the views list as a placeholder

ActionButton(f,"next line");

)

indentedRemaining

the maximum space that is left, starting at the current cursor position

(

f = FlowView.new;

GUI.slider.new(f,Rect(0,0,100,100));

GUI.slider.new(f,Rect(0,0,100,100));

GUI.slider.new(f, f.indentedRemaining)

.background = Color.blue(alpha:0.2)

)

(

f = FlowView.new;

GUI.slider.new(f,Rect(0,0,100,100));

GUI.slider.new(f,Rect(0,0,100,100));

f.startRow; // new row

GUI.slider.new(f, f.indentedRemaining)

.background = Color.blue(alpha:0.2)

)

(

f = FlowView.new;

GUI.slider.new(f,Rect(0,0,100,100));

GUI.slider.new(f,Rect(0,0,100,100));

GUI.slider.new(f,Rect(0,0,100,100));

GUI.slider.new(f,Rect(0,0,100,100));

GUI.slider.new(f, f.indentedRemaining)

.background = Color.blue(alpha:0.2)

)

used

the area used so far, rounded up to the nearest rectangle plus margin

(

w = GUI.window.new;

w.front;

f = FlowView.new(w);

f.background = Color.blue(alpha:0.1);

GUI.slider.new(f,Rect(0,0,100,100));

GUI.slider.new(f,Rect(0,0,100,100));

f.used.postln;

// overlaid

GUI.compositeView.new(w,f.used)

.background = Color.red(alpha: 0.1);

)

(

w = GUI.window.new;

w.front;

f = FlowView.new(w);

f.background = Color.blue(alpha:0.1);

GUI.slider.new(f,Rect(0,0,100,100));

GUI.slider.new(f,Rect(0,0,100,100));

f.startRow; // new row

GUI.slider.new(f,Rect(0,0,100,100));

f.used.postln;

// overlaid

GUI.compositeView.new(w,f.used)

.background = Color.red(alpha: 0.1);

)

flow

insert a sub flow view into the current view

(

f = FlowView.new;

GUI.slider.new(f,Rect(0,0,100,100));

// flow within a flow

g = f.flow({ arg g;

ActionButton(g,"a");

GUI.slider.new(g,Rect(0,0,100,100)).background_(Color.rand);

}).background_(Color.black);

// shrinks to fit the contents afterwards

)

comp

insert a sub composite view into the current view

(

f = FlowView.new;

GUI.slider.new(f,Rect(0,0,100,100));

// sc composite view

g = f.comp({ arg g;

GUI.slider.new(g,Rect(50,30,50,100)).background_(Color.rand);

GUI.slider.new(g,Rect(120,30,50,100)).background_(Color.rand);

},Rect(0,0,200,200)).background_(Color.black);

f.startRow;

"Back to flowing".gui(f);

)

// tests

(

FlowView.new.flow({ arg f;

// b = ActionButton(f,"hi",minWidth:140)

}).background_(Color.grey)

)

(

FlowView.new.flow({ arg f;

b = ActionButton(f,"hi",minWidth:140);

}).background_(Color.grey)

)

(

FlowView.new.flow({ arg f;

b = GUI.slider.new(f,Rect(0,0,100,100));

}).background_(Color.grey)

)

(

FlowView.new.flow({ arg f;

g = f;

f.flow({ arg f;

//b = ActionButton(f,"hi",minWidth:140)

}).background_(Color.white)

}).background_(Color.grey)

)

(

FlowView.new.flow({ arg f;

g = f;

f.flow({ arg f;

b = ActionButton(f,"hi",minWidth:140)

}).background_(Color.white)

}).background_(Color.grey)

)

(

FlowView.new.flow({ arg f;

g = f;

f.flow({ arg f;

f.flow({ arg f;

ActionButton(f,"hello",minWidth:100);

}).background_(Color.blue);

b = ActionButton(f,"hi",minWidth:140);

}).background_(Color.white)

}).background_(Color.grey)

)

(

FlowView.new.flow({ arg f;

g = f;

f.flow({ arg f;

f.flow({ arg f;

ActionButton(f,"hello",minWidth:100);

}).background_(Color.blue);

b = ActionButton(f,"hi",minWidth:140);

}).background_(Color.white)

}).background_(Color.grey)

)

(

FlowView.new.flow({ arg f;

g = f;

f.flow({ arg f;

b = ActionButton(f,"hi",minWidth:140);

f.flow({ arg f;

ActionButton(f,"hello",minWidth:100);

}).background_(Color.blue);

}).background_(Color.white)

}).background_(Color.grey)

)

(

FlowView.new.flow({ arg f;

g = f;

f.flow({ arg f;

b = GUI.slider.new(f,Rect(0,0,140,20));

f.flow({ arg f;

ActionButton(f,"hello",minWidth:100);

}).background_(Color.blue);

}).background_(Color.white)

}).background_(Color.grey)

)

(

FlowView.new.flow({ arg f;

b = GUI.slider.new(f,Rect(0,0,140,20));

f.flow({ arg f;

ActionButton(f,"hello",minWidth:100);

}).background_(Color.blue);

}).background_(Color.grey)

)

(

a = FlowView.new.flow({ arg f;

g = f;

w = f.flow({ arg f;

b = f.flow({ arg f;

ActionButton(f,"hello",minWidth:100);

}).background_(Color.blue);

ActionButton(f,"hi",minWidth:140);

}).background_(Color.white)

}).background_(Color.grey)

)

b.remove(true);

w.resizeToFit(true,true);

// add something big back in

ActionButton(w,"i'm back",minWidth: 200);

w.resizeToFit(true,true);

// slightly wrong size at the bottom