Comments (6)
This is a great question and one that gets at the heart of how you can get the most out of the library.
The short answer is that what you draw depends on one and only one thing: the application state. So if you need to make decisions about what to draw, the information that informs those decisions always goes in the state.
Let's say we have an app that has two "screens" - a main list an an editing interface for elements in the main list. Here's a way to program it. I've omitted some details just to provide the structure so you can see how you'd transition between interfaces and draw them. I'm assuming for the sake of illustration that the Enter
key is used to switch between interfaces. The key is to use events to set a flag in the state that tells the drawing function which interface should be drawn.
data Screen = MainList | EditForm
data MyState = MyState { screen :: Screen, ... }
draw :: MyState -> [Widget]
draw st@(MyState MainList ...) = [drawMainList st]
draw st@(MyState EditForm ...) = [drawEditForm st]
myEvent :: MyState -> Event -> EventM (Next MyState)
myEvent st e =
case screen st of
MainList -> handleMainListEvent st e
EditForm -> handleEditFormEvent st e
handleMainListEvent :: MyState -> Event -> EventM (Next MyState)
handleMainListEvent st e =
case e of
EvKey KEnter [] -> continue $ st { screen = EditForm }
..
handleEditFormEvent :: MyState -> Event -> EventM (Next MyState)
handleEditFormEvent st e =
case e of
EvKey KEnter [] -> continue $ st { screen = MainList }
..
-- Then create an App with the above event-handling and drawing functions and state type.
from brick.
To see this pattern in action you can take a look at this application:
https://github.com/jtdaugherty/dbmigrations-client/tree/master/src
See Types.hs
for the application state type, UI.hs
for the drawing function, and Events.hs
for the event-handling function.
from brick.
If that application I mentioned helped, then please feel free to close this issue. I don't plan on adding more sophisticated examples to the library at this point because my goal is different, which is to keep the example programs as simple as possible while only showing how to use one feature or set of related features at a time. If the documentation doesn't tackle the design questions, I can address those there.
from brick.
You can get some more ideas from this prototype, though it is in flux and may not at all represent best practices.
from brick.
Oh, yes. The application helped very much, and after lots of refactoring, I actually managed to make the code a lot nicer.
from brick.
Great!
from brick.
Related Issues (20)
- Wrap repeating code in a function HOT 18
- handleFormEvent doesn't update form field validation state? HOT 22
- row ... now exceeds region width HOT 8
- Is there any way to wait for an input? For example, wait for confirmation. HOT 8
- There should be something like `fmapState`. HOT 10
- Consider adding `zoomOut` for saving lines when dealing with sum types. HOT 3
- Cannot install `brick` via `cabal update && cabal install brick` on NixOS HOT 9
- Add version of customMain that doesn't require a Vty handle HOT 11
- Documentation Unavailable on Hackage HOT 4
- Can you add brick-trading-journal to featured projects on README? HOT 1
- Mouse-based selection stops working after using the mouse in an app. HOT 17
- Visbility request for FormFieldState instead of FormField HOT 7
- Segmentation fault when eagerly pressing a keyboard key HOT 3
- test compilation failure with brick-2.1.1 in Nixpkgs HOT 3
- How can I get SIGTSTP (ctrl-z) to suspend the process? HOT 6
- Thread blocked indefinitely in an STM transaction HOT 35
- Provide absolute coordinates on brick mouse event HOT 5
- Progress bar usage HOT 6
- How to use dialogSelection with appHandleEvent function? HOT 7
- Pop-up overlay dialog, is it possible? HOT 23
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from brick.