Easy drawer
guest211-Feb-2007/2:00:21+1:00
J'ai fait un ptit script pour faciliter l'écriture de blocs Draw.

Avant de le poster sur rebol.org, faites moi part de vos remarques.
Et aussi, si vous pouviez corriger mon anglais.

REBOL []
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)]]
		]
	]
	[] ;necessary to return nothing
]
board: []
view/new layout [
	origin 0x0 space 5x0 across
	label "rate" rate: field 30 form 50 [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 50 effect [draw []] feel [
		engage: func [face action event][
			poke face/effect 2 err? [compose/deep board]
			show face
		]
	]
]
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) - 1x1
					size: (caret-to-offset f fin) - offset + 0x12
					data: val
					caret: start
					len: offset? start fin
					paren-face: f
					sv-scroll: f/para/scroll
				]
				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 you 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: mold/only [
(
	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
		]
	]
	[] ;return nothing
)

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 furnish an easy way 
to test draw commands.

First, you have the source editor based on the native
rebol editor with some ehancements

 - When you modify the source, you have to refresh
   the Draw  board. To allow that, push the flying button
   "Refresh". 
 
 - All pair! and integer! values can be directly modified
   by draging them with the mouse. It's a speed manner to
   see the effects of any change. 
}

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.3)
			(169x224 + pos)
	text (183x235 + pos)  "drag" 
pen black arrow 0x0   
	text 21x251 {
 - When you write false syntax, you'll not have a crash
   but an indication of the error and the line in cause
   will be underlined (depending of the error).

The Draw board shows you what you expect, at least...
Sometimes, You'll see some small red cross allowing to
move the different items associated. And the "awesome" 
feature is that you will see (in direct) the effect of 
those updates in the source.
}

pen red
text 19x370 {
 I know, there is some explainations to give about how 
 i perform  these funny animations, but i let you inspect
 the source, it's easy to understand. 
}
pen black 
	image logo.gif 210x21 293x32 red
	text 211x9 "Powered by"
pen blue rotate 25 
	text vectorial "D e m o" 
		(93x-42 + (1x10 * sine iter 3 0 360 10))
]

show src
board: err? [load src/text]
refresh src 
do-events
neoreb11-Feb-2007/10:28:28+1:00
pour le code je peux rien te dire:

Pour l'anglais, j'ai modifié un peu, mais je suis pas toujours sur du sens de tes phrases.

editor search: join ";Enter youR draw code" newline

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 the effects of any modification.

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 different items associated (associés à quoi ?). The "awesome"
feature is that you can see in real time the effect of
those updates on the source.

I know, there are some explainations to give about how
I perform these funny animations, but i let you inspect
the source, it is easy to understand (ah bon)
neoreb11-Feb-2007/10:30:46+1:00
j'ai oublié:

explanations
et pas "explainations"
guest211-Feb-2007/14:11:53+1:00
Merci merci neoreb.
Mais as-tu lancé le script au moins ?

(Les petites croix rouges servent à bouger les éléments graphiques dans ce que j'appelle le Draw Board.)
neoreb11-Feb-2007/15:40:36+1:00
oui mais j'ai pas trop compris (bon j'ai pas cherché a comprendre vu que je suis plongé dans les abysses de view)
J'ai vu un editeur, une fenetre avec des croix rouges qui si elles sont deplacees modifient le source et c'est tout (pas de flying bouton refresh)

Je regarderai ça plus en details plus tard.
guest211-Feb-2007/16:01:53+1:00
ben en fait quand tu es dans le source, tu peux cliquer sur les valeurs (encadrées en jaune) et les faire glisser pour les modifier, ça a le même effet que de bouger les croix rouges sauf qu'il y a plus de choix.
neoreb11-Feb-2007/16:05:58+1:00
ok
je pense que tu voulais dire

You can see some small red crosses allowing you to move the different CORRESPONDING items
guest211-Feb-2007/17:10:25+1:00
hmmm... ok
anyway, c'est posté sur rebol.org.
Didec12-Feb-2007/11:09:22+1:00
Très sympa

Etant donnée la taille du code, c'est même impressionnant.

Il serait pas mal de repérer les tuple! aussi dans le parseur. Car sinon on se retourve avec des valeurs négatives ou supérieur à 255 dans le tuple et c'est pas "normal".

Félicitation pour ce travail.
Ca me donne envie de me remettre à bosser sur mon draw-editor, mais, j'ai si peu de temps
guest212-Feb-2007/14:35:28+1:00
Merci Didec,
Pour les tuples c'est pas si grâve, vue que l'erreur ne fait pas planter le bouzin.
Et puis si je les reconnaissais en tant que tuple! j'aurais un problème pour savoir quelle partie faire varier quand on fait un drag.
Didec12-Feb-2007/17:08:20+1:00
On peut imaginer un 'box spécial pour les tupple!, à 3 cases et on fait varier la valeur de la case où a commencé le clic.
guest212-Feb-2007/20:02:28+1:00
Mouiii, mais en fait ça marche déjà comme ça, il fait 3 cases par tuple. sauf que ça n'interdit pas les valeurs négatives ou superieure à 255.
Je vais y penser, mais je ne voudrais pas trop alourdir le script.
Je continue de penser que ce n'est pas trop grave, vu que la gestion des erreurs détecte lee tuples invalides en temps réel et qu'il suffit de corriger sans lacher la souris.
guest212-Feb-2007/20:08:02+1:00
Je vais ptet poster sous peu une nouvelle version qui tient compte des 'translate et autres 'rotate pour mieux positionner les petites croix rouges dans le draw Board.
C'est pas une évolution majeure mais bon...

Si vous avez des suggestions d'évolutions, c'est le moment.
jocko12-Feb-2007/20:23:15+1:00
en tout cas, félicitations pour ce travail remarquable !
guest212-Feb-2007/20:33:41+1:00
un truc qui serait sympa, c'est que RT mette en place un Reb service pour télécharger des librairies de codes draw.
ça permettrait à des applications comme Esay draw de piocher des logos ou des dessins déjà faits par d'autres.
Il suffirait de prévoir une interface dans rebol.org pour rentrer de nouvelles créations.

il faudrait aussi prévoir un format standard:
par exemple les dessin devra toujours être collé en haut à gauche aux coordonnées 0x0.
De cette façon il sera facile de l'insérer dans une composition existante un insérant un 'translate devant.

De la même façon, on pourrait aussi prévoir un standard pour les animations.
guest212-Feb-2007/20:34:36+1:00
Merci jocko, c'est pas grand chose.
guest212-Feb-2007/20:45:36+1:00
J'ai dit une connerie précédemment (une de plus).
Les dessins de la librairie ne devrait pas être collés en haut à gauche , mais centrés aux coordonnées 0x0.
Ca permettrait d'appliquer facilement des rotations avant le translate.
neoreb26-Feb-2007/16:02:23+1:00
Je viens de tester ton prog sous windows et je comprends pourquoi je n'avais rien compris la premiere fois. La premiere fois que j'ai testé ton prg easy draw, c'etait sous linux et là on ne voyait que les croix rouges et rien d'autre. As-tu testé ton prog sous linux ?
guest226-Feb-2007/17:56:27+1:00
nah, pas testé.
Mais je sais que sous linux y'a des problèmes avec Draw.
Surtout avec les fontes vectorielles, faut faire un truc en plus pour les voir, je modifierai mon script à l'occasion.
neoreb26-Feb-2007/18:09:28+1:00
j'ai constaté aussi que q-plot.r avaient quelques pbs sous linux.
easy draw est impressionnant!

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2