JSCScrollView container view with scrollers
A container view which allows the user to scroll across content which exceeds the view's visible bounds.
N.B. JSCScrollView inherits most of it's important methods from it's superclass, JSCScrollTopView. Please see its helpfile for more information.
Setting the Internal Bounds
The size of the contained 'canvas' is determined by the bounds of the views which it encloses. Resize settings are thus ignored for contained views. To set it to a particular size, you can add a JSCCompositeView or other container view, but there is no direct setter. One should not use a decorator such as FlowLayout directly on a NSScrollView, only on a container view within it.
Action Functions with Scrolling JSCViews
A JSCScrollTopView or JSCScrollView's action function is evaluated when a user scrolls the view or sets the visibleOrigin. See the example below.
Creation
*new(parent, bounds)
Returns a new JSCScrollView. (Inheritted from JSCView).
parent - A JSCWindow, or a container view such as JSCCompositeView.
bounds - A Rect, which specifies the position of this view in its parent.
Instance Methods
hasBorder_(bool)
hasBorder
These methods get and set a Boolean indicating whether or not a black border is drawn around the view. This border is drawn within the bounds of the JSCScrollView. Thus the bounds do not change when a border is added, but the visible area is slightly reduced.
Examples
(
a = JSCWindow.new;
b = JSCScrollView( a, Rect( 0, 0, 150, 100 ));
c = JSCSlider2D( b, Rect( 0, 0, 100, 100 ));
d = JSCSlider2D( b, Rect( 100, 0, 100, 100 ));
a.front;
)
a.view.background = Color.white;
b.background = Color.grey;
d.bounds = Rect( 100, 0, 1000, 100 ); // the 'canvas' grows to accomodate it
b.resize = 5; // the ScrollView resizes, but not its contents
b.hasBorder_( true );
b.hasBorder_( false );
b.visibleOrigin;
b.visibleOrigin = Point( 2000, 0 ); // clips to the bounds of its contents
b.hasHorizontalScroller_( false );
b.autohidesScrollers_( false );
b.hasVerticalScroller_( false );
b.hasHorizontalScroller_( true );
b.hasVerticalScroller_( true );
b.autohidesScrollers_( true );
a.close;
/////////////////
// force a 'canvas' size
(
a = JSCWindow.new;
b = JSCScrollView( a, Rect( 0, 0, 300, 300 ));
c = JSCCompositeView( b, Rect( 0, 0, 500, 500 )); // 'canvas' is this big
a.front;
)
(
c.decorator = FlowLayout( c.bounds ); // now we can use a decorator
JSCSlider2D( c, Rect( 0, 0, 240, 240 ));
JSCSlider2D( c, Rect( 0, 0, 240, 240 ));
JSCSlider2D( c, Rect( 0, 0, 240, 240 ));
c.decorator.nextLine;
)
/////////////////
// "rulers", using an action function
(
var labelFunc;
w = JSCWindow.new;
a = JSCScrollView( w, Rect( 40, 40, 300, 300 ));
b = JSCScrollView( w, Rect( 0, 40, 40, 300 ))
.hasHorizontalScroller_( false )
.hasVerticalScroller_( false );
// .autoScrolls_( false );
c = JSCScrollView( w, Rect( 40, 0, 300, 40 ))
.hasHorizontalScroller_( false )
.hasVerticalScroller_( false );
// .autoScrolls_( false );
b.background = Color.grey;
c.background = Color.grey;
d = JSCUserView( a, Rect( 0, 0, 620, 620 )).canFocus_( false );
e = JSCUserView( b, Rect( 0, 0, 40, 630 )).canFocus_( false );
f = JSCUserView( c, Rect( 0, 0, 630, 40 )).canFocus_( false );
a.action = { var origin;
origin = a.visibleOrigin;
b.visibleOrigin = 0 @ (origin.y);
c.visibleOrigin = (origin.x) @ 0;
};
labelFunc = { (1..30).do({ arg i; JPen.stringAtPoint( i.asString, (i * 20) @ 0 )})};
d.drawFunc = { arg view; var b = view.bounds;
JPen.font = JSCFont( "Courier", 9 );
JPen.fillColor = Color.red;
JPen.use({
JPen.translate( 0, 5 );
labelFunc.value;
});
JPen.translate( 15, 0 ).rotate( 0.5pi );
labelFunc.value;
};
e.drawFunc = { arg view; var b = view.bounds;
JPen.font = JSCFont( "Courier", 9 );
JPen.translate( 40, 0 ).rotate(0.5pi);
labelFunc.value;
};
f.drawFunc = { arg view; var b = view.bounds;
JPen.font = JSCFont( "Courier", 9 );
JPen.translate( 0, 25 );
labelFunc.value;
};
w.front;
)