aboutsummaryrefslogtreecommitdiff
path: root/src/Matrix.tsx
blob: 53faf516f6dbb3449664dcedf58cbb648a76c305 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import React from 'react';
import 'typeface-roboto';
import orange from '@material-ui/core/colors/orange';
import blue from '@material-ui/core/colors/blue';
import Color from 'color';
import './Matrix.css';

interface MatrixProps {
    onClickNode: (i: number, j: number) => void
    onHoverNode: (i: number, j: number) => void
    data: { d: number[], col: number }[][]
}

export function getNodeColor(d: number, col: number) {
    const color = [orange[300], blue[300]];
    let base = Color(color[col]).hsl().array();
    base[2] = 80;
    return Color.hsl(base).darken(Math.min(d / 15, 0.5)).hex();
}

class Matrix extends React.Component<MatrixProps> {
    static getColor(s: { d: number[], col: number }) {
        return getNodeColor(s.d[s.col], s.col);
    }
    mouseDown = false;
    mousePos = { x: -1, y: -1 };
    render() {
        const { data, onClickNode, onHoverNode } = this.props;
        const { mr, mc, l } = data.length <= 20 ?
            { mr: 'matrixRow', mc: 'matrixCell', l: 24 } :
            { mr: 'smallMatrixRow', mc: 'smallMatrixCell', l: 15 };
        return (
            <div className={`matrix ${mr} ${mc}`}
                onMouseDown={event => {
                    event.preventDefault();
                    this.mouseDown = true;
                    onClickNode(this.mousePos.y, this.mousePos.x);
                }}
                onMouseUp={event => {
                    event.preventDefault();
                    this.mouseDown = false;
                }}
                onMouseOver={event => {
                    const bounds = (event.currentTarget as Element).getBoundingClientRect();
                    const x = Math.floor((event.clientX - bounds.left) / l);
                    const y = Math.floor((event.clientY - bounds.top) / l);
                    console.log(y, x, this.mouseDown);
                    const t = this.mousePos;
                    this.mousePos = {x, y};
                    if (!this.mouseDown) return;
                    if (t.x !== x || t.y !== y)
                    {
                        onHoverNode(y, x);
                    }
                }}>
                {data.map((row, i) => (
                    <div key={i}>
                    {row.map((cell, j) => (
                            <div key={j}
                                style={{backgroundColor: Matrix.getColor(cell)}}>
                            </div>
                        ))}
                    </div>
                ))}
            </div>);
    }
}

export default Matrix;