Mercurial > minori
diff include/gui/widgets/graph.h @ 93:d5efb81540b3
statistics: add graph!
also now we have a VERY VERY simple graph widget that probably
sucks and doesn't work half the time :)
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Wed, 01 Nov 2023 13:52:34 -0400 |
parents | |
children | 2f373d48f889 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/gui/widgets/graph.h Wed Nov 01 13:52:34 2023 -0400 @@ -0,0 +1,60 @@ +#ifndef __gui__widgets__graph_h +#define __gui__widgets__graph_h +#include <QWidget> +#include <QSize> +#include <QPaintEvent> +#include <QSize> +#include <QRect> +#include <QPainter> +#include <QPainterPath> +#include <QPen> + +template <typename T> /* does this even work?? */ +class Graph final : public QWidget { +public: + Graph(QWidget* parent = nullptr) : QWidget(parent) {}; + void AddItem(T key, int val) { map[key] = val; update(); updateGeometry(); }; + void Clear() { map.clear(); update(); updateGeometry(); }; + +protected: + static constexpr int ITEM_HEIGHT = 20; + static constexpr int TEXT_WIDTH = 30; + inline int GetTotal() { + int count = 0; + for (const auto& item : map) + count += item.second; + return count; + } + QSize minimumSizeHint() const override { return QSize(100, ITEM_HEIGHT * map.size()); }; + void paintEvent(QPaintEvent* event) override { + const QRect rect = event->rect(); + const int height_of_each = rect.height() / map.size(); + const int size = GetTotal(); + + /* now we do the actual painting */ + QPainter painter(this); + + int i = 0; + for (const auto& item : map) { + painter.drawText(QRect(0, i*ITEM_HEIGHT, TEXT_WIDTH, ITEM_HEIGHT), Qt::AlignRight | Qt::AlignVCenter, QString::number(item.first)); + + if (size) { + painter.save(); + + QPen pen(Qt::transparent, 0); + painter.setPen(pen); + + QPainterPath path; + path.addRect(rect.x()+35, rect.y()+(i*ITEM_HEIGHT), (static_cast<double>(item.second)/size)*(rect.width()-35), ITEM_HEIGHT); + painter.fillPath(path, Qt::blue); + painter.drawPath(path); + + painter.restore(); + } + i++; + } + }; + std::unordered_map<T, int> map = {}; +}; + +#endif // __gui__widgets__graph_h \ No newline at end of file