summaryrefslogtreecommitdiffstats
path: root/kcachegrind/kcachegrind/costlistitem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kcachegrind/kcachegrind/costlistitem.cpp')
-rw-r--r--kcachegrind/kcachegrind/costlistitem.cpp136
1 files changed, 136 insertions, 0 deletions
diff --git a/kcachegrind/kcachegrind/costlistitem.cpp b/kcachegrind/kcachegrind/costlistitem.cpp
new file mode 100644
index 00000000..bfe22730
--- /dev/null
+++ b/kcachegrind/kcachegrind/costlistitem.cpp
@@ -0,0 +1,136 @@
+/* This file is part of KCachegrind.
+ Copyright (C) 2002, 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
+
+ KCachegrind is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation, version 2.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include <math.h>
+
+#include <qpainter.h>
+#include <qregexp.h>
+
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kapplication.h>
+
+#include "listutils.h"
+#include "costlistitem.h"
+#include "coverage.h"
+#include "configuration.h"
+
+// CostListItem
+
+
+CostListItem::CostListItem(QListView* parent, TraceCostItem* costItem,
+ TraceCostType* ct, int size)
+ :QListViewItem(parent)
+{
+ _groupSize = size;
+ _skipped = 0;
+ _costItem = costItem;
+ setCostType(ct);
+
+ if (costItem) {
+ updateName();
+ setPixmap(1, colorPixmap(10, 10,
+ Configuration::groupColor(_costItem)));
+ }
+}
+
+CostListItem::CostListItem(QListView* parent, int skipped,
+ TraceCostItem* costItem, TraceCostType* ct)
+ :QListViewItem(parent)
+{
+ _skipped = skipped;
+ _costItem = costItem;
+ setCostType(ct);
+
+ setText(1, i18n("(%n item skipped)", "(%n items skipped)", _skipped));
+}
+
+void CostListItem::setCostType(TraceCostType* ct)
+{
+ _costType = ct;
+ update();
+}
+
+void CostListItem::updateName()
+{
+ if (!_costItem) return;
+
+ QString n = _costItem->prettyName();
+ if (_groupSize>=0) n += QString(" (%1)").arg(_groupSize);
+
+ setText(1, n);
+}
+
+void CostListItem::setSize(int s)
+{
+ _groupSize = s;
+ updateName();
+}
+
+void CostListItem::update()
+{
+ if (!_costItem) return;
+ TraceData* d = _costItem->data();
+
+ double total = d->subCost(_costType);
+ if (total == 0.0) {
+ setText(0, QString("---"));
+ setPixmap(0, QPixmap());
+ return;
+ }
+
+ _pure = _costItem->subCost(_costType);
+ double pure = 100.0 * _pure / total;
+ QString str;
+ if (Configuration::showPercentage())
+ str = QString("%1").arg(pure, 0, 'f', Configuration::percentPrecision());
+ else
+ str = _costItem->prettySubCost(_costType);
+
+ if (_skipped) {
+ // special handling for skip entries...
+ setText(0, QString("< %1").arg(str));
+ return;
+ }
+
+ setText(0, str);
+ setPixmap(0, costPixmap(_costType, _costItem, total, false));
+}
+
+int CostListItem::compare(QListViewItem * i, int col, bool ascending ) const
+{
+ const CostListItem* fi1 = this;
+ const CostListItem* fi2 = (CostListItem*) i;
+
+ // we always want descending order
+ if (ascending) {
+ fi1 = fi2;
+ fi2 = this;
+ }
+
+ // a skip entry is always sorted last
+ if (fi1->_skipped) return -1;
+ if (fi2->_skipped) return 1;
+
+ if (col==0) {
+ if (fi1->_pure < fi2->_pure) return -1;
+ if (fi1->_pure > fi2->_pure) return 1;
+ return 0;
+ }
+ return QListViewItem::compare(i, col, ascending);
+}