File indexing completed on 2024-06-23 04:42:35
0001 // SPDX-FileCopyrightText: 2021 Claudio Cambra <claudio.cambra@gmail.com> 0002 // SPDX-License-Identifier: LGPL-2.0-or-later 0003 0004 #pragma once 0005 0006 #include "incidenceoccurrencemodel.h" 0007 #include <QAbstractItemModel> 0008 #include <QDateTime> 0009 #include <QList> 0010 #include <QSharedPointer> 0011 #include <QTimer> 0012 #include <QQmlEngine> 0013 0014 namespace KCalendarCore 0015 { 0016 class Incidence; 0017 } 0018 0019 /** 0020 * Each toplevel index represents a day. 0021 * The "incidences" roles provides a list of lists, where each list represents a visual line, 0022 * containing a number of events to display. 0023 */ 0024 class HourlyIncidenceModel : public QAbstractItemModel 0025 { 0026 Q_OBJECT 0027 QML_ELEMENT 0028 Q_PROPERTY(int periodLength READ periodLength WRITE setPeriodLength NOTIFY periodLengthChanged) 0029 Q_PROPERTY(HourlyIncidenceModel::Filters filters READ filters WRITE setFilters NOTIFY filtersChanged) 0030 Q_PROPERTY(IncidenceOccurrenceModel *model READ model WRITE setModel NOTIFY modelChanged) 0031 0032 public: 0033 enum Filter { 0034 NoAllDay = 0x1, 0035 NoMultiDay = 0x2, 0036 }; 0037 Q_DECLARE_FLAGS(Filters, Filter) 0038 Q_FLAGS(Filters) 0039 Q_ENUM(Filter) 0040 0041 enum Roles { 0042 Incidences = IncidenceOccurrenceModel::LastRole, 0043 PeriodStartDateTime, 0044 }; 0045 0046 explicit HourlyIncidenceModel(QObject *parent = nullptr); 0047 ~HourlyIncidenceModel() override = default; 0048 0049 QModelIndex index(int row, int column, const QModelIndex &parent = {}) const override; 0050 QModelIndex parent(const QModelIndex &index) const override; 0051 0052 int rowCount(const QModelIndex &parent) const override; 0053 int columnCount(const QModelIndex &parent) const override; 0054 0055 QVariant data(const QModelIndex &index, int role) const override; 0056 0057 QHash<int, QByteArray> roleNames() const override; 0058 0059 IncidenceOccurrenceModel *model(); 0060 void setModel(IncidenceOccurrenceModel *model); 0061 int periodLength(); 0062 void setPeriodLength(int periodLength); 0063 HourlyIncidenceModel::Filters filters(); 0064 void setFilters(HourlyIncidenceModel::Filters filters); 0065 0066 Q_SIGNALS: 0067 void periodLengthChanged(); 0068 void filtersChanged(); 0069 void modelChanged(); 0070 0071 private: 0072 QTimer mRefreshTimer; 0073 QList<QModelIndex> sortedIncidencesFromSourceModel(const QDateTime &rowStart) const; 0074 QVariantList layoutLines(const QDateTime &rowStart) const; 0075 IncidenceOccurrenceModel *mSourceModel{nullptr}; 0076 int mPeriodLength{15}; // In minutes 0077 HourlyIncidenceModel::Filters m_filters; 0078 }; 0079 0080 Q_DECLARE_OPERATORS_FOR_FLAGS(HourlyIncidenceModel::Filters)