From efdef7e40c3340e6275a72d315b3293ab6007a2b Mon Sep 17 00:00:00 2001 From: Emmanuel Pescosta Date: Sat, 24 Aug 2013 18:13:56 +0200 Subject: Make use of the "resort all items timer" in KFileItemModel::slotRefreshItems to avoid too much expensive resorting calls, in case of many refresh items signals. Followup to patch 111146 CCBUG: 303873 CCBUG: 299565 BUG: 323789 FIXED-IN: 4.11.1 REVIEW: 111195 --- src/kitemviews/kfileitemmodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 70e8834a6..58a135cd1 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -948,7 +948,7 @@ void KFileItemModel::slotRefreshItems(const QList >& emit itemsChanged(itemRangeList, changedRoles); if (changedRoles.contains(sortRole())) { - resortAllItems(); + m_resortAllItemsTimer->start(); } } -- cgit v1.3 From d7997f16a703990c1519bcf87806e44fb0ec73fa Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Sat, 24 Aug 2013 20:06:11 +0200 Subject: Delay the deletion of the role editor as long as possible This should prevent crashes that can be caused if the view is closed in a nested event loop that is run from the role editor. BUG: 322969 FIXED-IN: 4.11.1 REVIEW: 111988 --- src/kitemviews/kstandarditemlistwidget.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 2a89004c6..483517ecc 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -204,8 +204,13 @@ KStandardItemListWidget::~KStandardItemListWidget() qDeleteAll(m_textInfo); m_textInfo.clear(); - delete m_roleEditor; - delete m_oldRoleEditor; + if (m_roleEditor) { + m_roleEditor->deleteLater(); + } + + if (m_oldRoleEditor) { + m_oldRoleEditor->deleteLater(); + } } void KStandardItemListWidget::setLayout(Layout layout) @@ -649,16 +654,15 @@ void KStandardItemListWidget::editedRoleChanged(const QByteArray& current, const this, SLOT(slotRoleEditingCanceled(QByteArray,QVariant))); disconnect(m_roleEditor, SIGNAL(roleEditingFinished(QByteArray,QVariant)), this, SLOT(slotRoleEditingFinished(QByteArray,QVariant))); + + if (m_oldRoleEditor) { + m_oldRoleEditor->deleteLater(); + } m_oldRoleEditor = m_roleEditor; m_roleEditor->hide(); m_roleEditor = 0; } return; - } else if (m_oldRoleEditor) { - // Delete the old editor before constructing the new one to - // prevent a memory leak. - m_oldRoleEditor->deleteLater(); - m_oldRoleEditor = 0; } Q_ASSERT(!m_roleEditor); @@ -1302,6 +1306,9 @@ void KStandardItemListWidget::closeRoleEditor() scene()->views()[0]->parentWidget()->setFocus(); } + if (m_oldRoleEditor) { + m_oldRoleEditor->deleteLater(); + } m_oldRoleEditor = m_roleEditor; m_roleEditor->hide(); m_roleEditor = 0; -- cgit v1.3 From 7ffa66f77789f754a4c35a5c4d0ecbfc0a0ae1e7 Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Sat, 24 Aug 2013 20:22:56 +0200 Subject: Make determining the mime type faster for folders KFileItem::determineMimeType() not only determines the mime type, but also the icon. For folders, it looks for a .directory file inside the folder, where a custom icon might be stored. This can take quite a bit of time and cause the problem that some folder's type still appears to be "unknown" when the view is shown. We can work around this problem by caching the folder mime type in a static QString and applying to to all folders, which can be identified easily with KFileItem::isDir(), BUG: 321710 FIXED-IN: 4.11.1 REVIEW: 111830 --- src/kitemviews/kfileitemmodel.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 58a135cd1..7bbc1d17f 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -1381,6 +1381,9 @@ QHash KFileItemModel::retrieveData(const KFileItem& item, if (m_requestRole[TypeRole]) { data.insert(sharedValue("type"), item.mimeComment()); } + } else if (m_requestRole[TypeRole] && isDir) { + static const QString folderMimeType = item.mimeComment(); + data.insert(sharedValue("type"), folderMimeType); } return data; @@ -1987,7 +1990,15 @@ void KFileItemModel::determineMimeTypes(const KFileItemList& items, int timeout) QElapsedTimer timer; timer.start(); foreach (const KFileItem& item, items) { // krazy:exclude=foreach - item.determineMimeType(); + // Only determine mime types for files here. For directories, + // KFileItem::determineMimeType() reads the .directory file inside to + // load the icon, but this is not necessary at all if we just need the + // type. Some special code for setting the correct mime type for + // directories is in retrieveData(). + if (!item.isDir()) { + item.determineMimeType(); + } + if (timer.elapsed() > timeout) { // Don't block the user interface, let the remaining items // be resolved asynchronously. -- cgit v1.3