1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
/* This file is part of the KDE project
* SPDX-FileCopyrightText: 2014 Dan Leinir Turthra Jensen <admin@leinir.dk>
*
* SPDX-License-Identifier: LGPL-2.0-or-later
*/
#ifndef CALLIGRAMOBILE_DOCUMENTLISTMODEL_H
#define CALLIGRAMOBILE_DOCUMENTLISTMODEL_H
#include <QAbstractListModel>
#include <QDateTime>
#include <QQmlParserStatus>
#include <QRunnable>
class SearchThread;
class DocumentListModel : public QAbstractListModel, public QQmlParserStatus
{
Q_OBJECT
Q_PROPERTY(DocumentType filter READ filter WRITE setFilter NOTIFY filterChanged)
Q_PROPERTY(QString documentsFolder READ documentsFolder CONSTANT)
Q_INTERFACES(QQmlParserStatus)
public:
explicit DocumentListModel(QObject *parent = nullptr);
~DocumentListModel() override;
enum CustomRoles {
FileNameRole = Qt::UserRole + 1,
FilePathRole,
DocTypeRole,
SectionCategoryRole,
FileSizeRole,
AuthorNameRole,
AccessedTimeRole,
ModifiedTimeRole,
UUIDRole,
};
enum GroupBy {
GroupByName,
GroupByDocType
};
Q_ENUM(GroupBy);
enum DocumentType {
UnknownType,
TextDocumentType,
PresentationType,
SpreadsheetType,
};
Q_ENUM(DocumentType);
struct DocumentInfo {
bool operator==(const DocumentInfo &other) const
{
return filePath == other.filePath;
}
QString filePath;
QString fileName;
DocumentType docType;
QString fileSize;
QString authorName;
QDateTime accessedTime;
QDateTime modifiedTime;
QString uuid;
};
// reimp from QAbstractListModel
QHash<int, QByteArray> roleNames() const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
// reimp from QDeclarativeParserStatus
void classBegin() override;
void componentComplete() override;
DocumentType filter();
QString documentsFolder() const;
static QString prettyTime(QDateTime theTime);
Q_SIGNALS:
void filterChanged();
public Q_SLOTS:
void startSearch();
void stopSearch();
void addDocument(const DocumentListModel::DocumentInfo &info);
void setFilter(DocumentType newFilter);
public:
Q_INVOKABLE void groupBy(GroupBy role);
private Q_SLOTS:
void searchFinished();
private:
void relayout();
QHash<QString, DocumentType> m_docTypes;
QList<DocumentInfo> m_allDocumentInfos;
QList<DocumentInfo> m_currentDocumentInfos;
SearchThread *m_searchThread;
GroupBy m_groupBy;
DocumentType m_filter;
QString m_filteredTypes;
friend class SearchThread;
};
Q_DECLARE_METATYPE(DocumentListModel::DocumentInfo);
class SearchThread : public QObject, public QRunnable
{
Q_OBJECT
public:
SearchThread(const QHash<QString, DocumentListModel::DocumentType> &docTypes, QObject *parent = nullptr);
~SearchThread() override;
void run() override;
void abort()
{
m_abort = true;
}
Q_SIGNALS:
void documentFound(const DocumentListModel::DocumentInfo &);
void finished();
private:
bool m_abort;
QHash<QString, DocumentListModel::DocumentType> m_docTypes;
static const QString textDocumentType;
static const QString presentationType;
static const QString spreadsheetType;
};
#endif // CALLIGRAMOBILE_DOCUMENTLISTMODEL_H
|