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

0001 /* This file is part of the KDE project
0002  * SPDX-FileCopyrightText: 2012 KO GmbH. Contact : Boudewijn Rempt <boud@kogmbh.com>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 #include "DocumentListModel.h"
0007 
0008 #include <QTimer>
0009 #include <QLocale>
0010 
0011 
0012 #include <klocalizedstring.h>
0013 
0014 class DocumentListModel::Private
0015 {
0016 public:
0017     Private( DocumentListModel *qq) : q(qq), filter(DocumentListModel::UnknownType) { }
0018 
0019     void relayout();
0020 
0021     DocumentListModel* q;
0022 
0023     QList<DocumentInfo> allDocumentInfos;
0024     QList<DocumentInfo> currentDocumentInfos;
0025 
0026     DocumentType filter;
0027     QString searchPattern;
0028 };
0029 
0030 QHash<QString, DocumentListModel::DocumentType> DocumentListModel::sm_extensions = QHash<QString, DocumentListModel::DocumentType>();
0031 
0032 DocumentListModel::DocumentListModel(QObject *parent)
0033     : QAbstractListModel(parent), d(new Private(this))
0034 {
0035     qRegisterMetaType<DocumentListModel::DocumentInfo>();
0036 
0037 }
0038 
0039 DocumentListModel::~DocumentListModel()
0040 {
0041 }
0042 
0043 QHash<int, QByteArray> DocumentListModel::roleNames() const
0044 {
0045     QHash<int, QByteArray> roleNames = QAbstractListModel::roleNames();
0046     roleNames[FileNameRole] = "fileName";
0047     roleNames[FilePathRole] = "filePath";
0048     roleNames[DocTypeRole] = "docType";
0049     roleNames[FileSizeRole] = "fileSize";
0050     roleNames[AuthorNameRole] = "authorName";
0051     roleNames[AccessedTimeRole] = "accessedTime";
0052     roleNames[ModifiedTimeRole] = "modifiedTime";
0053     roleNames[UUIDRole] = "uuid";
0054 
0055     return roleNames;
0056 }
0057 
0058 void DocumentListModel::addDocument(const DocumentInfo &info)
0059 {
0060     if (d->allDocumentInfos.contains(info))
0061     {
0062         return;
0063     }
0064 
0065     d->allDocumentInfos.append(info);
0066 }
0067 
0068 int DocumentListModel::rowCount(const QModelIndex &parent) const
0069 {
0070     Q_UNUSED(parent);
0071     return d->currentDocumentInfos.count();
0072 }
0073 
0074 int DocumentListModel::columnCount(const QModelIndex &parent) const
0075 {
0076     Q_UNUSED(parent);
0077     return 1;
0078 }
0079 
0080 QVariant DocumentListModel::data(const QModelIndex &index, int role) const
0081 {
0082     if (!index.isValid()) {
0083         return QVariant();
0084     }
0085 
0086     const int row = index.row();
0087     const DocumentInfo &info = d->currentDocumentInfos[row];
0088 
0089     switch (role) {
0090         case FileNameRole: Q_FALLTHROUGH();
0091         case Qt::DisplayRole: return info.fileName;
0092         case FilePathRole: return info.filePath;
0093         case DocTypeRole: return info.docType;
0094         case FileSizeRole: return info.fileSize;
0095         case AuthorNameRole: return info.authorName;
0096         case AccessedTimeRole: return prettyTime(info.accessedTime);
0097         case ModifiedTimeRole: return prettyTime(info.modifiedTime);
0098         case UUIDRole: return info.uuid;
0099         default: return QVariant();
0100     }
0101 }
0102 
0103 QString DocumentListModel::prettyTime( const QDateTime& theTime)
0104 {
0105     return QLocale().toString(theTime, QLocale::LongFormat);
0106 }
0107 
0108 QVariant DocumentListModel::headerData(int section, Qt::Orientation orientation, int role) const
0109 {
0110     Q_UNUSED(section);
0111     Q_UNUSED(orientation);
0112     Q_UNUSED(role);
0113     return QVariant();
0114 }
0115 
0116 DocumentListModel::DocumentType DocumentListModel::filter()
0117 {
0118     return d->filter;
0119 }
0120 
0121 void DocumentListModel::setFilter( DocumentListModel::DocumentType newFilter)
0122 {
0123     d->filter = newFilter;
0124     d->relayout();
0125 }
0126 
0127 
0128 
0129 DocumentListModel::DocumentType DocumentListModel::typeForFile ( const QString& file )
0130 {
0131     if (sm_extensions.isEmpty()) {
0132         sm_extensions["odt"] = TextDocumentType;
0133         sm_extensions["fodt"] = TextDocumentType;
0134         sm_extensions["doc"] = TextDocumentType;
0135         sm_extensions["docx"] = TextDocumentType;
0136         sm_extensions["txt"] = TextDocumentType;
0137         sm_extensions["odp"] = PresentationType;
0138         sm_extensions["fodp"] = PresentationType;
0139         sm_extensions["ppt"] = PresentationType;
0140         sm_extensions["pptx"] = PresentationType;
0141         sm_extensions["ods"] = SpreadsheetType;
0142         sm_extensions["fods"] = SpreadsheetType;
0143         sm_extensions["xls"] = SpreadsheetType;
0144         sm_extensions["xlsx"] = SpreadsheetType;
0145         sm_extensions["pdf"] = PDFDocumentType;
0146     }
0147 
0148     QString ext = file.split('.').last().toLower();
0149     if (sm_extensions.contains(ext)) {
0150         return sm_extensions.value(ext);
0151     }
0152 
0153     return UnknownType;
0154 }
0155 
0156 void DocumentListModel::Private::relayout()
0157 {
0158     emit q->layoutAboutToBeChanged();
0159 
0160     QList<DocumentInfo> newList;
0161     Q_FOREACH (const DocumentInfo &docInfo, allDocumentInfos) {
0162         if (filter == UnknownType || docInfo.docType == filter) {
0163             if (searchPattern.isEmpty() || docInfo.fileName.contains(searchPattern, Qt::CaseInsensitive)) {
0164                 newList.append(docInfo);
0165             }
0166         }
0167     }
0168 
0169     currentDocumentInfos = newList;
0170     emit q->layoutChanged();
0171     q->beginResetModel();
0172     q->endResetModel();
0173 }