Paint App
This example shows how to use a Gesso component inside a Halogen application to make a small drawing app. It uses Halogen queries to communicate with the parent component.
Structure
Root
is the main component. It contains the Gesso component (Grid
) and four button components (ColorButton
). It keeps track of the color of the pixels in the drawing and the order that they changed colors, in order to provide undo and redo features.
ColorButton
renders a button element for selecting a color to draw with. It emits an Output
when clicked.
Grid
wraps the Gesso canvas. It uses this AppSpec
:
, behavior: GApp.defaultBehavior
{ render = renderApp
, output = extractOutput
, input = convertState
, interactions
{ mouse = [ highlightCell, clearHighlight, mouseDown, mouseUp ]
}
}
When the canvas state changes, extractOutput
is called with a Gesso.State.Compare
record. If this returns a Just
value, Gesso automatically calls Halogen.raise
to send output to Root
.
When Root
sends a query to Grid
with Halogen.tell
, Grid
reacts to the query with convertState
.
Layout
This example uses a view box from 0
to 32
in both axes to simplify coloring individual squares.
It also uses a fixed, 600 by 600 pixel size.
Scaling operators
This example uses the operator aliases for scaling functions:
x = floor $ point.x -~> drawing
y = floor $ point.y |~> drawing
Canvas.setLineWidth context $ 0.05 /~> canvas
Canvas.fillRect context $
{ x: toNumber x, y: toNumber y, width: 1.0, height: 1.0 } *~> canvas