aboutsummaryrefslogtreecommitdiff
#ifndef BARCHART_H
#define BARCHART_H

#include <memory>
#include <vector>

#include <armadillo>
#include <glad/gl.h>
#include <nod.hpp>

#include "scale.h"
#include "shader.h"

class BarChart
{
public:
    BarChart();

    size_t width() const { return m_width; }
    size_t height() const { return m_height; }
    GLuint texture() const { return m_outTex; }

    nod::signal<void(const arma::vec &)> valuesChanged;
    nod::signal<void(const std::vector<bool> &)> selectionChanged;
    nod::signal<void(const std::vector<bool> &)> selectionInteractivelyChanged;
    nod::signal<void(int, float)> itemBrushed;
    nod::signal<void(int)> itemInteractivelyBrushed;

    void setSize(size_t, size_t);
    void setValues(const arma::vec &values);
    void updateValues(const arma::vec &values);
    void setColormap(GLuint texture);
    void setSelection(const std::vector<bool> &selection);
    void brushItem(int item);

    void update();
    void draw();

    // protected:
    // QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *);

    // void hoverEnterEvent(QHoverEvent *event);
    // void hoverMoveEvent(QHoverEvent *event);
    // void hoverLeaveEvent(QHoverEvent *event);

    // void mousePressEvent(QMouseEvent *event);
    // void mouseMoveEvent(QMouseEvent *event);
    // void mouseReleaseEvent(QMouseEvent *event);

private:
    void updateBars();

    // QSGNode *newSceneGraph() const;
    // QSGNode *newBarNode() const;
    // QSGNode *newSelectionBarNode() const;

    // void updateViewport(QSGNode *root) const;
    // void updateBarNodeGeom(QSGNode *barNode, float x, float width, float height) const;
    // void updateBarNodeColor(QSGNode *barNode, const QColor &color) const;
    // void updateBars(QSGNode *node) const;
    bool m_redraw;
    bool m_shouldUpdateBars;

    // void updatePreSelection(QSGNode *node) const;
    bool m_shouldUpdatePreSelection;
    float m_dragStartPos, m_dragLastPos;

    // void updateSelectionBar(QSGNode *node, float x, float barWidth, const QColor &color) const;
    // void updateSelectionBars(QSGNode *node) const;
    bool m_shouldUpdateSelection;

    void interactiveSelection(float start, float end);
    std::vector<bool> m_selection;

    // void updateBrush(QSGNode *node) const;
    int m_brushedItem;

    int itemAt(float x, bool includeSelectorWidth = false) const;

    size_t m_width, m_height;
    GLuint m_FBO, m_VAO, m_VBO, m_colormapTex, m_outTex;
    std::unique_ptr<Shader> m_shader;

    arma::vec m_values;
    std::vector<int> m_originalIndices, m_currentIndices;
    LinearScale<float> m_scale;
};

#endif // BARCHART_H