]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Merge branch 'release/21.08'
authorNate Graham <nate@kde.org>
Tue, 28 Sep 2021 19:57:14 +0000 (13:57 -0600)
committerNate Graham <nate@kde.org>
Tue, 28 Sep 2021 19:57:14 +0000 (13:57 -0600)
41 files changed:
CMakeLists.txt
CMakePresets.json
src/CMakeLists.txt
src/dbusinterface.cpp
src/dolphinmainwindow.cpp
src/dolphinpart.cpp
src/dolphinpart.desktop.in
src/dolphinrecenttabsmenu.cpp
src/dolphintabpage.cpp
src/dolphintabpage.h
src/dolphintabwidget.cpp
src/global.cpp
src/kitemviews/kfileitemmodel.cpp
src/kitemviews/kfileitemmodel.h
src/kitemviews/kstandarditemlistwidget.cpp
src/kitemviews/private/kfileitemmodeldirlister.cpp [deleted file]
src/kitemviews/private/kfileitemmodeldirlister.h [deleted file]
src/main.cpp
src/org.kde.dolphin.appdata.xml
src/org.kde.dolphin.desktop
src/panels/information/informationpanelcontent.cpp
src/settings/dolphin_directoryviewpropertysettings.kcfg
src/settings/kcm/kcmdolphingeneral.cpp
src/settings/kcm/kcmdolphingeneral.desktop
src/settings/kcm/kcmdolphinnavigation.cpp
src/settings/kcm/kcmdolphinnavigation.desktop
src/settings/kcm/kcmdolphinviewmodes.cpp
src/settings/kcm/kcmdolphinviewmodes.desktop
src/settings/viewpropertiesdialog.cpp
src/settings/viewpropertiesdialog.h
src/tests/dolphinmainwindowtest.cpp
src/tests/kfileitemlistviewtest.cpp
src/tests/kfileitemmodeltest.cpp
src/trash/dolphintrash.cpp
src/views/dolphinview.cpp
src/views/dolphinview.h
src/views/dolphinviewactionhandler.cpp
src/views/dolphinviewactionhandler.h
src/views/versioncontrol/fileviewversioncontrolplugin.desktop
src/views/viewproperties.cpp
src/views/viewproperties.h

index 7cd82296a52dcb1cbb3e2147f3862d3d8a7b300a..ec87cdecc4e48dfbf513785cbce5cdd7f758bafa 100644 (file)
@@ -2,13 +2,13 @@ cmake_minimum_required(VERSION 3.16)
 
 # KDE Application Version, managed by release script
 set (RELEASE_SERVICE_VERSION_MAJOR "21")
-set (RELEASE_SERVICE_VERSION_MINOR "08")
-set (RELEASE_SERVICE_VERSION_MICRO "1")
+set (RELEASE_SERVICE_VERSION_MINOR "11")
+set (RELEASE_SERVICE_VERSION_MICRO "70")
 set (RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
 project(Dolphin VERSION ${RELEASE_SERVICE_VERSION})
 
 set(QT_MIN_VERSION "5.15.0")
-set(KF5_MIN_VERSION "5.81.0")
+set(KF5_MIN_VERSION "5.83.0")
 
 set(CMAKE_CXX_STANDARD 17)
 set(CMAKE_CXX_STANDARD_REQUIRED ON)
index 22e3de72eaffa37fc4375e0ce4bae645ab811d8c..d927f9984b9489d9b651ed0d92686cee482926ab 100644 (file)
                "CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
             }
         },
+        {
+            "name": "dev-disable-deprecated",
+            "displayName": "Build as without deprecated methods",
+            "generator": "Ninja",
+            "binaryDir": "${sourceDir}/build-disable-deprecated",
+            "cacheVariables": {
+                "CMAKE_BUILD_TYPE": "Debug",
+                "CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
+               "CMAKE_CXX_FLAGS_INIT": "-DQT_DISABLE_DEPRECATED_BEFORE=0x060000 -DKF_DISABLE_DEPRECATED_BEFORE_AND_AT=0x060000"
+            }
+        },
         {
             "name": "asan",
             "displayName": "Build with Asan support.",
             "name": "dev",
             "configurePreset": "dev"
         },
+        {
+            "name": "asan",
+            "configurePreset": "asan"
+        },
+       {
+            "name": "dev-disable-deprecated",
+            "configurePreset": "dev-disable-deprecated"
+        },
+       {
+            "name": "unity",
+            "configurePreset": "unity"
+        },
         {
             "name": "clazy",
             "configurePreset": "clazy",
index 46dbaa152f086983eefc3d1075cf820eb869530b..147f18c003696f1f056da7f9a706ffb8434d6b96 100644 (file)
@@ -82,7 +82,6 @@ target_sources(dolphinprivate PRIVATE
     kitemviews/private/kdirectorycontentscounter.cpp
     kitemviews/private/kdirectorycontentscounterworker.cpp
     kitemviews/private/kfileitemclipboard.cpp
-    kitemviews/private/kfileitemmodeldirlister.cpp
     kitemviews/private/kfileitemmodelfilter.cpp
     kitemviews/private/kitemlistheaderwidget.cpp
     kitemviews/private/kitemlistkeyboardsearchmanager.cpp
index 7e453f72ac785ffddcba23582c6b2129cc10444a..e4f647f737ea0d9ca7e7fcbb5d06eb20e1f86e55 100644 (file)
@@ -9,6 +9,7 @@
 #include "dolphin_generalsettings.h"
 
 #include <KPropertiesDialog>
+#include <KWindowSystem>
 
 #include <QApplication>
 #include <QDBusConnection>
@@ -20,17 +21,19 @@ DBusInterface::DBusInterface() :
 {
     QDBusConnection::sessionBus().registerObject(QStringLiteral("/org/freedesktop/FileManager1"), this,
             QDBusConnection::ExportScriptableContents | QDBusConnection::ExportAdaptors);
-    QDBusConnection::sessionBus().interface()->registerService(QStringLiteral("org.freedesktop.FileManager1"),
-                                                               QDBusConnectionInterface::QueueService);
+    QDBusConnectionInterface *sessionInterface = QDBusConnection::sessionBus().interface();
+    if (sessionInterface) {
+        sessionInterface->registerService(QStringLiteral("org.freedesktop.FileManager1"), QDBusConnectionInterface::QueueService);
+    }
 }
 
 void DBusInterface::ShowFolders(const QStringList& uriList, const QString& startUpId)
 {
-    Q_UNUSED(startUpId)
     const QList<QUrl> urls = Dolphin::validateUris(uriList);
     if (urls.isEmpty()) {
         return;
     }
+    KWindowSystem::setCurrentXdgActivationToken(startUpId);
     const auto serviceName = isDaemon() ? QString() : QStringLiteral("org.kde.dolphin-%1").arg(QCoreApplication::applicationPid());
     if(!Dolphin::attachToExistingInstance(urls, false, GeneralSettings::splitView(), serviceName)) {
         Dolphin::openNewWindow(urls);
@@ -39,11 +42,11 @@ void DBusInterface::ShowFolders(const QStringList& uriList, const QString& start
 
 void DBusInterface::ShowItems(const QStringList& uriList, const QString& startUpId)
 {
-    Q_UNUSED(startUpId)
     const QList<QUrl> urls = Dolphin::validateUris(uriList);
     if (urls.isEmpty()) {
         return;
     }
+    KWindowSystem::setCurrentXdgActivationToken(startUpId);
     const auto serviceName = isDaemon() ? QString() : QStringLiteral("org.kde.dolphin-%1").arg(QCoreApplication::applicationPid());
     if(!Dolphin::attachToExistingInstance(urls, true, GeneralSettings::splitView(), serviceName)) {
         Dolphin::openNewWindow(urls, nullptr, Dolphin::OpenNewWindowFlag::Select);
@@ -52,9 +55,9 @@ void DBusInterface::ShowItems(const QStringList& uriList, const QString& startUp
 
 void DBusInterface::ShowItemProperties(const QStringList& uriList, const QString& startUpId)
 {
-    Q_UNUSED(startUpId)
     const QList<QUrl> urls = Dolphin::validateUris(uriList);
     if (!urls.isEmpty()) {
+        KWindowSystem::setCurrentXdgActivationToken(startUpId);
         KPropertiesDialog::showDialog(urls);
     }
 }
index 3966a08fe3221b558d1b7947178fae26ee39825a..ec15bb978a0b012d57feaf9abdcaa45018bf9fd3 100644 (file)
 #include <KStandardAction>
 #include <KStartupInfo>
 #include <KSycoca>
+#include <KTerminalLauncherJob>
 #include <KToggleAction>
 #include <KToolBar>
 #include <KToolBarPopupAction>
-#include <KToolInvocation>
 #include <KUrlComboBox>
 #include <KUrlNavigator>
 #include <KWindowSystem>
@@ -211,11 +211,9 @@ DolphinMainWindow::DolphinMainWindow() :
     QTimer::singleShot(0, this, &DolphinMainWindow::updateOpenPreferredSearchToolAction);
 
     m_fileItemActions.setParentWidget(this);
-#if KIO_VERSION >= QT_VERSION_CHECK(5, 82, 0)
     connect(&m_fileItemActions, &KFileItemActions::error, this, [this](const QString &errorMessage) {
         showErrorMessage(errorMessage);
     });
-#endif
 
     connect(GeneralSettings::self(), &GeneralSettings::splitViewChanged,
             this, &DolphinMainWindow::slotSplitViewChanged);
@@ -1048,7 +1046,9 @@ void DolphinMainWindow::openTerminal()
     const QUrl url = m_activeViewContainer->url();
 
     if (url.isLocalFile()) {
-        KToolInvocation::invokeTerminal(QString(), {}, url.toLocalFile());
+        auto job = new KTerminalLauncherJob(QString());
+        job->setWorkingDirectory(url.toLocalFile());
+        job->start();
         return;
     }
 
@@ -1062,14 +1062,18 @@ void DolphinMainWindow::openTerminal()
                 statUrl = job->mostLocalUrl();
             }
 
-            KToolInvocation::invokeTerminal(QString(), {}, statUrl.isLocalFile() ? statUrl.toLocalFile() : QDir::homePath());
+            auto job = new KTerminalLauncherJob(QString());
+            job->setWorkingDirectory(statUrl.isLocalFile() ? statUrl.toLocalFile() : QDir::homePath());
+            job->start();
         });
 
         return;
     }
 
     // Nothing worked, just use $HOME
-    KToolInvocation::invokeTerminal(QString(), {}, QDir::homePath());
+    auto job = new KTerminalLauncherJob(QString());
+    job->setWorkingDirectory(QDir::homePath());
+    job->start();
 }
 
 void DolphinMainWindow::editSettings()
@@ -1542,7 +1546,8 @@ void DolphinMainWindow::setupActions()
     stashSplit->setToolTip(i18nc("@info", "Opens the stash virtual directory in a split window"));
     stashSplit->setIcon(QIcon::fromTheme(QStringLiteral("folder-stash")));
     stashSplit->setCheckable(false);
-    stashSplit->setVisible(QDBusConnection::sessionBus().interface()->isServiceRegistered(QStringLiteral("org.kde.kio.StashNotifier")));
+    QDBusConnectionInterface *sessionInterface = QDBusConnection::sessionBus().interface();
+    stashSplit->setVisible(sessionInterface && sessionInterface->isServiceRegistered(QStringLiteral("org.kde.kio.StashNotifier")));
     connect(stashSplit, &QAction::triggered, this, &DolphinMainWindow::toggleSplitStash);
 
     KStandardAction::redisplay(this, &DolphinMainWindow::reloadView, actionCollection());
index e2e5393da35b6e8387163c80efe18672f863bbb6..8d528f418a9b817826011bcfdafaa85dbb2b5343 100644 (file)
@@ -11,7 +11,6 @@
 #include "dolphinpart_ext.h"
 #include "dolphinremoveaction.h"
 #include "kitemviews/kfileitemmodel.h"
-#include "kitemviews/private/kfileitemmodeldirlister.h"
 #include "views/dolphinnewfilemenuobserver.h"
 #include "views/dolphinremoteencoding.h"
 #include "views/dolphinview.h"
@@ -22,6 +21,7 @@
 #include <KAuthorized>
 #include <KConfigGroup>
 #include <KDialogJobUiDelegate>
+#include <KDirLister>
 #include <KFileItemListProperties>
 #include <KIconLoader>
 #include <KJobWidgets>
@@ -32,7 +32,7 @@
 #include <KPluginFactory>
 #include <KIO/CommandLauncherJob>
 #include <KSharedConfig>
-#include <KToolInvocation>
+#include <KTerminalLauncherJob>
 
 #include <QActionGroup>
 #include <QApplication>
@@ -567,7 +567,9 @@ QString DolphinPart::localFilePathOrHome() const
 
 void DolphinPart::slotOpenTerminal()
 {
-    KToolInvocation::invokeTerminal(QString(), {}, localFilePathOrHome());
+    auto job = new KTerminalLauncherJob(QString());
+    job->setWorkingDirectory(localFilePathOrHome());
+    job->start();
 }
 
 void DolphinPart::slotFindFile()
index 2a121dbe6496d6f70c641575a2ec8355f98cefad..e891c2485d0c277fa9a072b743bdd5e248b3a0d1 100644 (file)
@@ -27,6 +27,7 @@ Name[ko]=Dolphin 보기
 Name[lt]=Dolphin rodinys
 Name[lv]=Dolphin skats
 Name[ml]=ഡോള്‍ഫിന്‍ അവതരണരീതി
+Name[my]=လင်းပိုင် မြင်ကွင်း
 Name[nb]=Dolphin visning
 Name[nl]=Dolphin-weergave
 Name[nn]=Dolphin-vising
@@ -98,6 +99,7 @@ Name[ko]=아이콘
 Name[lt]=Piktogramos
 Name[lv]=Ikonas
 Name[ml]=സൂചനാചിത്രങ്ങള്‍
+Name[my]=အိုင်ကွန်များ
 Name[nb]=Ikoner
 Name[nl]=Pictogrammen
 Name[nn]=Ikon
@@ -155,6 +157,7 @@ Name[ko]=축소됨
 Name[lt]=Kompaktiškas
 Name[lv]=Kompakts
 Name[ml]=തിങ്ങിയത്
+Name[my]=ကျစ်လစ်
 Name[nb]=Kompakt
 Name[nl]=Compact
 Name[nn]=Kompakt
@@ -211,6 +214,7 @@ Name[ko]=자세히
 Name[lt]=Išsamus
 Name[lv]=Detaļas
 Name[ml]=വിശദമായി
+Name[my]=အသေးစိတ်
 Name[nb]=Detaljer
 Name[nl]=Details
 Name[nn]=Detaljar
index 38eb4f65717b89d7161a6f17237817c10bc9cf75..d8bd06b5c82a529ba5da17f8edbdb1a03f49e083 100644 (file)
@@ -66,7 +66,7 @@ void DolphinRecentTabsMenu::handleAction(QAction* action)
         // action and the separator
         QList<QAction*> actions = menu()->actions();
         const int count = actions.size();
-        for (int i = 2; i < count; ++i) {
+        for (int i = count - 1; i >= 2; i--) {
             removeAction(actions.at(i));
         }
         Q_EMIT closedTabsCountChanged(0);
index 33c77c42ad2bb8127f7e1657d2c90c2e70b89117..771bbe9cd6fb98bbd8173bb4346fc0f62fd1bb1a 100644 (file)
@@ -12,7 +12,6 @@
 #include "global.h"
 
 #include <QVariantAnimation>
-#include <QSplitter>
 #include <QGridLayout>
 #include <QWidgetAction>
 #include <QStyle>
@@ -28,7 +27,7 @@ DolphinTabPage::DolphinTabPage(const QUrl &primaryUrl, const QUrl &secondaryUrl,
     layout->setSpacing(0);
     layout->setContentsMargins(0, 0, 0, 0);
 
-    m_splitter = new QSplitter(Qt::Horizontal, this);
+    m_splitter = new DolphinTabPageSplitter(Qt::Horizontal, this);
     m_splitter->setChildrenCollapsible(false);
     connect(m_splitter, &QSplitter::splitterMoved,
             this, &DolphinTabPage::splitterMoved);
@@ -505,3 +504,47 @@ void DolphinTabPage::startExpandViewAnimation(DolphinViewContainer *expandingCon
     }
     m_expandViewAnimation->start(QAbstractAnimation::DeleteWhenStopped);
 }
+
+DolphinTabPageSplitterHandle::DolphinTabPageSplitterHandle(Qt::Orientation orientation, QSplitter *parent)
+    : QSplitterHandle(orientation, parent)
+    , m_mouseReleaseWasReceived(false)
+{}
+
+bool DolphinTabPageSplitterHandle::event(QEvent *event)
+{
+    switch (event->type()) {
+    case QEvent::MouseButtonPress:
+        m_mouseReleaseWasReceived = false;
+        break;
+    case QEvent::MouseButtonRelease:
+        if (m_mouseReleaseWasReceived) {
+            resetSplitterSizes();
+        }
+        m_mouseReleaseWasReceived = !m_mouseReleaseWasReceived;
+        break;
+    case QEvent::MouseButtonDblClick:
+        m_mouseReleaseWasReceived = false;
+        resetSplitterSizes();
+        break;
+    default:
+        break;
+    }
+
+    return QSplitterHandle::event(event);
+}
+
+void DolphinTabPageSplitterHandle::resetSplitterSizes()
+{
+    QList<int> splitterSizes = splitter()->sizes();
+    std::fill(splitterSizes.begin(), splitterSizes.end(), 0);
+    splitter()->setSizes(splitterSizes);
+}
+
+DolphinTabPageSplitter::DolphinTabPageSplitter(Qt::Orientation orientation, QWidget *parent)
+    : QSplitter(orientation, parent)
+{}
+
+QSplitterHandle* DolphinTabPageSplitter::createHandle()
+{
+    return new DolphinTabPageSplitterHandle(orientation(), this);
+}
index 57a0c33440552091d71059d590133d59a58551ca..f1a784eb7427a2d3264b908616951153006b89d4 100644 (file)
 #include <QPointer>
 #include <QUrl>
 #include <QWidget>
+#include <QSplitter>
 
 class DolphinNavigatorsWidgetAction;
 class DolphinViewContainer;
-class QSplitter;
 class QVariantAnimation;
 class KFileItemList;
+class DolphinTabPageSplitter;
 
 enum Animated {
     WithAnimation,
@@ -185,7 +186,7 @@ private:
     void startExpandViewAnimation(DolphinViewContainer *expandingContainer);
 
 private:
-    QSplitter* m_splitter;
+    DolphinTabPageSplitter *m_splitter;
 
     QPointer<DolphinNavigatorsWidgetAction> m_navigatorsWidget;
     QPointer<DolphinViewContainer> m_primaryViewContainer;
@@ -199,4 +200,34 @@ private:
     bool m_active;
 };
 
+class DolphinTabPageSplitterHandle : public QSplitterHandle
+{
+    Q_OBJECT
+
+public:
+    explicit DolphinTabPageSplitterHandle(Qt::Orientation orientation, QSplitter *parent);
+
+protected:
+    bool event(QEvent *event) override;
+
+private:
+    void resetSplitterSizes();
+
+    // Sometimes QSplitterHandle doesn't receive MouseButtonDblClick event.
+    // We can detect that MouseButtonDblClick event should have been
+    // received if we receive two MouseButtonRelease events in a row.
+    bool m_mouseReleaseWasReceived;
+};
+
+class DolphinTabPageSplitter : public QSplitter
+{
+    Q_OBJECT
+
+public:
+    explicit DolphinTabPageSplitter(Qt::Orientation orientation, QWidget *parent);
+
+protected:
+    QSplitterHandle* createHandle() override;
+};
+
 #endif // DOLPHIN_TAB_PAGE_H
index cfb695e7db24a05a1f3a931f0823859ff917adf3..0e7012d3b687316be7097b249ea023b79f404d72 100644 (file)
@@ -383,7 +383,9 @@ void DolphinTabWidget::tabUrlChanged(const QUrl& url)
         tabBar()->setTabText(index, tabName(tabPageAt(index)));
         tabBar()->setTabToolTip(index, url.toDisplayString(QUrl::PreferLocalFile));
         if (tabBar()->isVisible()) {
-            tabBar()->setTabIcon(index, QIcon::fromTheme(KIO::iconNameForUrl(url)));
+            // ensure the path url ends with a slash to have proper folder icon for remote folders
+            const QUrl pathUrl = QUrl(url.adjusted(QUrl::StripTrailingSlash).toString(QUrl::FullyEncoded).append("/"));
+            tabBar()->setTabIcon(index, QIcon::fromTheme(KIO::iconNameForUrl(pathUrl)));
         } else {
             // Mark as dirty, actually load once the tab bar actually gets shown
             tabBar()->setTabIcon(index, QIcon());
@@ -427,7 +429,9 @@ void DolphinTabWidget::tabInserted(int index)
         for (int i = 0; i < count(); ++i) {
             const QUrl url = tabPageAt(i)->activeViewContainer()->url();
             if (tabBar()->tabIcon(i).isNull()) {
-                tabBar()->setTabIcon(i, QIcon::fromTheme(KIO::iconNameForUrl(url)));
+                // ensure the path url ends with a slash to have proper folder icon for remote folders
+                const QUrl pathUrl = QUrl(url.adjusted(QUrl::StripTrailingSlash).toString(QUrl::FullyEncoded).append("/"));
+                tabBar()->setTabIcon(i, QIcon::fromTheme(KIO::iconNameForUrl(pathUrl)));
             }
             if (tabBar()->tabToolTip(i).isEmpty()) {
                 tabBar()->setTabToolTip(index, url.toDisplayString(QUrl::PreferLocalFile));
index 92b1f7f56939ddfa64933465ff2559d065a67a99..0712aa173f8c7429d7e6c80ce0f86a7692e4c441 100644 (file)
@@ -62,8 +62,7 @@ bool Dolphin::attachToExistingInstance(const QList<QUrl>& inputUrls, bool openFi
 {
     bool attached = false;
 
-    // TODO: once Wayland clients can raise or activate themselves remove check from conditional
-    if (KWindowSystem::isPlatformWayland() || inputUrls.isEmpty() || !GeneralSettings::openExternallyCalledFolderInNewTab()) {
+    if (inputUrls.isEmpty() || !GeneralSettings::openExternallyCalledFolderInNewTab()) {
         return false;
     }
 
@@ -118,7 +117,8 @@ QVector<QPair<QSharedPointer<OrgKdeDolphinMainWindowInterface>, QStringList>> Do
     }
 
     // Look for dolphin instances among all available dbus services.
-    const QStringList dbusServices = QDBusConnection::sessionBus().interface()->registeredServiceNames().value();
+    QDBusConnectionInterface *sessionInterface = QDBusConnection::sessionBus().interface();
+    const QStringList dbusServices = sessionInterface ? sessionInterface->registeredServiceNames().value() : QStringList();
     // Don't match the service without trailing "-" (unique instance)
     const QString pattern = QStringLiteral("org.kde.dolphin-");
     // Don't match the pid without leading "-"
index ffd933d25d6946121ead506c4fd3e5c0e0cc808e..bf2597903ddef9263b3e05f068d1ad34d11ef138 100644 (file)
 #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 @@ KFileItemModel::KFileItemModel(QObject* parent) :
     KItemModelBase("text", parent),
     m_dirLister(nullptr),
     m_sortDirsFirst(true),
+    m_sortHiddenLast(false),
     m_sortRole(NameRole),
     m_sortingProgressPercent(-1),
     m_roles(),
@@ -53,7 +54,8 @@ KFileItemModel::KFileItemModel(QObject* parent) :
 
     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);
@@ -61,23 +63,17 @@ KFileItemModel::KFileItemModel(QObject* 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();
@@ -212,6 +208,19 @@ bool KFileItemModel::sortDirectoriesFirst() const
     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);
@@ -1758,6 +1767,17 @@ bool KFileItemModel::lessThan(const ItemData* a, const ItemData* b, const QColla
         }
     }
 
+    // Show hidden files and folders last
+    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)) {
         const bool isDirA = a->item.isDir();
         const bool isDirB = b->item.isDir();
@@ -1796,6 +1816,11 @@ void KFileItemModel::sort(const QList<KFileItemModel::ItemData*>::iterator &begi
 
 int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const QCollator& collator) const
 {
+    // This function must never return 0, because that would break stable
+    // sorting, which leads to all kinds of bugs.
+    // See: https://bugs.kde.org/show_bug.cgi?id=433247
+    // If two items have equal sort values, let the fallbacks at the bottom of
+    // the function handle it.
     const KFileItem& itemA = a->item;
     const KFileItem& itemB = b->item;
 
@@ -1813,29 +1838,21 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const
             auto valueA = a->values.value("count");
             auto valueB = b->values.value("count");
             if (valueA.isNull()) {
-                if (valueB.isNull()) {
-                    result = 0;
-                    break;
-                } else {
-                    result = -1;
-                    break;
+                if (!valueB.isNull()) {
+                    return -1;
                 }
             } else if (valueB.isNull()) {
-                result = +1;
-                break;
+                return +1;
             } else {
                 if (valueA.toLongLong() < valueB.toLongLong()) {
-                    result = -1;
-                    break;
+                    return -1;
                 } else if (valueA.toLongLong() > valueB.toLongLong()) {
-                    result = +1;
-                    break;
-                } else {
-                    result = 0;
-                    break;
+                    return +1;
                 }
             }
+            break;
         }
+
         KIO::filesize_t sizeA = 0;
         if (itemA.isDir()) {
             sizeA = a->values.value("size").toULongLong();
@@ -1848,12 +1865,10 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const
         } else {
             sizeB = itemB.size();
         }
-        if (sizeA > sizeB) {
-            result = +1;
-        } else if (sizeA < sizeB) {
-            result = -1;
-        } else {
-            result = 0;
+        if (sizeA < sizeB) {
+            return -1;
+        } else if (sizeA > sizeB) {
+            return +1;
         }
         break;
     }
@@ -1862,9 +1877,9 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const
         const long long dateTimeA = itemA.entry().numberValue(KIO::UDSEntry::UDS_MODIFICATION_TIME, -1);
         const long long dateTimeB = itemB.entry().numberValue(KIO::UDSEntry::UDS_MODIFICATION_TIME, -1);
         if (dateTimeA < dateTimeB) {
-            result = -1;
+            return -1;
         } else if (dateTimeA > dateTimeB) {
-            result = +1;
+            return +1;
         }
         break;
     }
@@ -1873,9 +1888,9 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const
         const long long dateTimeA = itemA.entry().numberValue(KIO::UDSEntry::UDS_CREATION_TIME, -1);
         const long long dateTimeB = itemB.entry().numberValue(KIO::UDSEntry::UDS_CREATION_TIME, -1);
         if (dateTimeA < dateTimeB) {
-            result = -1;
+            return -1;
         } else if (dateTimeA > dateTimeB) {
-            result = +1;
+            return +1;
         }
         break;
     }
@@ -1884,9 +1899,9 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const
         const QDateTime dateTimeA = a->values.value("deletiontime").toDateTime();
         const QDateTime dateTimeB = b->values.value("deletiontime").toDateTime();
         if (dateTimeA < dateTimeB) {
-            result = -1;
+            return -1;
         } else if (dateTimeA > dateTimeB) {
-            result = +1;
+            return +1;
         }
         break;
     }
@@ -1907,9 +1922,9 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const
         const QString roleValueA = a->values.value(role).toString();
         const QString roleValueB = b->values.value(role).toString();
         if (!roleValueA.isEmpty() && roleValueB.isEmpty()) {
-            result = -1;
+            return -1;
         } else if (roleValueA.isEmpty() && !roleValueB.isEmpty()) {
-            result = +1;
+            return +1;
         } else if (isRoleValueNatural(m_sortRole)) {
             result = stringCompare(roleValueA, roleValueB, collator);
         } else {
@@ -2517,3 +2532,15 @@ bool KFileItemModel::isConsistent() const
 
     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 acf4b761cf51bde3b470c197ce5ad36e81721962..161f6a0e25e3c0d6ae8b7ad794262ffe2f45252d 100644 (file)
 
 #include <functional>
 
-class KFileItemModelDirLister;
+class KDirLister;
+
 class QTimer;
 
+namespace KIO {
+    class Job;
+}
+
 /**
  * @brief KItemModelBase implementation for KFileItems.
  *
@@ -80,6 +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;
 
@@ -270,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();
 
@@ -458,11 +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 9c527fa171deb2e4b74672b9cf6ca40c8e642e67..1751812710f8d78dce8baa1e52c5de9d4f22ece6 100644 (file)
@@ -226,8 +226,22 @@ void KStandardItemListWidgetInformant::calculateCompactLayoutItemSizeHints(QVect
 void KStandardItemListWidgetInformant::calculateDetailsLayoutItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const
 {
     const KItemListStyleOption& option = view->styleOption();
-    const qreal height = option.padding * 2 + qMax(option.iconSize, option.fontMetrics.height());
-    logicalHeightHints.fill(height);
+
+    float zoomLevel = 1;
+    if (option.iconSize >= KIconLoader::SizeEnormous) {
+        zoomLevel = 2;
+    } else if (option.iconSize >= KIconLoader::SizeHuge) {
+        zoomLevel = 1.8;
+    } else if (option.iconSize >= KIconLoader::SizeLarge) {
+        zoomLevel = 1.6;
+    } else if (option.iconSize >= KIconLoader::SizeMedium) {
+        zoomLevel = 1.4;
+    } else if (option.iconSize >= KIconLoader::SizeSmallMedium) {
+        zoomLevel = 1.2;
+    }
+
+    const qreal contentHeight = qMax<qreal>(option.iconSize, zoomLevel * option.fontMetrics.height());
+    logicalHeightHints.fill(contentHeight + 2 * option.padding);
     logicalWidthHint = -1.0;
 }
 
diff --git a/src/kitemviews/private/kfileitemmodeldirlister.cpp b/src/kitemviews/private/kfileitemmodeldirlister.cpp
deleted file mode 100644 (file)
index eb860a2..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2006-2012 Peter Penz <peter.penz19@gmail.com>
- *
- * SPDX-License-Identifier: GPL-2.0-or-later
- */
-
-#include "kfileitemmodeldirlister.h"
-
-#include <KLocalizedString>
-#include <KIO/Job>
-#include <kio_version.h>
-
-KFileItemModelDirLister::KFileItemModelDirLister(QObject* parent) :
-    KDirLister(parent)
-{
-#if KIO_VERSION < QT_VERSION_CHECK(5, 82, 0)
-    setAutoErrorHandlingEnabled(false, nullptr);
-#else
-    setAutoErrorHandlingEnabled(false);
-#endif
-}
-
-KFileItemModelDirLister::~KFileItemModelDirLister()
-{
-}
-
-void KFileItemModelDirLister::handleError(KIO::Job* job)
-{
-    if (job->error() == KIO::ERR_IS_FILE) {
-        Q_EMIT urlIsFileError(url());
-    } else {
-        const QString errorString = job->errorString();
-        if (errorString.isEmpty()) {
-            Q_EMIT errorMessage(i18nc("@info:status", "Unknown error."));
-        } else {
-            Q_EMIT errorMessage(errorString);
-        }
-    }
-}
-
diff --git a/src/kitemviews/private/kfileitemmodeldirlister.h b/src/kitemviews/private/kfileitemmodeldirlister.h
deleted file mode 100644 (file)
index 5636959..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2006-2012 Peter Penz <peter.penz19@gmail.com>
- *
- * SPDX-License-Identifier: GPL-2.0-or-later
- */
-
-#ifndef KFILEITEMMODELDIRLISTER_H
-#define KFILEITEMMODELDIRLISTER_H
-
-#include "dolphin_export.h"
-
-#include <KDirLister>
-
-#include <QUrl>
-
-/**
- * @brief Extends the class KDirLister by emitting a signal when an
- *        error occurred instead of showing an error dialog.
- *        KDirLister::autoErrorHandlingEnabled() is set to false.
- */
-class DOLPHIN_EXPORT KFileItemModelDirLister : public KDirLister
-{
-    Q_OBJECT
-
-public:
-    explicit KFileItemModelDirLister(QObject* parent = nullptr);
-    ~KFileItemModelDirLister() override;
-
-Q_SIGNALS:
-    /** Is emitted whenever an error has occurred. */
-    void errorMessage(const QString& msg);
-
-    /**
-     * Is emitted when the URL of the directory lister represents a file.
-     * In this case no signal errorMessage() will be emitted.
-     */
-    void urlIsFileError(const QUrl& url);
-
-protected:
-    void handleError(KIO::Job* job) override;
-};
-
-#endif
index 6e9ef0b2a6dce729aecb29f5a641618aa7f950c5..779690c1c5de280c9742f2d432e0a3c395156986 100644 (file)
@@ -23,6 +23,7 @@
 #include <KLocalizedString>
 #include <Kdelibs4ConfigMigrator>
 #include <KConfigGui>
+#include <KIO/PreviewJob>
 
 #include <QApplication>
 #include <QCommandLineParser>
@@ -61,6 +62,8 @@ int main(int argc, char **argv)
     QApplication app(argc, argv);
     app.setWindowIcon(QIcon::fromTheme(QStringLiteral("system-file-manager"), app.windowIcon()));
 
+    KIO::PreviewJob::setDefaultDevicePixelRatio(app.devicePixelRatio());
+
     KCrash::initialize();
 
     Kdelibs4ConfigMigrator migrate(QStringLiteral("dolphin"));
@@ -178,7 +181,12 @@ int main(int argc, char **argv)
 
     mainWindow->show();
 
-    KDBusService dolphinDBusService;
+    // Allow starting Dolphin on a system that is not running DBus:
+    KDBusService::StartupOptions serviceOptions = KDBusService::Multiple;
+    if (!QDBusConnection::sessionBus().isConnected()) {
+        serviceOptions |= KDBusService::NoExitOnFailure;
+    }
+    KDBusService dolphinDBusService(serviceOptions);
     DBusInterface interface;
 
     if (!app.isSessionRestored()) {
index d1ac9b83cf234c11eb3e5eb7b61009454343588f..98771c6537033ee9bc11895a4efa551fdc23078b 100644 (file)
@@ -31,6 +31,7 @@
   <name xml:lang="ko">Dolphin</name>
   <name xml:lang="lt">Dolphin</name>
   <name xml:lang="ml">ഡോൾഫിൻ</name>
+  <name xml:lang="my">လင်းပိုင်</name>
   <name xml:lang="nb">Dolphin</name>
   <name xml:lang="nds">Dolphin</name>
   <name xml:lang="nl">Dolphin</name>
@@ -83,6 +84,7 @@
   <summary xml:lang="ko">파일 관리자</summary>
   <summary xml:lang="lt">Failų tvarkytuvė</summary>
   <summary xml:lang="ml">ഫയല്‍ കാര്യസ്ഥന്‍</summary>
+  <summary xml:lang="my">ဖိုင်လ်မန်နေဂျာ</summary>
   <summary xml:lang="nb">Filbehandler</summary>
   <summary xml:lang="nds">Dateipleger</summary>
   <summary xml:lang="nl">Bestandsbeheerder</summary>
   <summary xml:lang="zh-TW">檔案管理員</summary>
   <description>
     <p>Dolphin is KDE's file manager that lets you navigate and browse the contents of your hard drives, USB sticks, SD cards, and more. Creating, moving, or deleting files and folders is simple and fast.</p>
+    <p xml:lang="ar">دولفين هو مدير ملفات كدي الذي يتيح لك التنقل وتصفح محتويات محركات الأقراص الثابتة و USB وبطاقات SD والمزيد. يعد إنشاء الملفات والمجلدات أو نقلها أو حذفها أمرًا بسيطًا وسريعًا.</p>
     <p xml:lang="az">Dolphin sizin sərt disklərinizin, USB yaddaş qurğularınızın, SD katlarınızın və s. tərkibindəkiləri nəzərdən keçirmənizə imkan verən fayl meneceridir. Faylların və qovluqların yaradılması, Köçürülməsi və ya silinməsi sadə, rahat və cəld icra edilir.</p>
     <p xml:lang="ca">El Dolphin és el gestor de fitxers del KDE que permet navegar i explorar el contingut dels discs durs, memòries USB, targetes SD i més. Crear, moure o suprimir fitxers i carpetes és senzill i ràpid.</p>
     <p xml:lang="de">Dolphin ist die Dateiverwaltung von KDE und ermöglicht es Ihnen, den Inhalt Ihrer Festplatten, USB-Sticks, SD-Speicherkarten und anderen Geräten einzusehen. Das Erstellen, Verschieben und Löschen von Dateien und Ordnern funktioniert einfach und schnell.</p>
     <p xml:lang="x-test">xxDolphin is KDE's file manager that lets you navigate and browse the contents of your hard drives, USB sticks, SD cards, and more. Creating, moving, or deleting files and folders is simple and fast.xx</p>
     <p xml:lang="zh-CN">Dolphin 是 KDE 的文件管理器,您可以使用它来浏览硬盘、U 盘、SD 卡和其他存储设备中的内容,也可以方便快捷地创建、移动、删除文件和文件夹。</p>
     <p>Dolphin contains plenty of productivity features that will save you time. The multiple tabs and split view features allow navigating multiple folders at the same time, and you can easily drag and drop files between views to move or copy them. Dolphin's right-click menu provides with many quick actions that let you compress, share, and duplicate files, among many other things. You can also add your own custom actions.</p>
+    <p xml:lang="ar">يحتوي دولفين على الكثير من ميزات الإنتاجية التي ستوفر لك الوقت.تسمح علامات التبويب المتعددة وميزات العرض المقسم بالتنقل في مجلدات متعددة في نفس الوقت ، ويمكنك بسهولة سحب الملفات وإفلاتها بين طرق العرض لنقلها أو نسخها. توفر قائمة النقر بزر الفأرة الأيمن في دولفين العديد من الإجراءات السريعة التي تتيح لك ضغط الملفات ومشاركتها وتكرارها ، من بين أشياء أخرى كثيرة. يمكنك أيضًا إضافة الإجراءات المخصصة الخاصة بك.</p>
     <p xml:lang="az">Dolphin, səmərəliyi artıracaq bir çox funksiyalardan ibarətdir və bu da sizə vaxtınıza qənaət edəcəkdir. Birdən çox vərəq və bölünmə funksiyaları, qovluqlar arasında rahat hərəkət etməyə imkan verir, həmçinin, siz faylları, həmin görünən qovluqlar arasında tutub yerini dəyişməklə köçürə və kopyalaya bilərsiniz. Siçanın sağ düyməsi ilə açılan Dolpin menyusunda faylları sıxmağa, paylaşmağa, yeni surətini yaratmağa və bu kimi başqa bir çox cəld əməlləri təqdim edir. Bundan başqa siz həmçinin öz fərdi əməlinizi də bu menyuya daxil edə bilərsiniz.</p>
     <p xml:lang="ca">El Dolphin conté moltes característiques de productivitat que us estalviaran temps. Les característiques de múltiples pestanyes i de vista dividida permeten navegar per diverses carpetes al mateix temps, i poder arrossegar i deixar anar els fitxers amb facilitat entre les vistes per a moure'ls o copiar-los. El menú contextual del Dolphin ofereix moltes accions ràpides que us permeten comprimir, compartir i duplicar els fitxers, entre moltes altres coses. També podreu afegir-hi les vostres pròpies accions personalitzades.</p>
     <p xml:lang="de">Dolphin beinhaltet eine Vielzahl von Produktivitätsfunktionen, die Ihnen Zeit sparen. Dank Registerkarten und geteilten Ansichten können Sie in mehreren Ordnern gleichzeitig navigieren und Sie können einfach Dateien zwischen verschiedenen Ansichten mittels Ziehen kopieren oder verschieben. Dolphins Kontextmenü bietet viele Schnellzugriffe zu Aktionen, mit denen Sie Dateien unter anderem komprimieren, teilen und duplizieren können. Sie können außerdem eigene Aktionen hinzufügen.</p>
     <p xml:lang="x-test">xxDolphin contains plenty of productivity features that will save you time. The multiple tabs and split view features allow navigating multiple folders at the same time, and you can easily drag and drop files between views to move or copy them. Dolphin's right-click menu provides with many quick actions that let you compress, share, and duplicate files, among many other things. You can also add your own custom actions.xx</p>
     <p xml:lang="zh-CN">Dolphin 内建了许多有助于提高工作效率的功能。多标签页窗口、拆分视图等功能可以让您同时浏览多个文件夹,还可以在标签页和拆分的视图之间拖放、复制、移动文件。Dolphin 的右键菜单内建了许多快捷操作功能,例如压缩、分享、创建文件的副本等。您还可以将自定义操作添加到右键菜单。</p>
     <p>Dolphin is very lightweight, but at the same time, you can adapt it to your specific needs. This means that you can carry out your file management exactly the way you want to. Dolphin supports three different view modes: a classic grid view of all the files, a more detailed view, and a tree view. You can also configure most of Dolphin's behavior.</p>
+    <p xml:lang="ar">دولفين خفيف للغاية ، ولكن في نفس الوقت، يمكنك تكييفه مع احتياجاتك الخاصة. هذا يعني أنه يمكنك تنفيذ إدارة الملفات بالطريقة التي تريدها بالضبط. يدعم دولفين ثلاثة أوضاع عرض مختلفة: عرض الشبكة الكلاسيكي لجميع الملفات ، وعرض أكثر تفصيلاً ، وعرض شجرة. يمكنك أيضًا ضبط معظم سلوك دولفين. </p>
     <p xml:lang="az">Dolphin çox yüngüldür, bununla belə siz onu öz ehtiyaclarınıza uyğunlaşdıra bilərsiniz. Bu o deməkdir ki, siz fayllarınızı istədiyiniz kimi idarə edə bilərsiniz. Dolphin üç müxtəlif baxış rejimini dəstəkləyir: bütün faylları üçün şəbəkə formasında klassik görünüş, budaqlanan şəkildə daha təfərrüatlı baxış forması. Siz həmçinin daha çox Dolphin davranışlarını tənzimləyə bilərsiniz.</p>
     <p xml:lang="ca">El Dolphin és molt lleuger, però al mateix temps, podreu adaptar-lo a les vostres necessitats específiques. Això significa que podreu realitzar la gestió de fitxers exactament de la manera que vulgueu. El Dolphin admet tres modes de vista diferents: una vista de quadrícula clàssica amb tots els fitxers, una vista més detallada i una vista en arbre. També podreu configurar la major part del comportament del Dolphin.</p>
     <p xml:lang="de">Dolphin ist sehr leichtgewichtig, kann dabei aber dennoch an Ihre spezifischen Bedürfnisse angepasst werden. Das bedeutet, dass Sie Ihre Dateiverwaltung so vornehmen können, wie Sie es wollen. Dolphin bietet drei unterschiedliche Ansichtsmodi: eine klassische Rasteransicht aller Dateien mit Symbolen, eine detailliertere Ansicht sowie eine Baumansicht. Sie können außerdem einen großen Teil des Verhaltens von Dolphin anpassen.</p>
     <p xml:lang="x-test">xxDolphin is very lightweight, but at the same time, you can adapt it to your specific needs. This means that you can carry out your file management exactly the way you want to. Dolphin supports three different view modes: a classic grid view of all the files, a more detailed view, and a tree view. You can also configure most of Dolphin's behavior.xx</p>
     <p xml:lang="zh-CN">Dolphin 虽然是一款轻量级的应用程序,但依然支持用户按照自己的需要对界面和功能进行深入定制,让文件管理操作更加得心应手。Dolphin 的文件视图有三种模式:经典的图标网格模式、简洁的紧凑模式、显示多栏元数据的详情模式。Dolphin 的绝大多数程序行为都能进行配置。</p>
     <p>Dolphin can display files and folders from many Internet cloud services and other remote machines as if they were right there on your desktop.</p>
+    <p xml:lang="ar">يمكن لدولفين عرض الملفات والمجلدات من العديد من خدمات الإنترنت السحابية والأجهزة البعيدة الأخرى كما لو كانت موجودة على سطح المكتب.</p>
     <p xml:lang="az">Dolphin, bir çox İnternet və digər uzaq maşınların bulud xidmətindən faylları və qovluqları birbaşa sizin İş Masanızdakı kimi göstərəcəkdir.</p>
     <p xml:lang="ca">El Dolphin pot mostrar els fitxers i carpetes de molts serveis en el núvol d'Internet i altres màquines remotes com si hi estiguessin al vostre escriptori.</p>
     <p xml:lang="de">Dolphin kann Dateien und Ordner vieler Internet-Clouddienste und anderer entfernter Maschinen anzeigen, als wären sie direkt lokal auf Ihrem Rechner.</p>
     <p xml:lang="x-test">xxDolphin can display files and folders from many Internet cloud services and other remote machines as if they were right there on your desktop.xx</p>
     <p xml:lang="zh-CN">Dolphin 可以显示多种云存储服务和远程计算机中的文件和文件夹,使用体验与本机文件完全一致。</p>
     <p>Dolphin also comes with an integrated terminal that allows you to run commands on the current folder. You can extend the capabilities of Dolphin even further with powerful plugins to adapt it to your workflow. You can use the git integration plugin to interact with git repositories, or the Nextcloud plugin to synchronize your files online, and much more.</p>
+    <p xml:lang="ar">يأتي دولفين أيضًا مع محطة طرفية متكاملة تتيح لك تشغيل الأوامر في المجلد الحالي. يمكنك توسيع إمكانيات دولفين إلى أبعد من ذلك باستخدام المكونات الإضافية القوية لتكييفها مع سير عملك. يمكنك استخدام المكون الإضافي git للتكامل للتفاعل مع مستودعات git ، أو المكون الإضافي Nextcloud لمزامنة ملفاتك عبر الإنترنت ، وغير ذلك الكثير.</p>
     <p xml:lang="az">Dolphin həmçinin daxilə quraşdırılmış terminalla təmin olunur ki, bu da cari qovluqda əmrləri başlatmağa imkan verir. Siz, Dolphinin imkanlarını iş prosesinizə uyğunlaşdıracaq, güclü qoşmaların köməyi ilə daha da genişləndirə bilərsiniz. Sİz git repazitoriyaları ilə işləmək üçün, qoşulmuş git inteqrasiya modulundan və ya fayllarınızı internet üzərindən sinxronlaşdırmaq üçün Nextcloud qoşmasından və s. istifadə edə bilərsiniz.</p>
     <p xml:lang="ca">El Dolphin també ve amb un terminal integrat que permet executar ordres a la carpeta actual. Podreu estendre encara més les capacitats de Dolphin amb potents connectors per a que s'adapti al vostre flux de treball. Podreu utilitzar el connector d'integració amb el Git per a interactuar amb els repositoris de Git, o el connector de Nextcloud per a sincronitzar els vostres fitxers en línia, i molt més.</p>
     <p xml:lang="de">Dolphin beinhaltet ein integriertes Terminal, in welchem Sie Befehle im aktuellen Ordner ausführen können. Sie können die Fähigkeiten von Dolphin mit zusätzlichen Modulen noch weiter ausbauen, um ihn an Ihre Arbeitsweise anzupassen. Sie können durch das Integrationsmodul für Git mit Git-Repositorys interagieren, mit dem Nextcloud-Modul Ihre Dateien online synchronisieren und vieles mehr.</p>
   <screenshots>
     <screenshot type="default">
       <caption>File management in Dolphin</caption>
+      <caption xml:lang="ar">إدارة الملفات في دولفين</caption>
       <caption xml:lang="ast">Xestión de ficheros en Dolphin</caption>
       <caption xml:lang="az">Dolphində faylların idarə edilməsi</caption>
       <caption xml:lang="ca">Gestió de fitxers al Dolphin</caption>
       <caption xml:lang="ko">Dolphin의 파일 관리</caption>
       <caption xml:lang="lt">Failų tvarkymas Dolphin programoje</caption>
       <caption xml:lang="ml">ഡോൾഫിനിലെ ഫയൽ കൈകാര്യം ചെയ്യൽ</caption>
+      <caption xml:lang="my">လင်းပိုင်တွင် ဖိုင်လ်စီမံမှု</caption>
       <caption xml:lang="nl">Bestandsbeheer in Dolphin</caption>
       <caption xml:lang="nn">Filhandsaming i Dolphin</caption>
       <caption xml:lang="pa">ਡਾਲਫਿਨ ਵਿੱਚ ਫਾਇਲ ਇੰਤਜ਼ਾਮ</caption>
     </screenshot>
     <screenshot type="default">
       <caption>Embedded Terminal in Dolphin</caption>
+      <caption xml:lang="ar">طرفية مضمنة في دولفين</caption>
       <caption xml:lang="az">Dolphin daxilinə yerləşdirilmiş Terminal</caption>
       <caption xml:lang="ca">Terminal incrustat en el Dolphin</caption>
       <caption xml:lang="cs">Zabudovaný terminál v Dolphinu</caption>
       <caption xml:lang="it">Terminale integrato in Dolphin</caption>
       <caption xml:lang="ja">Dolphin の組み込みターミナル</caption>
       <caption xml:lang="ko">Dolphin에 내장된 터미널</caption>
+      <caption xml:lang="my">လင်းပိုင်တွင် မြှပ်သွင်း-တာမီနယ်</caption>
       <caption xml:lang="nl">Ingebedde terminal in Dolphin</caption>
       <caption xml:lang="pl">Osadzony terminal w Dolphinie</caption>
       <caption xml:lang="pt">Terminal Incorporado no Dolphin</caption>
     </screenshot>
     <screenshot>
       <caption>Dolphin lets you configure your file manager exactly how you want</caption>
+      <caption xml:lang="ar">يتيح لك دولفين ضبط مدير الملفات الخاص بك بالطريقة التي تريدها بالضبط</caption>
       <caption xml:lang="az">Dolphin, fayl bələdçisini tam istədiyiniz kimi tənzimləməyə imkan verir</caption>
       <caption xml:lang="ca">El Dolphin permet configurar el gestor de fitxers exactament com es vol</caption>
       <caption xml:lang="de">Mit Dolphin können Sie Ihre Dateiverwaltung genau so einrichten, wie Sie es wünschen</caption>
       <caption xml:lang="it">Dolphin ti consente di configurare il tuo gestore file esattamente come desideri</caption>
       <caption xml:lang="ja">Dolphin では、ファイルマネージャを思いどおりに設定することができます。</caption>
       <caption xml:lang="ko">Dolphin은 사용하고 싶은 대로 설정할 수 있습니다</caption>
+      <caption xml:lang="my">လင်းပိုင်သည် ဖိုင်လ်မန်နေဂျာကို သင်ကြိုက်သလို ပြင်ဆင်ခွင့်ပေးထားသည်</caption>
       <caption xml:lang="nl">Dolphin laat u uw bestandsbeheerder exact configureren zoals u dat wilt</caption>
       <caption xml:lang="pl">Dolphin umożliwia ustawienie zarządzania plikami dokładnie tak, jak tego chcesz</caption>
       <caption xml:lang="pt">O Dolphin permite-lhe configurar o seu gestor de ficheiros exactamente como pretende</caption>
index 9489ab3704129f9262b070033279d3be8aa17193..0031f088cbb3ad6d8254607052a16aadb4e48741 100755 (executable)
@@ -27,6 +27,7 @@ Name[ko]=Dolphin
 Name[lt]=Dolphin
 Name[lv]=Dolphin
 Name[ml]=ഡോള്‍ഫിന്‍
+Name[my]=လင်းပိုင်
 Name[nb]=Dolphin
 Name[nl]=Dolphin
 Name[nn]=Dolphin
@@ -84,6 +85,7 @@ GenericName[ko]=파일 관리자
 GenericName[lt]=Failų tvarkytuvė
 GenericName[lv]=Datņu pārvaldnieks
 GenericName[ml]=ഫയല്‍ മാനേജര്‍
+GenericName[my]=ဖိုင်လ်မန်နေဂျာ
 GenericName[nb]=Filbehandler
 GenericName[nl]=Bestandsbeheerder
 GenericName[nn]=Filhandsamar
index d43b9f5205d72b92531b0b9849f652a59078d881..98c012243752fe98562ee419e84ea784bd6db98f 100644 (file)
@@ -394,8 +394,8 @@ void InformationPanelContent::showPreview(const KFileItem& item,
         // adds a play arrow
 
         // compute relative pixel positions
-        const int zeroX = static_cast<int>(p.width() / 2 - PLAY_ARROW_SIZE / 2 / devicePixelRatio());
-        const int zeroY = static_cast<int>(p.height() / 2 - PLAY_ARROW_SIZE / 2 / devicePixelRatio());
+        const int zeroX = static_cast<int>((p.width() / 2 - PLAY_ARROW_SIZE / 2) / pixmap.devicePixelRatio());
+        const int zeroY = static_cast<int>((p.height() / 2 - PLAY_ARROW_SIZE / 2) / pixmap.devicePixelRatio());
 
         QPolygon arrow;
         arrow << QPoint(zeroX, zeroY);
index 6bcf3cd02bcdaec700c08f7d79b52a4a8fbe8681..f4d288369605528ab559a897119be875ab8f720c 100644 (file)
             <default>true</default>
         </entry>
 
+        <entry name="SortHiddenLast" type="Bool" >
+            <label context="@label">Show hidden files and folders last</label>
+            <default>false</default>
+        </entry>
+
         <entry name="VisibleRoles" type="StringList">
             <label context="@label">Visible roles</label>
             <default></default>
index 3a0aa779bdfc3defc179739d77731508701f4ea2..fd0044325260233bf62cc771d901c20f79ac8a06 100644 (file)
@@ -17,7 +17,7 @@
 #include <QTabWidget>
 #include <QVBoxLayout>
 
-K_PLUGIN_FACTORY(KCMDolphinGeneralConfigFactory, registerPlugin<DolphinGeneralConfigModule>(QStringLiteral("dolphingeneral"));)
+K_PLUGIN_FACTORY(KCMDolphinGeneralConfigFactory, registerPlugin<DolphinGeneralConfigModule>();)
 
 DolphinGeneralConfigModule::DolphinGeneralConfigModule(QWidget *parent, const QVariantList &args) :
     KCModule(parent, args),
index 0c37e03f55baa68125ad3cf24b99b7daa668d08e..b57c6711eed21001e1427b06d04304ecc0008ab0 100644 (file)
@@ -26,6 +26,7 @@ Name[ko]=Dolphin 일반
 Name[lt]=Dolphin bendrosios
 Name[lv]=Dolphin vispārējs
 Name[ml]=ഡോൾഫിൻ ജനറൽ
+Name[my]=လင်းပိုင် ယေဘုယျ
 Name[nb]=Dolphin generelt
 Name[nl]=Dolphin algemeen
 Name[nn]=Generelt for Dolphin
@@ -78,6 +79,7 @@ Comment[ko]=이 서비스를 통해 일반 Dolphin 설정을 구성할 수 있
 Comment[lt]=Ši paslauga leidžia bendrųjų Dolphin nuostatų konfigūravimą.
 Comment[lv]=Šis serviss ļauj konfigurēt vispārējos Dolphin iestatījumus.
 Comment[ml]=പൊതുവായ ഡോള്‍ഫിന്‍ സജ്ജീകരണങ്ങള്‍ ക്രമീകരിയ്ക്കാന്‍ ഈ സേവനം അനുവദിക്കുന്നു.
+Comment[my]=ဤဝန်ဆောင်မှုက လင်းပိုင် ယေဘုယျဆက်တင်ကို ပြင်ဆင်နိုင်စေသည်။
 Comment[nb]=Med denne tjenesten kan du sette opp generelle innstillinger for Dolphin.
 Comment[nl]=Met deze dienst kunt u algemene Dolphin-instellingen configureren.
 Comment[nn]=Denne tenesta lèt deg setja opp generelle innstillingar for Dolphin.
@@ -108,7 +110,6 @@ Type=Service
 X-KDE-ServiceTypes=KCModule
 
 X-KDE-Library=kcm_dolphingeneral
-X-KDE-PluginKeyword=dolphingeneral
 X-DocPath=dolphin/configuring-dolphin.html#preferences-dialog
 # ctxt: Random file browsing settings.
 Name=General
@@ -139,6 +140,7 @@ Name[ko]=일반
 Name[lt]=Bendrosios
 Name[lv]=Vispārējs
 Name[ml]=പൊതുവായതു്
+Name[my]=ယေဘုယျ
 Name[nb]=Generelt
 Name[nl]=Algemeen
 Name[nn]=Generelt
@@ -190,6 +192,7 @@ Comment[ko]=일반 파일 관리자 설정 구성
 Comment[lt]=Konfigūruoti bendras failų tvarkytuvės nuostatas
 Comment[lv]=Konfigurēt vispārējā datņu pārvaldnieka iestatījumus
 Comment[ml]=ഫയൽ മാനേജറിന്റെ പൊതുവായ സജ്ജീകരണങ്ങള്‍ ക്രമീകരിയ്ക്കുക
+Comment[my]=ဖိုင်လ်မန်နေဂျာ ယေဘုယျဆက်တင် ပြင်ဆင်မည်
 Comment[nb]=Sett opp generelle innstillinger for filbehandleren
 Comment[nl]=Algemene bestandsbeheerderinstellingen configureren
 Comment[nn]=Set opp generelle innstillingar for filhandsamaren
@@ -241,6 +244,7 @@ X-KDE-Keywords[ko]=파일 관리자
 X-KDE-Keywords[lt]=failų tvarkytuvė
 X-KDE-Keywords[lv]=datņu pārvaldnieks
 X-KDE-Keywords[ml]=ഫയൽ മാനേജർ
+X-KDE-Keywords[my]=ဖိုင်လ်မန်နေဂျာ
 X-KDE-Keywords[nb]=filbehandler
 X-KDE-Keywords[nl]=bestandsbeheerder
 X-KDE-Keywords[nn]=filhandsamar
index 74fce85c7f3ac2155b5421840034b572a9c27dad..f749628ab6aeed17abcbbcb29a07f91b164aee12 100644 (file)
@@ -13,7 +13,7 @@
 
 #include <QVBoxLayout>
 
-K_PLUGIN_FACTORY(KCMDolphinNavigationConfigFactory, registerPlugin<DolphinNavigationConfigModule>(QStringLiteral("dolphinnavigation"));)
+K_PLUGIN_FACTORY(KCMDolphinNavigationConfigFactory, registerPlugin<DolphinNavigationConfigModule>();)
 
 DolphinNavigationConfigModule::DolphinNavigationConfigModule(QWidget *parent, const QVariantList &args) :
     KCModule(parent, args),
index 954ad991fc60db77bc0e553a4eddf0ee29b99d8d..6df10ac24f55d126a5b9e85074a966c8780bb20c 100644 (file)
@@ -26,6 +26,7 @@ Name[ko]=Dolphin 탐색
 Name[lt]=Dolphin naršymas
 Name[lv]=Dolphin navigācija
 Name[ml]=ഡോള്‍ഫിന്‍ നാവിഗേഷന്‍
+Name[my]=လင်းပိုင် လမ်းညွှန်
 Name[nb]=Navigasjon i Dolphin
 Name[nl]=Dolphin-navigatie
 Name[nn]=Navigasjon i Dolphin
@@ -78,6 +79,7 @@ Comment[ko]=이 서비스를 통해 Dolphin 탐색을 설정할 수 있습니다
 Comment[lt]=Ši paslauga leidžia Dolphin naršymo konfigūravimą.
 Comment[lv]=Šis serviss ļauj konfigurēt Dolphin navigāciju.
 Comment[ml]=ഡോള്‍ഫിന്‍ നാവിഗേഷൻ ക്രമീകരിയ്ക്കാന്‍ ഈ സേവനം അനുവദിയ്ക്കുന്നു.
+Comment[my]=ဤဝန်ဆောင်မှုက လင်းပိုင် လမ်းညွှန်ကို ပြင်ဆင်နိုင်စေသည်။
 Comment[nb]=Med denne tjenesten kan du sette opp navigasjon for Dolphin.
 Comment[nl]=Met deze dienst kunt u Dolphin-navigatie configureren.
 Comment[nn]=Denne tenesta lèt deg setja opp navigasjonen for Dolphin.
@@ -108,7 +110,6 @@ Type=Service
 X-KDE-ServiceTypes=KCModule
 
 X-KDE-Library=kcm_dolphinnavigation
-X-KDE-PluginKeyword=dolphinnavigation
 X-DocPath=dolphin/configuring-dolphin.html#preferences-dialog-navigation
 Name=Navigation
 Name[ar]=التّنقّل
@@ -138,6 +139,7 @@ Name[ko]=탐색
 Name[lt]=Naršymas
 Name[lv]=Navigācija
 Name[ml]=നാവിഗേഷന്‍
+Name[my]=လမ်းညွှန်
 Name[nb]=Navigasjon
 Name[nl]=Navigatie
 Name[nn]=Navigasjon
@@ -190,6 +192,7 @@ Comment[ko]=파일 관리자 탐색 설정
 Comment[lt]=Konfigūruoti failų tvarkytuvės naršymą
 Comment[lv]=Konfigurēt datņu pārvaldnieka navigāciju
 Comment[ml]=ഫയല്‍ മാനേജർ നാവിഗേഷൻ ക്രമീകരിയ്ക്കുക
+Comment[my]=ဖိုင်လ်မန်နေဂျာ လမ်းညွှန် ပြင်ဆင်မည်
 Comment[nb]=Sett opp navigasjon i filbehandleren
 Comment[nl]=Bestandsbeheerdernavigatie configureren
 Comment[nn]=Set opp navigasjonen i filhandsamaren
@@ -242,6 +245,7 @@ X-KDE-Keywords[ko]=파일 관리자
 X-KDE-Keywords[lt]=failų tvarkytuvė
 X-KDE-Keywords[lv]=datņu pārvaldnieks
 X-KDE-Keywords[ml]=ഫയൽ മാനേജർ
+X-KDE-Keywords[my]=ဖိုင်လ်မန်နေဂျာ
 X-KDE-Keywords[nb]=filbehandler
 X-KDE-Keywords[nl]=bestandsbeheerder
 X-KDE-Keywords[nn]=filhandsamar
index fcd33a0f0f05bd71e498d32fec38d2300c3285b1..0c287ed220786858663fc7e925911be94a15ee3a 100644 (file)
@@ -17,7 +17,7 @@
 #include <QTabWidget>
 #include <QVBoxLayout>
 
-K_PLUGIN_FACTORY(KCMDolphinViewModesConfigFactory, registerPlugin<DolphinViewModesConfigModule>(QStringLiteral("dolphinviewmodes"));)
+K_PLUGIN_FACTORY(KCMDolphinViewModesConfigFactory, registerPlugin<DolphinViewModesConfigModule>();)
 
 DolphinViewModesConfigModule::DolphinViewModesConfigModule(QWidget *parent, const QVariantList &args) :
     KCModule(parent, args),
index 5bbb0eed5d0496b11309b2d0317d8483dba48684..25a3bd2de3b2a34b516ed1cb0c35318417a2b24c 100644 (file)
@@ -25,6 +25,7 @@ Name[ko]=Dolphin 보기 모드
 Name[lt]=Dolphin rodinio veiksenos
 Name[lv]=Dolphin skata režīmi
 Name[ml]=ഡോള്‍ഫിന്‍ അവതരണദശകള്‍
+Name[my]=လင်းပိုင် မြင်ကွင်းထုံးနည်းများ
 Name[nb]=Dolphin visningsmåter
 Name[nl]=Dolphin-weergavemodussen
 Name[nn]=Dolphin-visingar
@@ -76,6 +77,7 @@ Comment[ko]=이 서비스를 통해 Dolphin 보기 모드를 설정할 수 있
 Comment[lt]=Ši paslauga leidžia Dolphin rodinio veiksenų konfigūravimą.
 Comment[lv]=Šis serviss ļauj konfigurēt Dolphin skata režīmus.
 Comment[ml]=ഡോള്‍ഫിന്‍ അവതരണദശകള്‍ ക്രമീകരിയ്ക്കാന്‍ ഈ സേവനം അനുവദിയ്ക്കുന്നു.
+Comment[my]=ဤဝန်ဆောင်မှုက လင်းပိုင် မြင်ကွင်းထုံးနည်းများကို ပြင်ဆင်နိုင်စေသည်။
 Comment[nb]=Med denne tjenesten kan du sette opp Dolphins visningsmåter.
 Comment[nl]=Met deze dienst kunt u Dolphin-weergavemodussen configureren.
 Comment[nn]=Denne tenesta lèt deg setja opp Dolphin-visingsmodusar.
@@ -106,7 +108,6 @@ Type=Service
 X-KDE-ServiceTypes=KCModule
 
 X-KDE-Library=kcm_dolphinviewmodes
-X-KDE-PluginKeyword=dolphinviewmodes
 X-DocPath=dolphin/configuring-dolphin.html#preferences-dialog-viewmodes
 Name=View Modes
 Name[ar]=أوضاع المنظور
@@ -135,6 +136,7 @@ Name[ko]=보기 모드
 Name[lt]=Rodinio veiksenos
 Name[lv]=Skata režīmi
 Name[ml]=അവതരണ രീതികള്‍
+Name[my]=မြင်ကွင်းထုံးနည်းများ
 Name[nb]=Visningsmåter
 Name[nl]=Weergavemodi
 Name[nn]=Visingsmodusar
@@ -186,6 +188,7 @@ Comment[ko]=파일 관리자 보기 모드 구성
 Comment[lt]=Konfigūruoti failų tvarkytuvės rodinio veiksenas
 Comment[lv]=Konfigurēt datņu pārvaldnieka skata režīmus
 Comment[ml]=ഫയല്‍ മാനേജറിന്റെ അവതരണ രീതികള്‍ ക്രമീകരിയ്ക്കുക
+Comment[my]=ဖိုင်လ်မန်နေဂျာ မြင်ကွင်းထုံးနည်းများ ပြင်ဆင်မည်
 Comment[nb]=Tilpass filbehandlerens visningsmåter
 Comment[nl]=Bestandsbeheerderweergavemodussen configureren
 Comment[nn]=Set opp visingsmodusane i filhandsamaren
@@ -238,6 +241,7 @@ X-KDE-Keywords[ko]=파일 관리자
 X-KDE-Keywords[lt]=failų tvarkytuvė
 X-KDE-Keywords[lv]=datņu pārvaldnieks
 X-KDE-Keywords[ml]=ഫയൽ മാനേജർ
+X-KDE-Keywords[my]=ဖိုင်လ်မန်နေဂျာ
 X-KDE-Keywords[nb]=filbehandler
 X-KDE-Keywords[nl]=bestandsbeheerder
 X-KDE-Keywords[nn]=filhandsamar
index 82d182d1d00c8a9e8cc736c9df3428596d7f65c5..6659d79b63f0b3c9f23cefd0cb4829ed7661e4df 100644 (file)
@@ -44,6 +44,7 @@ ViewPropertiesDialog::ViewPropertiesDialog(DolphinView* dolphinView) :
     m_sortOrder(nullptr),
     m_sorting(nullptr),
     m_sortFoldersFirst(nullptr),
+    m_sortHiddenLast(nullptr),
     m_previewsShown(nullptr),
     m_showInGroups(nullptr),
     m_showHiddenFiles(nullptr),
@@ -82,6 +83,7 @@ ViewPropertiesDialog::ViewPropertiesDialog(DolphinView* dolphinView) :
     }
 
     m_sortFoldersFirst = new QCheckBox(i18nc("@option:check", "Show folders first"));
+    m_sortHiddenLast = new QCheckBox(i18nc("@option:check", "Show hidden files last"));
     m_previewsShown = new QCheckBox(i18nc("@option:check", "Show preview"));
     m_showInGroups = new QCheckBox(i18nc("@option:check", "Show in groups"));
     m_showHiddenFiles = new QCheckBox(i18nc("@option:check", "Show hidden files"));
@@ -146,6 +148,7 @@ ViewPropertiesDialog::ViewPropertiesDialog(DolphinView* dolphinView) :
     layout->addRow(QString(), m_previewsShown);
     layout->addRow(QString(), m_showInGroups);
     layout->addRow(QString(), m_showHiddenFiles);
+    layout->addRow(QString(), m_sortHiddenLast);
 
     connect(m_viewMode, QOverload<int>::of(&QComboBox::currentIndexChanged),
             this, &ViewPropertiesDialog::slotViewModeChanged);
@@ -155,6 +158,8 @@ ViewPropertiesDialog::ViewPropertiesDialog(DolphinView* dolphinView) :
             this, &ViewPropertiesDialog::slotSortOrderChanged);
     connect(m_sortFoldersFirst, &QCheckBox::clicked,
             this, &ViewPropertiesDialog::slotSortFoldersFirstChanged);
+    connect(m_sortHiddenLast, &QCheckBox::clicked,
+            this, &ViewPropertiesDialog::slotSortHiddenLastChanged);
     connect(m_previewsShown, &QCheckBox::clicked,
             this, &ViewPropertiesDialog::slotShowPreviewChanged);
     connect(m_showInGroups, &QCheckBox::clicked,
@@ -282,6 +287,13 @@ void ViewPropertiesDialog::slotSortFoldersFirstChanged()
     markAsDirty(true);
 }
 
+void ViewPropertiesDialog::slotSortHiddenLastChanged()
+{
+    const bool hiddenLast = m_sortHiddenLast->isChecked();
+    m_viewProps->setSortHiddenLast(hiddenLast);
+    markAsDirty(true);
+}
+
 void ViewPropertiesDialog::slotShowPreviewChanged()
 {
     const bool show = m_previewsShown->isChecked();
@@ -383,6 +395,7 @@ void ViewPropertiesDialog::applyViewProperties()
     m_dolphinView->setSortRole(m_viewProps->sortRole());
     m_dolphinView->setSortOrder(m_viewProps->sortOrder());
     m_dolphinView->setSortFoldersFirst(m_viewProps->sortFoldersFirst());
+    m_dolphinView->setSortHiddenLast(m_viewProps->sortHiddenLast());
     m_dolphinView->setGroupedSorting(m_viewProps->groupedSorting());
     m_dolphinView->setVisibleRoles(m_viewProps->visibleRoles());
     m_dolphinView->setPreviewsShown(m_viewProps->previewsShown());
@@ -418,6 +431,7 @@ void ViewPropertiesDialog::loadSettings()
     m_sorting->setCurrentIndex(sortRoleIndex);
 
     m_sortFoldersFirst->setChecked(m_viewProps->sortFoldersFirst());
+    m_sortHiddenLast->setChecked(m_viewProps->sortHiddenLast());
 
     // Load show preview, show in groups and show hidden files settings
     m_previewsShown->setChecked(m_viewProps->previewsShown());
index f07bb8088f00df2abe7465865d27923bd94d6822..c58fda5c002fb2dc782540ee5d5a2eca3995d14e 100644 (file)
@@ -46,6 +46,7 @@ private Q_SLOTS:
     void slotSortOrderChanged(int index);
     void slotGroupedSortingChanged();
     void slotSortFoldersFirstChanged();
+    void slotSortHiddenLastChanged();
     void slotShowPreviewChanged();
     void slotShowHiddenFilesChanged();
     void slotItemChanged(QListWidgetItem *item);
@@ -67,6 +68,7 @@ private:
     QComboBox* m_sortOrder;
     QComboBox* m_sorting;
     QCheckBox* m_sortFoldersFirst;
+    QCheckBox* m_sortHiddenLast;
     QCheckBox* m_previewsShown;
     QCheckBox* m_showInGroups;
     QCheckBox* m_showHiddenFiles;
index 40f8f6bcd8620c40d263cc03aefee470fe4e37fe..b40d3dbbf79e580dcadbc3041c4f7ed7e991d13a 100644 (file)
@@ -211,7 +211,8 @@ void DolphinMainWindowTest::testOpenInNewTabTitle()
     QCOMPARE(tabWidget->count(), 2);
     QVERIFY(tabWidget->tabText(0) != tabWidget->tabText(1));
     if (!tabWidget->tabIcon(0).isNull() && !tabWidget->tabIcon(1).isNull()) {
-        QVERIFY(tabWidget->tabIcon(0).name() != tabWidget->tabIcon(1).name());
+        QCOMPARE(QStringLiteral("inode-directory"), tabWidget->tabIcon(0).name());
+        QCOMPARE(QStringLiteral("inode-directory"), tabWidget->tabIcon(1).name());
     }
 }
 
index 4a5cd063021dffc612ef49d0382e9d0448fe3341..22d5d3a01ae143e691bf13e9aedfa6303dfa6129 100644 (file)
@@ -6,9 +6,10 @@
 
 #include "kitemviews/kfileitemlistview.h"
 #include "kitemviews/kfileitemmodel.h"
-#include "kitemviews/private/kfileitemmodeldirlister.h"
 #include "testdir.h"
 
+#include <KDirLister>
+
 #include <QGraphicsView>
 #include <QTest>
 #include <QSignalSpy>
index 558a00ab592475fb2b30a6a295967d2913221943..6a7c4cca6fa7e72c3fec68357c1eda186a60956d 100644 (file)
 #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)
@@ -812,6 +812,19 @@ void KFileItemModelTest::testRemoveFilteredExpandedItems()
 
 void KFileItemModelTest::testSorting()
 {
+    // testDir structure is as follows
+    // ./
+    // ├─ .g/
+    // ├─ a
+    // ├─ b
+    // ├─ c/
+    // │  ├─ c-2/
+    // │  │  ├─ c-3
+    // │  ├─ c-1
+    // ├─ .f
+    // ├─ d
+    // ├─ e
+
     QSignalSpy itemsInsertedSpy(m_model, &KFileItemModel::itemsInserted);
     QSignalSpy itemsMovedSpy(m_model, &KFileItemModel::itemsMoved);
     QVERIFY(itemsMovedSpy.isValid());
@@ -836,17 +849,27 @@ void KFileItemModelTest::testSorting()
     m_testDir->createFile("d", "The largest file in this directory", now.addDays(-1));
     m_testDir->createFile("e", "An even larger file", now.addDays(-4));
     m_testDir->createFile(".f");
+    m_testDir->createDir(".g");
 
     m_model->loadDirectory(m_testDir->url());
     QVERIFY(itemsInsertedSpy.wait());
+    QCOMPARE(itemsInsertedSpy.count(), 1);
+    KItemRangeList itemRangeList = itemsInsertedSpy.takeFirst().at(0).value<KItemRangeList>();
+    QCOMPARE(itemRangeList, KItemRangeList() << KItemRange(0, 5));
 
     int index = m_model->index(QUrl(m_testDir->url().url() + "/c"));
     m_model->setExpanded(index, true);
     QVERIFY(itemsInsertedSpy.wait());
+    QCOMPARE(itemsInsertedSpy.count(), 1);
+    itemRangeList = itemsInsertedSpy.takeFirst().at(0).value<KItemRangeList>();
+    QCOMPARE(itemRangeList, KItemRangeList() << KItemRange(1, 2));
 
     index = m_model->index(QUrl(m_testDir->url().url() + "/c/c-2"));
     m_model->setExpanded(index, true);
     QVERIFY(itemsInsertedSpy.wait());
+    QCOMPARE(itemsInsertedSpy.count(), 1);
+    itemRangeList = itemsInsertedSpy.takeFirst().at(0).value<KItemRangeList>();
+    QCOMPARE(itemRangeList, KItemRangeList() << KItemRange(2, 1));
 
     // Default: Sort by Name, ascending
     QCOMPARE(m_model->sortRole(), QByteArray("text"));
@@ -942,7 +965,46 @@ void KFileItemModelTest::testSorting()
     QCOMPARE(itemsMovedSpy.first().at(0).value<KItemRange>(), KItemRange(4, 4));
     QCOMPARE(itemsMovedSpy.takeFirst().at(1).value<QList<int> >(), QList<int>() << 7 << 6 << 5 << 4);
 
-    // TODO: Sort by other roles; show/hide hidden files
+    // 'Show Hidden Files' enabled
+    m_model->setShowHiddenFiles(true);
+    QVERIFY(m_model->showHiddenFiles());
+    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(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");
+    QCOMPARE(itemsInModel(), QStringList() << "c" << "c-2" << "c-3" << "c-1" << "e" << "d" << "b" << "a" << ".g" << ".f");
+    QCOMPARE(itemsMovedSpy.count(), 1);
+    QCOMPARE(itemsMovedSpy.first().at(0).value<KItemRange>(), KItemRange(4, 2));
+    QCOMPARE(itemsMovedSpy.takeFirst().at(1).value<QList<int> >(), QList<int>() << 5 << 4);
+
+    // Sort ascending
+    m_model->setSortOrder(Qt::AscendingOrder);
+    QCOMPARE(itemsInModel(), QStringList() << "c" << "c-2" << "c-3" << "c-1" << "a" << "b" << "d" << "e" << ".g" << ".f");
+    QCOMPARE(itemsMovedSpy.count(), 1);
+    QCOMPARE(itemsMovedSpy.first().at(0).value<KItemRange>(), KItemRange(4, 4));
+    QCOMPARE(itemsMovedSpy.takeFirst().at(1).value<QList<int> >(), QList<int>() << 7 << 6 << 5 << 4);
+
+    // 'Sort Folders First' disabled
+    m_model->setSortDirectoriesFirst(false);
+    QVERIFY(!m_model->sortDirectoriesFirst());
+    QCOMPARE(itemsInModel(), QStringList() << "a" << "b" << "c" << "c-1" << "c-2" << "c-3" << "d" << "e" << ".f" << ".g");
+    QCOMPARE(itemsMovedSpy.count(), 1);
+    QCOMPARE(itemsMovedSpy.first().at(0).value<KItemRange>(), KItemRange(0, 10));
+    QCOMPARE(itemsMovedSpy.takeFirst().at(1).value<QList<int> >(), QList<int>() << 2 << 4 << 5 << 3 << 0 << 1 << 6 << 7 << 9 << 8);
+
 }
 
 void KFileItemModelTest::testIndexForKeyboardSearch()
index 8684cda0690db9a2c337e50dd441a78816ffda3a..df88345561b1268a44dca0281e570fac31713906 100644 (file)
@@ -22,11 +22,7 @@ Trash::Trash()
     // The trash icon must always be updated dependent on whether
     // the trash is empty or not. We use a KDirLister that automatically
     // watches for changes if the number of items has been changed.
-#if KIO_VERSION < QT_VERSION_CHECK(5, 82, 0)
-    m_trashDirLister->setAutoErrorHandlingEnabled(false, nullptr);
-#else
     m_trashDirLister->setAutoErrorHandlingEnabled(false);
-#endif
     m_trashDirLister->setDelayedMimeTypes(true);
     auto trashDirContentChanged = [this]() {
         bool isTrashEmpty = m_trashDirLister->items().isEmpty();
index f5c21a2c5561ecf16898f98b5aefeb5d61f9b3ed..39fd20bde82a5410c36db490b3928c1e1be8259f 100644 (file)
@@ -7,7 +7,9 @@
 
 #include "dolphinview.h"
 
+#include "dolphin_compactmodesettings.h"
 #include "dolphin_detailsmodesettings.h"
+#include "dolphin_iconsmodesettings.h"
 #include "dolphin_generalsettings.h"
 #include "dolphinitemlistview.h"
 #include "dolphinnewfilemenuobserver.h"
@@ -463,6 +465,18 @@ bool DolphinView::sortFoldersFirst() const
     return m_model->sortDirectoriesFirst();
 }
 
+void DolphinView::setSortHiddenLast(bool hiddenLast)
+{
+    if (sortHiddenLast() != hiddenLast) {
+        updateSortHiddenLast(hiddenLast);
+    }
+}
+
+bool DolphinView::sortHiddenLast() const
+{
+    return m_model->sortHiddenLast();
+}
+
 void DolphinView::setVisibleRoles(const QList<QByteArray>& roles)
 {
     const QList<QByteArray> previousRoles = roles;
@@ -1373,6 +1387,17 @@ void DolphinView::updateSortFoldersFirst(bool foldersFirst)
     Q_EMIT sortFoldersFirstChanged(foldersFirst);
 }
 
+void DolphinView::updateSortHiddenLast(bool hiddenLast)
+{
+    ViewProperties props(viewPropertiesUrl());
+    props.setSortHiddenLast(hiddenLast);
+
+    m_model->setSortHiddenLast(hiddenLast);
+
+    Q_EMIT sortHiddenLastChanged(hiddenLast);
+}
+
+
 QPair<bool, QString> DolphinView::pasteInfo() const
 {
     const QMimeData *mimeData = QApplication::clipboard()->mimeData();
@@ -1508,16 +1533,30 @@ QUrl DolphinView::openItemAsFolderUrl(const KFileItem& item, const bool browseTh
 
 void DolphinView::resetZoomLevel()
 {
-    ViewModeSettings::ViewMode mode;
-
+    // TODO : Switch to using ViewModeSettings after MR #256 is merged
+    int defaultIconSize = KIconLoader::SizeSmall;
     switch (m_mode) {
-    case IconsView:     mode = ViewModeSettings::IconsMode;   break;
-    case CompactView:   mode = ViewModeSettings::CompactMode; break;
-    case DetailsView:   mode = ViewModeSettings::DetailsMode; break;
+    case IconsView:
+        IconsModeSettings::self()->useDefaults(true);
+        defaultIconSize = IconsModeSettings::iconSize();
+        IconsModeSettings::self()->useDefaults(false);
+        break;
+    case DetailsView:
+        DetailsModeSettings::self()->useDefaults(true);
+        defaultIconSize = DetailsModeSettings::iconSize();
+        DetailsModeSettings::self()->useDefaults(false);
+        break;
+    case CompactView:
+        CompactModeSettings::self()->useDefaults(true);
+        defaultIconSize = CompactModeSettings::iconSize();
+        CompactModeSettings::self()->useDefaults(false);
+        break;
+    default:
+        Q_ASSERT(false);
+        break;
     }
-    const ViewModeSettings settings(mode);
-    const QSize iconSize = QSize(settings.iconSize(), settings.iconSize());
-    setZoomLevel(ZoomLevelInfo::zoomLevelForIconSize(iconSize));
+
+    setZoomLevel(ZoomLevelInfo::zoomLevelForIconSize(QSize(defaultIconSize, defaultIconSize)));
 }
 
 void DolphinView::observeCreatedItem(const QUrl& url)
@@ -1903,6 +1942,12 @@ void DolphinView::applyViewProperties(const ViewProperties& props)
         Q_EMIT sortFoldersFirstChanged(sortFoldersFirst);
     }
 
+    const bool sortHiddenLast = props.sortHiddenLast();
+    if (sortHiddenLast != m_model->sortHiddenLast()) {
+        m_model->setSortHiddenLast(sortHiddenLast);
+        Q_EMIT sortHiddenLastChanged(sortHiddenLast);
+    }
+
     const QList<QByteArray> visibleRoles = props.visibleRoles();
     if (visibleRoles != m_visibleRoles) {
         const QList<QByteArray> previousVisibleRoles = m_visibleRoles;
index e4d7798300bee6f4cb0ccfbd392e9ddef5501fc8..75c9dd9856a382b9f9e2126b1ad2b66d4218424e 100644 (file)
@@ -206,6 +206,10 @@ public:
     void setSortFoldersFirst(bool foldersFirst);
     bool sortFoldersFirst() const;
 
+    /** Sets a separate sorting with hidden files and folders last (true) or not (false). */
+    void setSortHiddenLast(bool hiddenLast);
+    bool sortHiddenLast() const;
+
     /** Sets the additional information which should be shown for the items. */
     void setVisibleRoles(const QList<QByteArray>& roles);
 
@@ -470,6 +474,11 @@ Q_SIGNALS:
      */
     void sortFoldersFirstChanged(bool foldersFirst);
 
+    /**
+     * Is emitted if the sorting of hidden files has been changed.
+     */
+    void sortHiddenLastChanged(bool hiddenLast);
+
     /** Is emitted if the additional information shown for this view has been changed. */
     void visibleRolesChanged(const QList<QByteArray>& current,
                              const QList<QByteArray>& previous);
@@ -679,6 +688,12 @@ private Q_SLOTS:
      */
     void updateSortFoldersFirst(bool foldersFirst);
 
+    /**
+     * Updates the view properties of the current URL to the
+     * sorting of hidden files given by \a hiddenLast.
+     */
+    void updateSortHiddenLast(bool hiddenLast);
+
     /**
      * Indicates in the status bar that the delete operation
      * of the job \a job has been finished.
index c9bab5f82f793e5a66f508a5c3781756fcdbc769..90109605b65a1ae4b9abfb5e358927d4b66b4987 100644 (file)
@@ -57,6 +57,8 @@ void DolphinViewActionHandler::setCurrentView(DolphinView* view)
             this, &DolphinViewActionHandler::slotSortOrderChanged);
     connect(view, &DolphinView::sortFoldersFirstChanged,
             this, &DolphinViewActionHandler::slotSortFoldersFirstChanged);
+    connect(view, &DolphinView::sortHiddenLastChanged,
+            this, &DolphinViewActionHandler::slotSortHiddenLastChanged);
     connect(view, &DolphinView::visibleRolesChanged,
             this, &DolphinViewActionHandler::slotVisibleRolesChanged);
     connect(view, &DolphinView::groupedSortingChanged,
@@ -253,6 +255,10 @@ void DolphinViewActionHandler::createActions()
     sortFoldersFirst->setText(i18nc("@action:inmenu Sort", "Folders First"));
     connect(sortFoldersFirst, &KToggleAction::triggered, this, &DolphinViewActionHandler::toggleSortFoldersFirst);
 
+    KToggleAction* sortHiddenLast = m_actionCollection->add<KToggleAction>(QStringLiteral("hidden_last"));
+    sortHiddenLast->setText(i18nc("@action:inmenu Sort", "Hidden Files Last"));
+    connect(sortHiddenLast, &KToggleAction::triggered, this, &DolphinViewActionHandler::toggleSortHiddenLast);
+
     // View -> Sort By
     QActionGroup* sortByActionGroup = createFileItemRolesActionGroup(QStringLiteral("sort_by_"));
 
@@ -287,6 +293,7 @@ void DolphinViewActionHandler::createActions()
     sortByActionMenu->addAction(descendingAction);
     sortByActionMenu->addSeparator();
     sortByActionMenu->addAction(sortFoldersFirst);
+    sortByActionMenu->addAction(sortHiddenLast);
 
     // View -> Additional Information
     QActionGroup* visibleRolesGroup = createFileItemRolesActionGroup(QStringLiteral("show_"));
@@ -481,6 +488,7 @@ void DolphinViewActionHandler::updateViewActions()
 
     slotSortOrderChanged(m_currentView->sortOrder());
     slotSortFoldersFirstChanged(m_currentView->sortFoldersFirst());
+    slotSortHiddenLastChanged(m_currentView->sortHiddenLast());
     slotVisibleRolesChanged(m_currentView->visibleRoles(), QList<QByteArray>());
     slotGroupedSortingChanged(m_currentView->groupedSorting());
     slotSortRoleChanged(m_currentView->sortRole());
@@ -516,6 +524,12 @@ void DolphinViewActionHandler::toggleSortFoldersFirst()
     m_currentView->setSortFoldersFirst(!sortFirst);
 }
 
+void DolphinViewActionHandler::toggleSortHiddenLast()
+{
+    const bool sortHiddenLast = m_currentView->sortHiddenLast();
+    m_currentView->setSortHiddenLast(!sortHiddenLast);
+}
+
 void DolphinViewActionHandler::slotSortOrderChanged(Qt::SortOrder order)
 {
     QAction* descending = m_actionCollection->action(QStringLiteral("descending"));
@@ -530,6 +544,11 @@ void DolphinViewActionHandler::slotSortFoldersFirstChanged(bool foldersFirst)
     m_actionCollection->action(QStringLiteral("folders_first"))->setChecked(foldersFirst);
 }
 
+void DolphinViewActionHandler::slotSortHiddenLastChanged(bool hiddenLast)
+{
+    m_actionCollection->action(QStringLiteral("hidden_last"))->setChecked(hiddenLast);
+}
+
 void DolphinViewActionHandler::toggleVisibleRole(QAction* action)
 {
     Q_EMIT actionBeingHandled();
index 3f73153ea66f9d6b15c1c4efd5769358f1ab936e..6e9b4a432bbd4f3399b7e4a53b41b8ec4cccf01a 100644 (file)
@@ -136,6 +136,16 @@ private Q_SLOTS:
      */
     void slotSortFoldersFirstChanged(bool foldersFirst);
 
+    /**
+     * Switches between showing hidden files last or not.
+     */
+    void toggleSortHiddenLast();
+
+    /**
+     * Updates the state of the 'Sort Hidden Last' action.
+     */
+    void slotSortHiddenLastChanged(bool hiddenLast);
+
     /**
      * Updates the state of the 'Sort by' actions.
      */
index b82ac8483d2260d1104692682daa585d53da7597..3867b88a25945724b014e9560b497bc2c6e8c280 100644 (file)
@@ -28,6 +28,7 @@ Comment[ko]=파일 보기용 버전 제어 플러그인
 Comment[lt]=Failo rodinių versijų tvarkymo papildinys
 Comment[lv]=Versiju kontroles spraudnis priekš datņu skata
 Comment[ml]=ഫയൽ കാഴ്‌ചകൾക്കായുള്ള പതിപ്പ് നിയന്ത്രണ പ്ലഗിൻ
+Comment[my]=ဖိုင်လ်မြင်ကွင်းများအတွက် ဗားရှင်းထိန်းချုပ်ပလပ်ဂင်
 Comment[nb]=Versjonskontrollmodul for filvisninger
 Comment[nl]=Plugin voor versiecontrole op bestandoverzichten
 Comment[nn]=Versjonskontroll-tillegg for filvisingar
index 1f73f3b33ba01d6aac0be7c075b247cb5d59762d..4b8d017c72e8a2125b163f33d3946de59b4dfa33 100644 (file)
@@ -245,6 +245,19 @@ bool ViewProperties::sortFoldersFirst() const
     return m_node->sortFoldersFirst();
 }
 
+void ViewProperties::setSortHiddenLast(bool hiddenLast)
+{
+    if (m_node->sortHiddenLast() != hiddenLast) {
+        m_node->setSortHiddenLast(hiddenLast);
+        update();
+    }
+}
+
+bool ViewProperties::sortHiddenLast() const
+{
+    return m_node->sortHiddenLast();
+}
+
 void ViewProperties::setVisibleRoles(const QList<QByteArray>& roles)
 {
     if (roles == visibleRoles()) {
@@ -353,6 +366,7 @@ void ViewProperties::setDirProperties(const ViewProperties& props)
     setSortRole(props.sortRole());
     setSortOrder(props.sortOrder());
     setSortFoldersFirst(props.sortFoldersFirst());
+    setSortHiddenLast(props.sortHiddenLast());
     setVisibleRoles(props.visibleRoles());
     setHeaderColumnWidths(props.headerColumnWidths());
     m_node->setVersion(props.m_node->version());
index a9daafc87ad1fc3eceea9a5ea0eeec5bee6ada5c..def8aa7381f7c2c7657ca1904576705b1a7ebb0b 100644 (file)
@@ -62,6 +62,9 @@ public:
     void setSortFoldersFirst(bool foldersFirst);
     bool sortFoldersFirst() const;
 
+    void setSortHiddenLast(bool hiddenLast);
+    bool sortHiddenLast() const;
+
     /**
      * Sets the additional information for the current set view-mode.
      * Note that the additional-info property is the only property where