REBOL [
Title: "Button for Petr!"
Date: 21-Feb-2004
]
foreach [w f][
saltire %saltire.png
misc %green.png
tartan %back-tartan.png
metal %bg-metal.png
][
set w load-image join http://reb4.me/r/ f
]
;--- Wash Effect ---
make-wash-table: func [col /local blk col-s col-b][
blk: make block! 256
col: rgb-to-hsv col
col-s: col/2 col-b: col/3
repeat v 256 [
col/2: to-integer col-s - (v * col-s / 255)
col/3: to-integer col-b + ((255 - col-b) * (v - 1 / 255))
insert tail blk hsv-to-rgb col
]
blk
]
wash: func [img col /local table][
img: copy/part img img/size
table: make-wash-table col
repeat pix length? img [poke img pix pick table 1 + max max img/:pix/1 img/:pix/2 img/:pix/3]
return img
]
;--- BTN Images ---
imgs: load-thru http://reb4.me/r/button
pekr-up: make image! [5x5 #{
000000000000000000000000000000000000222222EEEEEE222222000000
000000EEEEEEDDDDDDCCCCCC000000000000222222CCCCCC222222000000
000000000000000000000000000000
} #{
FF990099FF990000009900000000009900000099FF990099FF
}]
pekr-dn: make image! [5x5 #{
000000000000000000000000000000000000222222BBBBBB222222000000
000000BBBBBBCCCCCCEEEEEE000000000000222222EEEEEE222222000000
000000000000000000000000000000
} #{
FF990099FF9900000099
00000000009900000099
FF990099FF
}]
;--- Chris's BTN Style ---
stylize/master [
PEKR: FACE -1x22 with [ ; version 0.1.2
color: image: none edge: none effects: none
font: [color: black colors: none style: none size: 11 shadow: none align: 'center valign: 'middle offset: 14x0]
saved-area: true
; 'look supercedes 'images, 'effects, 'colors, 'texts, etc. Provides
; action-based face manipulation in tandem with the feel/display function.
look: reduce [
'default load imgs/button-default
'down load imgs/button-down
'hover [luma 5 contrast 5]
]
feel: make svvf/button [
hover?: off ; none turns hover off altogether
over: func [face over? offset][
if hover? <> none [hover?: either over? [on][off] show face hover?: off]
]
redraw: func [face act pos /local state] [
display face either face/state ['down][either hover? ['hover]['default]]
]
; Function used to manipulate face
display: func [face action][
either action = 'hover [
insert tail face/effect face/look/hover
][
remove/part find/last face/effect 'luma 4
face/image: any [select face/look action face/image]
]
]
]
colors: color: none
init: [
if size/x = -1 [
either text [
size/x: 1000
state: size-text self
size/x: either state [state/x + font/offset/x][50]
state: none
][size/x: 50]
]
effect: join [extend] either effect [effect][make block! 10]
;-- In the absence of a 'wash effect (Rebug #366), this does it manually
if all [colors colors/2 image? look/default image? look/down][
look/default: wash look/default colors/1
look/down: wash look/down colors/2
]
if all [color not colors image? look/default image? look/down][
look/default: wash look/default color
look/down: wash look/down color
]
;-- End 'wash effect
color: none
]
]
RBTN: BTN with [
images: reduce [
load imgs/button-default
load imgs/button-down
load imgs/button-halo
]
init: [
if size/x = -1 [
either text [
size/x: 1000
state: size-text self
size/x: either state [state/x + font/offset/x] [50]
state: none
] [
size/x: 50
]
]
if font/colors [font/color: first font/colors]
if not images [
images: reduce [btn-up.png btn-dn.png]
]
if images [image: images/1]
if colors [color: colors/1]
;-- In the absence of a 'wash effect (Rebug #366), this does it manually
if all [colors images colors/2 images/2][
change images wash images/1 colors/1
change next images wash images/2 colors/2
]
if all [color not colors images/2][
change images wash first images color
change next images wash second images color
]
;-- End 'wash effect
if not effect [effect: [extend]]
color: none
]
]
]
;--- Test ---
view center-face layout [
origin 0 space 0
panel [
origin 10 space 10 backdrop saltire effect 'fit
rbtn "View" 100 51.68.102 pekr "Pekr" 100 51.68.102
]
panel [
origin 10 space 10 backdrop misc effect 'fit
rbtn "View" 100 51.85.36 pekr "Pekr" 100 51.87.36
]
return
panel [
origin 10x28 space 20 backdrop tartan effect 'tile
rbtn "View" 140x36 36.68.17 pekr "Pekr" 140x36 36.68.17
]
across return guide
panel [
origin 10 space 10 backdrop metal effect [tile-view luma -20]
rbtn "View" 120 gray - 70 pekr "Pekr" 120 gray - 70
]
panel [
origin 10 space 10 backdrop metal effect 'tile-view
rbtn "View" 120 gray pekr "Pekr" 120 gray return
]
]