]> git.cworth.org Git - apitrace/blobdiff - gui/graphing/timeaxiswidget.cpp
Rewrote profile graph drawing code.
[apitrace] / gui / graphing / timeaxiswidget.cpp
diff --git a/gui/graphing/timeaxiswidget.cpp b/gui/graphing/timeaxiswidget.cpp
new file mode 100644 (file)
index 0000000..cebabf7
--- /dev/null
@@ -0,0 +1,80 @@
+#include "timeaxiswidget.h"
+#include "profiling.h"
+
+#include <qmath.h>
+#include <QPainter>
+
+TimeAxisWidget::TimeAxisWidget(QWidget* parent) :
+    GraphAxisWidget(parent)
+{
+}
+
+void TimeAxisWidget::paintEvent(QPaintEvent *)
+{
+    /* TODO: Support selections? */
+    /* TODO: Vertical scrolling? */
+
+    QPainter painter(this);
+    painter.setPen(Qt::black);
+    painter.setBrush(Qt::lightGray);
+    painter.drawRect(0, 0, width() - 1, height() - 1);
+
+    if (m_orientation == GraphAxisWidget::Vertical) {
+        int axisHeight = height() - 1;
+        int fontHeight = painter.fontMetrics().height();
+        int ticks     = axisHeight / (fontHeight * 2);
+
+        double range  = m_valueMax - m_valueMin;
+        double step   = range / (double)ticks;
+        double step10 = qPow(10.0, qFloor(qLn(step) / qLn(10.0)));
+        step = qFloor((step / step10) * 2) * (step10 / 2);
+
+        if (step <= 0) {
+            return;
+        }
+
+        painter.resetTransform();
+
+        for (double tick = 0; tick <= range; tick += step) {
+            int y = axisHeight - ((tick / range) * axisHeight);
+
+            painter.drawLine(width() - 8, y, width(), y);
+
+            painter.drawText(0,
+                             qBound(0, y - fontHeight / 2, axisHeight - fontHeight),
+                             width() - 10,
+                             fontHeight,
+                             Qt::AlignRight | Qt::AlignVCenter,
+                             Profiling::getTimeString(tick, m_valueMax));
+        }
+    } else {
+        int axisWidth = width() - 1;
+        int fontWidth = painter.fontMetrics().width("0.000 ns");
+        int fontHeight= painter.fontMetrics().height();
+        int ticks     = axisWidth / (fontWidth * 2);
+
+        double range  = m_valueMax - m_valueMin;
+        double step   = range / (double)ticks;
+        double step10 = qPow(10.0, qFloor(qLn(step) / qLn(10.0)));
+        step = qFloor((step / step10) * 2) * (step10 / 2);
+
+        if (step <= 0) {
+            return;
+        }
+
+        painter.resetTransform();
+
+        for (double tick = 0; tick <= range; tick += step) {
+            int x = (tick / range) * axisWidth;
+
+            painter.drawLine(x, 0, x, 8);
+
+            painter.drawText(qBound(0, x - fontWidth / 2, axisWidth - fontWidth),
+                             8,
+                             fontWidth,
+                             fontHeight,
+                             Qt::AlignHCenter | Qt::AlignTop,
+                             Profiling::getTimeString(tick, m_valueMax));
+        }
+    }
+}