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