Script Library: 1238 scripts
 

easy-drawer.r

REBOl [ Title: "Easy Drawer" Author: "Guest2" Date: 11-Feb-2007 Version: 1.0.0 File: %easy-drawer.r Purpose: "Easy way to test draw commands" Library: [ Level: 'intermediate Type: [tool demo] Domain: [vid dialects] Tested-under: [Win] Platform: [all] Support: none License: none See-also: none ] History: [ [1.0.0 11-Feb-2007 "First version"] ] ] num: charset "0123456789" pair: [opt "-" some num "x" opt "-" some num ] integer: [opt "-" some num ] error: none err?: func [blk /local arg1 arg2 arg3 message err][ error: none if not error? set/any 'err try blk [return :err] err: disarm err set [arg1 arg2 arg3][err/arg1 err/arg2 err/arg3] message: get in get in system/error err/type err/id if block? message[bind message 'arg1] message: reform reduce message error: reduce [ make get-style 'text [ text: message font: make font [color: red] color: yellow offset: as-pair 0 src/size/y - 20 size: offset + as-pair src/size/x 20 ] make face [ offset: either err/near [ any [ attempt [0x14 + caret-to-offset src find src/text find/tail err/near ") "] as-pair 0 src/size/y ] ][ as-pair 0 src/size/y ] size: as-pair src/size/x 1 effect: compose/deep [draw [pen red line 0x0 (as-pair src/size/x 0)]] ] ] [] ] board: [] view/new/title layout [ origin 0x0 space 5x0 across label "rate" rate: field 30 form 40 [f-board/rate: load rate/text] label "size" size: field 60 form 300x450 [ f-board/size: load size/text f-board/parent-face/size: 0x20 + load size/text show f-board/parent-face ] below f-board: box 300x450 white rate 40 effect [draw []] feel [ engage: func [face action event][ poke face/effect 2 err? [compose/deep board] show face ] ] ] "Draw Board" box: make get-style 'box [ sv-scroll: 0x0 sv-event: none sv-data: none ;edge: make edge [color: yellow size: 1x1 effect: 'bevel] feel: make feel [ redraw: func [f a][if a = 'show [ f/offset: f/offset - f/sv-scroll + f/sv-scroll: f/parent-face/para/scroll ]] engage: func [f action event][ switch event/type [ down [sv-event: event sv-data: f/data] move [ f/data: sv-data + either pair? f/data [ event/offset - sv-event/offset ][ event/offset/y - sv-event/offset/y ] remove/part f/caret f/len insert f/caret form f/data f/len: length? form f/data board: err? [load src/text] refresh src ] up [ system/view/focal-face: src system/view/caret: offset-to-caret src f/offset + sv-event/offset show src ] ] ] ] ] cross: make get-style 'image [ reference: none feel: make feel [ engage: func [f a e][ f/reference/feel/engage f/reference a context [offset: e/offset + f/offset type: e/type] f/offset: f/reference/data show f ] ] ] refresh: func [f][ f/pane: clear [] f-board/pane: clear [] parse/all f/text [ any [ start: copy val [pair | integer] fin: ( val: load val append f/pane ref: make box [ offset: (caret-to-offset f start) - 2x1 size: (caret-to-offset f fin) - offset + 0x12 data: val caret: start len: offset? start fin paren-face: f sv-scroll: f/para/scroll effect: compose/deep [draw [pen orange line (as-pair 0 size/y - 1) (as-pair size/x size/y - 1)]] ] if pair? val [ append f-board/pane make cross [ offset: val - 2x2 size: 4x4 effect: [cross red] reference: ref ] ] ) | skip ] ] if error [append f/pane error ] sav-text: cp f/text show src ] ask-refresh: make get-style 'btn [ text: "Refresh" do init size: size - 0x5 action: [ err? [draw load system/words/size/text compose/deep load src/text] refresh src unless error [board: load src/text] ] ] editor search: join ";Enter your draw code" newline ; hack editor: find the face where the text is pasted edit: system/view/screen-face/pane/2 repeat face edit/pane [if face/text = search [src: face break]] src/feel/engage: func [f a e] compose [(get in src/feel 'engage) f a e if f/text <> sav-text [ f-board/pane: clear [] f/pane: clear [] ask-refresh/offset: 20x-15 + caret-to-offset f system/view/caret append f/pane ask-refresh ] ] sav-text: cp src/text: { ( unless value? 'font [ font: reduce [ make face/font [size: 11] make face/font [size: 33] ] ] unless value? 'iter [ iter: func [idx start end step /local stack][ stack: head [] while [tail? stack: at head stack idx] [insert tail stack none] if stack/1 = none [stack/1: end ] stack/1: stack/1 + step if stack/1 > end [stack/1: start] stack/1 ] ] [] ;don't forget to return an empty block (for compose/deep usage) ) pen (255.0.0 + (0.255.255 * sine iter 1 0 360 10)) font font/2 line-width 1 fill-pen radial 200x200 0 100 0 1 1 blue green red yellow text vectorial 18x-4 {Easy Drawer} pen blue font font/1 line-width 1 fill-pen none text 44x36 { - or a way thru the killer application} pen black text 20x56 { Easy drawer is an editor which gives an easy way to test draw commands. The source editor is an enhanced version of the native rebol editor. - If you modify the source then you need to refresh the Draw board by pushing the flying button "Refresh". - All pair! and integer! values can directly be modified by dragging them with the mouse. It is a quick way to see in the Draw Board the effects of any source modification. } pen blue text 97x217 "circle 70x70" text 166x218 (form siz: iter 5 1 25 1) circle 249x232 siz arrow 1x0 line (181x238 + pos: iter 6 1 10 0.7) (169x224 + pos) text (183x235 + pos) "drag" pen black arrow 0x0 text 21x251 { - If you use a wrong syntax then it does not crash but the incorrect line is underlined (depending ON the error). The Draw board shows you what you expect to see, at least... Sometimes, You can see some small red crosses allowing you to move the corresponding graphic items. The "awesome" feature is that you can see in real time the effect of those updates on the source. } pen red text 21x390 { I know, there are some explanations to give about how I perform these funny animations, but i let you inspect the source, it is easy to understand } pen blue rotate 25 text vectorial "D e m o" (93x-42 + (1x10 * sine iter 3 0 180 10)) pen black translate 243x-75 rotate (rot: iter 7 0 360 5) image logo.gif -27x-2 30x10 red text vectorial -26x-16 "Powered by" } show src board: err? [load src/text] refresh src do-events
halt ;; to terminate script if DO'ne from webpage