annotate include/gui/widgets/graph.h @ 337:a7d4e5107531

dep/animone: REFACTOR ALL THE THINGS 1: animone now has its own syntax divergent from anisthesia, making different platforms actually have their own sections 2: process names in animone are now called `comm' (this will probably break things). this is what its called in bsd/linux so I'm just going to use it everywhere 3: the X11 code now checks for the existence of a UTF-8 window title and passes it if available 4: ANYTHING THATS NOT LINUX IS 100% UNTESTED AND CAN AND WILL BREAK! I still actually need to test the bsd code. to be honest I'm probably going to move all of the bsds into separate files because they're all essentially different operating systems at this point
author Paper <paper@paper.us.eu.org>
date Wed, 19 Jun 2024 12:51:15 -0400
parents f31305b9f60a
children f81bed4e04ac
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
261
3ec7804abf17 include: make header guards more sane
Paper <paper@paper.us.eu.org>
parents: 259
diff changeset
1 #ifndef MINORI_GUI_WIDGETS_GRAPH_H_
3ec7804abf17 include: make header guards more sane
Paper <paper@paper.us.eu.org>
parents: 259
diff changeset
2 #define MINORI_GUI_WIDGETS_GRAPH_H_
94
2f373d48f889 *: etc changes to graph stuff
Paper <mrpapersonic@gmail.com>
parents: 93
diff changeset
3
96
bd68e4393e6f statistics: forward declare Graph
Paper <mrpapersonic@gmail.com>
parents: 94
diff changeset
4 /* This class is defined as a template, so that means everything gets defined here as well :) */
bd68e4393e6f statistics: forward declare Graph
Paper <mrpapersonic@gmail.com>
parents: 94
diff changeset
5
102
b315f3759c56 *: big patch
Paper <mrpapersonic@gmail.com>
parents: 96
diff changeset
6 #include <QDebug>
93
d5efb81540b3 statistics: add graph!
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
7 #include <QPaintEvent>
d5efb81540b3 statistics: add graph!
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
8 #include <QPainter>
d5efb81540b3 statistics: add graph!
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
9 #include <QPainterPath>
d5efb81540b3 statistics: add graph!
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
10 #include <QPen>
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
11 #include <QRect>
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
12 #include <QSize>
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
13 #include <QWidget>
102
b315f3759c56 *: big patch
Paper <mrpapersonic@gmail.com>
parents: 96
diff changeset
14 #include <algorithm>
96
bd68e4393e6f statistics: forward declare Graph
Paper <mrpapersonic@gmail.com>
parents: 94
diff changeset
15 #include <unordered_map>
93
d5efb81540b3 statistics: add graph!
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
16
171
03b444cbe55f graph: improve? drawing the text
Paper <mrpapersonic@gmail.com>
parents: 102
diff changeset
17 template<typename T>
93
d5efb81540b3 statistics: add graph!
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
18 class Graph final : public QWidget {
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
19 public:
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
20 Graph(QWidget* parent = nullptr) : QWidget(parent){};
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
21 void AddItem(T key, unsigned long val) {
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
22 map[key] = val;
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
23 update();
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
24 updateGeometry();
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
25 };
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
26 void Clear() {
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
27 map.clear();
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
28 update();
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
29 updateGeometry();
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
30 };
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
31
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
32 protected:
259
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
33 static constexpr int HORIZ_SPACING = 5;
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
34 static constexpr int VERT_SPACING = 3;
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
35
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
36 std::unordered_map<T, unsigned long> map = {};
93
d5efb81540b3 statistics: add graph!
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
37
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
38 QSize minimumSizeHint() const override {
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
39 QFontMetrics metric(font());
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
40 /* wtf?... */
259
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
41 return QSize(100, (metric.height() * map.size()) + (VERT_SPACING * map.size()));
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
42 }
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
43
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
44 /* helper functions */
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
45 inline unsigned long GetTotal() {
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
46 unsigned long count = 0;
171
03b444cbe55f graph: improve? drawing the text
Paper <mrpapersonic@gmail.com>
parents: 102
diff changeset
47
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
48 for (const auto& item : map)
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
49 count += item.second;
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
50
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
51 return count;
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
52 }
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
53
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
54 inline unsigned long GetTextWidth() {
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
55 unsigned long ret = 0;
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
56 QFontMetrics metric(font());
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
57
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
58 for (const auto& item : map) {
273
f31305b9f60a *: various code safety changes
Paper <paper@paper.us.eu.org>
parents: 261
diff changeset
59 unsigned long width = metric.boundingRect(QString::number(item.first)).width();
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
60 if (width > ret)
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
61 ret = width;
171
03b444cbe55f graph: improve? drawing the text
Paper <mrpapersonic@gmail.com>
parents: 102
diff changeset
62 }
03b444cbe55f graph: improve? drawing the text
Paper <mrpapersonic@gmail.com>
parents: 102
diff changeset
63
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
64 return ret;
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
65 }
171
03b444cbe55f graph: improve? drawing the text
Paper <mrpapersonic@gmail.com>
parents: 102
diff changeset
66
259
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
67 inline unsigned long GetValueWidth() {
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
68 unsigned long ret = 0;
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
69 QFontMetrics metric(font());
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
70
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
71 for (const auto& item : map) {
273
f31305b9f60a *: various code safety changes
Paper <paper@paper.us.eu.org>
parents: 261
diff changeset
72 unsigned long width = metric.boundingRect(QString::number(item.second)).width();
259
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
73 if (width > ret)
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
74 ret = width;
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
75 }
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
76
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
77 return ret;
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
78 }
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
79
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
80 void paintEvent(QPaintEvent* event) override {
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
81 /* these are retrieved from the QPaintEvent */
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
82 const QRect rect = event->rect();
259
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
83 const int width = rect.width();
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
84 const int x = rect.x();
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
85 int y = rect.y();
171
03b444cbe55f graph: improve? drawing the text
Paper <mrpapersonic@gmail.com>
parents: 102
diff changeset
86
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
87 /* these are calculated from font metrics and such */
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
88 const int total = GetTotal();
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
89 const int text_width = GetTextWidth();
259
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
90 const int value_width = GetValueWidth();
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
91 const int each_height = QFontMetrics(font()).height();
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
92
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
93 /* now we do the actual painting */
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
94 QPainter painter(this);
171
03b444cbe55f graph: improve? drawing the text
Paper <mrpapersonic@gmail.com>
parents: 102
diff changeset
95
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
96 for (const auto& [key, value] : map) {
259
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
97 int offset = 0;
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
98
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
99 painter.drawText(QRect(x, y, text_width, each_height), Qt::AlignVCenter | Qt::AlignRight,
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
100 QString::number(key));
171
03b444cbe55f graph: improve? drawing the text
Paper <mrpapersonic@gmail.com>
parents: 102
diff changeset
101
259
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
102 offset += text_width + HORIZ_SPACING;
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
103
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
104 /* only draw this if we actually have any data */
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
105 if (total) {
259
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
106 painter.save();
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
107
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
108 QPen pen(painter.pen());
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
109 pen.setStyle(Qt::NoPen);
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
110 painter.setPen(pen);
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
111
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
112 QPainterPath path;
259
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
113 path.addRect(x + offset, y,
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
114 (static_cast<double>(value) / total) * (width - offset - HORIZ_SPACING - value_width), each_height);
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
115 painter.fillPath(path, Qt::darkGreen);
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
116 painter.drawPath(path);
259
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
117
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
118 offset += (static_cast<double>(value) / total) * (width - offset - HORIZ_SPACING - value_width);
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
119
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
120 painter.restore();
102
b315f3759c56 *: big patch
Paper <mrpapersonic@gmail.com>
parents: 96
diff changeset
121 }
171
03b444cbe55f graph: improve? drawing the text
Paper <mrpapersonic@gmail.com>
parents: 102
diff changeset
122
259
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
123 offset += HORIZ_SPACING;
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
124
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
125 painter.drawText(QRect(x + offset, y, value_width, each_height), Qt::AlignVCenter | Qt::AlignLeft, QString::number(value));
0362f3c4534c widgets/graph: improve drawing code
Paper <paper@paper.us.eu.org>
parents: 258
diff changeset
126
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
127 y += each_height + VERT_SPACING;
102
b315f3759c56 *: big patch
Paper <mrpapersonic@gmail.com>
parents: 96
diff changeset
128 }
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 172
diff changeset
129 }
93
d5efb81540b3 statistics: add graph!
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
130 };
d5efb81540b3 statistics: add graph!
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
131
261
3ec7804abf17 include: make header guards more sane
Paper <paper@paper.us.eu.org>
parents: 259
diff changeset
132 #endif // MINORI_GUI_WIDGETS_GRAPH_H_