! Copyright (C) 2006, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: accessors colors colors.cmyk colors.gray colors.hsl colors.hsv colors.hwb colors.lab colors.luv colors.ryb colors.xyy colors.xyz colors.yiq colors.yuv effects formatting kernel math math.vectors models models.arrow models.product models.range quotations sequences sequences.generalizations splitting stack-checker ui ui.gadgets ui.gadgets.labels ui.gadgets.packs ui.gadgets.sliders ui.gadgets.tabbed ui.gadgets.tracks ui.pens.solid ; IN: color-picker ! Simple example demonstrating the use of models. TUPLE: color-preview < gadget ; : ( model -- gadget ) color-preview new swap >>model { 200 200 } >>dim ; M: color-preview model-changed swap value>> >>interior relayout-1 ; : constructor>class-name ( word -- name ) name>> "<" ?head drop ">" ?tail drop ; : constructor-inputs ( word -- count ) stack-effect in>> length ; : ( model word -- model ) dup 1quotation '[ _ constructor-inputs firstn [ 256 /f ] tri@ @ ] ; : ( model -- gadget ) horizontal 1 >>line ; : ( constructor -- gadget model ) constructor-inputs [ 0 0 0 255 1 ] replicate [ { 5 5 } >>gap [ add-gadget ] reduce ] [ [ range-model>> ] map ] bi ; : color>str ( seq -- str ) vtruncate v>integer first3 3dup "%d %d %d #%02x%02x%02x" sprintf ; ! vtruncate v>integer ! first3 ! ! _ constructor-inputs [ firstn ] keep ! "%d %d %d #%02x%02x%02x" sprintf ! ! [ [ "%d" ] replicate " " join ] ! [ [ "%02x" ] replicate "" join ] bi " #" glue sprintf ! "%d %d %d #%02x%02x%02x" sprintf ; : add-color-tab ( gadget constructor -- gadget ) dup [ 1quotation ] dip dup '[ vertical { 5 5 } >>gap _ [ f track-add ] dip [ _ 1 track-add ] [ [ color>str ] f track-add ] bi _ constructor>class-name add-tab ] call ; : ( -- gadget ) \ add-color-tab \ add-color-tab \ add-color-tab \ add-color-tab \ add-color-tab \ add-color-tab ! \ add-color-tab ! \ add-color-tab ! \ add-color-tab ! \ add-color-tab ! \ add-color-tab ! \ add-color-tab ! \ add-color-tab ! \ add-color-tab ; MAIN-WINDOW: color-picker-window { { title "Color Picker" } } >>gadgets ;