File indexing completed on 2024-04-28 15:52:01

0001 /*
0002     SPDX-FileCopyrightText: 2021 Jiří Wolker <woljiri@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "recentitemsmodel.h"
0008 
0009 #include <QFile>
0010 #include <QFileIconProvider>
0011 #include <QFileInfo>
0012 #include <QIcon>
0013 
0014 #include <KConfigGroup>
0015 
0016 RecentItemsModel::RecentItemsModel()
0017 {
0018 }
0019 
0020 RecentItemsModel::~RecentItemsModel()
0021 {
0022 }
0023 
0024 void RecentItemsModel::loadEntries(const KConfigGroup &cg)
0025 {
0026     clearEntries();
0027 
0028     // Based on implementation of KRecentFilesAction::loadEntries.
0029 
0030     // read file list
0031     for (int i = 1; i <= maxItems(); i++) {
0032         const QString key = QStringLiteral("File%1").arg(i);
0033         const QString value = cg.readPathEntry(key, QString());
0034         if (value.isEmpty()) {
0035             continue;
0036         }
0037         const QUrl url = QUrl::fromUserInput(value);
0038 
0039         // Don't restore if file doesn't exist anymore
0040         if (url.isLocalFile() && !QFile::exists(url.toLocalFile())) {
0041             continue;
0042         }
0043 
0044         const QString nameKey = QStringLiteral("Name%1").arg(i);
0045         const QString nameValue = cg.readPathEntry(nameKey, url.fileName());
0046         m_recentItems.append(RecentItem {nameValue, url});
0047     }
0048 
0049     Q_EMIT layoutChanged();
0050 }
0051 
0052 void RecentItemsModel::clearEntries()
0053 {
0054     m_recentItems.clear();
0055 
0056     Q_EMIT layoutChanged();
0057 }
0058 
0059 int RecentItemsModel::rowCount(const QModelIndex &parent) const
0060 {
0061     Q_UNUSED(parent);
0062 
0063     return m_recentItems.size();
0064 }
0065 
0066 QVariant RecentItemsModel::data(const QModelIndex &index, int role) const
0067 {
0068     const RecentItemsModel::RecentItem *item = getItem(index);
0069 
0070     if (item != nullptr) {
0071         switch (role) {
0072         case Qt::ItemDataRole::DisplayRole:
0073             if (item->name.isEmpty()) {
0074                 if (item->url.isLocalFile()) {
0075                     return item->url.toLocalFile();
0076                 } else {
0077                     return item->url.toString();
0078                 }
0079             } else {
0080                 return item->name;
0081             }
0082 
0083         case Qt::ItemDataRole::ToolTipRole:
0084             if (item->url.isLocalFile()) {
0085                 return item->url.toLocalFile();
0086             } else {
0087                 return item->url.toString();
0088             }
0089 
0090         case Qt::ItemDataRole::DecorationRole:
0091             if (item->url.isLocalFile()) {
0092                 return m_iconProvider.icon(QFileInfo(item->url.toLocalFile()));
0093             } else {
0094                 // Fallback icon for remote files.
0095                 return QIcon::fromTheme(QStringLiteral("network-server"));
0096             }
0097 
0098         default:
0099             return QVariant();
0100         }
0101     } else {
0102         return QVariant();
0103     }
0104 }
0105 
0106 RecentItemsModel::RecentItem const *RecentItemsModel::getItem(int index) const
0107 {
0108     if (m_recentItems.size() > index && index >= 0) {
0109         // We reverse the order of items.
0110         return &m_recentItems[m_recentItems.size() - index - 1];
0111     } else {
0112         return nullptr;
0113     }
0114 }
0115 
0116 RecentItemsModel::RecentItem const *RecentItemsModel::getItem(const QModelIndex &index) const
0117 {
0118     return getItem(index.row());
0119 }