canvas-tree: declarative rendering of tree structures into HTML5-canvas
You should feed the canvas-tree
with tree-structured object, consist of next fields:
geometry: geometyFunction style: styleObject children: /* child nodes following the same pattern */ handlers: {}
where:
- geometry: is a function that returns a Path2D instance. There are some
separate modules presenting geometries:
- canvas-rounded-rectangle
- canvas-label
- canvas-circle
- canvas-s-line
- ...more modules coming soon...
- style: a css-like style object. The properties are:
fill
,stroke
,strokeWidth
,cursor
,hover
(sub-object of the same type) and some geometry-specific properties such asradius
for circle - children: array of child nodes of the same type
- handlers: object with event handlers. Currently next handlers are supported:
onClick
onDoubleClick
onDragStart
onDrag
onDragEnd
API
- createCanvas(element) - creates
canvasTree
objectelement
canvas DOMElement
- canvasTree.update(tree) - render tree on canvas
- canvasTree.setMatrixListener(callback(matrix)) - sets the callback that will be called
when transformation matrix is changed. Callback receive
matrix
itself as an argument. - canvasTree.setMatrix(matix) - sets transformation matrix
Install
$ npm install --save canvas-tree
Example usage
This will make a canvas where you can add circles when click and then move those circles by dragging and dropping them.
; ; const nodeStyle = radius: 10 fill: '#f4f4f4' stroke: '#122292' strokeWidth: 2 cursor: 'pointer' hover: stroke: '#ff2292' strokeWidth: 4 ; // the storage let tree = // root node represents canvas itself children: handlers: // these are handlers for canvas onClick: addNode ; const $canvas = document; const canvas = ; { const newNode = ; const newChildren = treechildren; const i = newChildren; newChildreni = newNode; tree = Object; canvas; } { const id = treechildrenlength === 0 ? 0 : treechildrentreechildrenlength - 1id + 1; const newNode = id geometry: circle style: Object handlers: onDrag: dragNode ; tree = Object; canvas; } canvas;