diff --git a/src/libs/utils/basetreeview.cpp b/src/libs/utils/basetreeview.cpp index 326f407cf4e..e38326d3f37 100644 --- a/src/libs/utils/basetreeview.cpp +++ b/src/libs/utils/basetreeview.cpp @@ -133,18 +133,14 @@ public: } } - int suggestedColumnSize(int column) const - { - QHeaderView *h = q->header(); - QTC_ASSERT(h, return -1); - QAbstractItemModel *m = q->model(); - QTC_ASSERT(m, return -1); - QModelIndex a = q->indexAt(QPoint(1, 1)); + void considerItems(int column, QModelIndex start, int *minimum, bool single) const + { + QModelIndex a = start; a = a.sibling(a.row(), column); QFontMetrics fm = q->fontMetrics(); - int minimum = fm.width(m->headerData(column, Qt::Horizontal).toString()); const int ind = q->indentation(); + QAbstractItemModel *m = q->model(); for (int i = 0; i < 100 && a.isValid(); ++i) { const QString s = m->data(a).toString(); int w = fm.width(s) + 10; @@ -152,10 +148,29 @@ public: for (QModelIndex b = a.parent(); b.isValid(); b = b.parent()) w += ind; } - if (w > minimum) - minimum = w; + if (w > *minimum) + *minimum = w; + if (single) + break; a = q->indexBelow(a); } + } + + int suggestedColumnSize(int column) const + { + QHeaderView *h = q->header(); + QTC_ASSERT(h, return -1); + QAbstractItemModel *m = q->model(); + QTC_ASSERT(m, return -1); + + QFontMetrics fm = q->fontMetrics(); + int minimum = fm.width(m->headerData(column, Qt::Horizontal).toString()) + 2 * fm.width(QLatin1Char('m')); + considerItems(column, q->indexAt(QPoint(1, 1)), &minimum, false); + + QVariant extraIndices = m->data(QModelIndex(), BaseTreeView::ExtraIndicesForColumnWidth); + foreach (const QModelIndex &a, extraIndices.value()) + considerItems(column, a, &minimum, true); + return minimum; } diff --git a/src/libs/utils/basetreeview.h b/src/libs/utils/basetreeview.h index 777f1f51291..2023a14d3ac 100644 --- a/src/libs/utils/basetreeview.h +++ b/src/libs/utils/basetreeview.h @@ -48,6 +48,8 @@ class QTCREATOR_UTILS_EXPORT BaseTreeView : public TreeView Q_OBJECT public: + enum { ExtraIndicesForColumnWidth = 12734 }; + BaseTreeView(QWidget *parent = 0); ~BaseTreeView(); diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index cb9dcf77a02..107d59fc05a 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -201,6 +201,7 @@ public: static QString nameForFormat(int format); TypeFormatList typeFormatList(const WatchData &value) const; + QVariant data(const QModelIndex &idx, int role) const; bool setData(const QModelIndex &idx, const QVariant &value, int role); void insertDataItem(const WatchData &data); @@ -850,6 +851,19 @@ QVariant WatchItem::data(int column, int role) const return QVariant(); } +QVariant WatchModel::data(const QModelIndex &idx, int role) const +{ + if (role == BaseTreeView::ExtraIndicesForColumnWidth) { + QModelIndexList l; + foreach (TreeItem *item, m_watchRoot->children()) + l.append(indexFromItem(item)); + foreach (TreeItem *item, m_returnRoot->children()) + l.append(indexFromItem(item)); + return QVariant::fromValue(l); + } + return WatchModelBase::data(idx, role); +} + bool WatchModel::setData(const QModelIndex &idx, const QVariant &value, int role) { if (!idx.isValid())