brick/README.md

121 lines
4.3 KiB
Markdown
Raw Normal View History

2015-07-08 07:06:43 +03:00
brick
-----
2015-07-09 21:02:24 +03:00
[![Build Status](https://travis-ci.org/jtdaugherty/brick.png)](https://travis-ci.org/jtdaugherty/brick)
2015-07-08 07:06:43 +03:00
`brick` is a terminal user interface programming
library written in Haskell, in the style of
[gloss](http://hackage.haskell.org/package/gloss). This means you write
a function that describes how your user interface should look, but the
library takes care of a lot of the book-keeping that so commonly goes
into writing such programs.
2015-07-22 05:45:17 +03:00
`brick` exposes a declarative API. Unlike most GUI toolkits which
require you to write a long and tedious sequence of "create a widget,
now bind an event handler", `brick` just requires you to describe
your interface -- even the bits that are stateful -- using a set of
2015-08-09 07:18:30 +03:00
declarative combinators. Then you provide a function to transform your
own application state when input (or other kinds of) events arrive.
2015-07-08 07:06:43 +03:00
2015-08-09 07:18:30 +03:00
Under the hood, this library builds upon [vty](http://hackage.haskell.org/package/vty).
2015-07-08 07:49:01 +03:00
2015-07-08 07:38:54 +03:00
This library deprecates [vty-ui](https://github.com/jtdaugherty/vty-ui).
2015-07-21 05:02:53 +03:00
Feature Overview
----------------
2015-07-21 05:07:33 +03:00
`brick` comes with a bunch of widget types to get you started:
2015-07-21 05:02:53 +03:00
* Vertical and horizontal box layout widgets
* Basic single- and multi-line text editor widgets
* List widget
* Progress bar widget
* Simple dialog box widget
* Border-drawing widgets (put borders around or in between things)
2015-07-21 23:08:19 +03:00
* Generic scrollable viewports
2015-07-22 04:30:33 +03:00
* Extensible widget-building API
2015-07-22 05:37:55 +03:00
* (And many more general-purpose layout control combinators)
2015-07-21 05:02:53 +03:00
In addition, some of `brick`'s more powerful features may not be obvious
right away:
* All widgets can be arranged in predictable layouts so you don't have
to worry about terminal resizes.
* Most widgets can be made scrollable *for free*.
* Attribute management is flexible and can be customized at runtime on
a per-widget basis.
2015-07-21 05:02:53 +03:00
2015-07-22 05:45:17 +03:00
`brick` exports [lens](http://github.com/ekmett/lens) and non-`lens`
interfaces for most things, so you can get the full power of `lens` if
you want it or use plain Haskell if you don't. If a `brick` library
2015-07-22 19:41:51 +03:00
function named `thing` has a `lens` version, the `lens` version is named
`thingL`.
2015-07-22 05:45:17 +03:00
2015-07-08 07:38:54 +03:00
Getting Started
---------------
2015-07-24 09:11:49 +03:00
TLDR:
2015-07-08 07:08:54 +03:00
2015-07-08 07:38:54 +03:00
```
$ cabal sandbox init
$ cabal install -j -f demos
2015-07-08 07:38:54 +03:00
$ .cabal-sandbox/bin/brick-???-demo
```
2015-07-08 07:56:28 +03:00
2015-07-24 09:11:49 +03:00
To get started, see the [first few sections of the brick
2015-08-07 04:45:49 +03:00
user guide](docs/guide.rst).
2015-07-24 09:11:49 +03:00
Documentation
-------------
Your documentation options, in recommended order, are:
* [FAQ](https://github.com/jtdaugherty/brick/blob/master/FAQ.md)
* [The brick user guide](https://github.com/jtdaugherty/brick/blob/master/docs/guide.rst)
2015-07-24 09:11:49 +03:00
* Haddock (all modules)
* [Demo programs](https://github.com/jtdaugherty/brick/blob/master/programs)
2015-07-24 09:11:49 +03:00
2015-07-08 07:56:28 +03:00
Status
------
2015-08-07 04:51:52 +03:00
`brick` is young and may be missing some essential features. There are
some places were I have deliberately chosen to worry about performance
later for the sake of spending more time on the design (and to wait on
performance issues to arise first). `brick` exports an extension API
that makes it possible to make your own packages and widgets. If you
use that, you'll also be helping to test whether the exported interface
is usable and complete!
2015-07-08 07:56:28 +03:00
2015-07-24 09:12:35 +03:00
The development of this library has revealed some bugs in `vty`, and
I've tried to report those as I go. If they haven't been resolved,
2015-07-08 07:57:29 +03:00
you'll see them arise when using `brick`.
2015-07-09 21:15:21 +03:00
Reporting bugs
--------------
Please file bug reports as GitHub issues. For best results:
- Include the versions of relevant software packages: your terminal
emulator, `brick`, `ghc`, and `vty` will be the most important
ones. Even better, the output of `cabal freeze` would probably be
helpful in making the problem reproducible.
2015-07-09 21:15:21 +03:00
- Clearly describe the behavior you expected ...
2015-12-08 23:48:10 +03:00
- ... and include a minimal demonstration program that exhibits the
2015-07-09 21:15:21 +03:00
behavior you actually observed.
2015-07-08 07:56:28 +03:00
Contributing
------------
If you decide to contribute, that's great! Here are some guidelines you
should consider to make submitting patches easier for all concerned:
- If you want to take on big things, talk to me first; let's have a
2015-07-08 07:57:29 +03:00
design/vision discussion before you start coding. Create a GitHub
issue and we can use that as the place to hash things out.
2015-07-08 07:56:28 +03:00
- If you make changes, try to make them consistent with the syntactic
conventions I've used in the codebase.
2015-08-07 04:45:49 +03:00
- Please provide Haddock and/or user guide documentation for any
changes you make.