]> git.cworth.org Git - apitrace/blobdiff - gui/graphing/frameaxiswidget.cpp
Rewrote profile graph drawing code.
[apitrace] / gui / graphing / frameaxiswidget.cpp
diff --git a/gui/graphing/frameaxiswidget.cpp b/gui/graphing/frameaxiswidget.cpp
new file mode 100644 (file)
index 0000000..ad5d868
--- /dev/null
@@ -0,0 +1,99 @@
+#include "frameaxiswidget.h"
+
+#include <QPainter>
+
+FrameAxisWidget::FrameAxisWidget(QWidget* parent) :
+    GraphAxisWidget(parent),
+    m_data(NULL)
+{
+    setSelectable(GraphAxisWidget::Range);
+}
+
+void FrameAxisWidget::setDataProvider(FrameDataProvider* data)
+{
+    delete m_data;
+    m_data = data;
+}
+
+void FrameAxisWidget::paintEvent(QPaintEvent *)
+{
+    if (!m_data || m_orientation != GraphAxisWidget::Horizontal) {
+        /* TODO: Vertical axis support */
+        return;
+    }
+
+    QPainter painter(this);
+    painter.setPen(Qt::black);
+    painter.setBrush(Qt::lightGray);
+    painter.drawRect(0, 0, width() - 1, height() - 1);
+
+    qint64 range = m_valueEnd - m_valueBegin;
+    double dxdv = width() / (double)range;
+    double scroll = dxdv * m_valueBegin;
+    int lastLabel = -9999;
+
+    /* Iterate over frames, drawing a label when there is space to do so */
+    for (unsigned i = 0; i < m_data->size(); ++i) {
+        static const int padding = 4;
+        qint64 start = m_data->frameStart(i);
+        qint64 end = m_data->frameEnd(i);
+        bool visible = false;
+
+        if (start > m_valueEnd) {
+            break;
+        }
+
+        if (end < m_valueBegin) {
+            visible = false;
+        }
+
+        double left = dxdv * start;
+        double right = dxdv * end;
+        QString text = QString("%1").arg(i);
+
+        int width = painter.fontMetrics().width(text) + padding * 2;
+
+        if (right > scroll) {
+            visible = true;
+        }
+
+        if (left - lastLabel > width) {
+            lastLabel = left + width;
+
+            if (visible) {
+                int textX;
+
+                if (left < scroll && right - left > width) {
+                    if (right - scroll > width) {
+                        textX = 0;
+                    } else {
+                        textX = right - scroll - width;
+                    }
+                } else {
+                    textX = left - scroll;
+                }
+
+                painter.drawText(textX + padding, 0, width - padding, height() - 5, Qt::AlignLeft | Qt::AlignVCenter, text);
+                painter.drawLine(left - scroll, height() / 2, left - scroll, height() - 1);
+            }
+        } else if (visible) {
+            painter.drawLine(left - scroll, height() * 3/4.0, left - scroll, height() - 1);
+        }
+    }
+
+    /* Draw selection */
+    if (hasSelection()) {
+        double left = (dxdv * m_selectionState->start) - scroll;
+        double right = (dxdv * m_selectionState->end) - scroll;
+
+        painter.setPen(Qt::green);
+
+        if (left >= 0 && left <= width()) {
+            painter.drawLine(left, 0, left, height());
+        }
+
+        if (right >= 0 && right <= width()) {
+            painter.drawLine(right, 0, right, height());
+        }
+    }
+}