r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[!RebGUI] A lightweight alternative to VID

Vincent
9-Apr-2005
[525]
construct: func [
    block [block!] /with object [object!]
/local nb spec values name value
][
    if not with [object: object!]
    spec: copy []
    values: copy []
    parse/all :block [
        any [
            to set-word! (nb: 0) some [
                set name set-word! (nb: nb + 1 append spec :name)
            ]
            set value skip (

                insert tail values nb insert/only tail values :value
            )
        ]
    ]
    append spec none
    object: make object spec
    foreach [nb value] values [
        loop nb [
            set in object (to-word first spec) 

                either find [true false none on off] :value [do value][:value]
            spec: next spec
        ]
    ]
    object
]
Ashley
10-Apr-2005
[526]
Impressive! ;)
Robert
10-Apr-2005
[527]
WRT my question about extending/customizing layout. Would it be possible 
to add something to RebGUI so that this is possible:
	if my-var > 5 [optional: button red 100]
Ashley
10-Apr-2005
[528x2]
Not something I've ever needed myself, but certainly possible. I'd 
echo Anton's comment from the View group; "But what syntax is desired?"
Ah, nailed the radio-group problem under 1.2.1 by replacing this 
line:

	pos: pos + either size/y > 20 [0x20] [as-pair width 0]

with these two:


 tmp: either size/y > 20 [0x20] [as-pair width 0] ; required for 1.2.1
	pos: pos + tmp
Vincent
10-Apr-2005
[530x2]
Yes, 1.2.1 crashes with 
pair! + add pair! * number! pair! * number! 
changing the 'as-pair definition can fix the crash too : 
as-pair: func [x y] [(1x0 * x) + (0x1 * y)] ; 'add -> '+

as-pair: func [x y] [to-pair reduce [to-integer x to-integer y]] 
; earlier method
Proposal: IMHO, it would be better to use the VID convention for 
auto-size: negative size -> auto-size

as 9999 can lead to weird errors and crashs, if someone set dimensions 
to 999x999, or worst 99999x99999 .

...and 10k screen size isn't that improbable (the size of a virtual 
screen can be that big!)
Ashley
10-Apr-2005
[532]
The "+" version of as-pair has fixed all the 1.2.1 crashes (and got 
rid of a few 1.2.1 specific work arounds).
Vincent
10-Apr-2005
[533x2]
cool :-) I had that problem with the first RebGUI alpha, until I 
changed the 'as-pair definition.
The memory leak is a known behaviour. The memory allocated is free 
by the GC after a total of 1 - 2 megabytes.

http://www.rebol.org/cgi-bin/cgiwrap/rebol/ml-display-thread.r?m=rmlYRJQ
Ashley
10-Apr-2005
[535x2]
I was wondering when someone was going to ask about the whole 9999 
thing. ;) It's an optimization to avoid a redundant size assignment 
prior to 'size-text but has the problems you quoted. I'll probably 
change it back to -1x-1 in the next build or two.
Thanks for the link ... that and some testing has convinced me to 
remove the 'show redefine from the next build.
shadwolf
11-Apr-2005
[537x12]
I'm working on tab-panel 2 arrows insertion ;)
first change into the arrow/feel/engage down  event you will need 
to add if face/action [do face/action] to enable the arrow to launch 
action ;:)
I started the work on arrow motion ;)
in the tab-panel so for now no code is available maybe later to night 
(I have yet some little things done ;)
sorry face/action in arrow was yet supported  !!!
im don't know why the supplyed action for the tab-panel is not doed 
on mouse done avant ...
TAB-PANEL widget looks like :
redraw: function [face act pos] [test-size test-wid] [
			     
				if act = 'show [face/pane/1/size: face/size - 0x20
					either not dir-buttons [
					 	dir-buttons: true
					 	test-wid:  last face/pane
			    		test-size: test-wid/offset/x + test-wid/size/x
						if greater? test-size face/size/x  [
			    			insert tail face/pane face/l-arw: make arrow [
		        				size: 20x20
			    				offset: as-pair (face/size/x - 40) 0
			    				data: 'left
			    				action: [print "you clicked left" ]
		     				] do face/l-arw/init
			    			insert tail face/pane face/r-arw: make arrow [
		        				size: 20x20
			    				offset: as-pair (face/size/x - 20) 0 
			    				action: [print "you clicked right" ]
			    				data: 'right
		     				] do face/r-arw/init
	     				]
		     		 
	     			][	
	     				face/r-arw/offset: as-pair (face/size/x - 20) 0 
	     				face/l-arw/offset: as-pair (face/size/x - 40) 0 
	     			]
		     		

       print "la liste des bouttn est plus grande  que ce que l'on voit!!!" 
		    	]
tab-panel/feel/redraw offcourse
in it the arrow/action is not done when we make a click on them ... 
pretty anoying for the rest ...
another thing anoying is that we need to move the buttons so to do 
this easier we need to pack the header button of the tab-panel into 
two boxes in order to slide them ;)
this means the complete change of the feel event switch for the header 
to adapt them to the new path face/parent-face/parent-face ;)
Ashley
11-Apr-2005
[549]
re: action. Try:

	action: does [print "you clicked right" ]
shadwolf
11-Apr-2005
[550x9]
k
Well I'm going to sleep :)  I have 2 bugs with current implementation 
1) clicking into the panel arrow is not possibe ... 2)  header button 
countainer and sub countainer have the 100x100 size ...
tab-panel: make face [
		color:	none
		pane:	[]
		l-arw: none 
		r-arw: none
		dir-buttons: false
		feel:	make default-feel [
			redraw: function [face act pos] [test-size test-wid] [
				if act = 'show [face/pane/1/size: face/size - 0x20
; 					
; 				 	test-wid: face/pane/1
; 		    		test-size: test-wid/size/x
; 					if greater? test-size face/size/x  [
; 						either not dir-buttons [
; 				 			dir-buttons: true
; 		    				insert tail face/pane face/l-arw: make arrow [
; 	        					size: 20x20
; 		    					offset: as-pair (face/size/x - 40) 0
; 		    					data: 'left
; 		    					action: [print "you clicked left" ]
; 	     					] do face/l-arw/init
; 		    				insert tail face/pane face/r-arw: make arrow [
; 	        					size: 20x20
; 		    					offset: as-pair (face/size/x - 20) 0 
; 		    					action: [print "you clicked right" ]
; 		    					data: 'right
; 	     					] do face/r-arw/init
; 	 					][	
; 	 						face/r-arw/offset: as-pair (face/size/x - 20) 0 
; 	 						face/l-arw/offset: as-pair (face/size/x - 40) 0 
; 	 					]
; 	     			]

; 			    print "la liste des bouttn est plus grande  que ce que l'on 
voit!!!" 
		    	]
			]
		]
		
		init:	has [tab-offset last-tab] [
			;	create main display area
			insert pane make face [ offset: 0x20 edge: default-edge]
			;	add tabs
			tab-offset: 0x0

   insert tail pane make face [ offset: 0x0 pane: [] color: none ]
			container: last pane

   insert container/pane make face [ offset: 0x0 pane: [] color: none]
			foreach [title spec] data [
				insert tail container/pane/1/pane make face [
					offset:	tab-offset
					size:	1x20
					pane:	[]
					text:	title
					effect:	reduce ['round edge-color 5 'draw copy []]
					resize:	none
					font:	make default-font [align: 'center valign: 'bottom]
					para:	default-para
					feel:	make default-feel [
						over: func [face act pos] [
							either act [

        insert face/effect/draw compose [	; compose required for AGG betas
									pen over-color
									line 3x1 (as-pair face/size/x - 4 1)
									line 2x2 (as-pair face/size/x - 3 2)
									line 1x3 (as-pair face/size/x - 2 3)
								]
								show face
							][

        if face/parent-face/parent-face/parent-face/pane/1/pane <> face/data 
        [	; clear unless selected
									clear face/effect/draw
									show face
								]
							]
						]
						engage: function [face act event] [pf old-face] [
							if event/type = 'down [
								pf: face/parent-face
								pf3: pf/parent-face/parent-face

        if pf3/pane/1/pane = face/data [return]	; has a new tab been selected?
								clear face/effect/draw
								old-face: pick pf/pane pf3/data			; find previous tab
								old-face/resize: pf3/size				; remember last size
								old-face/size: old-face/size - 0x1		; deflag old
								clear old-face/effect/draw
								face/size: face/size + 0x1				; flag new
								face/feel/over face true 0x0
								pf3/data: index? find pf/pane face		; set new pane#
								pf3/pane/1/pane: face/data				; init tab panel
								if pf3/size <> face/resize [				; recursive resize
									span-resize pf3/pane/1 pf3/size - face/resize
									face/resize: pf3/size
								]
								show pf3
							]
						]
					]
				]
				last-tab: last container/pane/1/pane

    last-tab/size/x: 10 + first size-text last-tab	; set tab title width

    display/layout "" spec last-tab					; generate tab spec into tab 
    pane
				last-tab/data: last-tab/pane					; swap pane into data
				last-tab/pane: none								; clear pane
				last-tab/resize: size							; original panel size

    tab-offset/x: tab-offset/x + last-tab/size/x	; set offset for next 
    tab title
			]
			print "size et countainer a la con !!"
			probe size/x
			container/size: as-pair size/x 20
			probe container/size/x
			container/pane/1/size: container/size

   container/pane/1/pane/1/size: container/pane/1/pane/1/size + 0x1	; 
   flag 1st tab
			data: 1								; set pane#
			pane/1/pane: container/pane/1/pane/1/data			; init tab panel

   container/pane/1/pane/1/feel/over container/pane/1/pane/1 true 0x0	; 
   flag first as active
		]
	]
as I inserted 2 countainers to hold header buttons in tab panel I 
had to recode lot of path to be able to locate the convienient widgets 
:=
:)))
i solve both bugs by adding 9999x20 in the containers definition
now I have a new bug the 2 last header button are inserted into the 
secon tab-panel (the demo one ;) ))
how could they jump there  ???
I have no Idea :)
shadwolf
12-Apr-2005
[559x6]
well ashley the last code is posted to you private area (don't want 
to garbage this directory)
have fun ;)
the last thing to be done is: 1) scroll the sub countainer when we 
clic on the arrows 2) when the windows is bigger enought the arrows 
must desapeare been hided :)
sure you need first to find why the 2 last button header of the main 
tab panel jumps to the secon tab panel
Ashley: I posted to you in private my l	astest code.  visualisation 
of the arrows and scoll of the header buttons is done
there is still some bugs that I don't know how to solve them ... 
this time I'm really off ...
shadwolf
21-Apr-2005
[565x3]
ASHLEY  LOOK TO PRIVATE FOR A  SCROLLER WITH NONE  JITTERRING DRAGGER 
IMPLEMENTATION.
and lot of information of what I done and how :)
for all people reading this groups tab-panel problems have been solve
Gregg
21-Apr-2005
[568]
Excellent Shadwolf. Glad to see things are still active and progressing 
on this. I wish I weren't so busy at the moment, and I hope the community 
will help to make RebGUI a model for future projects.
shadwolf
21-Apr-2005
[569x2]
for this project I think the most important thing is the continuty 
there was so mutch widgets lib more or less evoluted that have been 
abandonned because no body was conserned by the futurs of those library 
I want to participate more but my implementations in general are 
very code consumming ;).
but I'm learning lot of things.
Ashley
24-Apr-2005
[571]
Alpha2 build available at: http://www.dobeash.com/files/RebGUI-020.zip

Highlights include:


 - New, unit based sizing model (see http://www.dobeash.com/it/rebgui/display.html)

 - Improved language localization (see http://www.dobeash.com/it/rebgui/locale.html)

 - New arrow, chevron, check-group, led-group, scroller, spinner and 
 drop-list widgets
	- Lots of minor fixes
	- show redefine removed
	- Use of -1 instead of 9999 to denote auto-size
	- Aesthetic improvements (use of gradients)
	- %tour.r substantially rewritten

Known issues

	- spinner and drop-list widgets need more work
	- scroller needs more work (resizeable dragger)

In progress

	- Improved tab-panel (shadwolf)
	- Menu (cyphre / shadwolf)
	- tabbing
	- field input validation (field input masks, etc)

That leaves less than half a dozen widgets to go!

	list		single column
	listview	multi-column
	treeview
	popup-menu	context menu
	status		status bar with one or more “segments”
Robert
24-Apr-2005
[572x2]
Great stuff!! One question WRT fields uses in specification and runtime, 
for example LED-Group. Is it possible to alter the led-group content? 
Adding or removing possible entries in it? Or is this a one-time 
action when the widget initializes?
resizing system: How about a method that will store the layout if 
altered by the user and reload the GUI in the same layout? It always 
drives me nuts if I have to resize application splitter bars, panes 
etc. when starting again.
Pekr
24-Apr-2005
[574]
Rebgui starts to look very nicely polished (UI wise), just a bit 
WinXP-ish, but it never mind here ... maybe OSx users will complain 
later :-)