Turbo Vision for Rust¶

The Borland text-mode UI framework, rebuilt in Rust. Menus, windows, dialogs, validators, editors and palettes, drawn in a terminal, on a desktop that still looks like 1991.

What it gives you¶

The crate is a full port of Borland's class library, not a lookalike. The class tree

TView → TGroup → TWindow → TDialog survives as a stack of Rust traits, the

event model is the same three-phase dispatch, the palettes are the original Borland colour tables,

and the commands still start at cmQuit. If you wrote Turbo Vision in Pascal or C++ you already

know most of this library.

-

:material-application-outline: An application shell A menu bar, a status line, a desktop with draggable, resizable, shadowed windows, and a modal loop that behaves like TProgram::run.

-

:material-form-textbox: Real controls Input lines, buttons, check boxes, radio buttons, list boxes, combo boxes, scroll bars, trees, split panes, progress bars, tooltips and history dropdowns.

-

:material-check-decagram: Validators Filter, range and picture validators, wired into input lines the way Borland wired them, so a dialog refuses to close on bad data.

-

:material-file-document-edit: An editor A text editor view with selection, clipboard, undo and syntax highlighting, plus the file-open and change-directory dialogs that go with it.

-

:material-palette: The Borland palettes The palette chain is pushed down the view tree at draw time, so a control picks up its colour from the window that owns it, exactly as the original did.

-

:material-console-network: A terminal layer A Backendtrait with a crossterm implementation, an optional SSH server behind a feature flag, and a mock terminal your tests can draw into and read cells back from.

Thirty seconds of code¶

use turbo_vision::core::status_data::StatusItemBuilder;

use turbo_vision::prelude::*;

use turbo_vision::views::status_line::StatusLine;

fn main() -> turbo_vision::core::error::Result<()> {

let mut app = Application::new()?;

let (w, h) = app.terminal.size();

app.set_status_line(StatusLine::new(

Rect::new(0, h as i16 - 1, w as i16, h as i16),

vec![

StatusItemBuilder::new()

.text("~Alt-X~ Exit")

.key("Alt+X")

.command(CM_QUIT)

.build(),

],

));

app.run();

Ok(())

}

Where to go next¶

It looks like this¶

Credits¶

Built by Enzo Lombardi, from Borland's original Turbo Vision 2.0 and the kloczek C++ port. MIT licensed.