REBOL [ Title: "ARROW Style" Author: ["Gregg Irwin" "Christopher Ross-Gill"] File: %arrow-style.r Version: 0.0.5 History: { Comments omitted for brevity. 4-point version only. See http://shadwolf.free.fr/arrow-RebGUI-port.r for more options... } ] do %gui.r widgets: make widgets [ flip-pair: func [pr [pair!] os][ pr: pr - os os + as-pair pr/y pr/x ] compose-arrow: func [ "Returns a block of DRAW commands for an arrow glyph" size "Parent Style Size" glyph "Glyph Data Block: [shape word! color tuple! direction word!]" /local rel-coord gsize gcenter os goffset weight out ][ rel-coord: func ["Returns glyph-offset-relative coordinate" x y][ goffset + as-pair x y ] gsize: min size/x size/y gsize: gsize - either gsize > 17 [7][5] gcenter: reduce [to-integer gsize / 2 none] gcenter/2: gsize - gcenter/1 weight: max 2 to-integer gsize / 6 os: goffset: size - gsize / 2 goffset/y: either find [chevron penta pointer] glyph/shape [ size/y - gcenter/1 - weight - 1 / 2 ][ size/y - gcenter/1 - 1 / 2 ] out: reduce [ rel-coord gcenter/1 0 rel-coord 0 gcenter/1 rel-coord weight gcenter/1 + weight rel-coord gcenter/1 2 * weight rel-coord gcenter/2 2 * weight rel-coord gsize - weight gcenter/1 + weight rel-coord gsize gcenter/1 rel-coord gcenter/2 0 ] switch glyph/shape [ triangle [remove/part at out 3 4] compass [remove at out 6 remove at out 3] penta [remove/part at out 4 2] pointer [ change/part at out 4 reduce [ rel-coord gcenter/1 - weight gcenter/1 rel-coord gcenter/1 - weight 2 * weight + gcenter/1 rel-coord gcenter/2 + weight 2 * weight + gcenter/1 rel-coord gcenter/2 + weight gcenter/1 ] 2 out: head forall out [change out subtract first out 0x1] ] ] forall out [ switch glyph/direction [ down [out/1/y: size/y - 1 - out/1/y] left [change out flip-pair out/1 os] right [change out flip-pair out/1 os out/1/x: size/x - 1 - out/1/x] ] ] compose [pen none fill-pen (glyph/color) polygon (head out)] ] arrow-feel: context [ arrow: make svvf/hot [ redraw: func [face action position][ all [action = 'show face/edge face/edge/effect: pick [ibevel bevel] face/state] ] over: func [f a p][] engage: func [face action event][ switch action [ time [if face/state [do-face face face/text]] down [face/state: on do-face face face/text] alt-down [face/state: on do-face-alt face face/text] up [face/state: off] alt-up [face/state: off] over [face/state: on ] away [face/state: off] ] show face ] ] ] ARROW: make face [ color: water size: 20x20 glyph: context [shape: 'chevron color: 255.255.255 direction: 'up] data: none state: off feel: arrow-feel/arrow font: none edge: make face/edge [size: 1x1] init: does [ if find [up down left right] data [glyph/direction: data] effect: compose [(any [effect []])] insert effect reduce ['draw compose-arrow size - edge/size - edge/size glyph] ] ] ] display "RebGUI Arrow Example" [ aw1: arrow [] aw2: arrow [data down] ] wait []