perfapps/perfmon/ui/hb/app/src/graphdatacontainer.cpp
author hgs
Fri, 03 Sep 2010 17:11:21 +0300
changeset 51 b048e15729d6
permissions -rw-r--r--
201035
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "graphdatacontainer.h"
hgs
parents:
diff changeset
    19
#include "enginewrapper.h"
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#include <QPainter>
hgs
parents:
diff changeset
    22
#include <QFontMetrics>
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
const int amountOfMicroSecondsFitsScreen = 20 * 1000000;
hgs
parents:
diff changeset
    25
const int microToSecondMultiplier = 1000000;
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
GraphDataContainer::GraphDataContainer(const EngineWrapper& engine, QGraphicsItem *parent) :
hgs
parents:
diff changeset
    28
    DataContainer(engine, parent)
hgs
parents:
diff changeset
    29
{
hgs
parents:
diff changeset
    30
    HbFontSpec spec(HbFontSpec::Secondary);
hgs
parents:
diff changeset
    31
    mFont = spec.font();
hgs
parents:
diff changeset
    32
    mFont.setPixelSize(12);
hgs
parents:
diff changeset
    33
}
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
void GraphDataContainer::paint (QPainter *painter,
hgs
parents:
diff changeset
    36
    const QStyleOptionGraphicsItem *option,
hgs
parents:
diff changeset
    37
    QWidget *widget)
hgs
parents:
diff changeset
    38
{
hgs
parents:
diff changeset
    39
    Q_UNUSED(option);
hgs
parents:
diff changeset
    40
    Q_UNUSED(widget);
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
    // set proper font and prepare font metrics for text width / height calculation
hgs
parents:
diff changeset
    43
    painter->setFont(mFont);
hgs
parents:
diff changeset
    44
    QFontMetricsF metrics(mFont);
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
    // fill background with black color
hgs
parents:
diff changeset
    47
    painter->fillRect(rect(), Qt::black);
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
    // calculate time factor
hgs
parents:
diff changeset
    50
    qreal scaleFactor = rect().width() / (qreal) amountOfMicroSecondsFitsScreen;
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
    // calculate area height which is used to draw the grpahs
hgs
parents:
diff changeset
    53
    qreal drawAreaHeight = rect().height() - 2 * metrics.height();
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
    const QList<SampleEntry> sampleEntries = engine().sampleEntries();
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
    // check if sample array has been constructed
hgs
parents:
diff changeset
    59
    if (sampleEntries.length())
hgs
parents:
diff changeset
    60
    {
hgs
parents:
diff changeset
    61
        // draw vertical time lines first
hgs
parents:
diff changeset
    62
        int verticalBarPeriodInSecs = engine().settings().graphVerticalBarPeriod();
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
        if (verticalBarPeriodInSecs >= 1 && sampleEntries.first().sampleCount() > 0)
hgs
parents:
diff changeset
    65
        {
hgs
parents:
diff changeset
    66
            // get time from the first sample
hgs
parents:
diff changeset
    67
            const SampleData& firstSample = sampleEntries.first().sample(0);
hgs
parents:
diff changeset
    68
            qint64 currentMicroSeconds = firstSample.mTimeFromStart;
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
            // calculate amount of microseconds exceeding value by using the modulo operator
hgs
parents:
diff changeset
    71
            int remainderInMicroSeconds = currentMicroSeconds % (verticalBarPeriodInSecs * 1000000);
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
            // calculate first x pos
hgs
parents:
diff changeset
    74
            qreal vbarXpos = rect().width() - (remainderInMicroSeconds * scaleFactor);
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
            // calculate the amount in seconds
hgs
parents:
diff changeset
    77
            int barSeconds = (currentMicroSeconds - remainderInMicroSeconds) / microToSecondMultiplier;
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
            // continue drawing periodically the vertical lines
hgs
parents:
diff changeset
    80
            while (vbarXpos >= 0 && barSeconds >= 0)
hgs
parents:
diff changeset
    81
            {
hgs
parents:
diff changeset
    82
                // draw vertical line
hgs
parents:
diff changeset
    83
                painter->setPen(Qt::darkRed);
hgs
parents:
diff changeset
    84
                painter->drawLine(QPointF(vbarXpos, metrics.height() + 1),
hgs
parents:
diff changeset
    85
                                  QPointF(vbarXpos, rect().height() - metrics.height()));
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
                // draw seconds value
hgs
parents:
diff changeset
    88
                painter->setPen(Qt::darkGray);
hgs
parents:
diff changeset
    89
                QString secsText = QString("%1s").arg(barSeconds);
hgs
parents:
diff changeset
    90
                QPointF secsPos(vbarXpos - metrics.width(secsText) / 2,
hgs
parents:
diff changeset
    91
                                rect().height());
hgs
parents:
diff changeset
    92
                painter->drawText(secsPos, secsText);
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
                // calculate new position
hgs
parents:
diff changeset
    95
                vbarXpos -= verticalBarPeriodInSecs * 1000000 * scaleFactor;
hgs
parents:
diff changeset
    96
                barSeconds -= verticalBarPeriodInSecs;
hgs
parents:
diff changeset
    97
            }
hgs
parents:
diff changeset
    98
        }
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
        // draw the basic grid
hgs
parents:
diff changeset
   101
        painter->setPen(Qt::darkGray);
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
        qreal axisY = metrics.height();
hgs
parents:
diff changeset
   104
        painter->drawLine(QPointF(0, axisY), QPointF(rect().width(), axisY)); // upper line
hgs
parents:
diff changeset
   105
        painter->drawText(QPointF(0, axisY), tr("100%"));
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
        axisY = rect().height() / 2;
hgs
parents:
diff changeset
   108
        painter->drawLine(QPointF(0, axisY), QPointF(rect().width(), axisY)); // mid line
hgs
parents:
diff changeset
   109
        painter->drawText(QPointF(0, axisY), tr("50%"));
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
        axisY = rect().height() - metrics.height();
hgs
parents:
diff changeset
   112
        painter->drawLine(QPointF(0, axisY), QPointF(rect().width(), axisY)); // bottom line
hgs
parents:
diff changeset
   113
        painter->drawText(QPointF(0, axisY), tr("0%"));
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
        int c = 0;
hgs
parents:
diff changeset
   116
        // draw graphs for each sampled type
hgs
parents:
diff changeset
   117
        for (int i=0; i<sampleEntries.length(); i++)
hgs
parents:
diff changeset
   118
        {
hgs
parents:
diff changeset
   119
            // check if this setting has been enabled and it has some data
hgs
parents:
diff changeset
   120
            if (engine().settings().graphSources().isEnabled(engine().SampleEntryPosToSettingPos(i)) &&
hgs
parents:
diff changeset
   121
                sampleEntries.at(i).sampleCount() > 0)
hgs
parents:
diff changeset
   122
            {
hgs
parents:
diff changeset
   123
                // set pen color for the graph
hgs
parents:
diff changeset
   124
                painter->setPen(sampleEntries.at(i).graphColor());
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
                // remember the position where drawing started
hgs
parents:
diff changeset
   127
                qreal currentXPos(rect().width()); // start drawing from right
hgs
parents:
diff changeset
   128
                qreal currentYPos(0.);
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
                // draw samples
hgs
parents:
diff changeset
   131
                for (int j=0; j<sampleEntries.at(i).sampleCount()-1; j++)
hgs
parents:
diff changeset
   132
                {
hgs
parents:
diff changeset
   133
                    const SampleData& currentSample = sampleEntries.at(i).sample(j);
hgs
parents:
diff changeset
   134
                    const SampleData& previousSample = sampleEntries.at(i).sample(j+1);
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
                    // calculate X position for previous (j+1)
hgs
parents:
diff changeset
   137
                    qreal previousXPos = currentXPos -
hgs
parents:
diff changeset
   138
                        qAbs(previousSample.mTimeFromStart - currentSample.mTimeFromStart) * scaleFactor;
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
                    // calculate initial Y position
hgs
parents:
diff changeset
   142
                    if (j==0)
hgs
parents:
diff changeset
   143
                    {
hgs
parents:
diff changeset
   144
                        currentYPos = currentSample.mSize > 0 ?
hgs
parents:
diff changeset
   145
                            drawAreaHeight * currentSample.mFree / currentSample.mSize + metrics.height() :
hgs
parents:
diff changeset
   146
                            rect().height() - metrics.height();
hgs
parents:
diff changeset
   147
                    }
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
                    // calculate Y position for previous (j+1)
hgs
parents:
diff changeset
   150
                    qreal previousYPos = previousSample.mSize > 0 ?
hgs
parents:
diff changeset
   151
                        drawAreaHeight * previousSample.mFree / previousSample.mSize + metrics.height() :
hgs
parents:
diff changeset
   152
                        rect().height() - metrics.height();
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
                    // draw a line between the previous and current
hgs
parents:
diff changeset
   156
                    painter->drawLine(QPointF(previousXPos, previousYPos),
hgs
parents:
diff changeset
   157
                                      QPointF(currentXPos, currentYPos));
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
                    // draw current value in %
hgs
parents:
diff changeset
   160
                    if (j==0) // draw the value of first sample
hgs
parents:
diff changeset
   161
                    {
hgs
parents:
diff changeset
   162
                        qreal perc = currentSample.mSize > 0 ?
hgs
parents:
diff changeset
   163
                                     100. - 100. * currentSample.mFree / currentSample.mSize : 0;
hgs
parents:
diff changeset
   164
                        QString percText = QString ("%1 %2%").
hgs
parents:
diff changeset
   165
                                           arg(sampleEntries.at(i).description()).
hgs
parents:
diff changeset
   166
                                           arg(perc, 0, 'f', 0);
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
                        painter->drawText(QPointF(0, metrics.height() * (c + 2)),
hgs
parents:
diff changeset
   169
                                          percText);
hgs
parents:
diff changeset
   170
                        c++;
hgs
parents:
diff changeset
   171
                    }
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
                    // stop drawing if we have run out of space
hgs
parents:
diff changeset
   175
                    if (previousXPos < 0)
hgs
parents:
diff changeset
   176
                        break;
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
                    // remeber previous values
hgs
parents:
diff changeset
   179
                    currentXPos = previousXPos;
hgs
parents:
diff changeset
   180
                    currentYPos = previousYPos;
hgs
parents:
diff changeset
   181
                }
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
            }
hgs
parents:
diff changeset
   185
        }
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
    }
hgs
parents:
diff changeset
   188
}