| 93 | 1 #ifndef __gui__widgets__graph_h | 
|  | 2 #define __gui__widgets__graph_h | 
|  | 3 #include <QWidget> | 
|  | 4 #include <QSize> | 
|  | 5 #include <QPaintEvent> | 
|  | 6 #include <QSize> | 
|  | 7 #include <QRect> | 
|  | 8 #include <QPainter> | 
|  | 9 #include <QPainterPath> | 
|  | 10 #include <QPen> | 
|  | 11 | 
|  | 12 template <typename T> /* does this even work?? */ | 
|  | 13 class Graph final : public QWidget { | 
|  | 14 public: | 
|  | 15 	Graph(QWidget* parent = nullptr) : QWidget(parent) {}; | 
|  | 16 	void AddItem(T key, int val) { map[key] = val; update(); updateGeometry(); }; | 
|  | 17 	void Clear() { map.clear(); update(); updateGeometry(); }; | 
|  | 18 | 
|  | 19 protected: | 
|  | 20 	static constexpr int ITEM_HEIGHT = 20; | 
|  | 21 	static constexpr int TEXT_WIDTH = 30; | 
|  | 22 	inline int GetTotal() { | 
|  | 23 		int count = 0; | 
|  | 24 		for (const auto& item : map) | 
|  | 25 			count += item.second; | 
|  | 26 		return count; | 
|  | 27 	} | 
|  | 28 	QSize minimumSizeHint() const override { return QSize(100, ITEM_HEIGHT * map.size()); }; | 
|  | 29 	void paintEvent(QPaintEvent* event) override { | 
|  | 30 		const QRect rect = event->rect(); | 
|  | 31 		const int height_of_each = rect.height() / map.size(); | 
|  | 32 		const int size = GetTotal(); | 
|  | 33 | 
|  | 34 		/* now we do the actual painting */ | 
|  | 35 		QPainter painter(this); | 
|  | 36 | 
|  | 37 		int i = 0; | 
|  | 38 		for (const auto& item : map) { | 
|  | 39 			painter.drawText(QRect(0, i*ITEM_HEIGHT, TEXT_WIDTH, ITEM_HEIGHT), Qt::AlignRight | Qt::AlignVCenter, QString::number(item.first)); | 
|  | 40 | 
|  | 41 			if (size) { | 
|  | 42 				painter.save(); | 
|  | 43 | 
|  | 44 				QPen pen(Qt::transparent, 0); | 
|  | 45 				painter.setPen(pen); | 
|  | 46 | 
|  | 47 				QPainterPath path; | 
|  | 48 				path.addRect(rect.x()+35, rect.y()+(i*ITEM_HEIGHT), (static_cast<double>(item.second)/size)*(rect.width()-35), ITEM_HEIGHT); | 
|  | 49 				painter.fillPath(path, Qt::blue); | 
|  | 50 				painter.drawPath(path); | 
|  | 51 | 
|  | 52 				painter.restore(); | 
|  | 53 			} | 
|  | 54 			i++; | 
|  | 55 		} | 
|  | 56 	}; | 
|  | 57 	std::unordered_map<T, int> map = {}; | 
|  | 58 }; | 
|  | 59 | 
|  | 60 #endif // __gui__widgets__graph_h |