]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kfileitemmodel.cpp
Merge remote-tracking branch 'origin/master' into frameworks
[dolphin.git] / src / kitemviews / kfileitemmodel.cpp
index de3c3eb22e26dacf50fb3ae7c24f6c507d47600d..4d5879f4da02781c9ea57f22841a804007529b85 100644 (file)
@@ -25,6 +25,7 @@
 #include <KLocale>
 #include <KStringHandler>
 #include <KDebug>
+#include <kstringhandler_deprecated.h> //TODO: port to QCollator
 
 #include "private/kfileitemmodelsortalgorithm.h"
 #include "private/kfileitemmodeldirlister.h"
@@ -68,17 +69,17 @@ KFileItemModel::KFileItemModel(QObject* parent) :
         m_dirLister->setMainWindow(parentWidget->window());
     }
 
-    connect(m_dirLister, SIGNAL(started(KUrl)), this, SIGNAL(directoryLoadingStarted()));
-    connect(m_dirLister, SIGNAL(canceled()), this, SLOT(slotCanceled()));
-    connect(m_dirLister, SIGNAL(completed(KUrl)), this, SLOT(slotCompleted()));
-    connect(m_dirLister, SIGNAL(itemsAdded(KUrl,KFileItemList)), this, SLOT(slotItemsAdded(KUrl,KFileItemList)));
-    connect(m_dirLister, SIGNAL(itemsDeleted(KFileItemList)), this, SLOT(slotItemsDeleted(KFileItemList)));
-    connect(m_dirLister, SIGNAL(refreshItems(QList<QPair<KFileItem,KFileItem> >)), this, SLOT(slotRefreshItems(QList<QPair<KFileItem,KFileItem> >)));
-    connect(m_dirLister, SIGNAL(clear()), this, SLOT(slotClear()));
-    connect(m_dirLister, SIGNAL(infoMessage(QString)), this, SIGNAL(infoMessage(QString)));
-    connect(m_dirLister, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString)));
-    connect(m_dirLister, SIGNAL(redirection(KUrl,KUrl)), this, SIGNAL(directoryRedirection(KUrl,KUrl)));
-    connect(m_dirLister, SIGNAL(urlIsFileError(KUrl)), this, SIGNAL(urlIsFileError(KUrl)));
+    connect(m_dirLister, &KFileItemModelDirLister::started, this, &KFileItemModel::directoryLoadingStarted);
+    connect(m_dirLister, static_cast<void(KFileItemModelDirLister::*)()>(&KFileItemModelDirLister::canceled), this, &KFileItemModel::slotCanceled);
+    connect(m_dirLister, static_cast<void(KFileItemModelDirLister::*)(const QUrl&)>(&KFileItemModelDirLister::completed), this, &KFileItemModel::slotCompleted);
+    connect(m_dirLister, &KFileItemModelDirLister::itemsAdded, this, &KFileItemModel::slotItemsAdded);
+    connect(m_dirLister, &KFileItemModelDirLister::itemsDeleted, this, &KFileItemModel::slotItemsDeleted);
+    connect(m_dirLister, &KFileItemModelDirLister::refreshItems, this, &KFileItemModel::slotRefreshItems);
+    connect(m_dirLister, static_cast<void(KFileItemModelDirLister::*)()>(&KFileItemModelDirLister::clear), this, &KFileItemModel::slotClear);
+    connect(m_dirLister, &KFileItemModelDirLister::infoMessage, this, &KFileItemModel::infoMessage);
+    connect(m_dirLister, &KFileItemModelDirLister::errorMessage, this, &KFileItemModel::errorMessage);
+    connect(m_dirLister, static_cast<void(KFileItemModelDirLister::*)(const QUrl&, const QUrl&)>(&KFileItemModelDirLister::redirection), this, &KFileItemModel::directoryRedirection);
+    connect(m_dirLister, &KFileItemModelDirLister::urlIsFileError, this, &KFileItemModel::urlIsFileError);
 
     // Apply default roles that should be determined
     resetRoles();
@@ -94,7 +95,7 @@ KFileItemModel::KFileItemModel(QObject* parent) :
     m_maximumUpdateIntervalTimer = new QTimer(this);
     m_maximumUpdateIntervalTimer->setInterval(2000);
     m_maximumUpdateIntervalTimer->setSingleShot(true);
-    connect(m_maximumUpdateIntervalTimer, SIGNAL(timeout()), this, SLOT(dispatchPendingItemsToInsert()));
+    connect(m_maximumUpdateIntervalTimer, &QTimer::timeout, this, &KFileItemModel::dispatchPendingItemsToInsert);
 
     // When changing the value of an item which represents the sort-role a resorting must be
     // triggered. Especially in combination with KFileItemModelRolesUpdater this might be done
@@ -103,9 +104,10 @@ KFileItemModel::KFileItemModel(QObject* parent) :
     m_resortAllItemsTimer = new QTimer(this);
     m_resortAllItemsTimer->setInterval(500);
     m_resortAllItemsTimer->setSingleShot(true);
-    connect(m_resortAllItemsTimer, SIGNAL(timeout()), this, SLOT(resortAllItems()));
+    connect(m_resortAllItemsTimer, &QTimer::timeout, this, &KFileItemModel::resortAllItems);
 
-    connect(KGlobalSettings::self(), SIGNAL(naturalSortingChanged()), this, SLOT(slotNaturalSortingChanged()));
+    connect(KGlobalSettings::self(), &KGlobalSettings::naturalSortingChanged,
+            this, &KFileItemModel::slotNaturalSortingChanged);
 }
 
 KFileItemModel::~KFileItemModel()
@@ -363,7 +365,7 @@ KFileItem KFileItemModel::fileItem(const KUrl& url) const
 
 int KFileItemModel::index(const KFileItem& item) const
 {
-    return index(item.url());
+    return index(KUrl(item.url()));
 }
 
 int KFileItemModel::index(const KUrl& url) const
@@ -395,7 +397,41 @@ int KFileItemModel::index(const KUrl& url) const
         index = m_items.value(urlToFind, -1);
     }
 
-    Q_ASSERT(index >= 0 || m_items.count() == m_itemData.count());
+    if (index < 0) {
+        // The item could not be found, even though all items from m_itemData
+        // should be in m_items now. We print some diagnostic information which
+        // might help to find the cause of the problem, but only once. This
+        // prevents that obtaining and printing the debugging information
+        // wastes CPU cycles and floods the shell or .xsession-errors.
+        static bool printDebugInfo = true;
+
+        if (m_items.count() != m_itemData.count() && printDebugInfo) {
+            printDebugInfo = false;
+
+            kWarning() << "The model is in an inconsistent state.";
+            kWarning() << "m_items.count()    ==" << m_items.count();
+            kWarning() << "m_itemData.count() ==" << m_itemData.count();
+
+            // Check if there are multiple items with the same URL.
+            QMultiHash<KUrl, int> indexesForUrl;
+            for (int i = 0; i < m_itemData.count(); ++i) {
+                indexesForUrl.insert(m_itemData.at(i)->item.url(), i);
+            }
+
+            foreach (const KUrl& url, indexesForUrl.uniqueKeys()) {
+                if (indexesForUrl.count(url) > 1) {
+                    kWarning() << "Multiple items found with the URL" << url;
+                    foreach (int index, indexesForUrl.values(url)) {
+                        const ItemData* data = m_itemData.at(index);
+                        kWarning() << "index" << index << ":" << data->item;
+                        if (data->parent) {
+                            kWarning() << "parent" << data->parent->item;
+                        }
+                    }
+                }
+            }
+        }
+    }
 
     return index;
 }
@@ -415,6 +451,8 @@ void KFileItemModel::setRoles(const QSet<QByteArray>& roles)
     if (m_roles == roles) {
         return;
     }
+
+    const QSet<QByteArray> changedRoles = (roles - m_roles) + (m_roles - roles);
     m_roles = roles;
 
     if (count() > 0) {
@@ -443,8 +481,7 @@ void KFileItemModel::setRoles(const QSet<QByteArray>& roles)
             m_itemData[i]->values = retrieveData(m_itemData.at(i)->item, m_itemData.at(i)->parent);
         }
 
-        kWarning() << "TODO: Emitting itemsChanged() with no information what has changed!";
-        emit itemsChanged(KItemRangeList() << KItemRange(0, count()), QSet<QByteArray>());
+        emit itemsChanged(KItemRangeList() << KItemRange(0, count()), changedRoles);
     }
 
     // Clear the 'values' of all filtered items. They will be re-populated with the
@@ -880,7 +917,7 @@ void KFileItemModel::slotItemsAdded(const KUrl& directoryUrl, const KFileItemLis
         // might result in emitting the same items twice due to the Keep-parameter.
         // This case happens if an item gets expanded, collapsed and expanded again
         // before the items could be loaded for the first expansion.
-        if (index(items.first().url()) >= 0) {
+        if (index(KUrl(items.first().url())) >= 0) {
             // The items are already part of the model.
             return;
         }
@@ -1475,8 +1512,8 @@ QHash<QByteArray, QVariant> KFileItemModel::retrieveData(const KFileItem& item,
         // Don't use KFileItem::timeString() as this is too expensive when
         // having several thousands of items. Instead the formatting of the
         // date-time will be done on-demand by the view when the date will be shown.
-        const KDateTime dateTime = item.time(KFileItem::ModificationTime);
-        data.insert(sharedValue("date"), dateTime.dateTime());
+        const QDateTime dateTime = item.time(KFileItem::ModificationTime);
+        data.insert(sharedValue("date"), dateTime);
     }
 
     if (m_requestRole[PermissionsRole]) {
@@ -1501,7 +1538,7 @@ QHash<QByteArray, QVariant> KFileItemModel::retrieveData(const KFileItem& item,
 
     if (m_requestRole[PathRole]) {
         QString path;
-        if (item.url().protocol() == QLatin1String("trash")) {
+        if (item.url().scheme() == QLatin1String("trash")) {
             path = item.entry().stringValue(KIO::UDSEntry::UDS_EXTRA);
         } else {
             // For performance reasons cache the home-path in a static QString
@@ -1680,8 +1717,8 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b) const
     }
 
     case DateRole: {
-        const KDateTime dateTimeA = itemA.time(KFileItem::ModificationTime);
-        const KDateTime dateTimeB = itemB.time(KFileItem::ModificationTime);
+        const QDateTime dateTimeA = itemA.time(KFileItem::ModificationTime);
+        const QDateTime dateTimeB = itemB.time(KFileItem::ModificationTime);
         if (dateTimeA < dateTimeB) {
             result = -1;
         } else if (dateTimeA > dateTimeB) {
@@ -1873,7 +1910,7 @@ QList<QPair<int, QVariant> > KFileItemModel::dateRoleGroups() const
     const int maxIndex = count() - 1;
     QList<QPair<int, QVariant> > groups;
 
-    const QDate currentDate = KDateTime::currentLocalDateTime().date();
+    const QDate currentDate = QDate::currentDate();
 
     QDate previousModifiedDate;
     QString groupValue;
@@ -1882,7 +1919,7 @@ QList<QPair<int, QVariant> > KFileItemModel::dateRoleGroups() const
             continue;
         }
 
-        const KDateTime modifiedTime = m_itemData.at(i)->item.time(KFileItem::ModificationTime);
+        const QDateTime modifiedTime = m_itemData.at(i)->item.time(KFileItem::ModificationTime);
         const QDate modifiedDate = modifiedTime.date();
         if (modifiedDate == previousModifiedDate) {
             // The current item is in the same group as the previous item
@@ -1969,7 +2006,7 @@ QList<QPair<int, QVariant> > KFileItemModel::permissionRoleGroups() const
         }
         permissionsString = newPermissionsString;
 
-        const QFileInfo info(itemData->item.url().pathOrUrl());
+        const QFileInfo info(itemData->item.url().toLocalFile());
 
         // Set user string
         QString user;
@@ -2210,4 +2247,3 @@ bool KFileItemModel::isConsistent() const
     return true;
 }
 
-#include "kfileitemmodel.moc"