summaryrefslogtreecommitdiff
path: root/Applications/SystemMonitor/GraphWidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Applications/SystemMonitor/GraphWidget.cpp')
-rw-r--r--Applications/SystemMonitor/GraphWidget.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/Applications/SystemMonitor/GraphWidget.cpp b/Applications/SystemMonitor/GraphWidget.cpp
new file mode 100644
index 0000000000..3266e5526d
--- /dev/null
+++ b/Applications/SystemMonitor/GraphWidget.cpp
@@ -0,0 +1,52 @@
+#include "GraphWidget.h"
+#include <LibGUI/GPainter.h>
+
+GraphWidget::GraphWidget(GWidget* parent)
+ : GFrame(parent)
+{
+ set_frame_thickness(2);
+ set_frame_shape(FrameShape::Container);
+ set_frame_shadow(FrameShadow::Sunken);
+}
+
+GraphWidget::~GraphWidget()
+{
+}
+
+void GraphWidget::add_value(int value)
+{
+ m_values.enqueue(value);
+ update();
+}
+
+void GraphWidget::paint_event(GPaintEvent& event)
+{
+ GFrame::paint_event(event);
+ GPainter painter(*this);
+ painter.add_clip_rect(event.rect());
+ painter.add_clip_rect(frame_inner_rect());
+ painter.fill_rect(event.rect(), Color::Black);
+
+ auto inner_rect = frame_inner_rect();
+ float scale = (float)inner_rect.height() / (float)m_max;
+
+ Point prev_point;
+ for (int i = 0; i < m_values.size(); ++i) {
+ int x = inner_rect.right() - (i * 2) + 1;
+ if (x < 0)
+ break;
+ float scaled_value = (float)m_values.at(m_values.size() - i - 1) * scale;
+ Point point = { x, inner_rect.bottom() - (int)scaled_value };
+ if (i != 0)
+ painter.draw_line(prev_point, point, m_graph_color);
+ prev_point = point;
+ }
+
+ if (!m_values.is_empty() && text_formatter) {
+ Rect text_rect = inner_rect.shrunken(8, 8);
+ text_rect.set_height(font().glyph_height());
+ auto text = text_formatter(m_values.last(), m_max);
+ painter.draw_text(text_rect.translated(1, 1), text.characters(), TextAlignment::CenterRight, Color::Black);
+ painter.draw_text(text_rect, text.characters(), TextAlignment::CenterRight, m_text_color);
+ }
+}