comparison include/gui/widgets/graph.h @ 96:bd68e4393e6f

statistics: forward declare Graph graph: fix missing #include (does this fix the build errors??)
author Paper <mrpapersonic@gmail.com>
date Wed, 01 Nov 2023 15:16:49 -0400
parents 2f373d48f889
children b315f3759c56
comparison
equal deleted inserted replaced
95:8043152ef9d4 96:bd68e4393e6f
1 #ifndef __gui__widgets__graph_h 1 #ifndef __gui__widgets__graph_h
2 #define __gui__widgets__graph_h 2 #define __gui__widgets__graph_h
3
4 /* This class is defined as a template, so that means everything gets defined here as well :) */
3 5
4 #include <QWidget> 6 #include <QWidget>
5 #include <QSize> 7 #include <QSize>
6 #include <QPaintEvent> 8 #include <QPaintEvent>
7 #include <QSize> 9 #include <QSize>
8 #include <QRect> 10 #include <QRect>
9 #include <QPainter> 11 #include <QPainter>
10 #include <QPainterPath> 12 #include <QPainterPath>
11 #include <QPen> 13 #include <QPen>
14 #include <unordered_map>
12 15
13 template <typename T> 16 template <typename T>
14 class Graph final : public QWidget { 17 class Graph final : public QWidget {
15 public: 18 public:
16 Graph(QWidget* parent = nullptr) : QWidget(parent) {}; 19 Graph(QWidget* parent = nullptr) : QWidget(parent) {};
17 void AddItem(T key, int val) { map[key] = val; update(); updateGeometry(); }; 20 void AddItem(T key, int val) { map[key] = val; update(); updateGeometry(); };
18 void Clear() { map.clear(); update(); updateGeometry(); }; 21 void Clear() { map.clear(); update(); updateGeometry(); };
19 22
20 protected: 23 protected:
21 static constexpr int ITEM_HEIGHT = 20; 24 static constexpr int ITEM_HEIGHT = 20;
22 static constexpr int TEXT_WIDTH = 30; 25 static constexpr int TEXT_WIDTH = 30;
23 inline int GetTotal() { 26 inline int GetTotal() {
24 int count = 0; 27 int count = 0;
25 for (const auto& item : map) 28 for (const auto& item : map)
26 count += item.second; 29 count += item.second;
27 return count; 30 return count;
28 } 31 }
29 QSize minimumSizeHint() const override { return QSize(100, ITEM_HEIGHT * map.size()); }; 32 QSize minimumSizeHint() const override { return QSize(100, ITEM_HEIGHT * map.size()); };
30 void paintEvent(QPaintEvent* event) override { 33 void paintEvent(QPaintEvent* event) override {
31 const QRect rect = event->rect(); 34 const QRect rect = event->rect();
32 const int height_of_each = rect.height() / map.size(); 35 const int height_of_each = rect.height() / map.size();
33 const int size = GetTotal(); 36 const int size = GetTotal();
34 37
35 /* now we do the actual painting */ 38 /* now we do the actual painting */
36 QPainter painter(this); 39 QPainter painter(this);
37 40
38 int i = 0; 41 int i = 0;
39 for (const auto& item : map) { 42 for (const auto& item : map) {
40 painter.drawText(QRect(rect.x(), rect.y() + i * ITEM_HEIGHT, TEXT_WIDTH, ITEM_HEIGHT), Qt::AlignRight | Qt::AlignVCenter, QString::number(item.first)); 43 painter.drawText(QRect(rect.x(), rect.y() + i * ITEM_HEIGHT, TEXT_WIDTH, ITEM_HEIGHT), Qt::AlignRight | Qt::AlignVCenter, QString::number(item.first));
41 44
42 if (size) { 45 if (size) {
43 painter.save(); 46 painter.save();
44 47
45 QPen pen(Qt::transparent, 0); 48 QPen pen(Qt::transparent, 0);
46 painter.setPen(pen); 49 painter.setPen(pen);
47 50
48 QPainterPath path; 51 QPainterPath path;
49 path.addRect(rect.x()+35, rect.y() + i * ITEM_HEIGHT, (static_cast<double>(item.second)/size)*(rect.width()-35), ITEM_HEIGHT); 52 path.addRect(rect.x()+35, rect.y() + i * ITEM_HEIGHT, (static_cast<double>(item.second)/size)*(rect.width()-35), ITEM_HEIGHT);
50 painter.fillPath(path, Qt::blue); 53 painter.fillPath(path, Qt::blue);
51 painter.drawPath(path); 54 painter.drawPath(path);
52 55
53 painter.restore(); 56 painter.restore();
57 }
58 i++;
54 } 59 }
55 i++; 60 };
56 } 61 std::unordered_map<T, int> map = {};
57 };
58 std::unordered_map<T, int> map = {};
59 }; 62 };
60 63
61 #endif // __gui__widgets__graph_h 64 #endif // __gui__widgets__graph_h