comparison include/gui/widgets/graph.h @ 259:0362f3c4534c

widgets/graph: improve drawing code
author Paper <paper@paper.us.eu.org>
date Mon, 01 Apr 2024 18:11:15 -0400
parents 862d0d8619f6
children 3ec7804abf17
comparison
equal deleted inserted replaced
258:862d0d8619f6 259:0362f3c4534c
28 update(); 28 update();
29 updateGeometry(); 29 updateGeometry();
30 }; 30 };
31 31
32 protected: 32 protected:
33 static constexpr int HORIZ_SPACING = 5;
34 static constexpr int VERT_SPACING = 3;
35
33 std::unordered_map<T, unsigned long> map = {}; 36 std::unordered_map<T, unsigned long> map = {};
34 37
35 QSize minimumSizeHint() const override { 38 QSize minimumSizeHint() const override {
36 QFontMetrics metric(font()); 39 QFontMetrics metric(font());
37 /* wtf?... */ 40 /* wtf?... */
38 return QSize(100, (metric.height() * map.size()) + (2 * map.size())); 41 return QSize(100, (metric.height() * map.size()) + (VERT_SPACING * map.size()));
39 } 42 }
40 43
41 /* helper functions */ 44 /* helper functions */
42 inline unsigned long GetTotal() { 45 inline unsigned long GetTotal() {
43 unsigned long count = 0; 46 unsigned long count = 0;
59 } 62 }
60 63
61 return ret; 64 return ret;
62 } 65 }
63 66
67 inline unsigned long GetValueWidth() {
68 unsigned long ret = 0;
69 QFontMetrics metric(font());
70
71 for (const auto& item : map) {
72 unsigned long width = metric.horizontalAdvance(QString::number(item.second), -1);
73 if (width > ret)
74 ret = width;
75 }
76
77 return ret;
78 }
79
64 void paintEvent(QPaintEvent* event) override { 80 void paintEvent(QPaintEvent* event) override {
65 static constexpr int HORIZ_SPACING = 5;
66 static constexpr int VERT_SPACING = 2;
67
68 /* these are retrieved from the QPaintEvent */ 81 /* these are retrieved from the QPaintEvent */
69 const QRect rect = event->rect(); 82 const QRect rect = event->rect();
70 const int width = event->rect().width(); 83 const int width = rect.width();
71 const int x = rect.x(); 84 const int x = rect.x();
72 int y = rect.y(); 85 int y = rect.y();
73 86
74 /* these are calculated from font metrics and such */ 87 /* these are calculated from font metrics and such */
75 const int total = GetTotal(); 88 const int total = GetTotal();
76 const int text_width = GetTextWidth(); 89 const int text_width = GetTextWidth();
90 const int value_width = GetValueWidth();
77 const int each_height = QFontMetrics(font()).height(); 91 const int each_height = QFontMetrics(font()).height();
78 92
79 /* now we do the actual painting */ 93 /* now we do the actual painting */
80 QPainter painter(this); 94 QPainter painter(this);
81 95
82 for (const auto& [key, value] : map) { 96 for (const auto& [key, value] : map) {
97 int offset = 0;
98
83 painter.drawText(QRect(x, y, text_width, each_height), Qt::AlignVCenter | Qt::AlignRight, 99 painter.drawText(QRect(x, y, text_width, each_height), Qt::AlignVCenter | Qt::AlignRight,
84 QString::number(key)); 100 QString::number(key));
85 101
102 offset += text_width + HORIZ_SPACING;
103
86 /* only draw this if we actually have any data */ 104 /* only draw this if we actually have any data */
87 if (total) { 105 if (total) {
106 painter.save();
107
108 QPen pen(painter.pen());
109 pen.setStyle(Qt::NoPen);
110 painter.setPen(pen);
111
88 QPainterPath path; 112 QPainterPath path;
89 path.addRect(x + text_width + HORIZ_SPACING, y, 113 path.addRect(x + offset, y,
90 (static_cast<double>(value) / total) * (width - text_width - HORIZ_SPACING), each_height); 114 (static_cast<double>(value) / total) * (width - offset - HORIZ_SPACING - value_width), each_height);
91 painter.fillPath(path, Qt::darkBlue); 115 painter.fillPath(path, Qt::darkGreen);
92 painter.drawPath(path); 116 painter.drawPath(path);
117
118 offset += (static_cast<double>(value) / total) * (width - offset - HORIZ_SPACING - value_width);
119
120 painter.restore();
93 } 121 }
122
123 offset += HORIZ_SPACING;
124
125 painter.drawText(QRect(x + offset, y, value_width, each_height), Qt::AlignVCenter | Qt::AlignLeft, QString::number(value));
94 126
95 y += each_height + VERT_SPACING; 127 y += each_height + VERT_SPACING;
96 } 128 }
97 } 129 }
98 }; 130 };