Racket GUI: text aligned to the left of other text

57 views
Skip to first unread message

Christopher Lemmer Webber

unread,
Aug 10, 2020, 3:32:41 PM8/10/20
to racket...@googlegroups.com
Hello,

I'm building a little chat application with Racket. Overall Racket's
GUI tools are quite comfortable, and I'm just using Rakcet's text editor
stuff to build the chat. But a fairly standard thing to do with chat
applications is to have text like:

(Beware, fixed width ascii art ahead)

.----------------------------------------------------------------.
| FooChat Deluxe [X]|
|----------------------------------------------------------------|
| File Blah |
|----------------------------------------------------------------|
| <alice> | It's snowing outside!! | alice |
| <bob> | In August???? | bob |
| <alice> | Nevermind, the snow is a representation of | carol |
| | collective anxiety about the world | |
| <bob> | Oh okay it is snowing then | |
|----------------------------------------------------------------|
| [Better go get some snow shoes then___________________] [Send] |
'----------------------------------------------------------------'

The core idea there being that usernames left-align to the text.

I'm not sure what's the nicest way to do this, though I've taken a guess
that maybe the "Show/Hide Line Numbers" in DrRacket is the best example.
I'd be happy to look at that but I can't really find it in the drracket
repository and am not sure where it would be?

(I guess one other complication is that if you copy-pasta text it would
be great to still be able to copy paste the names too, but I can think
of some kludgery that might make that possible.)

- Chris

Robby Findler

unread,
Aug 10, 2020, 3:43:20 PM8/10/20
to Christopher Lemmer Webber, Racket Users
That code is in the framework: https://github.com/racket/gui/blob/master/gui-lib/framework/private/text-line-numbers.rkt

You might also consider having two text%s, one with the names and one with the rest. They would scroll independently in that case, but you can hide the scrollbars on one and override various callbacks to keep them scrolled to the same place.

Robby


--
You received this message because you are subscribed to the Google Groups "Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to racket-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/87lfime1pm.fsf%40dustycloud.org.

Alex Harsanyi

unread,
Aug 10, 2020, 6:26:09 PM8/10/20
to Racket Users
The simplest thing is to just use tabs.   A line of text would be "<user>\tYour Message here" and an overflowing line would be "\tOverflowing message".  Yes, this will work for variable width fonts.

The `text%` class  has a `set-tabs` method which allows setting the tab stops in drawing units on the canvas, so you can override `on-display-size` to set the tab width to be a percentage of the display, or you can leave it as a fixed width.

Alex.

Justin Zamora

unread,
Aug 10, 2020, 10:44:26 PM8/10/20
to Christopher Lemmer Webber, Racket Users
Another, less lightweight way is to use panels for different parts of
the chat windows. I put together a sample at
https://gist.github.com/zamora/1cfc6480f7703735dffa3169facfbf10
chat-window.png

Christopher Lemmer Webber

unread,
Aug 11, 2020, 8:54:10 PM8/11/20
to Robby Findler, Racket Users
Ah great, thank you Robby! I'll give both options a try. :)

Christopher Lemmer Webber

unread,
Aug 11, 2020, 8:54:54 PM8/11/20
to Alex Harsanyi, racket...@googlegroups.com
Curious... thank you, I was trying to figure out what set-tabs meant. ;)

Christopher Lemmer Webber

unread,
Aug 11, 2020, 8:58:25 PM8/11/20
to Justin Zamora, Racket Users
Thanks! Yes I was looking at a route like that at first but I found
that there wasn't really a way to do fancier markup like links, etc
using just message% (unless I'm missing something...!)

Hence my abuse of an editor that's mostly-locked (idea borrowed from the
racket web browser code) ;)

Simon Schlee

unread,
Aug 12, 2020, 5:34:29 AM8/12/20
to Racket Users
Another approach might be to use multiple editor-snip% https://docs.racket-lang.org/gui/editor-snip_.html

Or possibly together with other snip instances, I currently don't have the time to experiment with it
and no experience with pasteboards, so I am not sure whether that would work well and I am just dropping the idea ;)

Laurent

unread,
Aug 12, 2020, 6:19:13 AM8/12/20
to Christopher Lemmer Webber, racket-users@googlegroups.com List
You can also cheat by writing the name with the same color as the background on the next lines (kind of like \vphantom in LaTeX). This has the advantage of aligning based on the length of each name instead of pushing everything to the right of the longest name, while working for any font.

A better approach to achieve the same result is to do a real \vphantom by writing the text in a separate box, obtaining the width and then inserting a blank snip of the same width.

But if you use a fixed-width font, you can of course replace the names with spaces on the next lines.

Christopher Lemmer Webber

unread,
Aug 12, 2020, 9:29:15 AM8/12/20
to Simon Schlee, racket...@googlegroups.com
That's a very interesting idea... I might give that a try!
Reply all
Reply to author
Forward
0 new messages