11 releases

Uses old Rust 2015

0.3.0 Jun 3, 2021
0.2.5 Nov 14, 2020
0.2.4 Jul 15, 2020
0.2.3 Jan 2, 2020
0.1.1 Mar 23, 2019

#722 in Command-line interface

Download history 4/week @ 2023-12-02 9/week @ 2023-12-09 15/week @ 2023-12-16 15/week @ 2023-12-23 11/week @ 2024-01-06 16/week @ 2024-01-13 6/week @ 2024-01-20 2/week @ 2024-01-27 10/week @ 2024-02-03 12/week @ 2024-02-10 24/week @ 2024-02-17 35/week @ 2024-02-24 28/week @ 2024-03-02 37/week @ 2024-03-09 29/week @ 2024-03-16

133 downloads per month
Used in 5 crates

MIT license

285KB
6K SLoC

unsegen

unsegen is a library facilitating the creation of text user interface (TUI) applications akin to ncurses. Currently, unsegen only provides a Rust interface.

Overview

The library consists of four modules:

  • base: Basic terminal rendering including Terminal setup, "slicing" using Windows, and formatted writing to Windows using Cursors.
  • widget: Widget abstraction and some basic Widgets useful for creating basic building blocks of text user interfaces.
  • input: Raw terminal input events, common abstractions for application (component) Behavior and means to easily distribute events.
  • container: Higher level window manager like functionality using Containers as the combination of widget and input concepts.

The following libraries are built on top of unsegen and provide higher level functionality:

  • unsegen_jsonviewer provides an interactive widget that can be used to display json values.
  • unsegen_pager provides a memory or file backed line buffer viewer with syntax highlighting and line decorations.
  • unsegen_signals uses unsegen's input module to raise signals on the usual key combinations (e.g., SIGINT on CTRL-C).
  • unsegen_terminal provides a pseudoterminal that can be easily integrated into applications using unsegen.

Getting Started

unsegen is available on crates.io. You can install it by adding this line to your Cargo.toml:

unsegen = "0.3.0"

Screenshots

Here is a screenshot of ugdb, which is built on top of unsegen.

Examples

There are examples at the top of each main modules' documentation (i.e., base, input, widget, and container) which should be sufficient to get you going.

For a fully fledged application using unsegen, you can have a look at ugdb, which was developed alongside unsegen and the primary motivation for it.

Some notes on implementation details

For simplicity, layouting is done in every draw call. This, in conjunction with recursive calls to calculate space demand of widgets, leads to not-so-great asymptotic runtime. However, I found this not to be a problem in practice so far. If this is problematic for, please file an issue. There are workarounds (caching the draw-result of widgets) for which convenient wrappers can be implemented in the library, but have not so far.

Licensing

unsegen is released under the MIT license.

Dependencies

~6MB
~128K SLoC