 M: checkbox model-changed
     swap value>> >>selected? relayout-1 ;
 
-TUPLE: radio-paint < caching-pen color interior-vertices boundary-vertices ;
-
-: <radio-paint> ( color -- paint ) radio-paint new swap >>color ;
-
-<PRIVATE
-
-CONSTANT: circle-steps 8
-
-PRIVATE>
-
-M: radio-paint recompute-pen
-    swap dim>>
-    [ { 4 4 } swap { 9 9 } v- circle-steps fill-circle-vertices >>interior-vertices ]
-    [ { 1 1 } swap { 3 3 } v- circle-steps circle-vertices >>boundary-vertices ] bi
-    drop ;
-
-<PRIVATE
-
-: (radio-paint) ( gadget paint -- )
-    [ compute-pen ] [ color>> gl-color ] bi ;
-
-PRIVATE>
-
-M: radio-paint draw-interior
-    [ (radio-paint) ] [ interior-vertices>> gl-vertex-pointer ] bi
-    GL_POLYGON 0 circle-steps glDrawArrays ;
-
-M: radio-paint draw-boundary
-    [ (radio-paint) ] [ boundary-vertices>> gl-vertex-pointer ] bi
-    GL_LINE_STRIP 0 circle-steps 1+ glDrawArrays ;
-
-:: radio-knob-theme ( gadget -- gadget )
-    COLOR: black <radio-paint> :> radio-paint
-    gadget
-    f f radio-paint radio-paint <button-paint> >>interior
-    radio-paint >>boundary
-    { 16 16 } >>dim ;
+: <radio-paint> ( -- pen )
+    "radio" theme-image <image-pen>
+    "radio" theme-image <image-pen>
+    "radio-clicked" theme-image <image-pen>
+    "radio-set" theme-image <image-pen>
+    "radio-set-clicked" theme-image <image-pen>
+    <button-pen> ;
 
 : <radio-knob> ( -- gadget )
-    <gadget> radio-knob-theme ;
+    <gadget>
+    <radio-paint> >>interior
+    dup dup interior>> pen-pref-dim >>dim ;
 
 TUPLE: radio-control < button value ;
 

    hand-clicked get-global child? ;

: button-update ( button -- )
    dup mouse-clicked?
    over button-rollover? and
    buttons-down? and
    >>pressed?
    relayout-1 ;

    { 0 1/2 } >>align ; inline

: roll-button-theme ( button -- button )
    f COLOR: black <solid> dup f f <button-pen> >>boundary
    f f pressed-gradient f f <button-pen> >>interior
    align-left ; inline

: <roll-button> ( label quot -- button )
