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)