callgrindtextmark.cpp 3.21 KB
Newer Older
Mike McQuaid's avatar
Mike McQuaid committed
1 2
/**************************************************************************
**
Tobias Hunger's avatar
Tobias Hunger committed
3
** This file is part of Qt Creator
Mike McQuaid's avatar
Mike McQuaid committed
4
**
hjk's avatar
hjk committed
5
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
Mike McQuaid's avatar
Mike McQuaid committed
6
**
7
** Contact: Nokia Corporation (qt-info@nokia.com)
Mike McQuaid's avatar
Mike McQuaid committed
8 9 10 11
**
**
** GNU Lesser General Public License Usage
**
Tobias Hunger's avatar
Tobias Hunger committed
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
Mike McQuaid's avatar
Mike McQuaid committed
27
**
Tobias Hunger's avatar
Tobias Hunger committed
28
** If you have questions regarding the use of this file, please contact
29
** Nokia at qt-info@nokia.com.
Mike McQuaid's avatar
Mike McQuaid committed
30 31 32 33 34 35 36
**
**************************************************************************/

#include "callgrindtextmark.h"

#include "callgrindhelper.h"

hjk's avatar
hjk committed
37 38
#include "callgrind/callgrinddatamodel.h"
#include "callgrind/callgrindfunction.h"
Mike McQuaid's avatar
Mike McQuaid committed
39

40 41
#include <QtCore/QDebug>
#include <QtGui/QPainter>
Mike McQuaid's avatar
Mike McQuaid committed
42 43 44

#include <utils/qtcassert.h>

45
using namespace Valgrind::Internal;
Mike McQuaid's avatar
Mike McQuaid committed
46 47 48 49
using namespace Valgrind::Callgrind;

CallgrindTextMark::CallgrindTextMark(const QPersistentModelIndex &index,
                                     const QString &fileName, int lineNumber)
Daniel Teske's avatar
Daniel Teske committed
50
    : TextEditor::BaseTextMark(fileName, lineNumber), m_modelIndex(index)
Mike McQuaid's avatar
Mike McQuaid committed
51 52 53 54 55 56 57 58 59 60
{
    setPriority(TextEditor::ITextMark::HighPriority);
}

void CallgrindTextMark::paint(QPainter *painter, const QRect &paintRect) const
{
    if (!m_modelIndex.isValid())
        return;

    bool ok;
61
    qreal costs = m_modelIndex.data(RelativeTotalCostRole).toReal(&ok);
Mike McQuaid's avatar
Mike McQuaid committed
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
    QTC_ASSERT(ok, return)
    QTC_ASSERT(costs >= 0.0 && costs <= 100.0, return)

    painter->save();

    // set up
    painter->setPen(Qt::black);

    // draw bar
    QRect fillRect = paintRect;
    fillRect.setWidth(paintRect.width() * costs);
    painter->fillRect(paintRect, Qt::white);
    painter->fillRect(fillRect, CallgrindHelper::colorForCostRatio(costs));
    painter->drawRect(paintRect);

    // draw text
    const QTextOption flags = Qt::AlignHCenter | Qt::AlignVCenter;
    const QString text = CallgrindHelper::toPercent(costs * 100.0f);

    // decrease font size if paint rect is too small (very unlikely, but may happen)
    QFont font = painter->font();
    QFontMetrics fm = font;
    while (fm.boundingRect(text).width() > paintRect.width()) {
        font.setPointSize(font.pointSize() - 1);
        fm = font;
    }
    painter->setFont(font);

    painter->drawText(paintRect, text, flags);

    painter->restore();
}

hjk's avatar
hjk committed
95
const Function *CallgrindTextMark::function() const
Mike McQuaid's avatar
Mike McQuaid committed
96 97 98 99 100 101 102 103 104 105 106
{
    if (!m_modelIndex.isValid())
        return 0;

    return m_modelIndex.data(DataModel::FunctionRole).value<const Function *>();
}

double CallgrindTextMark::widthFactor() const
{
    return 4.0;
}