forked from qt-creator/qt-creator
ProjectTree: Improve resizing of project tree
On each resize event the treeview iterated over all rows to get the maximum width of them. That involves text layout and is very slow with bigger trees. So cache the size hint for the column and connect to all signals that can potentially change the size hint. Change-Id: I83a13982848df56515fed8225ced336096370546 Task-number: QTCREATORBUG-8075 Reviewed-by: David Schulz <david.schulz@theqtcompany.com>
This commit is contained in:
@@ -96,15 +96,71 @@ public:
|
|||||||
m_context = new IContext(this);
|
m_context = new IContext(this);
|
||||||
m_context->setContext(Context(ProjectExplorer::Constants::C_PROJECT_TREE));
|
m_context->setContext(Context(ProjectExplorer::Constants::C_PROJECT_TREE));
|
||||||
m_context->setWidget(this);
|
m_context->setWidget(this);
|
||||||
|
|
||||||
ICore::addContextObject(m_context);
|
ICore::addContextObject(m_context);
|
||||||
|
|
||||||
|
connect(this, &ProjectTreeView::expanded,
|
||||||
|
this, &ProjectTreeView::invalidateSize);
|
||||||
|
connect(this, &ProjectTreeView::collapsed,
|
||||||
|
this, &ProjectTreeView::invalidateSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void invalidateSize()
|
||||||
|
{
|
||||||
|
m_cachedSize = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setModel(QAbstractItemModel *newModel)
|
||||||
|
{
|
||||||
|
// Note: Don't connect to column signals, as we have only one column
|
||||||
|
if (model()) {
|
||||||
|
QAbstractItemModel *m = model();
|
||||||
|
disconnect(m, &QAbstractItemModel::dataChanged,
|
||||||
|
this, &ProjectTreeView::invalidateSize);
|
||||||
|
disconnect(m, &QAbstractItemModel::layoutChanged,
|
||||||
|
this, &ProjectTreeView::invalidateSize);
|
||||||
|
disconnect(m, &QAbstractItemModel::modelReset,
|
||||||
|
this, &ProjectTreeView::invalidateSize);
|
||||||
|
disconnect(m, &QAbstractItemModel::rowsInserted,
|
||||||
|
this, &ProjectTreeView::invalidateSize);
|
||||||
|
disconnect(m, &QAbstractItemModel::rowsMoved,
|
||||||
|
this, &ProjectTreeView::invalidateSize);
|
||||||
|
disconnect(m, &QAbstractItemModel::rowsRemoved,
|
||||||
|
this, &ProjectTreeView::invalidateSize);
|
||||||
|
}
|
||||||
|
if (newModel) {
|
||||||
|
connect(newModel, &QAbstractItemModel::dataChanged,
|
||||||
|
this, &ProjectTreeView::invalidateSize);
|
||||||
|
connect(newModel, &QAbstractItemModel::layoutChanged,
|
||||||
|
this, &ProjectTreeView::invalidateSize);
|
||||||
|
connect(newModel, &QAbstractItemModel::modelReset,
|
||||||
|
this, &ProjectTreeView::invalidateSize);
|
||||||
|
connect(newModel, &QAbstractItemModel::rowsInserted,
|
||||||
|
this, &ProjectTreeView::invalidateSize);
|
||||||
|
connect(newModel, &QAbstractItemModel::rowsMoved,
|
||||||
|
this, &ProjectTreeView::invalidateSize);
|
||||||
|
connect(newModel, &QAbstractItemModel::rowsRemoved,
|
||||||
|
this, &ProjectTreeView::invalidateSize);
|
||||||
|
}
|
||||||
|
Utils::NavigationTreeView::setModel(newModel);
|
||||||
|
}
|
||||||
|
|
||||||
~ProjectTreeView()
|
~ProjectTreeView()
|
||||||
{
|
{
|
||||||
ICore::removeContextObject(m_context);
|
ICore::removeContextObject(m_context);
|
||||||
delete m_context;
|
delete m_context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int sizeHintForColumn(int column) const override
|
||||||
|
{
|
||||||
|
if (m_cachedSize < 0)
|
||||||
|
m_cachedSize = Utils::NavigationTreeView::sizeHintForColumn(column);
|
||||||
|
|
||||||
|
return m_cachedSize;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
mutable int m_cachedSize = -1;
|
||||||
IContext *m_context;
|
IContext *m_context;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user