radio-group: make rebface [ tip: { USAGE: radio-group data ["Option A" "Option B"] radio-group data [2 "On" "Off"] DESCRIPTION: Group of mutually exclusive radio buttons. Alignment is vertical unless height is specified as line height. An integer provided as the first entry in the block indicates the default selection. } size: 50x-1 pane: [] picked: none selected: make function! [] [ all [picked pick data picked] ] select-item: make function! [item [integer! none!]] [ either any [none? item zero? item] [ item: either picked = 1 [2] [1] pane/:item/feel/engage/reset pane/:item 'down none ][ all [item <> picked pane/:item/feel/engage pane/:item 'down none] ] ] init: make function! [/local off siz pos index] [ ; picked? unless string? first data: reduce data [ picked: first data remove data ] ; vertical or horizontal? all [negative? size/y size/y: sizes/line * length? data] off: either size/y > sizes/line [ siz: as-pair size/x sizes/line as-pair 0 sizes/line ][ siz: as-pair size/x / length? data sizes/line as-pair siz/x 0 ] ; insert labels pos: 0x0 index: 1 foreach label data [ insert tail pane make subface [ offset: pos size: siz text: label effect: compose/deep [draw [pen (colors/outline-light) fill-pen (colors/page) circle (as-pair sizes/cell * 1.5 sizes/cell * 2.5) (sizes/cell * 1.5)]] data: index font: default-font para: default-para-indented feel: make default-feel [ over: make function! [face act pos] [ face/effect/draw/pen: either act [colors/outline-dark] [colors/outline-light] show face ] engage: make function! [face act event /reset /local pf] [ do select [ down [ if all [pf: face/parent-face pf/picked <> face/data] [ ; deflag old all [ pf/picked clear skip pf/pane/(pf/picked)/effect/draw 7 show pf/pane/(pf/picked) ] either reset [pf/picked: none] [ ; flag new pf/picked: face/data insert tail face/effect/draw reduce [ 'pen colors/state-dark 'fill-pen colors/state-dark 'circle as-pair sizes/cell * 1.5 sizes/cell * 2.5 sizes/cell - 1 ] show face pf/action/on-click pf ] ] ] away [face/feel/over face false 0x0] ] act ] ] ] pos: pos + off index: index + 1 ] ; initial selection all [ integer? picked insert tail pane/:picked/effect/draw reduce [ 'pen colors/state-dark 'fill-pen colors/state-dark 'circle as-pair sizes/cell * 1.5 sizes/cell * 2.5 sizes/cell - 1 ] ] ] ]