File indexing completed on 2024-12-08 12:21:41

0001 /* -*- c++ -*-
0002     SPDX-FileCopyrightText: 2000 Waldo Bastian <bastian@kde.org>
0003 
0004     SPDX-License-Identifier: BSD-2-Clause
0005 */
0006 
0007 #include "krecentdirs.h"
0008 #include <KConfig>
0009 #include <KConfigGroup>
0010 #include <KSharedConfig>
0011 #include <QDebug>
0012 
0013 static constexpr int s_maxDirHistory = 3;
0014 
0015 static KConfigGroup recentdirs_readList(QString &key, QStringList &result)
0016 {
0017     KConfigGroup cg(KSharedConfig::openConfig(), QStringLiteral("Recent Dirs"));
0018     if ((key.length() < 2) || (key[0] != QLatin1Char(':'))) {
0019         key = QStringLiteral(":default");
0020     }
0021     if (key[1] == QLatin1Char(':')) {
0022 #if KIOFILEWIDGETS_BUILD_DEPRECATED_SINCE(5, 95)
0023         qWarning() << "Using KRecentDirs with a global config file is deprecated. Remove the second colon to use the application-local file."
0024                    << "The requested key was" << key;
0025         key.remove(0, 2);
0026         cg = KConfigGroup(KSharedConfig::openConfig(QStringLiteral("krecentdirsrc")), QString());
0027 #endif
0028     } else {
0029         key.remove(0, 1);
0030     }
0031 
0032     result = cg.readPathEntry(key, QStringList());
0033     if (result.isEmpty()) {
0034         result.append(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation));
0035     }
0036     return cg;
0037 }
0038 
0039 QStringList KRecentDirs::list(const QString &fileClass)
0040 {
0041     QString key = fileClass;
0042     QStringList result;
0043     recentdirs_readList(key, result).sync();
0044     return result;
0045 }
0046 
0047 QString KRecentDirs::dir(const QString &fileClass)
0048 {
0049     const QStringList result = list(fileClass);
0050     return result[0];
0051 }
0052 
0053 void KRecentDirs::add(const QString &fileClass, const QString &directory)
0054 {
0055     QString key = fileClass;
0056     QStringList result;
0057     KConfigGroup config = recentdirs_readList(key, result);
0058     // make sure the dir is first in history
0059     result.removeAll(directory);
0060     result.prepend(directory);
0061     if (result.size() > s_maxDirHistory) {
0062         result.erase(result.begin() + s_maxDirHistory, result.end());
0063     }
0064 
0065     config.writePathEntry(key, result);
0066     config.sync();
0067 }