Cache group view geometry -- speed up instance view by caching sizes of stuff
This commit is contained in:
		| @@ -8,6 +8,7 @@ | ||||
| #include <QPersistentModelIndex> | ||||
| #include <QDrag> | ||||
| #include <QMimeData> | ||||
| #include <QCache> | ||||
| #include <QScrollBar> | ||||
|  | ||||
| #include "Group.h" | ||||
| @@ -68,6 +69,7 @@ void GroupView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int e | ||||
|  | ||||
| void GroupView::updateGeometries() | ||||
| { | ||||
| 	geometryCache.clear(); | ||||
| 	int previousScroll = verticalScrollBar()->value(); | ||||
|  | ||||
| 	QMap<QString, Group *> cats; | ||||
| @@ -658,6 +660,13 @@ QRect GroupView::geometryRect(const QModelIndex &index) const | ||||
| 		return QRect(); | ||||
| 	} | ||||
|  | ||||
| 	int row = index.row(); | ||||
| 	if(geometryCache.contains(row)) | ||||
| 	{ | ||||
| 		return *geometryCache[row]; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		const Group *cat = category(index); | ||||
| 		QPair<int, int> pos = categoryInternalPosition(index); | ||||
| 		int x = pos.first; | ||||
| @@ -667,9 +676,10 @@ QRect GroupView::geometryRect(const QModelIndex &index) const | ||||
| 		out.setTop(cat->verticalPosition() + cat->headerHeight() + 5 + categoryInternalRowTop(index)); | ||||
| 		out.setLeft(m_spacing + x * (itemWidth() + m_spacing)); | ||||
| 		out.setSize(itemDelegate()->sizeHint(viewOptions(), index)); | ||||
|  | ||||
| 		const_cast<QCache<int, QRect>&>(geometryCache).insert(row, new QRect(out)); | ||||
| 		return out; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* | ||||
| void CategorizedView::startCategoryEditor(Category *category) | ||||
|   | ||||
| @@ -3,6 +3,7 @@ | ||||
| #include <QListView> | ||||
| #include <QLineEdit> | ||||
| #include <QScrollBar> | ||||
| #include <QCache> | ||||
|  | ||||
| struct GroupViewRoles | ||||
| { | ||||
| @@ -128,6 +129,7 @@ private: /* variables */ | ||||
| 	QItemSelectionModel::SelectionFlag m_ctrlDragSelectionFlag; | ||||
| 	QPoint m_lastDragPosition; | ||||
| 	int m_spacing = 5; | ||||
| 	QCache<int, QRect> geometryCache; | ||||
|  | ||||
| private: /* methods */ | ||||
| 	QPair<int, int> categoryInternalPosition(const QModelIndex &index) const; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Petr Mrázek
					Petr Mrázek