2015-05-09 19:28:21 +00:00
Cursive
=======
Cursive is a ncurses-based TUI (Text User Interface) library for rust. It is based on jeaye's [ncurses-rs ](https://github.com/jeaye/ncurses-rs ).
2015-05-19 17:01:54 +00:00
It is designed to be safe and easy to use:
2015-05-09 19:28:21 +00:00
2015-05-22 23:28:23 +00:00
```
[dependencies.cursive]
git = "https://github.com/Gyscos/cursive"
```
2015-06-04 06:48:17 +00:00
(You will also need ncurses installed - if it isn't already, check in your package manager.)
2015-06-02 19:03:33 +00:00
2015-05-09 19:28:21 +00:00
```rust
extern crate cursive;
2015-05-19 20:45:41 +00:00
use cursive::Cursive;
use cursive::view::{Dialog,TextView};
2015-05-09 19:28:21 +00:00
fn main() {
2015-06-01 06:06:27 +00:00
// Creates the cursive root - required for every application.
2015-05-19 18:01:16 +00:00
let mut siv = Cursive::new();
2015-05-09 19:28:21 +00:00
2015-06-01 06:06:27 +00:00
// Create a popup window with a button that quits the application
2015-05-25 08:15:00 +00:00
siv.add_layer(Dialog::new(TextView::new("Hello Dialog!"))
.title("Cursive")
2015-05-24 00:21:47 +00:00
.button("Quit", |s| s.quit()));
2015-05-09 19:28:21 +00:00
2015-05-19 18:01:16 +00:00
// Starts the event loop.
siv.run();
2015-05-09 19:28:21 +00:00
}
```
2015-05-19 17:01:54 +00:00
2015-05-24 21:07:30 +00:00
![Cursive dialog example ](https://raw.githubusercontent.com/Gyscos/Cursive/master/doc/cursive_example.png )
2015-05-25 08:15:00 +00:00
_(Colors may depend on your terminal configuration.)_
2015-05-24 21:07:30 +00:00
2015-05-20 18:14:38 +00:00
The goal is to be flexible enough, so that recreating these kind of tools would be - relatively - easy (at least on the layout front):
2015-05-19 20:54:50 +00:00
* [menuconfig ](http://en.wikipedia.org/wiki/Menuconfig#/media/File:Linux_x86_3.10.0-rc2_Kernel_Configuration.png )
* [nmtui ](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/sec-Configure_a_Network_Team_Using_the_Text_User_Interface_nmtui.html )
2015-05-19 17:01:54 +00:00
A few notes :
* The main focus point is _not_ performance. This is a simple layout library, guys, not [compiz ](https://www.google.com/search?q=compiz&tbm=isch ) piped into [libcaca ](https://www.google.com/search?q=libcaca&tbm=isch ). Unless you are running it on your microwave's microcontroller, it's not going to be slow.
* The library is single-threaded. Thus, callback methods are blocking - careful what you're doing in there! Feel free to use threads on your side, though.
2015-05-19 18:10:35 +00:00
* This goal is _not_ to have an equivalent to every ncurses function. You _can_ access the underlying ncurses window when creating your own custom views, so you can do what you want with that, but the main library will probably only use a subset of the ncurses features.
2015-05-31 20:11:50 +00:00
Contribute
----------
You want to help? Great! Here is a non-exhaustive list of things you could do:
* Provide example use-case: a good idea of application for existing or new components.
* Test and reports issues: a bug won't get fixed if we don't know it's there.
* Hack the code! If you feel confident with rust, pick an issue you like and hack away!