Last year, qtxie worked on a toy text backend project and submitted a PR for that. After some extra additions and testing recently, it has now been merged even if it is still incomplete, it is usable enough. So, in addition to the shiny GUI backends in Red/View, now we have an old-school text-based user interfaces (TUI) backend for the View engine!
The new TUI backend has currently a subset of the GUI backends features. Here is an overview:
- View styles: base, panel, button, check, radio, field, text, progress, rich-text, image and text-list.
- Draw commands: text, line, box, triangle, circle, ellipse (block-based for now).
- Rich-text supported in Draw.
- Keyboard handling: key-down and key events (which are the same event).
- Mouse handling: disabled by default. Use system/view/platform/mouse-event?: yes to enable it.
- Images support Truecolor (24-bit RGB) for image rendering if the terminal supports it, otherwise it falls back to 256 colors.
- Timers supported through /rate facet.
- Facets supported: /offset, /size, /text, /image, /color, /data, /enabled?, /visible?, /selected, /flags, /options, /pane, /rate, /para and /draw.
- Flags supported: password and all-over.
- Frames drawing using squared or rounded corners (
- Limited ANSI escape codes support in /text facet, only Colors / Graphics Mode codes.
- Uses 256 colors for text. It should works fine on most of the terminals.
- Works on the big-3 platforms (Linux, macOS and Windows10/11).
To use the TUI backend in your own compiled code, you need to add the two following options in the Red header block:
Needs: 'View Config: [GUI-engine: 'terminal]
Here are a few examples, starting with a HelloWorld!:
view [text "Hello TUI World!"] Hello TUI World!
When view is invoked, an event loop is launched. In order to return back to the console prompt, press the Escape key.
Here is an animated example using a progress bar:
view [ bar: progress 30% rate 10 on-time [ face/data: remainder (face/data + 10%) 100% info/text: form face/data info/font/color: random white ] info: text 4 font-color white "30%" ]
Spinners are also fun to watch:
Here is a rich-text example. Press TAB key to switch focus between the buttons. Press Enter key to push the button.
btn-quit: rtd-layout [i/red ["Q"] "uit"] view compose/deep [ rich-text 40x3 transparent data [ yellow "Hello"white red " Red " green "World!^/" u "Underline" /u " " s "Strike" /s i " Italic" /i ] return button "button 1" button 4x2 draw [text 0x0 (btn-quit)] [unview] ]
An example of mouse support (not all the terminals have mouse support):
system/view/platform/mouse-event?: yes view [panel 80x20 [base 11x1 center "drag me😀" loose]]
Simulating old-style text interfaces:
view [ panel navy 40x15 draw [ pen off fill-pen black box 5x4 36x10 fill-pen pewter pen black box 4x3 35x9 pen red text 15x3 "Hello Red" ][ origin 5x5 rich-text 30x1 pewter data [ green "Welcome" yellow " to" red " Red " u "TUI" /u blue " World!" ] return pad 12x1 button 4 "<OK>" [print "Hi!"] ] ]
File and folder requesters are also available in TUI, navigation is done using TAB and arrow keys, selection using Enter key:
Images support:
url: https://upload.wikimedia.org/wikipedia/en/e/e9/Red_Language_Tower_Logo.png view [image url 32x15]
Here is the same image displayed in TUI next to the GUI version:
Some examples of 2D vector graphics using the Draw dialect (currently using only block graphics, braille-based graphics in the future):
view [ base 80x40 transparent draw [ pen orange triangle 3x2 18x5 5x15 fill-pen blue circle 30x8 5 pen off fill-pen green ellipse 50x2 15x15 pen brick fill-pen brick box 3x20 15x30 pen gold line 20x30 28x20 40x28 44x24 ] ]
A special mention to group-box widget. It has a couple of new options for the frame style:
border-corners: round | #(none) border-color: #(tuple!)
view [ group-box font-color green " Folders " 26x8 options [ border-corners: round border-color: 255.0.0 ] group-box " Files " 26x8 ]
What's next?
We are finishing the work on some significant improvements to the Red and R/S memory management sub-systems and garbage collector that will bring them to the level required for a Red v1.0. Those changes will be released in a bumped 0.6.6 version. Those memory improvements are also needed for completing the work on the async IO branch.
Another version bump will follow with the deprecation of the high-level Red compiler and the addition of a new powerful layer to our Red tower of languages. All those changes are pre-requirements to start our work on 64-bit support.
In the meantime, enjoy this new toy!