File indexing completed on 2024-05-12 15:59:14

0001 /* This file is part of the KDE project
0002  * SPDX-FileCopyrightText: 2012 Boudewijn Rempt <boud@kogmbh.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 #include "RecentFileManager.h"
0007 
0008 #include <QFile>
0009 #include <QFileInfo>
0010 #include <QDir>
0011 #include <QUrl>
0012 
0013 #include <kconfiggroup.h>
0014 #include <kconfig.h>
0015 #include <klocalizedstring.h>
0016 #include <ksharedconfig.h>
0017 
0018 // Much of this is a gui-less clone of KRecentFilesAction, so the format of
0019 // storing recent files is compatible.
0020 class RecentFileManager::Private {
0021 public:
0022     Private()
0023     {
0024         KConfigGroup grp = KSharedConfig::openConfig()->group("RecentFiles");
0025         maxItems = grp.readEntry("maxRecentFileItems", 100);
0026 
0027         loadEntries(grp);
0028     }
0029 
0030     void loadEntries(const KConfigGroup &grp)
0031     {
0032         recentFiles.clear();
0033         recentFilesIndex.clear();
0034 
0035         QString value;
0036         QString nameValue;
0037         QUrl url;
0038 
0039         KConfigGroup cg = grp;
0040 
0041         if (cg.name().isEmpty()) {
0042             cg = KConfigGroup(cg.config(), "RecentFiles");
0043         }
0044 
0045         // read file list
0046         for (int i = 0; i < maxItems; ++i) {
0047             value = cg.readPathEntry(QString("File%1").arg(i+1), QString());
0048             if (value.isEmpty()) {
0049                 continue;
0050             }
0051             url = QUrl::fromUserInput(value);
0052 
0053             // krita sketch only handles local files
0054             if (!url.isLocalFile())
0055                 continue;
0056 
0057             // Don't restore if file doesn't exist anymore
0058             if (!QFile::exists(url.toLocalFile())) {
0059                 continue;
0060             }
0061 
0062 #ifdef Q_OS_WIN
0063             value = QDir::toNativeSeparators(value);
0064 #endif
0065 
0066             // Don't restore where the url is already known (eg. broken config)
0067             if (recentFiles.contains(value)) {
0068                 continue;
0069             }
0070 
0071             nameValue = cg.readPathEntry(QString("Name%1").arg(i+1), url.fileName());
0072 
0073             if (!value.isNull()) {
0074                 recentFilesIndex << nameValue;
0075                 recentFiles << value;
0076            }
0077         }
0078     }
0079 
0080     void saveEntries(const KConfigGroup &grp)
0081     {
0082         KConfigGroup cg = grp;
0083 
0084         if (cg.name().isEmpty()) {
0085             cg = KConfigGroup(cg.config(), "RecentFiles");
0086         }
0087         cg.deleteGroup();
0088 
0089         cg.writeEntry("maxRecentFileItems", maxItems);
0090 
0091         // write file list
0092         for (int i = 0; i < recentFilesIndex.size(); ++i) {
0093             cg.writePathEntry(QString("File%1").arg(i+1), recentFiles[i]);
0094             cg.writePathEntry(QString("Name%1").arg(i+1), recentFilesIndex[i]);
0095         }
0096     }
0097 
0098     int maxItems;
0099     QStringList recentFilesIndex;
0100     QStringList recentFiles;
0101 };
0102 
0103 RecentFileManager::RecentFileManager(QObject *parent)
0104     : QObject(parent)
0105     , d(new Private())
0106 {
0107 }
0108 
0109 RecentFileManager::~RecentFileManager()
0110 {
0111     delete d;
0112 }
0113 
0114 QStringList RecentFileManager::recentFileNames() const
0115 {
0116     return d->recentFilesIndex;
0117 }
0118 
0119 QStringList RecentFileManager::recentFiles() const
0120 {
0121     return d->recentFiles;
0122 }
0123 
0124 void RecentFileManager::addRecent(const QString &_url)
0125 {
0126     if (d->maxItems <= 0) {
0127         return;
0128     }
0129 
0130     if (d->recentFiles.size() > d->maxItems) {
0131         d->recentFiles.removeLast();
0132         d->recentFilesIndex.removeLast();
0133     }
0134 
0135     QString localFile = QDir::toNativeSeparators(_url);
0136     QString fileName  = QFileInfo(_url).fileName();
0137 
0138     if (d->recentFiles.contains(localFile)) {
0139         d->recentFiles.removeAll(localFile);
0140     }
0141 
0142     if (d->recentFilesIndex.contains(fileName)) {
0143         d->recentFilesIndex.removeAll(fileName);
0144     }
0145 
0146     d->recentFiles.insert(0, localFile);
0147     d->recentFilesIndex.insert(0, fileName);
0148 
0149     d->saveEntries(KSharedConfig::openConfig()->group("RecentFiles"));
0150     emit recentFilesListChanged();
0151 }
0152 
0153 int RecentFileManager::size()
0154 {
0155     return d->recentFiles.size();
0156 }
0157 
0158 QString RecentFileManager::recentFile(int index) const
0159 {
0160     if (index < d->recentFiles.size()) {
0161         return d->recentFiles.at(index);
0162     }
0163     return QString();
0164 }
0165 
0166 QString RecentFileManager::recentFileName(int index) const
0167 {
0168     if (index < d->recentFilesIndex.size()) {
0169         return d->recentFilesIndex.at(index);
0170     }
0171     return QString();
0172 }