[EMAIL PROTECTED] wrote:
> 
> When I make a slider, how come the slider /data value reaches a maximum
> of four integers less than the size of the slider?
> 
> For example, to return a maximum /data value of 255, use the following...
> 
> REBOL []
> 
> face-one: layout [
>         s: slider 10x259 [s/color: 0.0.0 + s/data show s print s/data]
> ]
> 
> view/title face-one "face one"

The problem is because of the edges on the slider.  Because they use up
4 pixels of space, you end up with a maximum value of the slider width -
4.  So if you did this -

face-one: layout [
  s: slider 10x259 with [edge/size: 4x4] 
    [s/color: 0.0.0 + s/data show s print s/data]
]
view/title face-one "face one"


You can use these functions to get/set the position of a slider -

get-slider-position: func [
    "Returns the sliders position, a value between 0.0 and 1.0"
    slider [object!]
    /scale amount [number!] 
      "Scales the position by amount, and converts to an integer"
    /local result way
] [
    way: not zero? slider/pane/way/1
    
    result: (slider/data - 1) / pick 
       (slider/size - (2 * slider/edge/size) - slider/pane/way) way
    if scale [result: to-integer result * amount]

    result
]

set-slider-position: func [
    slider [object!]
    position [number!]
    /scale amount [number!]
      "Scale the position down to a number between 0.0 and 1.0"
    /local way offset
] [
    if scale [position: position / amount]

    way: not zero? slider/pane/way/1

    offset: to-integer (position * pick 
      (slider/size - (2 * slider/edge/size) - slider/pane/way) way) + 1
    slider/data: offset
    slider/pane/offset: slider/pane/way * (to-integer position * pick 
      (slider/size - slider/pane/size - (2 * slider/edge/size)) way)
]


So now the code becomes -

face-one: layout [
  s: slider 10x300 [
    s/color: 0.0.0 + get-slider-position/scale s 255
    show s
    print s/color
  ]
]
view/title face-one "face one"


Julian Kinraid

Reply via email to