gadget
Factor documentation > Factor handbook > UI framework > Building user interfaces
Next:Gadget geometry


Vocabulary
ui.gadgets

Class description
An object which displays itself on the screen and acts on user input gestures. Gadgets have the following slots:
pref-dim - a cached value for pref-dim; do not read or write this slot directly.
parent - the gadget containing this one, or f if this gadget is not part of the visible gadget hierarchy.
children - a vector of child gadgets. Do not modify this vector directly, instead use add-gadget, add-gadgets, unparent or clear-gadget.
orientation - an orientation specifier. This slot is used by layout gadgets.
layout-state - stores the layout state of the gadget. Do not read or write this slot directly, instead call relayout and relayout-1 if the gadget needs to be re-laid out.
visible? - a boolean indicating if the gadget should display and receive user input.
root? - if set to t, layout changes in this gadget will not propagate to the gadget's parent.
clipped? - a boolean indicating if clipping will be enabled when drawing this gadget's children.
interior - an implementation of the UI pen protocol
boundary - an implementation of the UI pen protocol
model - a model or f; see Implementing controls

Gadgets subclass the rect class, and thus all instances have loc and dim instances holding their location and dimensions.

Notes
Other classes may inherit from gadget in order to re-implement generic words such as draw-gadget* and user-input*, or to define gestures with set-gestures.

Definition
USING: math.rectangles ;

IN: ui.gadgets

TUPLE: gadget < rect
pref-dim parent children
{ orientation initial: { 0 1 } } focus
{ visible? initial: t } root? clipped? layout-state
{ graft-state initial: { f f } } graft-node interior
boundary model ;


Methods
USING: kernel ui.baseline-alignment ui.gadgets ;

M: gadget baseline drop f ;


USING: kernel ui.baseline-alignment ui.gadgets ;

M: gadget cap-height drop f ;


USING: accessors kernel ui.gadgets ;

M: gadget children-on nip children>> ;


USING: accessors generic kernel math.rectangles ui.gadgets ;

M: gadget contains-point?
dup visible?>>
[ M\ gadget contains-point? (call-next-method) ]
[ 2drop f ] if ;


USING: accessors generic kernel math.rectangles ui.gadgets ;

M: gadget contains-rect?
dup visible?>>
[ M\ gadget contains-rect? (call-next-method) ] [ 2drop f ]
if ;


USING: kernel namespaces ui.gadgets ui.gadgets.private ;

M: gadget dim-changed
in-layout? get [ invalidate ] [ invalidate* ] if ;


USING: accessors combinators kernel namespaces sequences
ui.gadgets ui.render ;

M: gadget draw-children
dup children>> [
{
[ visible-children ]
[ selected-children ]
[ gadget-background ]
[ gadget-foreground ]
} cleave [
{
[ [ selected-gadgets set ] when* ]
[ [ selection-background set ] when* ]
[ [ background set ] when* ]
[ [ foreground set ] when* ]
} spread [ draw-gadget ] each
] with-scope
] [ drop ] if ;


USING: kernel ui.gadgets ui.render ;

M: gadget draw-gadget* drop ;


USING: kernel ui.gadgets ;

M: gadget equal? 2drop f ;


USING: kernel ui.gadgets ;

M: gadget focusable-child* drop t ;


USING: accessors kernel ui.gadgets ui.pens ui.render ;

M: gadget gadget-background dup interior>> pen-background ;


USING: accessors kernel ui.gadgets ui.pens ui.render ;

M: gadget gadget-foreground dup interior>> pen-foreground ;


USING: kernel ui.gadgets ;

M: gadget gadget-selection drop f ;


USING: kernel ui.gadgets ;

M: gadget gadget-selection? drop f ;


USING: accessors kernel ui.gadgets ;

M: gadget gadget-text* [ children>> ] keep gadget-seq-text ;


USING: accessors kernel ui.gadgets ;

M: gadget gadget-text-separator
orientation>> vertical = "\n" "" ? ;


USING: kernel ui.gadgets ;

M: gadget graft* drop ;


USING: kernel ui.gadgets ;

M: gadget hashcode* nip identity-hashcode ;


USING: kernel ui.gadgets ui.gadgets.glass ;

M: gadget hide-glass-hook drop ;


USING: kernel ui.gadgets ;

M: gadget layout* drop ;


USING: sets ui.gadgets ui.traverse ;

M: gadget leaves* adjoin ;


USING: kernel models ui.gadgets ;

M: gadget model-changed 2drop ;


USING: prettyprint.backend prettyprint.custom ui.gadgets ;

M: gadget pprint* pprint-tuple ;


USING: accessors ui.gadgets ;

M: gadget pref-dim* dim>> ;


USING: ui.gadgets ui.gadgets.scrollers ;

M: gadget pref-viewport-dim pref-dim ;


USING: kernel ui.gadgets ;

M: gadget remove-gadget 2drop ;


USING: accessors ui.gadgets ;

M: gadget request-focus-on parent>> request-focus-on ;


USING: kernel ui.gadgets ui.render ;

M: gadget selected-children drop f f ;


USING: accessors kernel math.rectangles sequences ui.gadgets
ui.gadgets.panes.private ;

M: gadget sloppy-pick-up*
children>> [ contains-point? ] with find-last drop ;


USING: kernel ui.backend.gtk.input-methods ui.gadgets ;

M: gadget support-input-methods? drop f ;


USING: kernel ui.gadgets ;

M: gadget ungraft* drop ;


USING: kernel ui.gadgets ui.gadgets.scrollers.private ;

M: gadget update-scroller swap (scroll>gadget) ;


USING: kernel ui.gadgets ;

M: gadget user-input* 2drop t ;


USING: kernel ui.gadgets ui.gadgets.scrollers ;

M: gadget viewport-column-header drop f ;