A Rust implementation of the classic Borland Turbo Vision text user interface framework.
Version 1.0.0 - PRODUCTION READY β
Based on kloczek Borland Turbo Vision C++ port here
Other C++ implementations:
This port achieves 100% API parity with kloczek port of Borland Turbo Vision C++. All features from the original framework have been implemented. While the codebase is complete and production-ready, it may contain bugs. Please report any issues you encounter!
The showcase demo with Calculator, Calendar, ASCII Table, and Puzzle windows demonstrating overlapping window management, z-ordering, and shadows.
A full-featured text editor (pascal_ide) editing its own source code, with menu bar, status line, and scrollable editing area.
Context-sensitive help system (F1) with scrollable content, rendered over the editor window.
A tree view widget displaying a hierarchical file system with expandable/collapsible directories, keyboard navigation, and selection highlighting.
The built-in file dialog with directory navigation, file list, and keyboard/mouse support.
- Complete UI Component Set: Windows, dialogs, buttons, input fields, menus, status bars, scrollbars
- Z-Order Management: Click any non-modal window to bring it to the front
- Modal Dialog Support: Modal dialogs block interaction with background windows
- Borland-Accurate Styling: Menu borders and shadows match original Borland Turbo Vision
- Scrollable Views: Built-in scrollbar support with keyboard navigation
- Text Viewer: Ready-to-use scrollable text viewer with line numbers
- Event-Driven Architecture:
- Three-phase event processing (PreProcess β Focused β PostProcess)
- Event re-queuing for deferred processing
- Owner-aware broadcast system to prevent echo back to sender
- Mouse Support: Full mouse support for buttons, menus, status bar, dialog close buttons, scroll wheel, and double-click detection
- Window Dragging and Resizing: Drag windows by title bar, resize by bottom-right corner
- Flexible Layout System: Geometry primitives with absolute and relative positioning
- Color Support: 16-color palette with Borland-accurate attribute system and context-aware remapping
- Cross-Platform: Built on crossterm for wide terminal compatibility
- SSH Support: Optional SSH backend to serve TUI applications over SSH connections
- Modal Dialogs: Built-in support for modal dialog execution
- Focus Management: Tab navigation and keyboard shortcuts
- ANSI Dump: Debug UI by dumping screen/views to ANSI text files (F12 for full screen, Shift+F12 for active view, with flash effect)
use turbo_vision::prelude::*;
fn main() -> turbo_vision::core::error::Result<()> {
// Create a window
let mut dialog = turbo_vision::views::dialog::DialogBuilder::new().bounds(Rect::new(10, 5, 50, 15)).title("My First Dialog").build();
// Create a button and add it to the window
let button = turbo_vision::views::button::Button::new(Rect::new(26, 6, 36, 8), "Quit", turbo_vision::core::command::CM_OK, true);
dialog.add(Box::new(button));
// Create the application and add the dialog to its desktop
let mut app = Application::new()?;
app.desktop.add(Box::new(dialog));
// Event loop
app.running = true;
while app.running {
app.desktop.draw(&mut app.terminal);
app.terminal.flush()?;
if let Ok(Some(mut event)) = app.terminal.poll_event(std::time::Duration::from_millis(50)) {
app.desktop.handle_event(&mut event);
if event.command == CM_OK {
// Handle button click
app.running = false;
}
}
}
Ok(())
}Tip: Press F12 at any time to capture full screen to screen-dump.txt, or F11 to capture active window/dialog to active-view-dump.txt - both with a visual flash effect for debugging!
The color palette system accurately replicates Borland Turbo Vision's behavior:
- Context-Aware Remapping: Views automatically remap colors based on their container (Dialog, Window, or Desktop)
- Owner Type Support: Each view tracks its owner type for correct palette inheritance
- Borland-Accurate Colors: All UI elements (menus, buttons, labels, dialogs) match original Borland colors
- Runtime Customization: Change the entire application palette at runtime with
app.set_palette()for custom themes
The palette system uses a three-level mapping chain:
- View palette (e.g., Button, Label) β indices 1-31
- Container palette (Dialog/Window) β remaps to indices 32-63
- Application palette β final RGB colors
You can customize the entire application palette at runtime to create custom themes:
// Create a custom palette (63 bytes, each encoding foreground << 4 | background)
let dark_palette = vec![/* 63 color bytes */];
// Set the palette - redraw happens automatically!
app.set_palette(Some(dark_palette));
// Reset to default Borland palette
app.set_palette(None);See examples/palette_themes_demo.rs for a complete example with multiple themes.
- core: Fundamental types (geometry, events, drawing, colors)
- terminal: Terminal I/O abstraction layer
- views: UI components (dialogs, buttons, menus, etc.)
- app: Application framework and event loop
This project includes extensive documentation for different audiences and use cases. Here's a recommended reading order based on your goals:
If you're new to Turbo Vision frameworks, follow this path:
- Quick Start (above) - Get a minimal example running
- Examples Overview - Browse 30+ working examples
cargo run --example showcase # Comprehensive feature showcase cargo run --bin pascal_ide # Full-featured text editor
- User Guide - Chapter 1 - Learn the basics
- User Guide - Chapter 2 - Handle events and commands
- User Guide - Chapter 3 - Create your first window
Continue with: Chapters 4-18 in the User Guide for comprehensive coverage of all features.
For practical application development:
- Custom Application Example - Complete walkthrough
- Biorhythm Calculator Tutorial - Build a real app step-by-step
- examples/showcase.rs - Study the comprehensive demo
- pascal_ide source - See a production-ready editor
If you're familiar with Borland Turbo Vision:
- Architecture Overview - Understand Rust adaptations
- Rust Implementation Reference - Technical details
- Turbo Vision Design - Complete design document
Key Differences: The Rust port uses composition over inheritance, but maintains the same event loop patterns, drawing system, and API structure as Borland's original.
When you need specific functionality:
- Palette & Colors: Palette System, Borland Palette Chart, Chapter 14
- Event Handling: Chapter 9 - Event-Driven Programming
- Forms & Input: Chapter 5 - Data Entry Forms, Chapter 13 - Validation
- Text Editing: Chapter 15 - Editor and Text Views
- Collections & Lists: Chapter 6 - Managing Data Collections
- Persistence: Serialization Guide, Quick Reference
- Application Structure: Chapter 10 - Application Objects
- Windows & Dialogs: Chapter 11 - Window and Dialog Box Objects
For API lookups and function signatures:
- Documentation Index - Master index of all documentation
- Rust API Catalog - Complete API listing
- API Catalog Index - Quick reference guide
- Inline Docs: Run
cargo doc --openfor generated documentation
If you want to modify or extend the codebase:
- Rust Coding Guidelines - Code style and best practices
- Chapter 8 - Views and Groups - Understanding the view hierarchy
- Study existing tests in
src/views/*/testsmodules
docs/
βββ DOCUMENTATION-INDEX.md # Master index
βββ RUST-CODING-GUIDELINES.md # Code style guide
βββ CUSTOM-APPLICATION-RUST-EXAMPLE.md # Complete app walkthrough
βββ BIORHYTHM-CALCULATOR-TUTORIAL.md # Step-by-step tutorial
βββ PALETTE-SYSTEM.md # Color system explained
βββ BORLAND-PALETTE-CHART.md # Color reference
βββ RUST-API-CATALOG.md # API reference
βββ TURBO-VISION-DESIGN.md # Complete design document
βββ SERIALIZATION-PERSISTENCE.md # Saving/loading data
βββ user-guide/ # 18-chapter comprehensive guide
βββ Chapter-01-Stepping-into-Turbo-Vision.md
βββ Chapter-02-Responding-to-Commands.md
βββ ... (Chapters 3-17)
βββ Chapter-18-Resources.md
examples/
βββ README.md # Examples index with descriptions
βββ showcase.rs # Comprehensive demo
βββ biorhythm.rs # Complete calculator app
βββ ... (30+ more examples)
demo/
βββ pascal_ide.rs # Production text editor
- Start Coding: Quick Start β Examples
- Learn Concepts: User Guide Chapter 1
- Build an App: Custom Application Example
- Get Help: Documentation Index
- Report Issues: GitHub Issues
Currently implements:
- β Core drawing and event system
- β Dialog boxes with frames and close buttons
- β Buttons with keyboard shortcuts
- β Static text labels (with centered text support)
- β Input fields
- β Menu bar with dropdowns and keyboard shortcut display
- β Status line with hot spots (hover highlighting, context-sensitive hints)
- β Desktop manager
- β Scrollbars (vertical and horizontal)
- β Scroller base class for scrollable views
- β Indicator (position display)
- β Text viewer with scrolling
- β CheckBoxes
- β RadioButtons
- β ListBoxes
- β Memo (multi-line text editor)
- β Mouse support (buttons, menus, status bar, close buttons, hover effects, listbox clicks, scroll wheel, double-click detection)
- β Window dragging and resizing (drag by title bar, resize from bottom-right corner with minimum size constraints)
- β Window closing (non-modal windows close with close button, modal dialogs convert to cancel)
- β File Dialog (fully functional with mouse/keyboard support and directory navigation)
- β ANSI Dump for debugging (dump screen/views to text files with colors)
- β Input Validators (FilterValidator, RangeValidator with hex/octal, LookupValidator)
- β Editor with search/replace and file I/O (load_file, save_file, save_as)
- β EditWindow (ready-to-use editor window wrapper)
- β OS Clipboard integration (cross-platform with arboard)
- β Help System (markdown-based with HelpFile, HelpViewer, HelpWindow, HelpContext)
- β SSH TUI Bridge (optional feature for serving TUI apps over SSH)
Turbo Vision can serve TUI applications over SSH connections, enabling remote terminal access to your application. This is useful for admin consoles, monitoring dashboards, and tools that need to be accessed remotely.
SSH support is behind a feature flag. Enable it in your Cargo.toml:
[dependencies]
turbo-vision = { version = "1.0", features = ["ssh"] }Or build with the feature:
cargo build --features sshuse turbo_vision::prelude::*;
use turbo_vision::terminal::{Backend, SshBackend, SshSessionBuilder};
use turbo_vision::ssh::{SshServer, SshServerConfig};
use std::sync::Arc;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = SshServerConfig::default();
let server = SshServer::new(config)?;
server.run("0.0.0.0:2222", |backend| {
// Create Terminal with SSH backend
let terminal = Terminal::with_backend(backend).unwrap();
run_your_tui_app(terminal);
}).await?;
Ok(())
}# Start the SSH server
cargo run --example ssh_server --features ssh
# Connect from another terminal
ssh -p 2222 user@localhost
# Password: any (accepts any password in the example)The SSH support uses a Backend trait abstraction:
- Backend trait: Abstracts terminal I/O operations
- CrosstermBackend: Default implementation for local terminals
- SshBackend: Implementation for SSH channel I/O
- InputParser: Converts raw terminal bytes to turbo-vision events
This allows the same TUI application to run locally or over SSH with no code changes.
This implementation closely follows Borland Turbo Vision's architecture, adapted for Rust:
- Event Loop: Located in
Group(matching Borland'sTGroup::execute()), not in individual views - Modal Dialogs: Use Borland's
endModal()pattern to exit event loops - View Hierarchy: Composition-based design (
WindowcontainsGroup,DialogwrapsWindow) - Drawing: Event-driven redraws with Borland's
drawUnderRectpattern for efficient updates - Event System:
- Three-phase processing (PreProcess β Focused β PostProcess) matching Borland's
TGroup::handleEvent() - Event re-queuing via
Terminal::put_event()matching Borland'sTProgram::putEvent() - Owner-aware broadcasts via
Group::broadcast()matching Borland'smessage(owner, ...)pattern
- Three-phase processing (PreProcess β Focused β PostProcess) matching Borland's
===============================================================================
Language Files Lines Code Comments Blanks
===============================================================================
Rust 125 37315 28029 3557 5729
|- Markdown 102 4695 332 3604 759
(Total) 42010 28361 7161 6488
===============================================================================
Generated with tokei - includes inline documentation
226 unit tests - all passing β
MIT License - see LICENSE file for details.





