On Wed, Jan 13, 2010 at 9:14 AM, Thorsten Moeller <[email protected]> wr=
ote:

> lay-spec: [
> =A0 =A0across space 4x4
> =A0 =A0backdrop effect compose [gradient 1x0 (white) (silver)
> =A0 =A0 =A0 =A0]
> =A0 =A0return
> =A0 =A0style pgr progress 270 green
> ]
>
>
> foreach line result [
> =A0 =A0append lay-spec compose [
> =A0 =A0 =A0 =A0(make-lbl-name to-word line/3 set-word!) text bold 200 (fo=
rm
> =A0 =A0 =A0 =A0line/3)
> =A0 =A0 =A0 =A0pgr
> =A0 =A0 =A0 =A0return
> =A0 =A0]
> ]
>
>
> I thought in the foreach loop there must be somthing like if line > 80
> [PG1: pgr orange and PG1/data: line/ 16] . That doesn't seem to work.

You can do that. I don't know which column gives you the data, so I'm
just using line/5 and I'm assuming it's a decimal between 0 and 1:

 foreach line result [
    append lay-spec compose [
        (make-lbl-name to-word line/3 set-word!) text bold 200 (form
        line/3)
        pgr (line/5) (
          case [
            line/5 < 0.5 [green]
            line/5 < 0.7 [yellow]
            line/5 < 0.9 [red]
          ]
        )
        return
    ]
 ]

There is at least one other way to do it, and that is to duplicate and
modify the progress style, so that it knows what color it needs to
draw, when you give it a specific value. That gives a cleaner and
smaller layout, by abstracting the color decision away from the
layout, but it requires that you redo or append to the progress style
function. If you end up doing a lot of customization, it makes sense
to move the color evaluation to the style, rather than building a huge
layout.

You need to dig out the 'init part of the progress style. 'init is run
as the layout is created:

probe get in get-style 'progress 'init

which gives:

[
    if image? image [
        if none? size [size: image/size]
        if size/y < 0 [size/y: size/x * image/size/y / image/size/x
effect: insert copy effect 'fit]
        if color [effect: join effect ['colorize color]]
    ]
    if none? size [size: 100x100]
    pane: make bar []
    pane/size: size
    either size/x > size/y [pane/size/x: 1] [pane/size/y: 1]
    if colors [color: first colors pane/color: second colors]
]

Now you need to modify that code and build a derivative style. We can
shave it down a little bit, since you probably don't need images:

stylize/master [
  pgr: progress [
    init: [
      if none? size [size: 100x100]
      pane: make bar []
      pane/size: size
      either size/x > size/y [pane/size/x: 1][pane/size/y: 1]
      ; here we decide it. COLORS is two colors. The first gives
foreground, the second gives background. (At least I think, swap it
around if it doesn't work)
      if not number? data [data: 0] ; for safety
      if colors [
        colors/1:
          case [
             data < 0.5 [green]
             data < 0.7 [yellow]
             data < 0.9 [red]
          ]
      ]
      if colors [color: first colors pane/color: second colors]
    ]
  ]
]

Then your loop would appear like this:

 foreach line result [
    append lay-spec compose [
        (make-lbl-name to-word line/3 set-word!) text bold 200 (form
        line/3)
        pgr (line/5)
        return
    ]
 ]

Nice and clean. Code is untested.

--=20
Regards,
Henrik Mikael Kristensen
-- 
To unsubscribe from the list, just send an email to 
lists at rebol.com with unsubscribe as the subject.

Reply via email to