26 #include <QAbstractItemView>
27 #include <QAbstractProxyModel>
31 class KMimeTypeResolverPrivate
36 m_delayForNonVisibleIcons(10),
37 m_noVisibleIcon(false)
39 m_timer.setSingleShot(
true);
43 void _k_slotRowsInserted(
const QModelIndex&,
int,
int);
44 void _k_slotViewportAdjusted();
45 void _k_slotProcessMimeIcons();
48 QModelIndex findVisibleIcon();
54 int m_delayForNonVisibleIcons;
55 QList<QPersistentModelIndex> m_pendingIndexes;
62 void KMimeTypeResolverPrivate::init()
64 QObject::connect(m_dirModel, SIGNAL(rowsInserted(QModelIndex,
int,
int)),
65 q, SLOT(_k_slotRowsInserted(QModelIndex,
int,
int)));
66 QObject::connect(&m_timer, SIGNAL(
timeout()),
67 q, SLOT(_k_slotProcessMimeIcons()));
71 QModelIndex KMimeTypeResolverPrivate::findVisibleIcon()
76 if (m_pendingIndexes.count() < 20) {
78 return QModelIndex(m_pendingIndexes.first());
81 const QRect visibleArea = m_adapter->visibleArea();
82 QList<QPersistentModelIndex>::const_iterator it = m_pendingIndexes.constBegin();
83 const QList<QPersistentModelIndex>::const_iterator
end = m_pendingIndexes.constEnd();
84 bool layoutDone =
true;
85 for ( ; it != end ; ++it ) {
86 const QModelIndex index = m_proxyModel ? m_proxyModel->mapFromSource(*it) : QModelIndex(*it);
87 const QRect rect = m_adapter->visualRect(index);
90 else if (rect.intersects(visibleArea)) {
92 return QModelIndex(*it);
98 m_noVisibleIcon =
true;
102 return QModelIndex(m_pendingIndexes.first());
109 :
QObject(view), d(new KMimeTypeResolverPrivate(this))
113 d->m_dirModel = model;
118 :
QObject(view), d(new KMimeTypeResolverPrivate(this))
121 d->m_proxyModel = model;
122 d->m_dirModel =
static_cast<KDirModel*
>(model->sourceModel());
127 :
QObject(adapter), d(new KMimeTypeResolverPrivate(this))
130 d->m_adapter = adapter;
132 d->m_dirModel = d->m_proxyModel ? qobject_cast<
KDirModel*>(d->m_proxyModel->sourceModel())
133 : qobject_cast<KDirModel*>(model);
134 Q_ASSERT(d->m_dirModel);
143 void KMimeTypeResolverPrivate::_k_slotProcessMimeIcons()
145 if (m_pendingIndexes.isEmpty()) {
151 QModelIndex index = findVisibleIcon();
152 if (index.isValid()) {
154 const int numFound = m_pendingIndexes.removeAll(index);
156 Q_ASSERT(numFound == 1);
160 index = m_pendingIndexes.takeFirst();
161 nextDelay = m_delayForNonVisibleIcons;
163 KFileItem item = m_dirModel->itemForIndex(index);
167 m_dirModel->itemChanged(index);
170 m_timer.start(nextDelay);
173 void KMimeTypeResolverPrivate::_k_slotRowsInserted(
const QModelIndex& parent,
int first,
int last)
176 for (
int row = first; row <= last; ++row) {
177 QModelIndex idx = model->
index(row, 0, parent);
180 m_pendingIndexes.append(idx);
185 m_noVisibleIcon =
false;
186 m_timer.start(m_delayForNonVisibleIcons);
189 void KMimeTypeResolverPrivate::_k_slotViewportAdjusted()
191 m_noVisibleIcon =
false;
195 #include "kmimetyperesolver.moc"