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 }