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

World: r3wp

[!RebGUI] A lightweight alternative to VID

Awi
17-Feb-2011
[8912x4]
I just want to share my modifications of the chat widget in b177, 
I needed a slimmer chat. It should also fix the resize issue:
REBOL []
slim-chat: make baseface [
	options: {
		USAGE:

   chat2 120 data ["Bob" blue "My comment." yello 14-Apr-2007/10:58]

		DESCRIPTION:
			Three column chat display as found in IM apps such as AltME.
			Messages are appended, with those exceeding 'limit not shown.

		OPTIONS:

   [limit n] where n specifies number of messages to show (default 100)
			[id n] where n specifies id column width (default 10)
			[user n] where n specifies user column width (default 15)
			[date n] where n specifies date column width (default 25)
	}
	size: 200x100
	pane: []
	data: []
	edge: default-edge
	action: make default-action [
		on-resize: make function! [face] [

   poke face/pane/2/para/tabs 2 face/pane/1/size/x - sizes/slider - 
   (sizes/cell * any [select face/options 'date 25])
			face/redraw/no-show
		]
	]


 height: 0 ; actual pixel height of all messages (-1 ensures first 
 message is offset to hide it's edge
	rows: 0 ; number of messages
	limit: none ; last n messages to display

	append-message: make function! [
		user [string!]
		user-color [tuple! word! none!]
		msg [string!]
		msg-color [tuple! word! none!]
		date [date!]
		/no-show row
		/local p y t1 t2 t3
	] [
		;	cache current tab stops
		p: self
		t1: pick pane/2/para/tabs 1

  t2: pane/1/size/x - sizes/slider - (sizes/cell * any [select p/options 
  'date 25])

		p: self
		;	get height of message
		y: max sizes/line 4 + second size-text make baseface [
			size: as-pair p/size/x - sizes/slider + 1 10000
			text: msg
			font: default-font
			para: para-wrap
		]

		

		insert tail pane/1/pane reduce [
			make baseface [
				offset: as-pair -1 height - 1
				size: as-pair t2 21
				span: all [p/span find p/span #W #W]
				text: user
				edge: make default-edge [size: 0x1]

    font: make font-top [color: either word? user-color [get user-color] 
    [user-color] style: 'bold]
				color: either word? msg-color [get msg-color] [msg-color]
			]
			make baseface [
				offset: as-pair -1 height - 1 + 20
				size: as-pair p/size/x - sizes/slider + 1 y
				text: form msg
				color: either word? msg-color [get msg-color] [msg-color]
				edge: make default-edge [size: 0x1]
				font: default-font
				para: para-wrap
			]
			make baseface [
				offset: as-pair t2 - 1 height - 1

    size: as-pair (sizes/cell * any [select p/options 'date 25]) + sizes/slider 
    + 1 21
				span: all [p/span find p/span #W #X]

    text: form either now/date = date/date [date/time] [date/date]
				edge: make default-edge [size: 0x1]
				font: make font-top [style: 'bold align: 'right]
				color: either word? msg-color [get msg-color] [msg-color]
			]
		]
		height: height + y - 1 + 20
		if ((length? pane/1/pane) / 3) > limit [
			y: pane/1/pane/2/size/y + pane/1/pane/1/size/y - 2
			remove/part pane/1/pane 3
			foreach [u m d] pane/1/pane [
				u/offset/y: u/offset/y - y
				m/offset/y: m/offset/y - y
				d/offset/y: d/offset/y - y
			]
			height: height - y
		]
		unless no-show [
			insert tail data reduce [user user-color msg msg-color date]
			pane/1/size/y: height
			pane/3/ratio: pane/3/size/y / height
			show p
		]

  show pane/1 ; !!! this cleans up artifacts but "eats" other widgets 
  redraw events !!!
	]


 set-user-color: make function! [id [integer!] color [tuple! word! 
 none!] /local idx] [
		if any [zero? id id > rows] [exit]
		poke data id * 5 - 3 color
		if limit > (rows - id) [

   idx: either rows > limit [(id + limit - rows) * 3 - 2] [id * 3 - 
   2]

   pane/1/pane/:idx/font/color: either word? color [get color] [color]
			show pane/1/pane/:idx
		]
	]


 set-message-text: make function! [id [integer!] string [string!] 
 /local idx] [
		if any [zero? id id > rows] [exit]
		poke data id * 5 - 2 string
		if limit > (rows - id) [

   idx: either rows > limit [(id + limit - rows) * 3 - 1] [id * 3 - 
   1]
			insert clear pane/1/pane/:idx/text string
			redraw
		]
	]


 set-message-color: make function! [id [integer!] color [tuple! word! 
 none!] /local idx] [
		if any [zero? id id > rows] [exit]
		poke data id * 5 - 1 color
		if limit > (rows - id) [

   idx: either rows > limit [(id + limit - rows) * 3 - 1] [id * 3 - 
   1]
			pane/1/pane/:idx/color: either word? color [get color] [color]
			show pane/1/pane/:idx
		]
	]

	redraw: make function! [/no-show /local row] [
		clear pane/1/pane
		height: 0
		rows: (length? data) / 5
		row: max 0 rows - limit: any [select options 'limit 100]

  foreach [user user-color msg msg-color date] skip data row * 5 [

   append-message/no-show user user-color msg msg-color date row: row 
   + 1
		]
		pane/1/size/y: height
		pane/3/ratio: either zero? height [1] [pane/3/size/y / height]
		unless no-show [show self]
	]

	init: make function! [/local p] [
		unless options [options: copy []]
		p: self
		limit: any [select options 'limit 100]
		; chat pane (1)
		insert pane make baseface [
			offset: as-pair 0 sizes/line
			size: p/size - as-pair sizes/slider sizes/line
			span: all [p/span find p/span #W #W]
			pane: []
		]
		;	heading (2)
		insert tail pane make gradface [
			offset: -1x-1
			size: as-pair p/size/x sizes/line
			text: "Chat"
			span: all [p/span find p/span #W #W]
			font: make font-button [align: 'left]
			para: make default-para [tabs: [0 0]]
		]
		;	set header tabs

  poke pane/2/para/tabs 1 sizes/cell * (any [select options 'user 15])

  poke pane/2/para/tabs 2 size/x - sizes/slider - (sizes/cell * any 
  [select options 'date 25])
		;	vertical scroller
		insert tail pane make slider [
			offset: as-pair p/size/x - sizes/slider sizes/line - 2
			size: as-pair sizes/slider p/size/y - sizes/line + 2
			span: case [
				none? p/span [none]
				all [find p/span #H find p/span #W] [#XH]
				find p/span #H [#H]
				find p/span #W [#X]
			]
			action: make default-action [
				on-click: make function! [face] [
					if height > face/size/y [

      face/parent-face/pane/1/offset/y: (height - face/size/y * negate 
      face/data) + sizes/line
						show face/parent-face
					]
				]
			]
		]
		pane/3/init
		action/on-resize self
	]
]
And here is a screenshot: http://uploadpad.com/files/Chat.png
To use this, just save it as slim-chat in rebgui/widgets, and then 
do create-distribution.r. It's fully syntax-compatible with the existing 
chat widget.
I forgot, you will need to add #include %widgets/slim-chat.r in rebgui-widgets.r
GrahamC
17-Feb-2011
[8916]
indonesian?
Awi
17-Feb-2011
[8917]
yes :-)
Awi
25-Feb-2011
[8918x3]
another minor bug in rebgui, I just mentioned it here so it's not 
lost:
REBOL []

do %rebgui.r
counter: 0
muline: copy ""
display "button color not reset" [	
	btn "start timer" [
		if tgl/text = "wait" [wait 0]
		print "hi"
	]
	tgl: toggle data ["wait" "no-wait"]
]
do-events
when a button does some activities, in this case 'wait', the button's 
color changed to the pushed state, but never gets back to it's original 
color.
it's b218
Gabriele
21-Mar-2011
[8921]
calling WAIT inside a vid face action is not really supported by 
REBOL. In practice, there are cases where you may need to do this, 
but it is always a bit tricky.
Awi
21-Mar-2011
[8922x2]
Thanks for the information Gabriele, I've been using this inside 
vid face action to wait for a data from serial port. Until now I 
have not encountered any issue. But maybe I'm just lucky.
What I needed is actually only the timer action of a face to process 
an internal command queue, and while doing this I read some data 
from serial port. If rebol had a timer object, I don't need the face 
anymore. But afaik there is no timer in rebol, since it does not 
support multithreading yet, with exception of the face timer.
Gabriele
24-Mar-2011
[8924]
Timers are not really related to multithreading. If you only need 
a timer, you can just use WAIT with a time! or integer! value. Also, 
one way to work around problems that may happen when using WAIT inside 
a face action is to disable the event port, then WAIT, then enable 
it again. Eg, in your above code, replace the WAIT 0 with:

    saved: system/ports/wait-list
    system/ports/wait-list: []
    wait 0
    system/ports/wait-list: saved


It may be better though to add the serial port to the wait list and 
handle things differently - I can't say without knowing more about 
your program.
Awi
24-Mar-2011
[8925x2]
That solved this issue, thanks for the hint.
On the timer topic, I needed a recurring event that fires every second, 
where I can do some processing, without blocking the main thread 
while waiting until the next event. In .Net I can achieve that using 
a timer object.
GrahamC
16-Apr-2011
[8927x2]
Ashley, any suggestions on how to detect inactivity so that I can 
log a user out of the application?
Do I have to track every event?
Ashley
17-Apr-2011
[8929]
How about checking stats/evals periodically (accounting for the calls 
that this in itself generates)?
GrahamC
17-Apr-2011
[8930]
I'll give that a go ...
Henrik
3-May-2011
[8931]
is there a simple/proper way to resize a rebgui window?
Ashley
4-May-2011
[8932]
build#218:

display "test" [
	box red #HW
	return
	button #Y "resize" [
		var: face/parent-face
		var/size: 300x300
		show var
	]
]
Henrik
4-May-2011
[8933]
thanks
Henrik
13-Jul-2011
[8934]
I need to copy the entire state of a rebgui table for an undo system. 
Any idea how to do that? Deep copying the face object is far too 
slow, so I guess I need to access particuar values in the table that 
will then update the table properly when calling REDRAW.
Ashley
13-Jul-2011
[8935]
table/data
table/widths
table/aligns
Henrik
14-Jul-2011
[8936]
Thanks
Awi
22-Aug-2011
[8937x2]
build#218:
do %rebgui.r
display "test scroll panel" [

 mytable: table options ["id" left .2 "name" right .8  ] data [1 "A" 
 2 "B" 3 "C"] [alert "see me?"]
]
do-events
I tried to fix the bug that selecting the third row brings up an 
empty alert window (no text). I've played with face-iterator and 
table widget source code, but don't know where to look further. If 
anyone can give a hint I would really appreciate it.
Awi
23-Aug-2011
[8939x2]
I found the bug, it's in the rebgui-widgets.r -> face-iterator

    font: either 'left = aligns/:i [default-font] [make default-font 
    [align: aligns/:i]]
should be replaced with

    font: either 'left = aligns/:i [make default-font []] [make default-font 
    [align: aligns/:i]]

otherwise, selecting a line will change default-font/color to white, 
thus any widgets using default-font shown thereafter will appear 
blank
Ashley, if you give me access, I would be more than glad to submit 
the changes back to the repository (including some other widgets 
that I might have fixed along the way)
GrahamC
23-Aug-2011
[8941]
Awi ... I started that repository.  Join up and I'll see if I can 
grant you write access.
Awi
23-Aug-2011
[8942]
Ok, I already following the project in codeplex
GrahamC
23-Aug-2011
[8943]
Ok, made you a developer .. hope that works
GrahamC
26-Aug-2011
[8944]
Awi ... do you now have write access to the repo?
Awi
6-Sep-2011
[8945]
Sorry Graham, I was in vacation recently. Yes, now I have write access 
to the repo. I will need to clean up a bit before posting my changes 
though.
Robert
26-Sep-2011
[8946]
GrahamC "Are the RebGUI widgets being released?" - No, as our internal 
RebGUI is a fork long time ago and I think it developed quite far 
away from the official version of RebGUI. So, not sure if it's useful 
for others.
Endo
1-Nov-2011
[8947x2]
When I add rows to a TABLE using the following code works well:
append my-table/data a-block
my-table/redraw


But when I make a block of data then set my-table/data to it, it 
doesn't work (nothing appears in my-table)
b: []
append b a-block
my-table/data: b
my-table/redraw

and the using my-table/add-row is also doesn't work.
Am I doing something wrong?
This shows the problem more clear:

gui-table/add-row ["a" "b" "c"]
gui-table/redraw ;works ok

b: copy gui-table/data

clear gui-table/data
gui-table/redraw ;clears the table

gui-table/data: copy b
gui-table/redraw ;shows nothing


There is something related directly to the DATA block inside TABLE 
functions I think.
GrahamC
1-Nov-2011
[8949]
you have to do this:

insert clear head gui-table/data a-block
gui-table/redraw

as there is a reference to the data block elsewhere
Endo
10-Nov-2011
[8950]
Where to download the latest RebGUI source codes? Sorry I found it 
a few days ago but cannot find now.
GrahamC
10-Nov-2011
[8951]
codeplex
Endo
10-Nov-2011
[8952]
Got it, thanks.
Endo
11-Nov-2011
[8953]
I downloaded the source codes for RebGUI but it looks it is not the 
latest version.

Many of the functions & styles are totally different in rebgui-92396.zip 
(source from codeplex) and in B117 (from dobeash website).
Is there any more recent version somewhere?
Ashley
11-Nov-2011
[8954]
b117 is the latest stable release. The b2xx series is a rewrite that 
is 95% complete.
Endo
11-Nov-2011
[8955]
Thank you. New UI looks very nice. It would be nice if table widget 
supports mouse wheel scrolling.
Endo
15-Nov-2011
[8956]
This line give error when you select an item in drop-list, I tested 
on latest svn version (218): Is it a known bug? (same error for edit-list)

do %rebgui.r display "Test" [drop-list "Black" data ["Red" "Green" 
"Blue"]] do-events
GrahamC
15-Nov-2011
[8957]
I normally specify a size for the drop-list
Endo
16-Nov-2011
[8958x2]
Doesn't change the result, still crash.

display "Test" [drop-list 30x4 "Black" data ["Red" "Green" "Blue"] 
box 40x40] do-events
Should I report this as a bug on codeplex?
display "Test" [d: drop-list 30x4 "Black" data ["Red" "Green" "Blue"] 
box 40x40] do-events

after crash when I type d/picked into console, it gives the error.

error happens in on-click, on the line "result: .... first picked"
MaxV
23-Dec-2011
[8960]
Hello everybody, I can't reach http://www.dobeash.com/RebGUI/dictionary/
 , is it normal?
Henrik
23-Dec-2011
[8961]
I get "Forbidden".