Hello community, here is the log from the commit of package kcachegrind for openSUSE:Factory checked in at 2016-08-31 00:07:01 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kcachegrind (Old) and /work/SRC/openSUSE:Factory/.kcachegrind.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kcachegrind" Changes: -------- --- /work/SRC/openSUSE:Factory/kcachegrind/kcachegrind.changes 2016-07-24 19:45:22.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.kcachegrind.new/kcachegrind.changes 2016-08-31 00:07:02.000000000 +0200 @@ -1,0 +2,16 @@ +Fri Aug 12 10:11:27 UTC 2016 - [email protected] + +- Update to KDE Applications 16.08.0 + * KDE Applications 16.08.0 + * https://www.kde.org/announcements/announce-applications-16.08.0.php + + +------------------------------------------------------------------- +Mon Aug 8 14:49:28 UTC 2016 - [email protected] + +- Update to KDE Applications 16.07.90 + * KDE Applications 16.07.90 (16.08-RC) + * https://www.kde.org/announcements/announce-applications-16.07.90.php + + +------------------------------------------------------------------- Old: ---- kcachegrind-16.04.3.tar.xz New: ---- kcachegrind-16.08.0.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kcachegrind.spec ++++++ --- /var/tmp/diff_new_pack.MVFdPK/_old 2016-08-31 00:07:03.000000000 +0200 +++ /var/tmp/diff_new_pack.MVFdPK/_new 2016-08-31 00:07:03.000000000 +0200 @@ -22,7 +22,7 @@ License: GPL-2.0 and BSD-4-Clause and GFDL-1.2 Group: Development/Tools/Other Url: http://www.kde.org/ -Version: 16.04.3 +Version: 16.08.0 Release: 0 Source0: %{name}-%{version}.tar.xz BuildRoot: %{_tmppath}/%{name}-%{version}-build ++++++ kcachegrind-16.04.3.tar.xz -> kcachegrind-16.08.0.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-16.04.3/libviews/callgraphview.cpp new/kcachegrind-16.08.0/libviews/callgraphview.cpp --- old/kcachegrind-16.04.3/libviews/callgraphview.cpp 2015-11-05 05:25:27.000000000 +0100 +++ new/kcachegrind-16.08.0/libviews/callgraphview.cpp 2016-07-06 23:50:15.000000000 +0200 @@ -754,6 +754,8 @@ if (_go->clusterGroups() && i) { QString iabr = GlobalConfig::shortenSymbol(i->prettyName()); + // escape quotation marks in symbols to avoid invalid dot syntax + iabr.replace("\"", "\\\""); *stream << QString("subgraph \"cluster%1\" { label=\"%2\";\n") .arg(cluster).arg(iabr); } @@ -762,6 +764,8 @@ TraceFunction* f = np->function(); QString abr = GlobalConfig::shortenSymbol(f->prettyName()); + // escape quotation marks to avoid invalid dot syntax + abr.replace("\"", "\\\""); *stream << QString(" F%1 [").arg((qptrdiff)f, 0, 16); if (_useBox) { // we want a minimal size for cost display diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-16.04.3/libviews/callmapview.cpp new/kcachegrind-16.08.0/libviews/callmapview.cpp --- old/kcachegrind-16.04.3/libviews/callmapview.cpp 2015-11-05 05:25:27.000000000 +0100 +++ new/kcachegrind-16.08.0/libviews/callmapview.cpp 2016-07-06 23:50:15.000000000 +0200 @@ -54,7 +54,7 @@ CallMapView::CallMapView(bool showCallers, TraceItemView* parentView, QWidget* parent, const char* name) - : TreeMapWidget(new CallMapBaseItem(), parent), TraceItemView(parentView) + : TreeMapWidget(new CallMapRootItem(), parent), TraceItemView(parentView) { setObjectName(name); _showCallers = showCallers; @@ -139,7 +139,7 @@ { TraceItemView::setData(d); - ((CallMapBaseItem*)base())->setFunction(0); + ((CallMapRootItem*)base())->setFunction(0); } void CallMapView::addItemListMenu(QMenu* menu, TreeMapItem* item) @@ -149,7 +149,7 @@ QMenu* m = menu->addMenu(tr("Go To")); int count = 0; while (count<GlobalConfig::maxSymbolCount() && item) { - QString name = item->text(0); + QString name = item->text(IDX_FUNCNAME); a = m->addAction(GlobalConfig::shortenSymbol(name)); a->setData(QVariant::fromValue( (void*)item )); item = item->parent(); @@ -229,8 +229,8 @@ m->addSeparator(); int count = 0; while (count<GlobalConfig::maxSymbolCount() && item) { - QString name = GlobalConfig::shortenSymbol(item->text(0)); - a = addStopFunctionAction(m, name, item->text(0)); + QString name = GlobalConfig::shortenSymbol(item->text(IDX_FUNCNAME)); + a = addStopFunctionAction(m, name, item->text(IDX_FUNCNAME)); if (a->isChecked()) foundStopName = true; item = item->parent(); count++; @@ -320,7 +320,7 @@ QString shortCurrentName; if (i) { - shortCurrentName = GlobalConfig::shortenSymbol(i->text(0)); + shortCurrentName = GlobalConfig::shortenSymbol(i->text(IDX_FUNCNAME)); } if (i) { @@ -416,7 +416,7 @@ if (!item) return; if (item->rtti() == 1) { - CallMapBaseItem* bi = (CallMapBaseItem*)item; + CallMapRootItem* bi = (CallMapRootItem*)item; activated(bi->function()); } else if (item->rtti() == 2) { @@ -432,10 +432,10 @@ void CallMapView::selectedSlot(TreeMapItem* item, bool kbd) { if (!item) return; - if (item->text(0).isEmpty()) return; + if (item->text(IDX_FUNCNAME).isEmpty()) return; if (kbd) { - QString msg = tr("Call Map: Current is '%1'").arg(item->text(0)); + QString msg = tr("Call Map: Current is '%1'").arg(item->text(IDX_FUNCNAME)); if (_topLevel) _topLevel->showMessage(msg, 5000); } @@ -443,7 +443,7 @@ TraceFunction* f = 0; if (item->rtti() == 1) { - CallMapBaseItem* bi = (CallMapBaseItem*)item; + CallMapRootItem* bi = (CallMapRootItem*)item; f = bi->function(); } else if (item->rtti() == 2) { @@ -515,7 +515,7 @@ break; } } - ((CallMapBaseItem*)base())->setFunction(f); + ((CallMapRootItem*)base())->setFunction(f); } else if ( ((changeType & partsChanged) && GlobalConfig::showCycles()) || (changeType & dataChanged) || @@ -553,10 +553,10 @@ // first, SubPartItem's while (i && count<GlobalConfig::maxSymbolCount()) { - itemTip = GlobalConfig::shortenSymbol(i->text(0)); + itemTip = GlobalConfig::shortenSymbol(i->text(IDX_FUNCNAME)); - if (!i->text(1).isEmpty()) - itemTip += " (" + i->text(1) + ')'; + if (!i->text(IDX_COST).isEmpty()) + itemTip += " (" + i->text(IDX_COST) + ')'; if (!tip.isEmpty()) tip += '\n'; @@ -572,7 +572,7 @@ ProfileCostArray* CallMapView::totalCost() { - TraceFunction* f = ((CallMapBaseItem*)base())->function(); + TraceFunction* f = ((CallMapRootItem*)base())->function(); if (!f) return 0; return GlobalConfig::showExpanded() ? f->inclusive() : f->data(); @@ -580,15 +580,42 @@ +// CallMapItemBase -// CallMapBaseItem +int CallMapItemBase::maxLines(int i) const +{ + if ((i == IDX_FUNCNAME) || (i == IDX_LOCATION)) return 1; + return 0; +} + +bool CallMapItemBase::allowBreak(int i) const +{ + if ((i == IDX_COST) || (i == IDX_CALLCOUNT)) return false; + return true; +} -CallMapBaseItem::CallMapBaseItem() +bool CallMapItemBase::allowTruncation(int i) const +{ + if ((i == IDX_COST) || (i == IDX_CALLCOUNT)) return false; + return true; +} + +DrawParams::Position CallMapItemBase::position(int i) const +{ + if ((i == IDX_FUNCNAME) || (i == IDX_LOCATION)) return TopLeft; + return TopRight; +} + + + +// CallMapRootItem + +CallMapRootItem::CallMapRootItem() { _f = 0; } -void CallMapBaseItem::setFunction(TraceFunction* f) +void CallMapRootItem::setFunction(TraceFunction* f) { if (f == _f) return; @@ -597,9 +624,9 @@ } -QString CallMapBaseItem::text(int textNo) const +QString CallMapRootItem::text(int i) const { - if (textNo == 0) { + if (i == IDX_FUNCNAME) { if (!_f) return QObject::tr("(no function)"); @@ -608,12 +635,15 @@ if (!_f) return QString(); - if (textNo == 2) return _f->prettyLocation(); - if (textNo == 3) return _f->calledCount().pretty(); - if (textNo != 1) return QString(); + if (i == IDX_LOCATION) + return _f->prettyLocation(); + if (i == IDX_CALLCOUNT) + return QString("%1 x").arg(_f->calledCount().pretty()); + if (i != IDX_COST) + return QString(); EventType* ct = ((CallMapView*)widget())->eventType(); - ProfileCostArray* t = ((CallMapView*)widget())->totalCost(); + ProfileCostArray* t = ((CallMapView*)widget())->totalCost(); if (GlobalConfig::showPercentage()) { double sum, total = t->subCost(ct); @@ -628,9 +658,10 @@ return _f->inclusive()->prettySubCost(ct); } -QPixmap CallMapBaseItem::pixmap(int i) const + +QPixmap CallMapRootItem::pixmap(int i) const { - if ((i != 1) || !_f) return QPixmap(); + if ((i != IDX_COST) || !_f) return QPixmap(); EventType* ct = ((CallMapView*)widget())->eventType(); ProfileCostArray* t = ((CallMapView*)widget())->totalCost(); @@ -640,7 +671,7 @@ } -double CallMapBaseItem::value() const +double CallMapRootItem::value() const { if (!_f) return 0.0; @@ -650,7 +681,7 @@ } -double CallMapBaseItem::sum() const +double CallMapRootItem::sum() const { if (!_f) return 0.0; @@ -663,19 +694,19 @@ } -bool CallMapBaseItem::isMarked(int) const +bool CallMapRootItem::isMarked(int) const { return ((CallMapView*)widget())->selectedItem() == _f; } -TreeMapItemList* CallMapBaseItem::children() +TreeMapItemList* CallMapRootItem::children() { if (_f && !initialized()) { CallMapView* w = (CallMapView*)widget(); if (0) qDebug("Create Function %s (%s)", w->showCallers() ? "Callers":"Callees", - qPrintable(text(0))); + qPrintable(text(IDX_FUNCNAME))); setSorting(-1); if (w->showCallers()) { @@ -708,7 +739,7 @@ return _children; } -QColor CallMapBaseItem::backColor() const +QColor CallMapRootItem::backColor() const { return ((CallMapView*)widget())->groupColor(_f); } @@ -735,16 +766,19 @@ QString CallMapCallingItem::text(int textNo) const { - if (textNo == 0) { + if (textNo == IDX_FUNCNAME) { if (!_c) return QObject::tr("(no call)"); return _c->calledName(); } - if (textNo == 2) return _c->called()->prettyLocation(); - if (textNo == 3) return SubCost(_factor * _c->callCount()).pretty(); - if (textNo != 1) return QString(); + if (textNo == IDX_LOCATION) + return _c->called()->prettyLocation(); + if (textNo == IDX_CALLCOUNT) + return QString("%1 x").arg(SubCost(_factor * _c->callCount()).pretty()); + if (textNo != IDX_COST) + return QString(); EventType* ct; ct = ((CallMapView*)widget())->eventType(); @@ -760,13 +794,14 @@ return val.pretty(); } + QPixmap CallMapCallingItem::pixmap(int i) const { - if (i != 1) return QPixmap(); + if (i != IDX_COST) return QPixmap(); // Cost pixmap EventType* ct = ((CallMapView*)widget())->eventType(); - ProfileCostArray* t = ((CallMapView*)widget())->totalCost(); + ProfileCostArray* t = ((CallMapView*)widget())->totalCost(); // colored level meter with frame return costPixmap( ct, _c, t->subCost(ct) / _factor, true); @@ -848,18 +883,21 @@ _c = c; } -QString CallMapCallerItem::text(int textNo) const +QString CallMapCallerItem::text(int i) const { - if (textNo == 0) { + if (i == IDX_FUNCNAME) { if (!_c) return QObject::tr("(no call)"); return _c->callerName(); } - if (textNo == 2) return _c->caller()->prettyLocation(); - if (textNo == 3) return SubCost(_factor * _c->callCount()).pretty(); - if (textNo != 1) return QString(); + if (i == IDX_LOCATION) + return _c->caller()->prettyLocation(); + if (i == IDX_CALLCOUNT) + return QString("%1 x").arg(SubCost(_factor * _c->callCount()).pretty()); + if (i != IDX_COST) + return QString(); EventType* ct; ct = ((CallMapView*)widget())->eventType(); @@ -874,14 +912,13 @@ return val.pretty(); } - QPixmap CallMapCallerItem::pixmap(int i) const { - if (i != 1) return QPixmap(); + if (i != IDX_COST) return QPixmap(); // Cost pixmap EventType* ct = ((CallMapView*)widget())->eventType(); - ProfileCostArray* t = ((CallMapView*)widget())->totalCost(); + ProfileCostArray* t = ((CallMapView*)widget())->totalCost(); // colored level meter with frame return costPixmap( ct, _c, t->subCost(ct) / _factor, true ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-16.04.3/libviews/callmapview.h new/kcachegrind-16.08.0/libviews/callmapview.h --- old/kcachegrind-16.04.3/libviews/callmapview.h 2015-11-05 05:25:27.000000000 +0100 +++ new/kcachegrind-16.08.0/libviews/callmapview.h 2016-07-06 23:50:15.000000000 +0200 @@ -82,18 +82,34 @@ -// Subitems of CallMap +// Subitems in CallMapView -class CallMapBaseItem: public TreeMapItem +// text field indexes: lower indexes get priority if space is not enough +#define IDX_COST 0 +#define IDX_FUNCNAME 1 +#define IDX_LOCATION 2 +#define IDX_CALLCOUNT 3 + +// base class providing same layout configuration +class CallMapItemBase: public TreeMapItem { public: - CallMapBaseItem(); + int maxLines(int) const; + bool allowBreak(int) const; + bool allowTruncation(int) const; + Position position(int) const; +}; + +class CallMapRootItem: public CallMapItemBase +{ +public: + CallMapRootItem(); void setFunction(TraceFunction* f); TraceFunction* function() { return _f; } int rtti() const { return 1; } double sum() const; - double value() const ; + double value() const; bool isMarked(int) const; QString text(int) const; QPixmap pixmap(int) const; @@ -105,7 +121,7 @@ }; -class CallMapCallingItem: public TreeMapItem +class CallMapCallingItem: public CallMapItemBase { public: CallMapCallingItem(double factor, TraceCall* c); @@ -126,7 +142,7 @@ double _factor; }; -class CallMapCallerItem: public TreeMapItem +class CallMapCallerItem: public CallMapItemBase { public: CallMapCallerItem(double factor, TraceCall* c); @@ -135,7 +151,7 @@ TraceFunction* function() { return _c->caller(); } double value() const; bool isMarked(int) const; - QString text(int) const; + QString text(int i) const; QPixmap pixmap(int) const; TreeMapItemList* children(); QColor backColor() const; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-16.04.3/libviews/treemap.cpp new/kcachegrind-16.08.0/libviews/treemap.cpp --- old/kcachegrind-16.04.3/libviews/treemap.cpp 2015-11-05 05:25:27.000000000 +0100 +++ new/kcachegrind-16.08.0/libviews/treemap.cpp 2016-07-06 23:50:15.000000000 +0200 @@ -428,7 +428,7 @@ while(1) { int halfPos = (breakPos + topPos)/2; int halfWidth = fm->width(text.mid(halfPos)); - if (halfWidth > maxWidth) { + if (halfWidth < maxWidth) { topPos = halfPos-1; continue; } @@ -587,6 +587,9 @@ } if (lines<1) return false; + // keep some space between fields if part of line already used + if (unused > 0 && unused < width) + unused -= _fm->averageCharWidth(); int y = isBottom ? height - h : 0; @@ -639,9 +642,13 @@ if (0) qDebug() << " For '" << name << "': Unused " << unused << ", StrW " << w << ", Width " << width; + // adjust available lines according to maxLines + int max = dp->maxLines(f); + if ((max > 0) && (lines>max)) lines = max; + // if we have limited space at 1st line: // use it only if whole name does fit in last line... - if ((unused < width) && (w > unused)) { + if ((lines>1) && (unused < width) && (w > unused)) { y = isBottom ? (y-h) : (y+h); lines--; @@ -652,6 +659,7 @@ _usedBottomLeft = _usedBottomCenter = _usedBottomRight = 0; else _usedTopLeft = _usedTopCenter = _usedTopRight = 0; + unused = width; } p->save(); @@ -665,11 +673,6 @@ else p->translate(r.x()+2, r.y()); - - // adjust available lines according to maxLines - int max = dp->maxLines(f); - if ((max > 0) && (lines>max)) lines = max; - /* loop over name parts to break up string depending on available width. * every char category change is supposed a possible break, * with the exception Uppercase=>Lowercase. @@ -680,14 +683,15 @@ */ QString remaining; int origLines = lines; + int unusedWidth = unused; while (lines>0) { // more than one line: search for line break - if (w>width && lines>1) { + if (dp->allowBreak(f) && w>unusedWidth && lines>1) { int breakPos; if (!isBottom) { - w = pixW + findBreak(breakPos, name, _fm, width - pixW); + w = pixW + findBreak(breakPos, name, _fm, unusedWidth - pixW); remaining = name.mid(breakPos); // remove space on break point @@ -697,7 +701,7 @@ name = name.left(breakPos); } else { // bottom - w = pixW + findBreakBackwards(breakPos, name, _fm, width - pixW); + w = pixW + findBreakBackwards(breakPos, name, _fm, unusedWidth - pixW); remaining = name.left(breakPos); // remove space on break point @@ -711,11 +715,16 @@ remaining = QString(); /* truncate and add ... if needed */ - if (w > width) { - name = _fm->elidedText(name, Qt::ElideRight, width - pixW); + if (dp->allowTruncation(f) && w > unusedWidth) { + name = _fm->elidedText(name, Qt::ElideRight, unusedWidth - pixW); w = _fm->width(name) + pixW; } + if (w > unusedWidth) { + name = QString(); + w = pixW; + } + int x = 0; if (isCenter) x = (width - w)/2; @@ -738,7 +747,7 @@ << x+pixW << "/" << y; p->drawText( x+pixW, y, - width - pixW, h, + unusedWidth - pixW, h, Qt::AlignLeft, name); y = isBottom ? (y-h) : (y+h); lines--; @@ -746,6 +755,7 @@ if (remaining.isEmpty()) break; name = remaining; w = pixW + _fm->width(name); + unusedWidth = width; } // make sure the pix stays visible @@ -2367,7 +2377,10 @@ if ((r.height() < _fontHeight) || (r.width() < _fontHeight)) return; RectDrawing d(r); - item->setRotated(_allowRotation && (r.height() > r.width())); + // draw text fields rotated to split direction + bool rotate = !horizontal(item, r); + if (_allowRotation) rotate = (r.height() > r.width()); + item->setRotated(rotate); for (int no=0;no<(int)_attr.size();no++) { if (!fieldVisible(no)) continue; d.drawField(p, no, item); @@ -2399,7 +2412,10 @@ if ((r.height() >= _fontHeight) && (r.width() >= _fontHeight)) { RectDrawing d(r); - item->setRotated(_allowRotation && (r.height() > r.width())); + // draw text fields rotated to split direction + bool rotate = !horizontal(item, r); + if (_allowRotation) rotate = (r.height() > r.width()); + item->setRotated(rotate); for (int no=0;no<(int)_attr.size();no++) { if (!fieldVisible(no)) continue; if (!fieldForced(no)) continue; @@ -2425,8 +2441,6 @@ self = 0; } else { - self = user_sum - child_sum; - if (user_sum < child_sum) { //qDebug() << "TreeMWidget " << // item->path() << ": User sum " << user_sum << " < Child Items sum " << child_sum; @@ -2436,30 +2450,17 @@ self = 0.0; } else { - // Try to put the border waste in self - // percent of wasted space on border... - float borderArea = origRect.width() * origRect.height(); - borderArea = (borderArea - r.width()*r.height())/borderArea; - unsigned borderValue = (unsigned)(borderArea * user_sum); - - if (borderValue > self) { - if (_skipIncorrectBorder) { - r = origRect; - // should add my self to nested self and set my self =0 - } - else - self = 0.0; - } - else - self -= borderValue; - - user_sum = child_sum + self; + self = user_sum - child_sum; } } - bool rotate = (_allowRotation && (r.height() > r.width())); + // use requested splitting algorithm: we rotate for horizontal splits + bool rotate = horizontal(item, r); int self_length = (int)( ((rotate) ? r.width() : r.height()) * - self / user_sum + .5); + self / user_sum + .5); + // drawn border belongs to self (TODO: option _skipIncorrectBorder) + self_length -= 2 * item->borderWidth(); + if (self_length > 0) { // take space for self cost QRect sr = r; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kcachegrind-16.04.3/libviews/treemap.h new/kcachegrind-16.08.0/libviews/treemap.h --- old/kcachegrind-16.04.3/libviews/treemap.h 2015-11-05 05:25:27.000000000 +0100 +++ new/kcachegrind-16.08.0/libviews/treemap.h 2016-07-06 23:50:15.000000000 +0200 @@ -76,6 +76,10 @@ virtual Position position(int) const = 0; // 0: no limit, negative: leave at least -maxLines() free virtual int maxLines(int) const { return 0; } + // allow breaking up content into multiple lines? + virtual bool allowBreak(int) const { return true; } + // truncate or show nothing if space not enough? + virtual bool allowTruncation(int) const { return true; } virtual int fieldCount() const { return 0; } virtual QColor backColor() const { return Qt::white; }
