SwingOSC – Java-based GUI classes

last mod: 31-jul-07 sciss

JSCScrollBar

Note: please use the abstraction layer GUI.scrollBar if possible! (see GUI). See also JSCView.

A kind of range slider that is commonly used to specify the viewport into a virtual scrollable canvas. See also JSCScrollPane for a combination of scroll bars with a container viewport.

(
    w = JSCWindow( "ScrollBars", Rect( 360, 240, 400, 400 ));
    v = JSCScrollBar( w, Rect( 380, 4, 16, 372 ))
        .resize_( 6 )
        .extent_( 0.1 ) // 1/10th of the virtual viewport extent
        .action_({ w.refresh });
    h = JSCScrollBar( w, Rect( 4, 380, 372, 16 ))
        .resize_( 8 )
        .extent_( 0.1 ) // 1/10th of the virtual viewport extent
        .action_({ w.refresh });
    JSCUserView( w, Rect( 4, 4, 372, 372 ))
        .resize_( 5 )
        .background_( Color.black )
        .canFocus_( false )
        .drawFunc_({ arg view;
            var b = view.bounds;
            JPen.addRect( b );
            JPen.clip;
            JPen.translate( b.left, b.top );
            JPen.scale( b.width / (10 * h.extent), b.height / (10 * v.extent) );
            JPen.translate( h.value * -10, v.value * -10 );
            JPen.font = JFont( "Monospaced", 2 );
            5.do({ arg y;
                JPen.fillColor = Color.hsv( y / 5, 1, 1 );
                JPen.stringAtPoint( "VIEWPORT", 0.1 @ ((y << 1) - 0.5) );
            });
        });
    w.front;
)

// assign a function that is called when button toggles:
// value returns float between 0 and 1. isAdjusting
// returns true when the slider is currently being dragged,
// false if the mouse button is released or the slider
// is positioned programmatically using valueAction_
v.action = { arg butt; ("New value = " ++ butt.value ++ "; isAdjusting? " ++ butt.isAdjusting ).postln; w.refresh };

// set value (without invoking action function).
// the valid range is 0 ... (1 - extent). values outside
// this range will be clipped automatically
v.value = 0.2;
v.value = 0.6;
v.value = 1.0;	// clips to 0.9 when extent is 0.1!

// set state and invoke action function if it results in a change of value
v.valueAction = 0.5;

// set the extent, i.e. visible amount of the viewport (default is 1.0)
v.extent = 0.2; w.refresh;
h.extent = 0.4; v.extent = 0.4; w.refresh;
h.extent = 1.0; v.extent = 1.0; w.refresh;

// set both value and extent by specifying a span from 'lo' to 'hi'
h.setSpan( 0.2, 0.4 );
h.setSpanActive( 0.4, 0.6 );	// invokes action function

// the unit increment is a factor of the extent
// by which the scrollbar moves when clicking into the arrows.
// the default is 0.1 (1/10th of the scrollbar extent)
h.unitIncrement = 0.01;  // very fine
h.unitIncrement = 0.5;   // very coarse

// the block increment is a factor of the extent
// by which the scrollbar moves when clicking next to
// the handle into the track.
// the default is 1.0 (jump one full scrollbar extent)

h.blockIncrement = 0.1;  // fine
h.blockIncrement = 2.0;  // coarse