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 }