RETerm to The Terminal with a GUI

When it comes to user interfaces, most (if not all) software applications can be classified into one of three categories:

Text Based - whether they entail one-off commands, interactive terminals (REPL), or text-based visual widgets, these saw a major rise in the 50s-80s though were usurped by GUIs in the 80s-90s

Graphical - GUIs, or Graphical User Interfaces, facilitate creating visual windows which the user may interact with via the mouse or keyboard. There are many different GUI frameworks available for various platforms

Web Based - A special type of graphical interface rendered via a web browser, many applications provide their frontend via HTML, Javascript, & CSS

In recent years modern interface trends seem to be moving in the direction of the Web User Interfaces (WUI), with increasing numbers of apps offering their functionality primarily via HTTP. That being said GUIs and TUIs (Text User Interfaces) are still an entrenched use case for various reasons:

Web browsers, servers, and network access may not be available or permissable on all systems

Systems need mechanisms to access and interact with the underlying components, incase higher level constructs, such as graphics and network subsystems fail or are unreliable

Simpler text & graphical implementations can be coupled and optimized for the underlying operational environment without having to worry about portability and cross-env compatability. Clients can thus be simpler and more robust.

Finally there is a certain pleasing ascethic to simple text interfaces that you don't get with GUIs or WUIs. Of course this is a human-preference sort-of-thing, but it's often nice to return to our computational roots as we move into the future of complex gesture and voice controlled computer interactions.

When working on a recent side project (to be announced), I was exploring various concepts as to the user interface which to throw ontop of it. Because other solutions exist in the domain which I'm working in (and for other reasons), I wanted to explore something novel as far as user interaction, and decided to expirement with a text-based approach. ncurses is the goto library for this sort of thing, being available on most modern platforms, along with many widget libraries and high level wrappers

Unfortunately ncurses comes with alot of boilerplate and it made sense to seperate that from the project I intend to use this for. Thus the RETerm library was born, with the intent to provide a high level DSL to implmenent terminal interfaces and applications (... in Ruby of couse <3 !!!)

RETerm, aka the Ruby Enhanced TERMinal allows the user to incorporate high level text-based widgets into an orgnaized terminal window, with seemless standardized keyboard interactions (mouse support is on the roadmap to be added). So for example, one could define a window containing a child widget like so:

require 'reterm' include RETerm value = nil init_reterm { win = Window . new :rows => 10 , :cols => 30 win . border! update_reterm slider = Components :: VSlider . new win . component = slider value = slider . activate! } puts "Slider Value: #{ value } "

This would result in the following interface containing a vertical slider:

RETerm ships with many built widgets including:

Text Entry

Clickable Button

Radio Switch/Rocker/Selectable List

Sliders (both horizontal and vertical)

Dial

Ascii Text (with many fonts via artii/figlet)

Images (via drawille)

RETerm is now available via rubygems. To install, simplly:

$ gem install reterm

That's All Folks ... but wait there is more!!! Afterall:

For a bit of a value-add, I decided to implement a standard schema where text interfaces could be described in a JSON config file and loaded by the framework, similar to xml schemas which GTK and Android use for their interfaces. One can simply describe their interface in JSON and the framework will instantiate the corresponding text interface:

{ "window" : { "rows" : 10 , "cols" : 50 , "border" : true , "component" : { "type" : "Entry" , "init" : { "title" : "<C>Demo" , "label" : "Enter Text: " } } } }

To assist in generating this schema, I implemented a graphical designer, where components can be dragged and dropped into a 2D canvas to layout the interface.

That's right, you can now use a GUI based application to design a text-based interface.

The Designer itself can be found in the same repo as the RETerm project, loaded in the "designer/" subdir.

To use if you need to install visualruby (a high level wrapper to ruby-gnome) like so:

$ gem install visualruby

And that's it! (for real this time) This was certainly a fun side-project to a side-project (toss in a third "side-project" if you consider the designer to be its own thing!). As I to return to the project using RETerm, I aim to revisit it every so often, adding new features, widgets, etc....

EOF

CLS