]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Merge branch 'release/21.08'
authorNate Graham <nate@kde.org>
Thu, 5 Aug 2021 14:34:04 +0000 (08:34 -0600)
committerNate Graham <nate@kde.org>
Thu, 5 Aug 2021 14:34:04 +0000 (08:34 -0600)
1  2 
src/kitemviews/kfileitemmodel.cpp
src/kitemviews/kfileitemmodel.h
src/tests/kfileitemmodeltest.cpp

index b3080d93387c33c246cef02a5e3539f494fc2ea8,af8cfc13126e5c935d8039a8ae4f90e4577060ad..9a2d159f9171310b0864f33349b96d54d07ec082
  #include "dolphin_generalsettings.h"
  #include "dolphin_detailsmodesettings.h"
  #include "dolphindebug.h"
 -#include "private/kfileitemmodeldirlister.h"
  #include "private/kfileitemmodelsortalgorithm.h"
  
 -#include <kio_version.h>
 +#include <KDirLister>
 +#include <KIO/Job>
  #include <KLocalizedString>
  #include <KUrlMimeData>
  
@@@ -34,6 -34,7 +34,7 @@@ KFileItemModel::KFileItemModel(QObject
      KItemModelBase("text", parent),
      m_dirLister(nullptr),
      m_sortDirsFirst(true),
+     m_sortHiddenLast(false),
      m_sortRole(NameRole),
      m_sortingProgressPercent(-1),
      m_roles(),
@@@ -53,8 -54,7 +54,8 @@@
  
      loadSortingSettings();
  
 -    m_dirLister = new KFileItemModelDirLister(this);
 +    m_dirLister = new KDirLister(this);
 +    m_dirLister->setAutoErrorHandlingEnabled(false);
      m_dirLister->setDelayedMimeTypes(true);
  
      const QWidget* parentWidget = qobject_cast<QWidget*>(parent);
          m_dirLister->setMainWindow(parentWidget->window());
      }
  
 -    connect(m_dirLister, &KFileItemModelDirLister::started, this, &KFileItemModel::directoryLoadingStarted);
 +    connect(m_dirLister, &KCoreDirLister::started, this, &KFileItemModel::directoryLoadingStarted);
      connect(m_dirLister, QOverload<>::of(&KCoreDirLister::canceled), this, &KFileItemModel::slotCanceled);
 -    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, &KCoreDirLister::itemsAdded, this, &KFileItemModel::slotItemsAdded);
 +    connect(m_dirLister, &KCoreDirLister::itemsDeleted, this, &KFileItemModel::slotItemsDeleted);
 +    connect(m_dirLister, &KCoreDirLister::refreshItems, this, &KFileItemModel::slotRefreshItems);
      connect(m_dirLister, QOverload<>::of(&KCoreDirLister::clear), this, &KFileItemModel::slotClear);
 -    connect(m_dirLister, &KFileItemModelDirLister::infoMessage, this, &KFileItemModel::infoMessage);
 -    connect(m_dirLister, &KFileItemModelDirLister::errorMessage, this, &KFileItemModel::errorMessage);
 -    connect(m_dirLister, &KFileItemModelDirLister::percent, this, &KFileItemModel::directoryLoadingProgress);
 +    connect(m_dirLister, &KCoreDirLister::infoMessage, this, &KFileItemModel::infoMessage);
 +    connect(m_dirLister, &KCoreDirLister::jobError, this, &KFileItemModel::slotListerError);
 +    connect(m_dirLister, &KCoreDirLister::percent, this, &KFileItemModel::directoryLoadingProgress);
      connect(m_dirLister, QOverload<const QUrl&, const QUrl&>::of(&KCoreDirLister::redirection), this, &KFileItemModel::directoryRedirection);
 -    connect(m_dirLister, &KFileItemModelDirLister::urlIsFileError, this, &KFileItemModel::urlIsFileError);
 -
 -#if KIO_VERSION < QT_VERSION_CHECK(5, 79, 0)
 -    connect(m_dirLister, QOverload<const QUrl&>::of(&KCoreDirLister::completed), this, &KFileItemModel::slotCompleted);
 -#else
      connect(m_dirLister, &KCoreDirLister::listingDirCompleted, this, &KFileItemModel::slotCompleted);
 -#endif
  
      // Apply default roles that should be determined
      resetRoles();
@@@ -207,6 -213,19 +208,19 @@@ bool KFileItemModel::sortDirectoriesFir
      return m_sortDirsFirst;
  }
  
+ void KFileItemModel::setSortHiddenLast(bool hiddenLast)
+ {
+     if (hiddenLast != m_sortHiddenLast) {
+         m_sortHiddenLast = hiddenLast;
+         resortAllItems();
+     }
+ }
+ bool KFileItemModel::sortHiddenLast() const
+ {
+     return m_sortHiddenLast;
+ }
  void KFileItemModel::setShowHiddenFiles(bool show)
  {
      m_dirLister->setShowingDotFiles(show);
@@@ -1729,12 -1748,14 +1743,14 @@@ bool KFileItemModel::lessThan(const Ite
      }
  
      // Show hidden files and folders last
-     const bool isHiddenA = a->item.isHidden();
-     const bool isHiddenB = b->item.isHidden();
-     if (isHiddenA && !isHiddenB) {
-         return false;
-     } else if (!isHiddenA && isHiddenB) {
-         return true;
+     if (m_sortHiddenLast) {
+         const bool isHiddenA = a->item.isHidden();
+         const bool isHiddenB = b->item.isHidden();
+         if (isHiddenA && !isHiddenB) {
+             return false;
+         } else if (!isHiddenA && isHiddenB) {
+             return true;
+         }
      }
  
      if (m_sortDirsFirst || (DetailsModeSettings::directorySizeCount() && m_sortRole == SizeRole)) {
@@@ -2496,15 -2517,3 +2512,15 @@@ bool KFileItemModel::isConsistent() con
  
      return true;
  }
 +
 +void KFileItemModel::slotListerError(KIO::Job *job)
 +{
 +    if (job->error() == KIO::ERR_IS_FILE) {
 +        if (auto *listJob = qobject_cast<KIO::ListJob *>(job)) {
 +            Q_EMIT urlIsFileError(listJob->url());
 +        }
 +    } else {
 +        const QString errorString = job->errorString();
 +        Q_EMIT errorMessage(!errorString.isEmpty() ? errorString : i18nc("@info:status", "Unknown error."));
 +    }
 +}
index 3602c16c12227f6a250561d60d67ca29e0d64744,33838853df2cd5d920b2ab18c28ac5287a281fb9..161f6a0e25e3c0d6ae8b7ad794262ffe2f45252d
  
  #include <functional>
  
 -class KFileItemModelDirLister;
 +class KDirLister;
 +
  class QTimer;
  
 +namespace KIO {
 +    class Job;
 +}
 +
  /**
   * @brief KItemModelBase implementation for KFileItems.
   *
@@@ -85,6 -80,12 +85,12 @@@ public
      void setSortDirectoriesFirst(bool dirsFirst);
      bool sortDirectoriesFirst() const;
  
+     /**
+      * Sets a separate sorting with hidden files and folders last (true) or not (false).
+      */
+     void setSortHiddenLast(bool hiddenLast);
+     bool sortHiddenLast() const;
      void setShowHiddenFiles(bool show);
      bool showHiddenFiles() const;
  
@@@ -275,7 -276,6 +281,7 @@@ private Q_SLOTS
      void slotRefreshItems(const QList<QPair<KFileItem, KFileItem> >& items);
      void slotClear();
      void slotSortingChoiceChanged();
 +    void slotListerError(KIO::Job *job);
  
      void dispatchPendingItemsToInsert();
  
@@@ -464,11 -464,12 +470,12 @@@ private
      bool isConsistent() const;
  
  private:
 -    KFileItemModelDirLister* m_dirLister;
 +    KDirLister *m_dirLister = nullptr;
  
      QCollator m_collator;
      bool m_naturalSorting;
      bool m_sortDirsFirst;
+     bool m_sortHiddenLast;
  
      RoleType m_sortRole;
      int m_sortingProgressPercent; // Value of directorySortingProgress() signal
index 8dccc2c6f2f212c3e4515c987c5c48f00902c2ae,4b84f157945d735bbc618f1bf9ed81a6fbc1fb5d..6a7c4cca6fa7e72c3fec68357c1eda186a60956d
  #include <QTimer>
  #include <QMimeData>
  
 +#include <KDirLister>
  #include <kio/job.h>
  
  #include "kitemviews/kfileitemmodel.h"
 -#include "kitemviews/private/kfileitemmodeldirlister.h"
  #include "testdir.h"
  
  void myMessageOutput(QtMsgType type, const QMessageLogContext& context, const QString& msg)
@@@ -814,16 -814,16 +814,16 @@@ void KFileItemModelTest::testSorting(
  {
      // testDir structure is as follows
      // ./
+     // ├─ .g/
      // ├─ a
      // ├─ b
      // ├─ c/
      // │  ├─ c-2/
      // │  │  ├─ c-3
      // │  ├─ c-1
+     // ├─ .f
      // ├─ d
      // ├─ e
-     // ├─ .f
-     // ├─ .g/
  
      QSignalSpy itemsInsertedSpy(m_model, &KFileItemModel::itemsInserted);
      QSignalSpy itemsMovedSpy(m_model, &KFileItemModel::itemsMoved);
      // 'Show Hidden Files' enabled
      m_model->setShowHiddenFiles(true);
      QVERIFY(m_model->showHiddenFiles());
-     QCOMPARE(itemsInModel(), QStringList() << "c" << "c-2" << "c-3" << "c-1" << "d" << "e" << "b" << "a" << ".g" << ".f");
+     QVERIFY(!m_model->sortHiddenLast());
+     QCOMPARE(itemsInModel(), QStringList() << "c" << "c-2" << "c-3" << "c-1" << ".g" << "d" << "e" << "b" << "a" << ".f");
      QCOMPARE(itemsMovedSpy.count(), 0);
      QCOMPARE(itemsInsertedSpy.count(), 1);
-     QCOMPARE(itemsInsertedSpy.takeFirst().at(0).value<KItemRangeList>(), KItemRangeList() << KItemRange(8, 2));
+     QCOMPARE(itemsInsertedSpy.takeFirst().at(0).value<KItemRangeList>(), KItemRangeList() << KItemRange(4, 1) << KItemRange(8, 1));
+     // 'Sort Hidden Files Last' enabled
+     m_model->setSortHiddenLast(true);
+     QVERIFY(m_model->sortHiddenLast());
+     QCOMPARE(itemsInModel(), QStringList() << "c" << "c-2" << "c-3" << "c-1" << "d" << "e" << "b" << "a" << ".g" << ".f");
+     QCOMPARE(itemsMovedSpy.count(), 1);
+     QCOMPARE(itemsInsertedSpy.count(), 0);
+     QCOMPARE(itemsMovedSpy.first().at(0).value<KItemRange>(), KItemRange(4, 5));
+     QCOMPARE(itemsMovedSpy.takeFirst().at(1).value<QList<int> >(), QList<int>() << 8 << 4 << 5 << 6 << 7);
  
      // Sort by Name
      m_model->setSortRole("text");
@@@ -1151,7 -1161,7 +1161,7 @@@ void KFileItemModelTest::testRemoveHidd
      m_model->setShowHiddenFiles(true);
      m_model->loadDirectory(m_testDir->url());
      QVERIFY(itemsInsertedSpy.wait());
-     QCOMPARE(itemsInModel(), QStringList() << "c" << "d" << "h" << "i" << ".a" << ".b" <<".f" << ".g");
+     QCOMPARE(itemsInModel(), QStringList() << ".a" << ".b" << "c" << "d" <<".f" << ".g" << "h" << "i");
      QCOMPARE(itemsInsertedSpy.count(), 1);
      QCOMPARE(itemsRemovedSpy.count(), 0);
      KItemRangeList itemRangeList = itemsInsertedSpy.takeFirst().at(0).value<KItemRangeList>();
      QCOMPARE(itemsInsertedSpy.count(), 0);
      QCOMPARE(itemsRemovedSpy.count(), 1);
      itemRangeList = itemsRemovedSpy.takeFirst().at(0).value<KItemRangeList>();
-     QCOMPARE(itemRangeList, KItemRangeList() << KItemRange(4, 4));
+     QCOMPARE(itemRangeList, KItemRangeList() << KItemRange(0, 2) << KItemRange(4, 2));
  
      m_model->setShowHiddenFiles(true);
-     QCOMPARE(itemsInModel(), QStringList() << "c" << "d" << "h" << "i" << ".a" << ".b" <<".f" << ".g");
+     QCOMPARE(itemsInModel(), QStringList() << ".a" << ".b" << "c" << "d" <<".f" << ".g" << "h" << "i");
      QCOMPARE(itemsInsertedSpy.count(), 1);
      QCOMPARE(itemsRemovedSpy.count(), 0);
      itemRangeList = itemsInsertedSpy.takeFirst().at(0).value<KItemRangeList>();
-     QCOMPARE(itemRangeList, KItemRangeList() << KItemRange(4, 4));
+     QCOMPARE(itemRangeList, KItemRangeList() << KItemRange(0, 2) << KItemRange(2, 2));
  
      m_model->clear();
      QCOMPARE(itemsInModel(), QStringList());